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