|  | // 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. | 
|  |  | 
|  | // +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) | 
|  | } | 
|  | } | 
|  | } |