package fluentd // import "github.com/docker/docker/daemon/logger/fluentd" import ( "testing" "github.com/google/go-cmp/cmp" "gotest.tools/v3/assert" ) func TestValidateLogOptReconnectInterval(t *testing.T) { invalidIntervals := []string{"-1", "1", "-1s", "99ms", "11s"} for _, v := range invalidIntervals { t.Run("invalid "+v, func(t *testing.T) { err := ValidateLogOpt(map[string]string{asyncReconnectIntervalKey: v}) assert.ErrorContains(t, err, "invalid value for fluentd-async-reconnect-interval:") }) } validIntervals := []string{"100ms", "10s"} for _, v := range validIntervals { t.Run("valid "+v, func(t *testing.T) { err := ValidateLogOpt(map[string]string{asyncReconnectIntervalKey: v}) assert.NilError(t, err) }) } } func TestValidateLogOptAddress(t *testing.T) { // ports to try, and their results validPorts := map[string]int{ "": defaultPort, ":": defaultPort, ":123": 123, ":65535": 65535, } // paths to try, which should result in an error paths := []string{"/", "/some-path"} tests := []struct { addr string ports map[string]int // combinations of addr + port -> expected port paths []string // paths to append to addr, should be an error for tcp/udp expected location expectedErr string }{ { addr: "", expected: location{ protocol: defaultProtocol, host: defaultHost, port: defaultPort, }, }, { addr: "192.168.1.1", ports: validPorts, paths: paths, expected: location{ protocol: defaultProtocol, host: "192.168.1.1", }, }, { addr: "[::1]", ports: validPorts, paths: paths, expected: location{ protocol: defaultProtocol, host: "::1", }, }, { addr: "example.com", ports: validPorts, paths: paths, expected: location{ protocol: defaultProtocol, host: "example.com", }, }, { addr: "tcp://", paths: paths, expected: location{ protocol: "tcp", host: defaultHost, port: defaultPort, }, }, { addr: "tcp://example.com", ports: validPorts, paths: paths, expected: location{ protocol: "tcp", host: "example.com", }, }, { addr: "tls://", paths: paths, expected: location{ protocol: "tls", host: defaultHost, port: defaultPort, }, }, { addr: "tls://example.com", ports: validPorts, paths: paths, expected: location{ protocol: "tls", host: "example.com", }, }, { addr: "://", expectedErr: "missing protocol scheme", }, { addr: "something://", expectedErr: "unsupported scheme: 'something'", }, { addr: "udp://", expectedErr: "unsupported scheme: 'udp'", }, { addr: "unixgram://", expectedErr: "unsupported scheme: 'unixgram'", }, { addr: "tcp+tls://", expectedErr: "unsupported scheme: 'tcp+tls'", }, { addr: "corrupted:c", expectedErr: "invalid port", }, { addr: "tcp://example.com:port", expectedErr: "invalid port", }, { addr: "tcp://example.com:-1", expectedErr: "invalid port", }, { addr: "tcp://example.com:65536", expectedErr: "invalid port", }, { addr: "unix://", expectedErr: "path is empty", }, { addr: "unix:///some/socket.sock", expected: location{ protocol: "unix", path: "/some/socket.sock", }, }, { addr: "unix:///some/socket.sock:80", // unusual, but technically valid expected: location{ protocol: "unix", path: "/some/socket.sock:80", }, }, } for _, tc := range tests { tc := tc if len(tc.ports) == 0 { tc.ports = map[string]int{"": tc.expected.port} } // always try empty paths; add paths to try if the test specifies it tc.paths = append([]string{""}, tc.paths...) for port, expectedPort := range tc.ports { for _, path := range tc.paths { address := tc.addr + port + path expected := tc.expected expected.port = expectedPort t.Run(address, func(t *testing.T) { err := ValidateLogOpt(map[string]string{addressKey: address}) if path != "" { assert.ErrorContains(t, err, "should not contain a path element") return } if tc.expectedErr != "" { assert.ErrorContains(t, err, tc.expectedErr) return } assert.NilError(t, err) addr, _ := parseAddress(address) assert.DeepEqual(t, expected, *addr, cmp.AllowUnexported(location{})) }) } } } }