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//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
6
7package net
8
9import (
10	"reflect"
11	"testing"
12	"time"
13)
14
15const 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
21passwd:         compat
22group:          compat
23shadow:         compat
24
25hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4
26networks:       files
27
28protocols:      db files
29services:       db files
30ethers:         db files
31rpc:            db files
32
33netgroup:       nis
34`
35
36func TestParseNSSConf(t *testing.T) {
37	t.Parallel()
38
39	tests := []struct {
40		name string
41		in   string
42		want *nssConf
43	}{
44		{
45			name: "no_newline",
46			in:   "foo: a b",
47			want: &nssConf{
48				sources: map[string][]nssSource{
49					"foo": {{source: "a"}, {source: "b"}},
50				},
51			},
52		},
53		{
54			name: "newline",
55			in:   "foo: a b\n",
56			want: &nssConf{
57				sources: map[string][]nssSource{
58					"foo": {{source: "a"}, {source: "b"}},
59				},
60			},
61		},
62		{
63			name: "whitespace",
64			in:   "   foo:a    b    \n",
65			want: &nssConf{
66				sources: map[string][]nssSource{
67					"foo": {{source: "a"}, {source: "b"}},
68				},
69			},
70		},
71		{
72			name: "comment1",
73			in:   "   foo:a    b#c\n",
74			want: &nssConf{
75				sources: map[string][]nssSource{
76					"foo": {{source: "a"}, {source: "b"}},
77				},
78			},
79		},
80		{
81			name: "comment2",
82			in:   "   foo:a    b #c \n",
83			want: &nssConf{
84				sources: map[string][]nssSource{
85					"foo": {{source: "a"}, {source: "b"}},
86				},
87			},
88		},
89		{
90			name: "crit",
91			in:   "   foo:a    b [!a=b    X=Y ] c#d \n",
92			want: &nssConf{
93				sources: map[string][]nssSource{
94					"foo": {
95						{source: "a"},
96						{
97							source: "b",
98							criteria: []nssCriterion{
99								{
100									negate: true,
101									status: "a",
102									action: "b",
103								},
104								{
105									status: "x",
106									action: "y",
107								},
108							},
109						},
110						{source: "c"},
111					},
112				},
113			},
114		},
115
116		// Ubuntu Trusty w/ avahi-daemon, libavahi-* etc installed.
117		{
118			name: "ubuntu_trusty_avahi",
119			in:   ubuntuTrustyAvahi,
120			want: &nssConf{
121				sources: map[string][]nssSource{
122					"passwd": {{source: "compat"}},
123					"group":  {{source: "compat"}},
124					"shadow": {{source: "compat"}},
125					"hosts": {
126						{source: "files"},
127						{
128							source: "mdns4_minimal",
129							criteria: []nssCriterion{
130								{
131									negate: false,
132									status: "notfound",
133									action: "return",
134								},
135							},
136						},
137						{source: "dns"},
138						{source: "mdns4"},
139					},
140					"networks": {{source: "files"}},
141					"protocols": {
142						{source: "db"},
143						{source: "files"},
144					},
145					"services": {
146						{source: "db"},
147						{source: "files"},
148					},
149					"ethers": {
150						{source: "db"},
151						{source: "files"},
152					},
153					"rpc": {
154						{source: "db"},
155						{source: "files"},
156					},
157					"netgroup": {
158						{source: "nis"},
159					},
160				},
161			},
162		},
163	}
164
165	for _, tt := range tests {
166		gotConf := nssStr(t, tt.in)
167		gotConf.mtime = time.Time{} // ignore mtime in comparison
168		if !reflect.DeepEqual(gotConf, tt.want) {
169			t.Errorf("%s: mismatch\n got %#v\nwant %#v", tt.name, gotConf, tt.want)
170		}
171	}
172}
173