import (
"fmt"
"os"
- "reflect"
+ "path/filepath"
"testing"
- "github.com/google/go-cmp/cmp"
+ "ruderich.org/simon/safcm/testutil"
)
func TestLoadGroups(t *testing.T) {
"group2:remove": {
"remove",
},
+ "group3": {
+ "host1.example.org",
+ },
+ "group3:remove": {
+ "host2",
+ },
"all_except_some": {
"all",
},
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{},
&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",
for _, tc := range tests {
t.Run(tc.path, func(t *testing.T) {
- err := os.Chdir(tc.path)
+ 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("res: %s", 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("err = %#v, want %#v",
- err, tc.expErr)
- }
-
- err = os.Chdir(cwd)
- if err != nil {
- t.Fatal(err)
- }
+ testutil.AssertEqual(t, "res", res, tc.exp)
+ testutil.AssertErrorEqual(t, "err", err, tc.expErr)
})
}
}
[]string{
"all",
"group",
+ "group3",
"host1.example.org",
"remove",
},
[]string{
"all",
"detected_mips",
+ "group3",
"host1.example.org",
"remove",
},
t.Run(tc.name, func(t *testing.T) {
res, err := ResolveHostGroups(tc.host, allGroups,
tc.detected)
- if !reflect.DeepEqual(tc.exp, res) {
- t.Errorf("res: %s", 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("err = %#v, want %#v",
- err, tc.expErr)
- }
+ 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 []string
+ }{
+
+ {
+ "no detected",
+ map[string][]string{
+ "group-a": {
+ "a",
+ "b",
+ "group-b",
+ },
+ "group-a:remove": {
+ "d",
+ },
+ "group-b": {
+ "c",
+ "d",
+ },
+ },
+ nil,
+ },
+
+ {
+ "detected as direct member",
+ map[string][]string{
+ "group-a": {
+ "a",
+ "b",
+ "detected_foo",
+ },
+ "group-b": {
+ "c",
+ "d",
+ },
+ },
+ []string{
+ "group-a",
+ },
+ },
+
+ {
+ "detected as direct :remove member",
+ map[string][]string{
+ "group-a": {
+ "a",
+ "b",
+ "group-b",
+ },
+ "group-a:remove": {
+ "d",
+ "detected_foo",
+ },
+ "group-b": {
+ "c",
+ "d",
+ },
+ },
+ []string{
+ "group-a",
+ },
+ },
+
+ {
+ "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",
+ },
+ },
+ []string{
+ "group-a",
+ "group-b",
+ "group-c",
+ "group-d",
+ "group-e",
+ },
+ },
+
+ {
+ "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",
+ },
+ },
+ []string{
+ "group-a",
+ "group-b",
+ "group-c",
+ "group-d",
+ "group-e",
+ },
+ },
+ }
+
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ res := TransitivelyDetectedGroups(tc.groups)
+ testutil.AssertEqual(t, "res", res, tc.exp)
})
}
}