github.com/karrick/go@v0.0.0-20170817181416-d5b0ec858b37/src/net/nss_test.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // +build darwin dragonfly freebsd linux netbsd openbsd solaris
     6  
     7  package net
     8  
     9  import (
    10  	"reflect"
    11  	"strings"
    12  	"testing"
    13  )
    14  
    15  const ubuntuTrustyAvahi = `# /etc/nsswitch.conf
    16  #
    17  # Example configuration of GNU Name Service Switch functionality.
    18  # If you have the libc-doc-reference' and nfo' packages installed, try:
    19  # nfo libc "Name Service Switch"' for information about this file.
    20  
    21  passwd:         compat
    22  group:          compat
    23  shadow:         compat
    24  
    25  hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
    26  networks:       files
    27  
    28  protocols:      db files
    29  services:       db files
    30  ethers:         db files
    31  rpc:            db files
    32  
    33  netgroup:       nis
    34  `
    35  
    36  func TestParseNSSConf(t *testing.T) {
    37  	tests := []struct {
    38  		name string
    39  		in   string
    40  		want *nssConf
    41  	}{
    42  		{
    43  			name: "no_newline",
    44  			in:   "foo: a b",
    45  			want: &nssConf{
    46  				sources: map[string][]nssSource{
    47  					"foo": {{source: "a"}, {source: "b"}},
    48  				},
    49  			},
    50  		},
    51  		{
    52  			name: "newline",
    53  			in:   "foo: a b\n",
    54  			want: &nssConf{
    55  				sources: map[string][]nssSource{
    56  					"foo": {{source: "a"}, {source: "b"}},
    57  				},
    58  			},
    59  		},
    60  		{
    61  			name: "whitespace",
    62  			in:   "   foo:a    b    \n",
    63  			want: &nssConf{
    64  				sources: map[string][]nssSource{
    65  					"foo": {{source: "a"}, {source: "b"}},
    66  				},
    67  			},
    68  		},
    69  		{
    70  			name: "comment1",
    71  			in:   "   foo:a    b#c\n",
    72  			want: &nssConf{
    73  				sources: map[string][]nssSource{
    74  					"foo": {{source: "a"}, {source: "b"}},
    75  				},
    76  			},
    77  		},
    78  		{
    79  			name: "comment2",
    80  			in:   "   foo:a    b #c \n",
    81  			want: &nssConf{
    82  				sources: map[string][]nssSource{
    83  					"foo": {{source: "a"}, {source: "b"}},
    84  				},
    85  			},
    86  		},
    87  		{
    88  			name: "crit",
    89  			in:   "   foo:a    b [!a=b    X=Y ] c#d \n",
    90  			want: &nssConf{
    91  				sources: map[string][]nssSource{
    92  					"foo": {
    93  						{source: "a"},
    94  						{
    95  							source: "b",
    96  							criteria: []nssCriterion{
    97  								{
    98  									negate: true,
    99  									status: "a",
   100  									action: "b",
   101  								},
   102  								{
   103  									status: "x",
   104  									action: "y",
   105  								},
   106  							},
   107  						},
   108  						{source: "c"},
   109  					},
   110  				},
   111  			},
   112  		},
   113  
   114  		// Ubuntu Trusty w/ avahi-daemon, libavahi-* etc installed.
   115  		{
   116  			name: "ubuntu_trusty_avahi",
   117  			in:   ubuntuTrustyAvahi,
   118  			want: &nssConf{
   119  				sources: map[string][]nssSource{
   120  					"passwd": {{source: "compat"}},
   121  					"group":  {{source: "compat"}},
   122  					"shadow": {{source: "compat"}},
   123  					"hosts": {
   124  						{source: "files"},
   125  						{
   126  							source: "mdns4_minimal",
   127  							criteria: []nssCriterion{
   128  								{
   129  									negate: false,
   130  									status: "notfound",
   131  									action: "return",
   132  								},
   133  							},
   134  						},
   135  						{source: "dns"},
   136  						{source: "mdns4"},
   137  					},
   138  					"networks": {{source: "files"}},
   139  					"protocols": {
   140  						{source: "db"},
   141  						{source: "files"},
   142  					},
   143  					"services": {
   144  						{source: "db"},
   145  						{source: "files"},
   146  					},
   147  					"ethers": {
   148  						{source: "db"},
   149  						{source: "files"},
   150  					},
   151  					"rpc": {
   152  						{source: "db"},
   153  						{source: "files"},
   154  					},
   155  					"netgroup": {
   156  						{source: "nis"},
   157  					},
   158  				},
   159  			},
   160  		},
   161  	}
   162  
   163  	for _, tt := range tests {
   164  		gotConf := parseNSSConf(strings.NewReader(tt.in))
   165  		if !reflect.DeepEqual(gotConf, tt.want) {
   166  			t.Errorf("%s: mismatch\n got %#v\nwant %#v", tt.name, gotConf, tt.want)
   167  		}
   168  	}
   169  }