package dockerversion import ( "context" "testing" "github.com/moby/moby/v2/pkg/useragent" "gotest.tools/v3/assert" is "gotest.tools/v3/assert/cmp" ) func TestDockerUserAgent(t *testing.T) { tests := []struct { doc string ctx context.Context metadata []useragent.VersionInfo expected string }{ { doc: "daemon user-agent", ctx: t.Context(), expected: getDaemonUserAgent(), }, { doc: "daemon user-agent custom metadata", ctx: t.Context(), metadata: []useragent.VersionInfo{ {Name: "hello", Version: "world"}, {Name: "foo", Version: "bar"}, }, expected: getDaemonUserAgent() + ` hello/world foo/bar`, }, { doc: "daemon user-agent with upstream", ctx: WithUpstreamUserAgent(t.Context(), "Magic-Client/1.2.3 (linux)"), expected: getDaemonUserAgent() + ` UpstreamClient(Magic-Client/1.2.3 \(linux\))`, }, { doc: "daemon user-agent with upstream and custom metadata", ctx: WithUpstreamUserAgent(t.Context(), "Magic-Client/1.2.3 (linux)"), metadata: []useragent.VersionInfo{ {Name: "hello", Version: "world"}, {Name: "foo", Version: "bar"}, }, expected: getDaemonUserAgent() + ` hello/world foo/bar UpstreamClient(Magic-Client/1.2.3 \(linux\))`, }, { doc: "daemon user-agent with upstream special chars", ctx: WithUpstreamUserAgent(t.Context(), `Magic-Client/1.2.3 (linux); \ test`), expected: getDaemonUserAgent() + ` UpstreamClient(Magic-Client/1.2.3 \(linux\)\; \\ test)`, }, { doc: "daemon user-agent with upstream control chars", ctx: WithUpstreamUserAgent(t.Context(), "Magic-Client/1.2.3\r\nInjected: evil"), expected: getDaemonUserAgent() + ` UpstreamClient(Magic-Client/1.2.3Injected: evil)`, }, } for _, tc := range tests { t.Run(tc.doc, func(t *testing.T) { assert.Check(t, is.Equal(DockerUserAgent(tc.ctx, tc.metadata...), tc.expected)) }) } }