]> ruderich.org/simon Gitweb - safcm/safcm.git/blobdiff - cmd/safcm/sync_sync_test.go
sync: remove duplicate "priority" from group priority log message
[safcm/safcm.git] / cmd / safcm / sync_sync_test.go
index 65a490a298518963326cf3597fd720e4e82ddbc0..f0e7524e8186a6d803c6d8e5ac326e95f722a93e 100644 (file)
@@ -22,12 +22,10 @@ import (
        "log"
        "os"
        "path/filepath"
-       "reflect"
        "testing"
 
-       "github.com/google/go-cmp/cmp"
-
        "ruderich.org/simon/safcm"
+       "ruderich.org/simon/safcm/testutil"
 )
 
 func TestHostSyncReq(t *testing.T) {
@@ -61,6 +59,7 @@ func TestHostSyncReq(t *testing.T) {
                                Groups: []string{
                                        "all",
                                        "group",
+                                       "group3",
                                        "remove",
                                        "host1.example.org",
                                },
@@ -95,7 +94,7 @@ func TestHostSyncReq(t *testing.T) {
                                                Mode:      0644,
                                                Uid:       -1,
                                                Gid:       -1,
-                                               Data:      []byte("Welcome to Host ONE\n\n\n\n"),
+                                               Data:      []byte("Welcome to Host ONE\n\n\n\n\n\nall\n\n\nhost1.example.org\n\n\n\n"),
                                        },
                                        "/etc/rc.local": &safcm.File{
                                                OrigGroup: "group",
@@ -137,14 +136,20 @@ func TestHostSyncReq(t *testing.T) {
                                Services: []string{
                                        "unbound",
                                },
-                               Commands: []string{
-                                       "echo command one",
-                                       "echo -n command two",
+                               Commands: []*safcm.Command{
+                                       {
+                                               OrigGroup: "group",
+                                               Cmd:       "echo command one",
+                                       },
+                                       {
+                                               OrigGroup: "group",
+                                               Cmd:       "echo -n command two",
+                                       },
                                },
                        },
                        []string{
-                               "host1.example.org: <nil> 3 host groups: all group host1.example.org remove",
-                               "host1.example.org: <nil> 3 host group priorities (desc. order): host1.example.org",
+                               "host1.example.org: <nil> 3 host groups: all group group3 host1.example.org remove",
+                               "host1.example.org: <nil> 3 host group priorities (descending): host1.example.org",
                        },
                        nil,
                },
@@ -159,6 +164,7 @@ func TestHostSyncReq(t *testing.T) {
                                Groups: []string{
                                        "all",
                                        "group",
+                                       "group3",
                                        "remove",
                                        "host1.example.org",
                                },
@@ -193,7 +199,7 @@ func TestHostSyncReq(t *testing.T) {
                                                Mode:      0644,
                                                Uid:       -1,
                                                Gid:       -1,
-                                               Data:      []byte("Welcome to Host ONE\n\n\n\n"),
+                                               Data:      []byte("Welcome to Host ONE\n\n\n\n\n\nall\n\n\nhost1.example.org\n\n\n\n"),
                                        },
                                        "/etc/rc.local": &safcm.File{
                                                OrigGroup: "group",
@@ -235,9 +241,15 @@ func TestHostSyncReq(t *testing.T) {
                                Services: []string{
                                        "unbound",
                                },
-                               Commands: []string{
-                                       "echo command one",
-                                       "echo -n command two",
+                               Commands: []*safcm.Command{
+                                       {
+                                               OrigGroup: "group",
+                                               Cmd:       "echo command one",
+                                       },
+                                       {
+                                               OrigGroup: "group",
+                                               Cmd:       "echo -n command two",
+                                       },
                                },
                        },
                        nil,
@@ -253,9 +265,9 @@ func TestHostSyncReq(t *testing.T) {
                        safcm.MsgSyncReq{},
                        []string{
                                "host1.example.org: <nil> 3 host groups: all dns host1.example.org",
-                               "host1.example.org: <nil> 3 host group priorities (desc. order): host1.example.org",
+                               "host1.example.org: <nil> 3 host group priorities (descending): host1.example.org",
                        },
-                       fmt.Errorf("groups dns and all both provide file \"/etc/resolv.conf\"\nUse 'group_order' in config.yaml to declare preference"),
+                       fmt.Errorf("groups dns and all both provide file \"/etc/resolv.conf\"\nUse 'group_priority' in config.yaml to declare preference"),
                },
                {
                        "conflict: file from detected group",
@@ -268,9 +280,9 @@ func TestHostSyncReq(t *testing.T) {
                        safcm.MsgSyncReq{},
                        []string{
                                "host2.example.org: <nil> 3 host groups: all detected_other host2.example.org other",
-                               "host2.example.org: <nil> 3 host group priorities (desc. order): host2.example.org",
+                               "host2.example.org: <nil> 3 host group priorities (descending): host2.example.org",
                        },
-                       fmt.Errorf("groups other and all both provide file \"/etc/resolv.conf\"\nUse 'group_order' in config.yaml to declare preference"),
+                       fmt.Errorf("groups other and all both provide file \"/etc/resolv.conf\"\nUse 'group_priority' in config.yaml to declare preference"),
                },
 
                {
@@ -282,9 +294,9 @@ func TestHostSyncReq(t *testing.T) {
                        safcm.MsgSyncReq{},
                        []string{
                                "host1.example.org: <nil> 3 host groups: all dns host1.example.org",
-                               "host1.example.org: <nil> 3 host group priorities (desc. order): host1.example.org",
+                               "host1.example.org: <nil> 3 host group priorities (descending): host1.example.org",
                        },
-                       fmt.Errorf("groups dns and all both provide file \"/etc\"\nUse 'group_order' in config.yaml to declare preference"),
+                       fmt.Errorf("groups dns and all both provide file \"/etc\"\nUse 'group_priority' in config.yaml to declare preference"),
                },
                {
                        "conflict: dir from detected group",
@@ -297,9 +309,9 @@ func TestHostSyncReq(t *testing.T) {
                        safcm.MsgSyncReq{},
                        []string{
                                "host2.example.org: <nil> 3 host groups: all detected_other host2.example.org other",
-                               "host2.example.org: <nil> 3 host group priorities (desc. order): host2.example.org",
+                               "host2.example.org: <nil> 3 host group priorities (descending): host2.example.org",
                        },
-                       fmt.Errorf("groups other and all both provide file \"/etc\"\nUse 'group_order' in config.yaml to declare preference"),
+                       fmt.Errorf("groups other and all both provide file \"/etc\"\nUse 'group_priority' in config.yaml to declare preference"),
                },
 
                {
@@ -314,8 +326,8 @@ func TestHostSyncReq(t *testing.T) {
                },
 
                {
-                       "group_order",
-                       "project-group_order",
+                       "group_priority",
+                       "project-group_priority",
                        "host1.example.org",
                        nil,
                        safcm.LogDebug3,
@@ -410,81 +422,107 @@ func TestHostSyncReq(t *testing.T) {
                        },
                        []string{
                                "host1.example.org: <nil> 3 host groups: all group-a group-b host1.example.org",
-                               "host1.example.org: <nil> 3 host group priorities (desc. order): host1.example.org group-a group-b all",
+                               "host1.example.org: <nil> 3 host group priorities (descending): host1.example.org group-a group-b all",
                                `host1.example.org: <nil> 4 files: "/etc": group group-a overwrites triggers from group group-b`,
                                `host1.example.org: <nil> 4 files: "/etc": group host1.example.org overwrites triggers from group group-a`,
                        },
                        nil,
                },
+
+               {
+                       "group_priority (single group)",
+                       "project-group_priority-single",
+                       "host1.example.org",
+                       nil,
+                       safcm.LogDebug3,
+                       safcm.MsgSyncReq{
+                               Groups: []string{"all", "group-b", "group-a", "host1.example.org"},
+                               Files: map[string]*safcm.File{
+                                       "/": {
+                                               Path:      "/",
+                                               Mode:      fs.ModeDir | 0755,
+                                               Uid:       -1,
+                                               Gid:       -1,
+                                               OrigGroup: "group-a",
+                                       },
+                                       "/file.txt": {
+                                               Path:      "/file.txt",
+                                               Mode:      0644,
+                                               Uid:       -1,
+                                               Gid:       -1,
+                                               Data:      []byte("file.txt: from group-a\n"),
+                                               OrigGroup: "group-a",
+                                       },
+                               },
+                       },
+                       []string{
+                               "host1.example.org: <nil> 3 host groups: all group-a group-b host1.example.org",
+                               "host1.example.org: <nil> 3 host group priorities (descending): host1.example.org group-a",
+                       },
+                       nil,
+               },
        }
 
        for _, tc := range tests {
                t.Run(tc.name, func(t *testing.T) {
-               err = os.Chdir(filepath.Join(cwd, "testdata", tc.project))
-               if err != nil {
-                       t.Fatal(err)
-               }
+                       err = os.Chdir(filepath.Join(cwd,
+                               "testdata", tc.project))
+                       if err != nil {
+                               t.Fatal(err)
+                       }
 
-               // `safcm fixperms` in case user has strict umask
-               log.SetOutput(io.Discard)
-               err := MainFixperms()
-               if err != nil {
-                       t.Fatal(err)
-               }
-               log.SetOutput(os.Stderr)
+                       // `safcm fixperms` in case user has strict umask
+                       log.SetOutput(io.Discard)
+                       err := MainFixperms()
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       log.SetOutput(os.Stderr)
 
-               cfg, allHosts, allGroups, err := LoadBaseFiles()
-               if err != nil {
-                       t.Fatal(err)
-               }
-               cfg.LogLevel = tc.level
+                       cfg, allHosts, allGroups, err := LoadBaseFiles()
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       cfg.LogLevel = tc.level
 
-               var events []string
-               ch := make(chan Event)
-               done := make(chan struct{})
-               go func() {
-                       for {
-                               x, ok := <-ch
-                               if !ok {
-                                       break
+                       var events []string
+                       ch := make(chan Event)
+                       done := make(chan struct{})
+                       go func() {
+                               for {
+                                       x, ok := <-ch
+                                       if !ok {
+                                               break
+                                       }
+                                       if x.ConnEvent.Type != 0 {
+                                               panic("unexpected ConnEvent")
+                                       }
+                                       events = append(events,
+                                               fmt.Sprintf("%s: %v %d %s",
+                                                       x.Host.Name,
+                                                       x.Error, x.Log.Level,
+                                                       x.Log.Text))
                                }
-                               if x.ConnEvent.Type != 0 {
-                                       panic("unexpected ConnEvent")
-                               }
-                               events = append(events,
-                                       fmt.Sprintf("%s: %v %d %s",
-                                               x.Host.Name,
-                                               x.Error, x.Log.Level,
-                                               x.Log.Text))
+                               done <- struct{}{}
+                       }()
+
+                       s := &Sync{
+                               host:      allHosts.Map[tc.host],
+                               config:    cfg,
+                               allHosts:  allHosts,
+                               allGroups: allGroups,
+                               events:    ch,
                        }
-                       done <- struct{}{}
-               }()
 
-               s := &Sync{
-                       host:      allHosts.Map[tc.host],
-                       config:    cfg,
-                       allHosts:  allHosts,
-                       allGroups: allGroups,
-                       events:    ch,
-               }
+                       res, err := s.hostSyncReq(tc.detected)
 
-               res, err := s.hostSyncReq(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)
 
-               close(ch)
-               <-done
-               if !reflect.DeepEqual(tc.expEvents, events) {
-                       t.Errorf("events: %s",
-                               cmp.Diff(tc.expEvents, events))
-               }
+                       close(ch)
+                       <-done
+                       testutil.AssertEqual(t, "events",
+                               events, tc.expEvents)
                })
        }
 }