"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) {
Groups: []string{
"all",
"group",
+ "group3",
"remove",
"host1.example.org",
},
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",
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 groups: all group group3 host1.example.org remove",
"host1.example.org: <nil> 3 host group priorities (desc. order): host1.example.org",
},
nil,
Groups: []string{
"all",
"group",
+ "group3",
"remove",
"host1.example.org",
},
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",
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,
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
- }
- if x.ConnEvent.Type != 0 {
- panic("unexpected ConnEvent")
+ 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))
}
- 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)
})
}
}