]> ruderich.org/simon Gitweb - safcm/safcm.git/blobdiff - cmd/safcm/sync_sync_test.go
Use SPDX license identifiers
[safcm/safcm.git] / cmd / safcm / sync_sync_test.go
index a5f65811e0d82297f642f01dcf027dd175ff9da3..614b5b0c72254dc17240db2a5e6888d9d355547e 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.
+// SPDX-License-Identifier: GPL-3.0-or-later
+// Copyright (C) 2021-2024  Simon Ruderich
 
 package main
 
@@ -33,28 +21,26 @@ 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",
@@ -64,8 +50,9 @@ func TestHostSyncReq(t *testing.T) {
                                        "host1.example.org",
                                },
                                Files: map[string]*safcm.File{
-                                       "/": &safcm.File{Path: "/",
+                                       "/": {
                                                OrigGroup: "group",
+                                               Path:      "/",
                                                Mode:      fs.ModeDir | 0755 | fs.ModeSetgid,
                                                Uid:       -1,
                                                Gid:       -1,
@@ -73,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,
@@ -88,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,
@@ -96,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,
@@ -107,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,
@@ -120,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,
@@ -148,126 +135,23 @@ func TestHostSyncReq(t *testing.T) {
                                },
                        },
                        []string{
-                               "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",
+                               "3 false host groups: all group group3 host1.example.org remove",
+                               "3 false host group priorities (descending): host1.example.org",
                        },
                        nil,
                },
 
-               {
-                       "project: host1 (log level info)",
-                       "project",
-                       "host1.example.org",
-                       nil,
-                       safcm.LogInfo,
-                       safcm.MsgSyncReq{
-                               Groups: []string{
-                                       "all",
-                                       "group",
-                                       "group3",
-                                       "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{
-                                               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",
-                                               },
-                                       },
-                                       "/etc/test": &safcm.File{
-                                               OrigGroup: "group",
-                                               Path:      "/etc/test",
-                                               Mode:      os.ModeSymlink | 0777,
-                                               Uid:       -1,
-                                               Gid:       -1,
-                                               Data:      []byte("doesnt-exist"),
-                                       },
-                               },
-                               Packages: []string{
-                                       "unbound",
-                                       "unbound-anchor",
-                               },
-                               Services: []string{
-                                       "unbound",
-                               },
-                               Commands: []*safcm.Command{
-                                       {
-                                               OrigGroup: "group",
-                                               Cmd:       "echo command one",
-                                       },
-                                       {
-                                               OrigGroup: "group",
-                                               Cmd:       "echo -n command two",
-                                       },
-                               },
-                       },
-                       nil,
-                       nil,
-               },
-
                {
                        "conflict: file",
                        "project-conflict-file",
                        "host1.example.org",
                        nil,
-                       safcm.LogDebug3,
                        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",
+                               "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",
@@ -276,13 +160,12 @@ func TestHostSyncReq(t *testing.T) {
                        []string{
                                "detected_other",
                        },
-                       safcm.LogDebug3,
                        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",
+                               "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"),
                },
 
                {
@@ -290,13 +173,12 @@ func TestHostSyncReq(t *testing.T) {
                        "project-conflict-dir",
                        "host1.example.org",
                        nil,
-                       safcm.LogDebug3,
                        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",
+                               "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",
@@ -305,13 +187,12 @@ func TestHostSyncReq(t *testing.T) {
                        []string{
                                "detected_other",
                        },
-                       safcm.LogDebug3,
                        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",
+                               "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"),
                },
 
                {
@@ -319,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",
@@ -365,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",
@@ -381,83 +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: <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> 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`,
+                               "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_order (single group)",
-                       "project-group_order-single",
+                       "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{
                                        "/": {
+                                               OrigGroup: "group-a",
                                                Path:      "/",
                                                Mode:      fs.ModeDir | 0755,
                                                Uid:       -1,
                                                Gid:       -1,
-                                               OrigGroup: "group-a",
                                        },
                                        "/file.txt": {
+                                               OrigGroup: "group-a",
                                                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 (desc. order): host1.example.org 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",
                        },
                        nil,
                },
@@ -483,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)
                })