mirror of
https://github.com/docker/docker-agent.git
synced 2026-11-04 10:02:15 +00:00
113 lines
2.4 KiB
Go
113 lines
2.4 KiB
Go
package e2e_test
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"io"
|
|
"net"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/docker/docker-agent/pkg/config"
|
|
"github.com/docker/docker-agent/pkg/server"
|
|
"github.com/docker/docker-agent/pkg/session"
|
|
)
|
|
|
|
type Session struct {
|
|
Title string `json:"title"`
|
|
}
|
|
|
|
func TestCagentAPI_ListSessions(t *testing.T) {
|
|
type testcase struct {
|
|
db string
|
|
expectedCount int
|
|
}
|
|
|
|
for _, tc := range []testcase{
|
|
{"one-session.db", 1},
|
|
{"two-sessions.db", 2},
|
|
{"transfer-task.db", 1},
|
|
{"session.db", 1},
|
|
{"session-not-found.db", 17},
|
|
{"desktop.db", 2},
|
|
} {
|
|
t.Run(tc.db, func(t *testing.T) {
|
|
socketPath := startCagentAPI(t, filepath.Join("testdata", "db", tc.db))
|
|
|
|
client := &http.Client{
|
|
Transport: &http.Transport{
|
|
DialContext: func(ctx context.Context, _, _ string) (net.Conn, error) {
|
|
return (&net.Dialer{}).DialContext(ctx, "unix", socketPath)
|
|
},
|
|
},
|
|
}
|
|
|
|
resp, err := client.Get("http://localhost/api/sessions")
|
|
require.NoError(t, err)
|
|
defer resp.Body.Close()
|
|
|
|
var sessions []Session
|
|
err = json.NewDecoder(resp.Body).Decode(&sessions)
|
|
require.NoError(t, err)
|
|
|
|
assert.Len(t, sessions, tc.expectedCount)
|
|
})
|
|
}
|
|
}
|
|
|
|
func startCagentAPI(t *testing.T, db string) string {
|
|
t.Helper()
|
|
|
|
// Get absolute path to db before changing directory
|
|
absDB, err := filepath.Abs(db)
|
|
require.NoError(t, err)
|
|
|
|
tmpDir := t.TempDir()
|
|
t.Chdir(tmpDir) // Use relative socket path to avoid Unix socket path length limit
|
|
|
|
// Copy database files to temp directory
|
|
dbCopy := tmpDir + "/session.db"
|
|
copyFile(t, dbCopy, absDB)
|
|
if _, err := os.Stat(absDB + "-wal"); err == nil {
|
|
copyFile(t, dbCopy+"-wal", absDB+"-wal")
|
|
}
|
|
|
|
ln, err := server.Listen(t.Context(), "unix://cagent.sock")
|
|
require.NoError(t, err)
|
|
t.Cleanup(func() {
|
|
_ = ln.Close()
|
|
})
|
|
|
|
sessionStore, err := session.NewSQLiteSessionStore(dbCopy)
|
|
require.NoError(t, err)
|
|
|
|
srv, err := server.New(t.Context(), sessionStore, &config.RuntimeConfig{}, 0, nil)
|
|
require.NoError(t, err)
|
|
|
|
go func() {
|
|
_ = srv.Serve(t.Context(), ln)
|
|
}()
|
|
|
|
return "cagent.sock"
|
|
}
|
|
|
|
func copyFile(t *testing.T, dst, src string) {
|
|
t.Helper()
|
|
|
|
srcFile, err := os.Open(src)
|
|
require.NoError(t, err)
|
|
defer srcFile.Close()
|
|
|
|
dstFile, err := os.Create(dst)
|
|
require.NoError(t, err)
|
|
defer dstFile.Close()
|
|
|
|
_, err = io.Copy(dstFile, srcFile)
|
|
require.NoError(t, err)
|
|
}
|