blob: 407bb28a125d8bf66f001b5803e1b4bcc86de0b3 [file] [log] [blame]
package main
import (
"context"
"flag"
"fmt"
"net/http/httptest"
"os"
"path"
"path/filepath"
"strconv"
"sync"
"syscall"
"testing"
"time"
"github.com/docker/docker/integration-cli/cli"
"github.com/docker/docker/integration-cli/daemon"
"github.com/docker/docker/integration-cli/environment"
"github.com/docker/docker/internal/test/suite"
"github.com/docker/docker/testutil"
testdaemon "github.com/docker/docker/testutil/daemon"
ienv "github.com/docker/docker/testutil/environment"
"github.com/docker/docker/testutil/fakestorage"
"github.com/docker/docker/testutil/fixtures/plugin"
"github.com/docker/docker/testutil/registry"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
"gotest.tools/v3/assert"
"gotest.tools/v3/skip"
)
const (
// the private registry to use for tests
privateRegistryURL = registry.DefaultURL
// path to containerd's ctr binary
ctrBinary = "ctr"
// the docker daemon binary to use
dockerdBinary = "dockerd"
)
var (
testEnvOnce sync.Once
testEnv *environment.Execution
// the docker client binary to use
dockerBinary = ""
baseContext context.Context
)
func TestMain(m *testing.M) {
flag.Parse()
os.Exit(testRun(m))
}
func testRun(m *testing.M) (ret int) {
// Global set up
var err error
shutdown := testutil.ConfigureTracing()
ctx, span := otel.Tracer("").Start(context.Background(), "integration-cli/TestMain")
defer func() {
if err != nil {
span.SetStatus(codes.Error, err.Error())
ret = 255
} else {
if ret != 0 {
span.SetAttributes(attribute.Int("exitCode", ret))
span.SetStatus(codes.Error, "m.Run() exited with non-zero code")
}
}
span.End()
shutdown(ctx)
}()
baseContext = ctx
testEnv, err = environment.New(ctx)
if err != nil {
return
}
if testEnv.IsLocalDaemon() {
setupLocalInfo()
}
dockerBinary = testEnv.DockerBinary()
err = ienv.EnsureFrozenImagesLinux(ctx, &testEnv.Execution)
if err != nil {
return
}
testEnv.Print()
printCliVersion()
return m.Run()
}
func printCliVersion() {
// Print output of "docker version"
cli.SetTestEnvironment(testEnv)
cmd := cli.Docker(cli.Args("version"))
if cmd.Error != nil {
fmt.Printf("WARNING: Failed to run 'docker version': %+v\n", cmd.Error)
return
}
fmt.Println("INFO: Testing with docker cli version:")
fmt.Println(cmd.Stdout())
}
func ensureTestEnvSetup(ctx context.Context, t *testing.T) {
testEnvOnce.Do(func() {
cli.SetTestEnvironment(testEnv)
fakestorage.SetTestEnvironment(&testEnv.Execution)
ienv.ProtectAll(ctx, t, &testEnv.Execution)
})
}
func TestDockerAPISuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerAPISuite{ds: &DockerSuite{}})
}
func TestDockerBenchmarkSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerBenchmarkSuite{ds: &DockerSuite{}})
}
func TestDockerCLIAttachSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIAttachSuite{ds: &DockerSuite{}})
}
func TestDockerCLIBuildSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIBuildSuite{ds: &DockerSuite{}})
}
func TestDockerCLICommitSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLICommitSuite{ds: &DockerSuite{}})
}
func TestDockerCLICpSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLICpSuite{ds: &DockerSuite{}})
}
func TestDockerCLICreateSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLICreateSuite{ds: &DockerSuite{}})
}
func TestDockerCLIEventSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIEventSuite{ds: &DockerSuite{}})
}
func TestDockerCLIExecSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIExecSuite{ds: &DockerSuite{}})
}
func TestDockerCLIHealthSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIHealthSuite{ds: &DockerSuite{}})
}
func TestDockerCLIHistorySuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIHistorySuite{ds: &DockerSuite{}})
}
func TestDockerCLIImagesSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIImagesSuite{ds: &DockerSuite{}})
}
func TestDockerCLIImportSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIImportSuite{ds: &DockerSuite{}})
}
func TestDockerCLIInfoSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIInfoSuite{ds: &DockerSuite{}})
}
func TestDockerCLIInspectSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIInspectSuite{ds: &DockerSuite{}})
}
func TestDockerCLILinksSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLILinksSuite{ds: &DockerSuite{}})
}
func TestDockerCLILoginSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLILoginSuite{ds: &DockerSuite{}})
}
func TestDockerCLILogsSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLILogsSuite{ds: &DockerSuite{}})
}
func TestDockerCLINetmodeSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLINetmodeSuite{ds: &DockerSuite{}})
}
func TestDockerCLINetworkSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLINetworkSuite{ds: &DockerSuite{}})
}
func TestDockerCLIPluginLogDriverSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIPluginLogDriverSuite{ds: &DockerSuite{}})
}
func TestDockerCLIPluginsSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIPluginsSuite{ds: &DockerSuite{}})
}
func TestDockerCLIPortSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIPortSuite{ds: &DockerSuite{}})
}
func TestDockerCLIProxySuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIProxySuite{ds: &DockerSuite{}})
}
func TestDockerCLIPruneSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIPruneSuite{ds: &DockerSuite{}})
}
func TestDockerCLIPsSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIPsSuite{ds: &DockerSuite{}})
}
func TestDockerCLIPullSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIPullSuite{ds: &DockerSuite{}})
}
func TestDockerCLIPushSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIPushSuite{ds: &DockerSuite{}})
}
func TestDockerCLIRestartSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIRestartSuite{ds: &DockerSuite{}})
}
func TestDockerCLIRmiSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIRmiSuite{ds: &DockerSuite{}})
}
func TestDockerCLIRunSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIRunSuite{ds: &DockerSuite{}})
}
func TestDockerCLISaveLoadSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLISaveLoadSuite{ds: &DockerSuite{}})
}
func TestDockerCLISearchSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLISearchSuite{ds: &DockerSuite{}})
}
func TestDockerCLISNISuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLISNISuite{ds: &DockerSuite{}})
}
func TestDockerCLIStartSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIStartSuite{ds: &DockerSuite{}})
}
func TestDockerCLIStatsSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIStatsSuite{ds: &DockerSuite{}})
}
func TestDockerCLITopSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLITopSuite{ds: &DockerSuite{}})
}
func TestDockerCLIUpdateSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIUpdateSuite{ds: &DockerSuite{}})
}
func TestDockerCLIVolumeSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerCLIVolumeSuite{ds: &DockerSuite{}})
}
func TestDockerRegistrySuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerRegistrySuite{ds: &DockerSuite{}})
}
func TestDockerSchema1RegistrySuite(t *testing.T) {
skip.If(t, testEnv.UsingSnapshotter())
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerSchema1RegistrySuite{ds: &DockerSuite{}})
}
func TestDockerRegistryAuthHtpasswdSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerRegistryAuthHtpasswdSuite{ds: &DockerSuite{}})
}
func TestDockerRegistryAuthTokenSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerRegistryAuthTokenSuite{ds: &DockerSuite{}})
}
func TestDockerDaemonSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerDaemonSuite{ds: &DockerSuite{}})
}
func TestDockerSwarmSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerSwarmSuite{ds: &DockerSuite{}})
}
func TestDockerPluginSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerPluginSuite{ds: &DockerSuite{}})
}
func TestDockerExternalVolumeSuite(t *testing.T) {
testRequires(t, DaemonIsLinux)
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerExternalVolumeSuite{ds: &DockerSuite{}})
}
func TestDockerNetworkSuite(t *testing.T) {
testRequires(t, DaemonIsLinux)
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
suite.Run(ctx, t, &DockerNetworkSuite{ds: &DockerSuite{}})
}
func TestDockerHubPullSuite(t *testing.T) {
ctx := testutil.StartSpan(baseContext, t)
ensureTestEnvSetup(ctx, t)
// FIXME. Temporarily turning this off for Windows as GH16039 was breaking
// Windows to Linux CI @icecrime
testRequires(t, DaemonIsLinux)
suite.Run(ctx, t, newDockerHubPullSuite())
}
type DockerSuite struct{}
func (s *DockerSuite) OnTimeout(c *testing.T) {
if testEnv.IsRemoteDaemon() {
return
}
path := filepath.Join(os.Getenv("DEST"), "docker.pid")
b, err := os.ReadFile(path)
if err != nil {
c.Fatalf("Failed to get daemon PID from %s\n", path)
}
rawPid, err := strconv.ParseInt(string(b), 10, 32)
if err != nil {
c.Fatalf("Failed to parse pid from %s: %s\n", path, err)
}
daemonPid := int(rawPid)
if daemonPid > 0 {
testdaemon.SignalDaemonDump(daemonPid)
}
}
func (s *DockerSuite) TearDownTest(ctx context.Context, c *testing.T) {
testEnv.Clean(ctx, c)
}
type DockerRegistrySuite struct {
ds *DockerSuite
reg *registry.V2
d *daemon.Daemon
}
func (s *DockerRegistrySuite) OnTimeout(c *testing.T) {
s.d.DumpStackAndQuit()
}
func (s *DockerRegistrySuite) SetUpTest(ctx context.Context, c *testing.T) {
testRequires(c, DaemonIsLinux, RegistryHosting, testEnv.IsLocalDaemon)
s.reg = registry.NewV2(c)
s.reg.WaitReady(c)
s.d = daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
}
func (s *DockerRegistrySuite) TearDownTest(ctx context.Context, c *testing.T) {
if s.reg != nil {
s.reg.Close()
}
if s.d != nil {
s.d.Stop(c)
}
s.ds.TearDownTest(ctx, c)
}
type DockerSchema1RegistrySuite struct {
ds *DockerSuite
reg *registry.V2
d *daemon.Daemon
}
func (s *DockerSchema1RegistrySuite) OnTimeout(c *testing.T) {
s.d.DumpStackAndQuit()
}
func (s *DockerSchema1RegistrySuite) SetUpTest(ctx context.Context, c *testing.T) {
testRequires(c, DaemonIsLinux, RegistryHosting, NotArm64, testEnv.IsLocalDaemon)
s.reg = registry.NewV2(c, registry.Schema1)
s.reg.WaitReady(c)
s.d = daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
}
func (s *DockerSchema1RegistrySuite) TearDownTest(ctx context.Context, c *testing.T) {
if s.reg != nil {
s.reg.Close()
}
if s.d != nil {
s.d.Stop(c)
}
s.ds.TearDownTest(ctx, c)
}
type DockerRegistryAuthHtpasswdSuite struct {
ds *DockerSuite
reg *registry.V2
d *daemon.Daemon
}
func (s *DockerRegistryAuthHtpasswdSuite) OnTimeout(c *testing.T) {
s.d.DumpStackAndQuit()
}
func (s *DockerRegistryAuthHtpasswdSuite) SetUpTest(ctx context.Context, c *testing.T) {
testRequires(c, DaemonIsLinux, RegistryHosting, testEnv.IsLocalDaemon)
s.reg = registry.NewV2(c, registry.Htpasswd)
s.reg.WaitReady(c)
s.d = daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
}
func (s *DockerRegistryAuthHtpasswdSuite) TearDownTest(ctx context.Context, c *testing.T) {
if s.reg != nil {
out, err := s.d.Cmd("logout", privateRegistryURL)
assert.NilError(c, err, out)
s.reg.Close()
}
if s.d != nil {
s.d.Stop(c)
}
s.ds.TearDownTest(ctx, c)
}
type DockerRegistryAuthTokenSuite struct {
ds *DockerSuite
reg *registry.V2
d *daemon.Daemon
}
func (s *DockerRegistryAuthTokenSuite) OnTimeout(c *testing.T) {
s.d.DumpStackAndQuit()
}
func (s *DockerRegistryAuthTokenSuite) SetUpTest(ctx context.Context, c *testing.T) {
testRequires(c, DaemonIsLinux, RegistryHosting, testEnv.IsLocalDaemon)
s.d = daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
}
func (s *DockerRegistryAuthTokenSuite) TearDownTest(ctx context.Context, c *testing.T) {
if s.reg != nil {
out, err := s.d.Cmd("logout", privateRegistryURL)
assert.NilError(c, err, out)
s.reg.Close()
}
if s.d != nil {
s.d.Stop(c)
}
s.ds.TearDownTest(ctx, c)
}
func (s *DockerRegistryAuthTokenSuite) setupRegistryWithTokenService(c *testing.T, tokenURL string) {
if s == nil {
c.Fatal("registry suite isn't initialized")
}
s.reg = registry.NewV2(c, registry.Token(tokenURL))
s.reg.WaitReady(c)
}
type DockerDaemonSuite struct {
ds *DockerSuite
d *daemon.Daemon
}
func (s *DockerDaemonSuite) OnTimeout(c *testing.T) {
s.d.DumpStackAndQuit()
}
func (s *DockerDaemonSuite) SetUpTest(ctx context.Context, c *testing.T) {
testRequires(c, DaemonIsLinux, testEnv.IsLocalDaemon)
s.d = daemon.New(c, dockerBinary, dockerdBinary, testdaemon.WithEnvironment(testEnv.Execution))
}
func (s *DockerDaemonSuite) TearDownTest(ctx context.Context, c *testing.T) {
testRequires(c, DaemonIsLinux, testEnv.IsLocalDaemon)
if s.d != nil {
s.d.Stop(c)
}
s.ds.TearDownTest(ctx, c)
}
func (s *DockerDaemonSuite) TearDownSuite(ctx context.Context, c *testing.T) {
filepath.Walk(testdaemon.SockRoot, func(path string, fi os.FileInfo, err error) error {
if err != nil {
// ignore errors here
// not cleaning up sockets is not really an error
return nil
}
if fi.Mode() == os.ModeSocket {
syscall.Unlink(path)
}
return nil
})
os.RemoveAll(testdaemon.SockRoot)
}
const defaultSwarmPort = 2477
type DockerSwarmSuite struct {
server *httptest.Server
ds *DockerSuite
daemonsLock sync.Mutex // protect access to daemons and portIndex
daemons []*daemon.Daemon
portIndex int
}
func (s *DockerSwarmSuite) OnTimeout(c *testing.T) {
s.daemonsLock.Lock()
defer s.daemonsLock.Unlock()
for _, d := range s.daemons {
d.DumpStackAndQuit()
}
}
func (s *DockerSwarmSuite) SetUpTest(ctx context.Context, c *testing.T) {
testRequires(c, DaemonIsLinux, testEnv.IsLocalDaemon)
}
func (s *DockerSwarmSuite) AddDaemon(ctx context.Context, c *testing.T, joinSwarm, manager bool) *daemon.Daemon {
c.Helper()
d := daemon.New(c, dockerBinary, dockerdBinary,
testdaemon.WithEnvironment(testEnv.Execution),
testdaemon.WithSwarmPort(defaultSwarmPort+s.portIndex),
)
if joinSwarm {
if len(s.daemons) > 0 {
d.StartAndSwarmJoin(ctx, c, s.daemons[0].Daemon, manager)
} else {
d.StartAndSwarmInit(ctx, c)
}
} else {
d.StartNodeWithBusybox(ctx, c)
}
s.daemonsLock.Lock()
s.portIndex++
s.daemons = append(s.daemons, d)
s.daemonsLock.Unlock()
return d
}
func (s *DockerSwarmSuite) TearDownTest(ctx context.Context, c *testing.T) {
testRequires(c, DaemonIsLinux)
s.daemonsLock.Lock()
for _, d := range s.daemons {
if d != nil {
if c.Failed() {
d.TailLogsT(c, 100)
}
d.Stop(c)
d.Cleanup(c)
}
}
s.daemons = nil
s.portIndex = 0
s.daemonsLock.Unlock()
s.ds.TearDownTest(ctx, c)
}
type DockerPluginSuite struct {
ds *DockerSuite
registry *registry.V2
}
func (ps *DockerPluginSuite) registryHost() string {
return privateRegistryURL
}
func (ps *DockerPluginSuite) getPluginRepo() string {
return path.Join(ps.registryHost(), "plugin", "basic")
}
func (ps *DockerPluginSuite) getPluginRepoWithTag() string {
return ps.getPluginRepo() + ":" + "latest"
}
func (ps *DockerPluginSuite) SetUpSuite(ctx context.Context, c *testing.T) {
testRequires(c, DaemonIsLinux, RegistryHosting)
ps.registry = registry.NewV2(c)
ps.registry.WaitReady(c)
ctx, cancel := context.WithTimeout(ctx, 60*time.Second)
defer cancel()
err := plugin.CreateInRegistry(ctx, ps.getPluginRepo(), nil)
assert.NilError(c, err, "failed to create plugin")
}
func (ps *DockerPluginSuite) TearDownSuite(ctx context.Context, c *testing.T) {
if ps.registry != nil {
ps.registry.Close()
}
}
func (ps *DockerPluginSuite) TearDownTest(ctx context.Context, c *testing.T) {
ps.ds.TearDownTest(ctx, c)
}
func (ps *DockerPluginSuite) OnTimeout(c *testing.T) {
ps.ds.OnTimeout(c)
}