| 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()) |
| }) |
| } |
| |
| } |