X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=cmd%2Fsafcm%2Fconfig%2Fgroups_test.go;h=7c3dd483393e9dbb5791004633358912c705285b;hb=77f373a4aa590711155e3af0b768997781f81559;hp=ccf096897859dd775b71a86f72919d8c597d87dc;hpb=f2f2bc47e8729548f3c10117f7f008b547c4afc5;p=safcm%2Fsafcm.git diff --git a/cmd/safcm/config/groups_test.go b/cmd/safcm/config/groups_test.go index ccf0968..7c3dd48 100644 --- a/cmd/safcm/config/groups_test.go +++ b/cmd/safcm/config/groups_test.go @@ -18,10 +18,10 @@ package config import ( "fmt" "os" - "reflect" + "path/filepath" "testing" - "github.com/google/go-cmp/cmp" + "ruderich.org/simon/safcm/testutil" ) func TestLoadGroups(t *testing.T) { @@ -55,7 +55,7 @@ func TestLoadGroups(t *testing.T) { { "../testdata/project", &Config{ - GroupOrder: []string{ + GroupPriority: []string{ "detected_linux", "detected_freebsd", }, @@ -77,6 +77,12 @@ func TestLoadGroups(t *testing.T) { "group2:remove": { "remove", }, + "group3": { + "host1.example.org", + }, + "group3:remove": { + "host2", + }, "all_except_some": { "all", }, @@ -99,38 +105,38 @@ func TestLoadGroups(t *testing.T) { { "../testdata/project", &Config{ - GroupOrder: []string{ + GroupPriority: []string{ "detected_freebsd", "does-not-exist", }, }, hosts, nil, - fmt.Errorf("config.yaml: group_order: group \"does-not-exist\" does not exist"), + fmt.Errorf("config.yaml: group_priority: group \"does-not-exist\" does not exist"), }, { "../testdata/project", &Config{ - GroupOrder: []string{ + GroupPriority: []string{ "detected_freebsd", "special:group", }, }, hosts, nil, - fmt.Errorf("config.yaml: group_order: invalid group name \"special:group\""), + fmt.Errorf("config.yaml: group_priority: invalid group name \"special:group\""), }, { "../testdata/project", &Config{ - GroupOrder: []string{ + GroupPriority: []string{ "detected_freebsd", "group:remove", }, }, hosts, nil, - fmt.Errorf("config.yaml: group_order: invalid group name \"group:remove\""), + fmt.Errorf("config.yaml: group_priority: invalid group name \"group:remove\""), }, { @@ -154,6 +160,13 @@ func TestLoadGroups(t *testing.T) { nil, fmt.Errorf("groups.yaml: group \"host2\": conflict with existing host"), }, + { + "../testdata/group-invalid-conflict-remove", + &Config{}, + hosts, + nil, + fmt.Errorf("groups.yaml: group \"host2:remove\": conflict with existing host"), + }, { "../testdata/group-invalid-detected", &Config{}, @@ -173,7 +186,7 @@ func TestLoadGroups(t *testing.T) { &Config{}, &Hosts{}, nil, - fmt.Errorf("groups.yaml: group \"1group2\": group \"does-not-exist\" not found"), + fmt.Errorf("groups.yaml: group \"1group2\": member \"does-not-exist\" not found"), }, { "../testdata/group-invalid-name", @@ -185,27 +198,16 @@ func TestLoadGroups(t *testing.T) { } for _, tc := range tests { - err := os.Chdir(tc.path) - if err != nil { - t.Fatal(err) - } + t.Run(tc.path, func(t *testing.T) { + err := os.Chdir(filepath.Join(cwd, tc.path)) + if err != nil { + t.Fatal(err) + } - res, err := LoadGroups(tc.cfg, tc.hosts) - - if !reflect.DeepEqual(tc.exp, res) { - t.Errorf("%s: res: %s", tc.path, - cmp.Diff(tc.exp, res)) - } - // Ugly but the simplest way to compare errors (including nil) - if fmt.Sprintf("%s", err) != fmt.Sprintf("%s", tc.expErr) { - t.Errorf("%s: err = %#v, want %#v", - tc.path, err, tc.expErr) - } - - err = os.Chdir(cwd) - if err != nil { - t.Fatal(err) - } + res, err := LoadGroups(tc.cfg, tc.hosts) + testutil.AssertEqual(t, "res", res, tc.exp) + testutil.AssertErrorEqual(t, "err", err, tc.expErr) + }) } } @@ -244,6 +246,7 @@ func TestResolveHostGroups(t *testing.T) { []string{ "all", "group", + "group3", "host1.example.org", "remove", }, @@ -293,6 +296,7 @@ func TestResolveHostGroups(t *testing.T) { []string{ "all", "detected_mips", + "group3", "host1.example.org", "remove", }, @@ -315,15 +319,154 @@ func TestResolveHostGroups(t *testing.T) { } for _, tc := range tests { - res, err := ResolveHostGroups(tc.host, allGroups, tc.detected) - if !reflect.DeepEqual(tc.exp, res) { - t.Errorf("%s: res: %s", tc.name, - cmp.Diff(tc.exp, res)) - } - // Ugly but the simplest way to compare errors (including nil) - if fmt.Sprintf("%s", err) != fmt.Sprintf("%s", tc.expErr) { - t.Errorf("%s: err = %#v, want %#v", - tc.name, err, tc.expErr) - } + t.Run(tc.name, func(t *testing.T) { + res, err := ResolveHostGroups(tc.host, allGroups, + tc.detected) + testutil.AssertEqual(t, "res", res, tc.exp) + testutil.AssertErrorEqual(t, "err", err, tc.expErr) + }) + } +} + +func TestTransitivelyDetectedGroups(t *testing.T) { + tests := []struct { + name string + groups map[string][]string + exp map[string]bool + }{ + + { + "no detected", + map[string][]string{ + "group-a": { + "a", + "b", + "group-b", + }, + "group-a:remove": { + "d", + }, + "group-b": { + "c", + "d", + }, + }, + map[string]bool{}, + }, + + { + "detected as direct member", + map[string][]string{ + "group-a": { + "a", + "b", + "detected_foo", + }, + "group-b": { + "c", + "d", + }, + }, + map[string]bool{ + "group-a": true, + }, + }, + + { + "detected as direct :remove member", + map[string][]string{ + "group-a": { + "a", + "b", + "group-b", + }, + "group-a:remove": { + "d", + "detected_foo", + }, + "group-b": { + "c", + "d", + }, + }, + map[string]bool{ + "group-a": true, + }, + }, + + { + "detected as transitive member", + map[string][]string{ + "group-a": { + "group-b", + }, + "group-b": { + "group-c", + }, + "group-c": { + "group-d", + "detected_bar", + }, + "group-d": { + "group-e", + }, + "group-e": { + "detected_foo", + }, + "group-f": { + "a", + "b", + }, + }, + map[string]bool{ + "group-a": true, + "group-b": true, + "group-c": true, + "group-d": true, + "group-e": true, + }, + }, + + { + "detected as transitive :remove member", + map[string][]string{ + "group-a": { + "group-b", + }, + "group-b": { + "group-c", + }, + "group-c": { + "group-d", + }, + "group-d": { + "group-e", + }, + "group-e": { + "all", + }, + "group-e:remove": { + "detected_foo", + }, + "group-f": { + "a", + "b", + }, + }, + map[string]bool{ + "group-a": true, + "group-b": true, + "group-c": true, + "group-d": true, + "group-e": true, + }, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + res := TransitivelyDetectedGroups(tc.groups) + testutil.AssertEqual(t, "res", res, tc.exp) + }) } }