package logging import ( "bytes" "context" "runtime" "strings" "testing" "time" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/pkg/stdcopy" "github.com/docker/docker/testutil/daemon" "gotest.tools/v3/assert" ) // TestReadPluginNoRead tests that reads are supported even if the plugin isn't capable. func TestReadPluginNoRead(t *testing.T) { if runtime.GOOS == "windows" { t.Skip("no unix domain sockets on Windows") } t.Parallel() d := daemon.New(t) d.StartWithBusybox(t, "--iptables=false") defer d.Stop(t) client, err := d.NewClient() assert.Assert(t, err) createPlugin(t, client, "test", "discard", asLogDriver) ctx := context.Background() err = client.PluginEnable(ctx, "test", types.PluginEnableOptions{Timeout: 30}) assert.Check(t, err) d.Stop(t) cfg := &container.Config{ Image: "busybox", Cmd: []string{"/bin/echo", "hello world"}, } for desc, test := range map[string]struct { dOpts []string logsSupported bool }{ "default": {logsSupported: true}, "disabled caching": {[]string{"--log-opt=cache-disabled=true"}, false}, "explicitly enabled caching": {[]string{"--log-opt=cache-disabled=false"}, true}, } { t.Run(desc, func(t *testing.T) { d.Start(t, append([]string{"--iptables=false"}, test.dOpts...)...) defer d.Stop(t) c, err := client.ContainerCreate(ctx, cfg, &container.HostConfig{LogConfig: container.LogConfig{Type: "test"}}, nil, nil, "", ) assert.Assert(t, err) defer client.ContainerRemove(ctx, c.ID, types.ContainerRemoveOptions{Force: true}) err = client.ContainerStart(ctx, c.ID, types.ContainerStartOptions{}) assert.Assert(t, err) logs, err := client.ContainerLogs(ctx, c.ID, types.ContainerLogsOptions{ShowStdout: true}) if !test.logsSupported { assert.Assert(t, err != nil) return } assert.Assert(t, err) defer logs.Close() buf := bytes.NewBuffer(nil) errCh := make(chan error, 1) go func() { _, err := stdcopy.StdCopy(buf, buf, logs) errCh <- err }() select { case <-time.After(60 * time.Second): t.Fatal("timeout waiting for IO to complete") case err := <-errCh: assert.Assert(t, err) } assert.Assert(t, strings.TrimSpace(buf.String()) == "hello world", buf.Bytes()) }) } }