1 // Copyright (C) 2021 Simon Ruderich
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 // GNU General Public License for more details.
13 // You should have received a copy of the GNU General Public License
14 // along with this program. If not, see <http://www.gnu.org/licenses/>.
24 "ruderich.org/simon/safcm/testutil"
27 func TestLoadGroups(t *testing.T) {
28 cwd, err := os.Getwd()
34 err = os.Chdir("../testdata/project")
38 hosts, err := LoadHosts()
51 exp map[string][]string
56 "../testdata/project",
58 GroupPriority: []string{
89 "all_except_some:remove": {
106 "../testdata/project",
108 GroupPriority: []string{
115 fmt.Errorf("config.yaml: group_priority: group \"does-not-exist\" does not exist"),
118 "../testdata/project",
120 GroupPriority: []string{
127 fmt.Errorf("config.yaml: group_priority: invalid group name \"special:group\""),
130 "../testdata/project",
132 GroupPriority: []string{
139 fmt.Errorf("config.yaml: group_priority: invalid group name \"group:remove\""),
143 "../testdata/group-invalid-all",
147 fmt.Errorf("groups.yaml: group \"all\": conflict with pre-defined group \"all\""),
150 "../testdata/group-invalid-all-remove",
154 fmt.Errorf("groups.yaml: group \"all:remove\": conflict with pre-defined group \"all:remove\""),
157 "../testdata/group-invalid-conflict",
161 fmt.Errorf("groups.yaml: group \"host2\": conflict with existing host"),
164 "../testdata/group-invalid-conflict-remove",
168 fmt.Errorf("groups.yaml: group \"host2:remove\": conflict with existing host"),
171 "../testdata/group-invalid-detected",
175 fmt.Errorf("groups.yaml: group \"detected_linux\": name must not start with \"detected\" (reserved for detected groups)"),
178 "../testdata/group-invalid-member",
182 fmt.Errorf("groups.yaml: group \"group1\": member \"special:member\" must not contain \":\""),
185 "../testdata/group-invalid-missing",
189 fmt.Errorf("groups.yaml: group \"group2\": member \"does-not-exist\" not found"),
192 "../testdata/group-invalid-name",
196 fmt.Errorf("groups.yaml: group \"invalid.group.name\": name contains invalid characters (must match ^[a-z0-9_-]+$)"),
200 for _, tc := range tests {
201 t.Run(tc.path, func(t *testing.T) {
202 err := os.Chdir(filepath.Join(cwd, tc.path))
207 res, err := LoadGroups(tc.cfg, tc.hosts)
208 testutil.AssertEqual(t, "res", res, tc.exp)
209 testutil.AssertErrorEqual(t, "err", err, tc.expErr)
214 func TestResolveHostGroups(t *testing.T) {
215 cwd, err := os.Getwd()
221 err = os.Chdir("../testdata/project")
225 allHosts, err := LoadHosts()
229 allGroups, err := LoadGroups(&Config{}, allHosts)
291 "host1, detected_mips",
306 "host2, detected_linux",
321 for _, tc := range tests {
322 t.Run(tc.name, func(t *testing.T) {
323 res, err := ResolveHostGroups(tc.host, allGroups,
325 testutil.AssertEqual(t, "res", res, tc.exp)
326 testutil.AssertErrorEqual(t, "err", err, tc.expErr)
331 func TestTransitivelyDetectedGroups(t *testing.T) {
334 groups map[string][]string
358 "detected as direct member",
376 "detected as direct :remove member",
398 "detected as transitive member",
431 "detected as transitive :remove member",
466 for _, tc := range tests {
467 t.Run(tc.name, func(t *testing.T) {
468 res := TransitivelyDetectedGroups(tc.groups)
469 testutil.AssertEqual(t, "res", res, tc.exp)