X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=cmd%2Fsafcm%2Fsync_sync_test.go;h=cfa47fac38e9b50294a1e1d7a3675fd91ccfd6d1;hb=8620dac1f9ee7f73058e3e97b488ec0c710a89df;hp=f3d046a23a0f4618525403fd1158239e8d149dca;hpb=4299c5d0946ecfa034e9eefe6b16e50bab94a820;p=safcm%2Fsafcm.git diff --git a/cmd/safcm/sync_sync_test.go b/cmd/safcm/sync_sync_test.go index f3d046a..cfa47fa 100644 --- a/cmd/safcm/sync_sync_test.go +++ b/cmd/safcm/sync_sync_test.go @@ -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) { @@ -42,30 +40,29 @@ func TestHostSyncReq(t *testing.T) { project string host string detected []string - level safcm.LogLevel exp safcm.MsgSyncReq expEvents []string expErr error }{ // NOTE: Also update MsgSyncReq in safcm-remote test cases - // when changing anything here! + // changing the MsgSyncReq struct! { "project: host1", "project", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{ Groups: []string{ "all", "group", + "group3", "remove", "host1.example.org", }, Files: map[string]*safcm.File{ - "/": &safcm.File{Path: "/", + "/": {Path: "/", OrigGroup: "group", Mode: fs.ModeDir | 0755 | fs.ModeSetgid, Uid: -1, @@ -74,14 +71,14 @@ func TestHostSyncReq(t *testing.T) { "touch /.update", }, }, - "/etc": &safcm.File{ + "/etc": { OrigGroup: "group", Path: "/etc", Mode: fs.ModeDir | 0755, Uid: -1, Gid: -1, }, - "/etc/.hidden": &safcm.File{ + "/etc/.hidden": { OrigGroup: "group", Path: "/etc/.hidden", Mode: 0100 | fs.ModeSetuid | fs.ModeSetgid | fs.ModeSticky, @@ -89,15 +86,15 @@ func TestHostSyncReq(t *testing.T) { Gid: -1, Data: []byte("..."), }, - "/etc/motd": &safcm.File{ + "/etc/motd": { OrigGroup: "group", Path: "/etc/motd", 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{ + "/etc/rc.local": { OrigGroup: "group", Path: "/etc/rc.local", Mode: 0700, @@ -108,7 +105,7 @@ func TestHostSyncReq(t *testing.T) { "/etc/rc.local", }, }, - "/etc/resolv.conf": &safcm.File{ + "/etc/resolv.conf": { OrigGroup: "group", Path: "/etc/resolv.conf", Mode: 0641, @@ -121,7 +118,7 @@ func TestHostSyncReq(t *testing.T) { "echo resolv.conf updated", }, }, - "/etc/test": &safcm.File{ + "/etc/test": { OrigGroup: "group", Path: "/etc/test", Mode: os.ModeSymlink | 0777, @@ -137,110 +134,21 @@ func TestHostSyncReq(t *testing.T) { Services: []string{ "unbound", }, - Commands: []string{ - "echo command one", - "echo -n command two", - }, - }, - []string{ - "host1.example.org: 3 host groups: all group host1.example.org remove", - "host1.example.org: 3 host group priorities (desc. order): host1.example.org", - }, - nil, - }, - - { - "project: host1 (log level info)", - "project", - "host1.example.org", - nil, - safcm.LogInfo, - safcm.MsgSyncReq{ - Groups: []string{ - "all", - "group", - "remove", - "host1.example.org", - }, - Files: map[string]*safcm.File{ - "/": &safcm.File{Path: "/", - OrigGroup: "group", - Mode: fs.ModeDir | 0755 | fs.ModeSetgid, - Uid: -1, - Gid: -1, - TriggerCommands: []string{ - "touch /.update", - }, - }, - "/etc": &safcm.File{ - OrigGroup: "group", - Path: "/etc", - Mode: fs.ModeDir | 0755, - Uid: -1, - Gid: -1, - }, - "/etc/.hidden": &safcm.File{ - OrigGroup: "group", - Path: "/etc/.hidden", - Mode: 0100 | fs.ModeSetuid | fs.ModeSetgid | fs.ModeSticky, - Uid: -1, - Gid: -1, - Data: []byte("..."), - }, - "/etc/motd": &safcm.File{ - OrigGroup: "group", - Path: "/etc/motd", - Mode: 0644, - Uid: -1, - Gid: -1, - Data: []byte("Welcome to Host ONE\n\n\n\n"), - }, - "/etc/rc.local": &safcm.File{ - OrigGroup: "group", - Path: "/etc/rc.local", - Mode: 0700, - Uid: -1, - Gid: -1, - Data: []byte("#!/bin/sh\n"), - TriggerCommands: []string{ - "/etc/rc.local", - }, - }, - "/etc/resolv.conf": &safcm.File{ + Commands: []*safcm.Command{ + { OrigGroup: "group", - Path: "/etc/resolv.conf", - Mode: 0641, - User: "user", - Uid: -1, - Group: "group", - Gid: -1, - Data: []byte("nameserver ::1\n"), - TriggerCommands: []string{ - "echo resolv.conf updated", - }, + Cmd: "echo command one", }, - "/etc/test": &safcm.File{ + { OrigGroup: "group", - Path: "/etc/test", - Mode: os.ModeSymlink | 0777, - Uid: -1, - Gid: -1, - Data: []byte("doesnt-exist"), + Cmd: "echo -n command two", }, }, - Packages: []string{ - "unbound", - "unbound-anchor", - }, - Services: []string{ - "unbound", - }, - Commands: []string{ - "echo command one", - "echo -n command two", - }, }, - nil, + []string{ + "3 false host groups: all group group3 host1.example.org remove", + "3 false host group priorities (descending): host1.example.org", + }, nil, }, @@ -249,13 +157,12 @@ func TestHostSyncReq(t *testing.T) { "project-conflict-file", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{}, []string{ - "host1.example.org: 3 host groups: all dns host1.example.org", - "host1.example.org: 3 host group priorities (desc. order): host1.example.org", + "3 false host groups: all dns host1.example.org", + "3 false 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 \"/etc/resolv.conf\"\nUse 'group_priority' in config.yaml to declare preference"), }, { "conflict: file from detected group", @@ -264,13 +171,12 @@ func TestHostSyncReq(t *testing.T) { []string{ "detected_other", }, - safcm.LogDebug3, safcm.MsgSyncReq{}, []string{ - "host2.example.org: 3 host groups: all detected_other host2.example.org other", - "host2.example.org: 3 host group priorities (desc. order): host2.example.org", + "3 false host groups: all detected_other host2.example.org other", + "3 false 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 \"/etc/resolv.conf\"\nUse 'group_priority' in config.yaml to declare preference"), }, { @@ -278,13 +184,12 @@ func TestHostSyncReq(t *testing.T) { "project-conflict-dir", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{}, []string{ - "host1.example.org: 3 host groups: all dns host1.example.org", - "host1.example.org: 3 host group priorities (desc. order): host1.example.org", + "3 false host groups: all dns host1.example.org", + "3 false 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 \"/etc\"\nUse 'group_priority' in config.yaml to declare preference"), }, { "conflict: dir from detected group", @@ -293,13 +198,12 @@ func TestHostSyncReq(t *testing.T) { []string{ "detected_other", }, - safcm.LogDebug3, safcm.MsgSyncReq{}, []string{ - "host2.example.org: 3 host groups: all detected_other host2.example.org other", - "host2.example.org: 3 host group priorities (desc. order): host2.example.org", + "3 false host groups: all detected_other host2.example.org other", + "3 false 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 \"/etc\"\nUse 'group_priority' in config.yaml to declare preference"), }, { @@ -307,18 +211,16 @@ func TestHostSyncReq(t *testing.T) { "project-group-cycle", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{}, nil, fmt.Errorf("groups.yaml: cycle while expanding group \"group-b\""), }, { - "group_order", - "project-group_order", + "group_priority", + "project-group_priority", "host1.example.org", nil, - safcm.LogDebug3, safcm.MsgSyncReq{ Groups: []string{"all", "group-b", "group-a", "host1.example.org"}, Files: map[string]*safcm.File{ @@ -409,10 +311,42 @@ func TestHostSyncReq(t *testing.T) { }, }, []string{ - "host1.example.org: 3 host groups: all group-a group-b host1.example.org", - "host1.example.org: 3 host group priorities (desc. order): host1.example.org group-a group-b all", - `host1.example.org: 4 files: "/etc": group group-a overwrites triggers from group group-b`, - `host1.example.org: 4 files: "/etc": group host1.example.org overwrites triggers from group group-a`, + "3 false host groups: all group-a group-b host1.example.org", + "3 false host group priorities (descending): host1.example.org group-a group-b all", + `4 false files: "/etc": group group-a overwrites triggers from group group-b`, + `4 false 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.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{ + "3 false host groups: all group-a group-b host1.example.org", + "3 false host group priorities (descending): host1.example.org group-a", }, nil, }, @@ -438,53 +372,24 @@ func TestHostSyncReq(t *testing.T) { 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 - } - 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, + logFunc: func(level safcm.LogLevel, escaped bool, msg string) { + events = append(events, + fmt.Sprintf("%d %v %s", level, escaped, msg)) + }, } 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) - } - - close(ch) - <-done - if !reflect.DeepEqual(tc.expEvents, events) { - t.Errorf("events: %s", - cmp.Diff(tc.expEvents, events)) - } + testutil.AssertEqual(t, "res", res, tc.exp) + testutil.AssertErrorEqual(t, "err", err, tc.expErr) + testutil.AssertEqual(t, "events", + events, tc.expEvents) }) } }