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