| // Copyright 2015 The Go Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style | 
 | // license that can be found in the LICENSE file. | 
 |  | 
 | //go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris | 
 | // +build darwin dragonfly freebsd linux netbsd openbsd solaris | 
 |  | 
 | package net | 
 |  | 
 | import ( | 
 | 	"reflect" | 
 | 	"strings" | 
 | 	"testing" | 
 | ) | 
 |  | 
 | const ubuntuTrustyAvahi = `# /etc/nsswitch.conf | 
 | # | 
 | # Example configuration of GNU Name Service Switch functionality. | 
 | # If you have the libc-doc-reference' and nfo' packages installed, try: | 
 | # nfo libc "Name Service Switch"' for information about this file. | 
 |  | 
 | passwd:         compat | 
 | group:          compat | 
 | shadow:         compat | 
 |  | 
 | hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4 | 
 | networks:       files | 
 |  | 
 | protocols:      db files | 
 | services:       db files | 
 | ethers:         db files | 
 | rpc:            db files | 
 |  | 
 | netgroup:       nis | 
 | ` | 
 |  | 
 | func TestParseNSSConf(t *testing.T) { | 
 | 	tests := []struct { | 
 | 		name string | 
 | 		in   string | 
 | 		want *nssConf | 
 | 	}{ | 
 | 		{ | 
 | 			name: "no_newline", | 
 | 			in:   "foo: a b", | 
 | 			want: &nssConf{ | 
 | 				sources: map[string][]nssSource{ | 
 | 					"foo": {{source: "a"}, {source: "b"}}, | 
 | 				}, | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			name: "newline", | 
 | 			in:   "foo: a b\n", | 
 | 			want: &nssConf{ | 
 | 				sources: map[string][]nssSource{ | 
 | 					"foo": {{source: "a"}, {source: "b"}}, | 
 | 				}, | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			name: "whitespace", | 
 | 			in:   "   foo:a    b    \n", | 
 | 			want: &nssConf{ | 
 | 				sources: map[string][]nssSource{ | 
 | 					"foo": {{source: "a"}, {source: "b"}}, | 
 | 				}, | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			name: "comment1", | 
 | 			in:   "   foo:a    b#c\n", | 
 | 			want: &nssConf{ | 
 | 				sources: map[string][]nssSource{ | 
 | 					"foo": {{source: "a"}, {source: "b"}}, | 
 | 				}, | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			name: "comment2", | 
 | 			in:   "   foo:a    b #c \n", | 
 | 			want: &nssConf{ | 
 | 				sources: map[string][]nssSource{ | 
 | 					"foo": {{source: "a"}, {source: "b"}}, | 
 | 				}, | 
 | 			}, | 
 | 		}, | 
 | 		{ | 
 | 			name: "crit", | 
 | 			in:   "   foo:a    b [!a=b    X=Y ] c#d \n", | 
 | 			want: &nssConf{ | 
 | 				sources: map[string][]nssSource{ | 
 | 					"foo": { | 
 | 						{source: "a"}, | 
 | 						{ | 
 | 							source: "b", | 
 | 							criteria: []nssCriterion{ | 
 | 								{ | 
 | 									negate: true, | 
 | 									status: "a", | 
 | 									action: "b", | 
 | 								}, | 
 | 								{ | 
 | 									status: "x", | 
 | 									action: "y", | 
 | 								}, | 
 | 							}, | 
 | 						}, | 
 | 						{source: "c"}, | 
 | 					}, | 
 | 				}, | 
 | 			}, | 
 | 		}, | 
 |  | 
 | 		// Ubuntu Trusty w/ avahi-daemon, libavahi-* etc installed. | 
 | 		{ | 
 | 			name: "ubuntu_trusty_avahi", | 
 | 			in:   ubuntuTrustyAvahi, | 
 | 			want: &nssConf{ | 
 | 				sources: map[string][]nssSource{ | 
 | 					"passwd": {{source: "compat"}}, | 
 | 					"group":  {{source: "compat"}}, | 
 | 					"shadow": {{source: "compat"}}, | 
 | 					"hosts": { | 
 | 						{source: "files"}, | 
 | 						{ | 
 | 							source: "mdns4_minimal", | 
 | 							criteria: []nssCriterion{ | 
 | 								{ | 
 | 									negate: false, | 
 | 									status: "notfound", | 
 | 									action: "return", | 
 | 								}, | 
 | 							}, | 
 | 						}, | 
 | 						{source: "dns"}, | 
 | 						{source: "mdns4"}, | 
 | 					}, | 
 | 					"networks": {{source: "files"}}, | 
 | 					"protocols": { | 
 | 						{source: "db"}, | 
 | 						{source: "files"}, | 
 | 					}, | 
 | 					"services": { | 
 | 						{source: "db"}, | 
 | 						{source: "files"}, | 
 | 					}, | 
 | 					"ethers": { | 
 | 						{source: "db"}, | 
 | 						{source: "files"}, | 
 | 					}, | 
 | 					"rpc": { | 
 | 						{source: "db"}, | 
 | 						{source: "files"}, | 
 | 					}, | 
 | 					"netgroup": { | 
 | 						{source: "nis"}, | 
 | 					}, | 
 | 				}, | 
 | 			}, | 
 | 		}, | 
 | 	} | 
 |  | 
 | 	for _, tt := range tests { | 
 | 		gotConf := parseNSSConf(strings.NewReader(tt.in)) | 
 | 		if !reflect.DeepEqual(gotConf, tt.want) { | 
 | 			t.Errorf("%s: mismatch\n got %#v\nwant %#v", tt.name, gotConf, tt.want) | 
 | 		} | 
 | 	} | 
 | } |