syslog_test.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package syslog // import "github.com/docker/docker/daemon/logger/syslog"
  2. import (
  3. "log"
  4. "net"
  5. "os"
  6. "path/filepath"
  7. "reflect"
  8. "runtime"
  9. "strings"
  10. "testing"
  11. syslog "github.com/RackSec/srslog"
  12. )
  13. func functionMatches(expectedFun interface{}, actualFun interface{}) bool {
  14. return reflect.ValueOf(expectedFun).Pointer() == reflect.ValueOf(actualFun).Pointer()
  15. }
  16. func TestParseLogFormat(t *testing.T) {
  17. formatter, framer, err := parseLogFormat("rfc5424", "udp")
  18. if err != nil || !functionMatches(rfc5424formatterWithAppNameAsTag, formatter) ||
  19. !functionMatches(syslog.DefaultFramer, framer) {
  20. t.Fatal("Failed to parse rfc5424 format", err, formatter, framer)
  21. }
  22. formatter, framer, err = parseLogFormat("rfc5424", "tcp+tls")
  23. if err != nil || !functionMatches(rfc5424formatterWithAppNameAsTag, formatter) ||
  24. !functionMatches(syslog.RFC5425MessageLengthFramer, framer) {
  25. t.Fatal("Failed to parse rfc5424 format", err, formatter, framer)
  26. }
  27. formatter, framer, err = parseLogFormat("rfc5424micro", "udp")
  28. if err != nil || !functionMatches(rfc5424microformatterWithAppNameAsTag, formatter) ||
  29. !functionMatches(syslog.DefaultFramer, framer) {
  30. t.Fatal("Failed to parse rfc5424 (microsecond) format", err, formatter, framer)
  31. }
  32. formatter, framer, err = parseLogFormat("rfc5424micro", "tcp+tls")
  33. if err != nil || !functionMatches(rfc5424microformatterWithAppNameAsTag, formatter) ||
  34. !functionMatches(syslog.RFC5425MessageLengthFramer, framer) {
  35. t.Fatal("Failed to parse rfc5424 (microsecond) format", err, formatter, framer)
  36. }
  37. formatter, framer, err = parseLogFormat("rfc3164", "")
  38. if err != nil || !functionMatches(syslog.RFC3164Formatter, formatter) ||
  39. !functionMatches(syslog.DefaultFramer, framer) {
  40. t.Fatal("Failed to parse rfc3164 format", err, formatter, framer)
  41. }
  42. formatter, framer, err = parseLogFormat("", "")
  43. if err != nil || !functionMatches(syslog.UnixFormatter, formatter) ||
  44. !functionMatches(syslog.DefaultFramer, framer) {
  45. t.Fatal("Failed to parse empty format", err, formatter, framer)
  46. }
  47. formatter, framer, err = parseLogFormat("invalid", "")
  48. if err == nil {
  49. t.Fatal("Failed to parse invalid format", err, formatter, framer)
  50. }
  51. }
  52. func TestValidateLogOptEmpty(t *testing.T) {
  53. emptyConfig := make(map[string]string)
  54. if err := ValidateLogOpt(emptyConfig); err != nil {
  55. t.Fatal("Failed to parse empty config", err)
  56. }
  57. }
  58. func TestValidateSyslogAddress(t *testing.T) {
  59. const sockPlaceholder = "/TEMPDIR/socket.sock"
  60. s, err := os.Create(filepath.Join(t.TempDir(), "socket.sock"))
  61. if err != nil {
  62. log.Fatal(err)
  63. }
  64. socketPath := s.Name()
  65. _ = s.Close()
  66. tests := []struct {
  67. address string
  68. expectedErr string
  69. skipOn string
  70. }{
  71. {
  72. address: "this is not an uri",
  73. expectedErr: "unsupported scheme: ''",
  74. },
  75. {
  76. address: "corrupted:42",
  77. expectedErr: "unsupported scheme: 'corrupted'",
  78. },
  79. {
  80. address: "unix://" + sockPlaceholder,
  81. skipOn: "windows", // doesn't work with unix:// sockets
  82. },
  83. {
  84. address: "unix:///does_not_exist",
  85. expectedErr: "no such file or directory",
  86. skipOn: "windows", // error message differs
  87. },
  88. {
  89. address: "tcp://1.2.3.4",
  90. },
  91. {
  92. address: "udp://1.2.3.4",
  93. },
  94. {
  95. address: "http://1.2.3.4",
  96. expectedErr: "unsupported scheme: 'http'",
  97. },
  98. }
  99. for _, tc := range tests {
  100. tc := tc
  101. if tc.skipOn == runtime.GOOS {
  102. continue
  103. }
  104. t.Run(tc.address, func(t *testing.T) {
  105. address := strings.Replace(tc.address, sockPlaceholder, socketPath, 1)
  106. err := ValidateLogOpt(map[string]string{"syslog-address": address})
  107. if tc.expectedErr != "" {
  108. if err == nil {
  109. t.Fatal("expected an error, got nil")
  110. }
  111. if !strings.Contains(err.Error(), tc.expectedErr) {
  112. t.Fatalf("expected error to contain '%s', got: '%s'", tc.expectedErr, err)
  113. }
  114. } else if err != nil {
  115. t.Fatalf("unexpected error: '%s'", err)
  116. }
  117. })
  118. }
  119. }
  120. func TestParseAddressDefaultPort(t *testing.T) {
  121. _, address, err := parseAddress("tcp://1.2.3.4")
  122. if err != nil {
  123. t.Fatal(err)
  124. }
  125. _, port, _ := net.SplitHostPort(address)
  126. if port != defaultPort {
  127. t.Fatalf("Expected to default to port %s. It used port %s", defaultPort, port)
  128. }
  129. }
  130. func TestValidateSyslogFacility(t *testing.T) {
  131. err := ValidateLogOpt(map[string]string{
  132. "syslog-facility": "Invalid facility",
  133. })
  134. if err == nil {
  135. t.Fatal("Expected error if facility level is invalid")
  136. }
  137. }
  138. func TestValidateLogOptSyslogFormat(t *testing.T) {
  139. err := ValidateLogOpt(map[string]string{
  140. "syslog-format": "Invalid format",
  141. })
  142. if err == nil {
  143. t.Fatal("Expected error if format is invalid")
  144. }
  145. }
  146. func TestValidateLogOpt(t *testing.T) {
  147. err := ValidateLogOpt(map[string]string{
  148. "env": "http://127.0.0.1",
  149. "env-regex": "abc",
  150. "labels": "labelA",
  151. "labels-regex": "def",
  152. "syslog-address": "udp://1.2.3.4:1111",
  153. "syslog-facility": "daemon",
  154. "syslog-tls-ca-cert": "/etc/ca-certificates/custom/ca.pem",
  155. "syslog-tls-cert": "/etc/ca-certificates/custom/cert.pem",
  156. "syslog-tls-key": "/etc/ca-certificates/custom/key.pem",
  157. "syslog-tls-skip-verify": "true",
  158. "tag": "true",
  159. "syslog-format": "rfc3164",
  160. })
  161. if err != nil {
  162. t.Fatal(err)
  163. }
  164. err = ValidateLogOpt(map[string]string{
  165. "not-supported-option": "a",
  166. })
  167. if err == nil {
  168. t.Fatal("Expecting error on unsupported options")
  169. }
  170. }