X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;ds=inline;f=cmd%2Fsafcm%2Fsync_sync_test.go;h=614b5b0c72254dc17240db2a5e6888d9d355547e;hb=refs%2Fheads%2Fmaster;hp=31252936e663861f18aa352766ab43479540caae;hpb=b731ef4979de9e533ce9bb35110ab2b769e2eed4;p=safcm%2Fsafcm.git
diff --git a/cmd/safcm/sync_sync_test.go b/cmd/safcm/sync_sync_test.go
index 3125293..614b5b0 100644
--- a/cmd/safcm/sync_sync_test.go
+++ b/cmd/safcm/sync_sync_test.go
@@ -1,17 +1,5 @@
-// Copyright (C) 2021 Simon Ruderich
-//
-// This program is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
+// SPDX-License-Identifier: GPL-3.0-or-later
+// Copyright (C) 2021-2024 Simon Ruderich
package main
@@ -33,38 +21,38 @@ func TestHostSyncReq(t *testing.T) {
if err != nil {
t.Fatal(err)
}
- defer os.Chdir(cwd)
+ defer os.Chdir(cwd) //nolint:errcheck
tests := []struct {
name string
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: "/",
+ "/": {
OrigGroup: "group",
+ Path: "/",
Mode: fs.ModeDir | 0755 | fs.ModeSetgid,
Uid: -1,
Gid: -1,
@@ -72,14 +60,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,
@@ -87,7 +75,7 @@ func TestHostSyncReq(t *testing.T) {
Gid: -1,
Data: []byte("..."),
},
- "/etc/motd": &safcm.File{
+ "/etc/motd": {
OrigGroup: "group",
Path: "/etc/motd",
Mode: 0644,
@@ -95,7 +83,7 @@ func TestHostSyncReq(t *testing.T) {
Gid: -1,
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,
@@ -106,7 +94,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,
@@ -119,7 +107,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,
@@ -135,110 +123,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\n\nall\n\n\nhost1.example.org\n\n\n\n"),
- },
- "/etc/rc.local": &safcm.File{
+ Commands: []*safcm.Command{
+ {
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{
- 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,
},
@@ -247,13 +146,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",
@@ -262,13 +160,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"),
},
{
@@ -276,13 +173,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",
@@ -291,13 +187,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"),
},
{
@@ -305,42 +200,40 @@ 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{
"/": {
+ OrigGroup: "host1.example.org",
Path: "/",
Mode: fs.ModeDir | 0755,
Uid: -1,
Gid: -1,
- OrigGroup: "host1.example.org",
},
"/etc": {
+ OrigGroup: "host1.example.org",
Path: "/etc",
Mode: fs.ModeDir | 0755,
Uid: -1,
Gid: -1,
- OrigGroup: "host1.example.org",
},
"/etc/dir-to-file": {
+ OrigGroup: "group-a",
Path: "/etc/dir-to-file",
Mode: 0644,
Uid: -1,
Gid: -1,
Data: []byte("dir-to-file: from group-a\n"),
- OrigGroup: "group-a",
},
"/etc/dir-to-filex": {
OrigGroup: "group-b",
@@ -351,12 +244,12 @@ func TestHostSyncReq(t *testing.T) {
Data: []byte("dir-to-filex\n"),
},
"/etc/dir-to-link": {
+ OrigGroup: "group-a",
Path: "/etc/dir-to-link",
Mode: fs.ModeSymlink | 0777,
Uid: -1,
Gid: -1,
Data: []byte("target"),
- OrigGroup: "group-a",
},
"/etc/dir-to-linkx": {
OrigGroup: "group-b",
@@ -367,50 +260,82 @@ func TestHostSyncReq(t *testing.T) {
Data: []byte("dir-to-linkx\n"),
},
"/etc/file-to-dir": {
+ OrigGroup: "group-a",
Path: "/etc/file-to-dir",
Mode: fs.ModeDir | 0755,
Uid: -1,
Gid: -1,
- OrigGroup: "group-a",
},
"/etc/file-to-dir/file": {
+ OrigGroup: "group-a",
Path: "/etc/file-to-dir/file",
Mode: 0644,
Uid: -1,
Gid: -1,
Data: []byte("file: from group-a\n"),
- OrigGroup: "group-a",
},
"/etc/file-to-dir/dir": {
+ OrigGroup: "group-a",
Path: "/etc/file-to-dir/dir",
Mode: fs.ModeDir | 0755,
Uid: -1,
Gid: -1,
- OrigGroup: "group-a",
},
"/etc/file-to-dir/dir/file2": {
+ OrigGroup: "group-a",
Path: "/etc/file-to-dir/dir/file2",
Mode: 0644,
Uid: -1,
Gid: -1,
Data: []byte("file2: from group-a\n"),
- OrigGroup: "group-a",
},
"/etc/motd": {
+ OrigGroup: "host1.example.org",
Path: "/etc/motd",
Mode: 0644,
Uid: -1,
Gid: -1,
Data: []byte("motd: from host1\n"),
- OrigGroup: "host1.example.org",
},
},
},
[]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{
+ "/": {
+ OrigGroup: "group-a",
+ Path: "/",
+ Mode: fs.ModeDir | 0755,
+ Uid: -1,
+ Gid: -1,
+ },
+ "/file.txt": {
+ OrigGroup: "group-a",
+ Path: "/file.txt",
+ Mode: 0644,
+ Uid: -1,
+ Gid: -1,
+ Data: []byte("file.txt: from group-a\n"),
+ },
+ },
+ },
+ []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,
},
@@ -436,44 +361,22 @@ 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)
-
testutil.AssertEqual(t, "res", res, tc.exp)
testutil.AssertErrorEqual(t, "err", err, tc.expErr)
-
- close(ch)
- <-done
testutil.AssertEqual(t, "events",
events, tc.expEvents)
})