github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/daemon/logger/syslog/syslog_test.go (about)

     1  package syslog // import "github.com/docker/docker/daemon/logger/syslog"
     2  
     3  import (
     4  	"net"
     5  	"reflect"
     6  	"testing"
     7  
     8  	syslog "github.com/RackSec/srslog"
     9  )
    10  
    11  func functionMatches(expectedFun interface{}, actualFun interface{}) bool {
    12  	return reflect.ValueOf(expectedFun).Pointer() == reflect.ValueOf(actualFun).Pointer()
    13  }
    14  
    15  func TestParseLogFormat(t *testing.T) {
    16  	formatter, framer, err := parseLogFormat("rfc5424", "udp")
    17  	if err != nil || !functionMatches(rfc5424formatterWithAppNameAsTag, formatter) ||
    18  		!functionMatches(syslog.DefaultFramer, framer) {
    19  		t.Fatal("Failed to parse rfc5424 format", err, formatter, framer)
    20  	}
    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  
    28  	formatter, framer, err = parseLogFormat("rfc5424micro", "udp")
    29  	if err != nil || !functionMatches(rfc5424microformatterWithAppNameAsTag, formatter) ||
    30  		!functionMatches(syslog.DefaultFramer, framer) {
    31  		t.Fatal("Failed to parse rfc5424 (microsecond) format", err, formatter, framer)
    32  	}
    33  
    34  	formatter, framer, err = parseLogFormat("rfc5424micro", "tcp+tls")
    35  	if err != nil || !functionMatches(rfc5424microformatterWithAppNameAsTag, formatter) ||
    36  		!functionMatches(syslog.RFC5425MessageLengthFramer, framer) {
    37  		t.Fatal("Failed to parse rfc5424 (microsecond) format", err, formatter, framer)
    38  	}
    39  
    40  	formatter, framer, err = parseLogFormat("rfc3164", "")
    41  	if err != nil || !functionMatches(syslog.RFC3164Formatter, formatter) ||
    42  		!functionMatches(syslog.DefaultFramer, framer) {
    43  		t.Fatal("Failed to parse rfc3164 format", err, formatter, framer)
    44  	}
    45  
    46  	formatter, framer, err = parseLogFormat("", "")
    47  	if err != nil || !functionMatches(syslog.UnixFormatter, formatter) ||
    48  		!functionMatches(syslog.DefaultFramer, framer) {
    49  		t.Fatal("Failed to parse empty format", err, formatter, framer)
    50  	}
    51  
    52  	formatter, framer, err = parseLogFormat("invalid", "")
    53  	if err == nil {
    54  		t.Fatal("Failed to parse invalid format", err, formatter, framer)
    55  	}
    56  }
    57  
    58  func TestValidateLogOptEmpty(t *testing.T) {
    59  	emptyConfig := make(map[string]string)
    60  	if err := ValidateLogOpt(emptyConfig); err != nil {
    61  		t.Fatal("Failed to parse empty config", err)
    62  	}
    63  }
    64  
    65  func TestValidateSyslogAddress(t *testing.T) {
    66  	err := ValidateLogOpt(map[string]string{
    67  		"syslog-address": "this is not an uri",
    68  	})
    69  	if err == nil {
    70  		t.Fatal("Expected error with invalid uri")
    71  	}
    72  
    73  	// File exists
    74  	err = ValidateLogOpt(map[string]string{
    75  		"syslog-address": "unix:///",
    76  	})
    77  	if err != nil {
    78  		t.Fatal(err)
    79  	}
    80  
    81  	// File does not exist
    82  	err = ValidateLogOpt(map[string]string{
    83  		"syslog-address": "unix:///does_not_exist",
    84  	})
    85  	if err == nil {
    86  		t.Fatal("Expected error when address is non existing file")
    87  	}
    88  
    89  	// accepts udp and tcp URIs
    90  	err = ValidateLogOpt(map[string]string{
    91  		"syslog-address": "udp://1.2.3.4",
    92  	})
    93  	if err != nil {
    94  		t.Fatal(err)
    95  	}
    96  
    97  	err = ValidateLogOpt(map[string]string{
    98  		"syslog-address": "tcp://1.2.3.4",
    99  	})
   100  	if err != nil {
   101  		t.Fatal(err)
   102  	}
   103  }
   104  
   105  func TestParseAddressDefaultPort(t *testing.T) {
   106  	_, address, err := parseAddress("tcp://1.2.3.4")
   107  	if err != nil {
   108  		t.Fatal(err)
   109  	}
   110  
   111  	_, port, _ := net.SplitHostPort(address)
   112  	if port != "514" {
   113  		t.Fatalf("Expected to default to port 514. It used port %s", port)
   114  	}
   115  }
   116  
   117  func TestValidateSyslogFacility(t *testing.T) {
   118  	err := ValidateLogOpt(map[string]string{
   119  		"syslog-facility": "Invalid facility",
   120  	})
   121  	if err == nil {
   122  		t.Fatal("Expected error if facility level is invalid")
   123  	}
   124  }
   125  
   126  func TestValidateLogOptSyslogFormat(t *testing.T) {
   127  	err := ValidateLogOpt(map[string]string{
   128  		"syslog-format": "Invalid format",
   129  	})
   130  	if err == nil {
   131  		t.Fatal("Expected error if format is invalid")
   132  	}
   133  }
   134  
   135  func TestValidateLogOpt(t *testing.T) {
   136  	err := ValidateLogOpt(map[string]string{
   137  		"env":                    "http://127.0.0.1",
   138  		"env-regex":              "abc",
   139  		"labels":                 "labelA",
   140  		"labels-regex":           "def",
   141  		"syslog-address":         "udp://1.2.3.4:1111",
   142  		"syslog-facility":        "daemon",
   143  		"syslog-tls-ca-cert":     "/etc/ca-certificates/custom/ca.pem",
   144  		"syslog-tls-cert":        "/etc/ca-certificates/custom/cert.pem",
   145  		"syslog-tls-key":         "/etc/ca-certificates/custom/key.pem",
   146  		"syslog-tls-skip-verify": "true",
   147  		"tag":                    "true",
   148  		"syslog-format":          "rfc3164",
   149  	})
   150  	if err != nil {
   151  		t.Fatal(err)
   152  	}
   153  
   154  	err = ValidateLogOpt(map[string]string{
   155  		"not-supported-option": "a",
   156  	})
   157  	if err == nil {
   158  		t.Fatal("Expecting error on unsupported options")
   159  	}
   160  }