]> ruderich.org/simon Gitweb - safcm/safcm.git/blob - cmd/safcm/config/triggers_test.go
Use SPDX license identifiers
[safcm/safcm.git] / cmd / safcm / config / triggers_test.go
1 // SPDX-License-Identifier: GPL-3.0-or-later
2 // Copyright (C) 2021-2024  Simon Ruderich
3
4 package config
5
6 import (
7         "fmt"
8         "io/fs"
9         "os"
10         "testing"
11
12         "ruderich.org/simon/safcm"
13         "ruderich.org/simon/safcm/testutil"
14 )
15
16 func TestLoadTriggers(t *testing.T) {
17         cwd, err := os.Getwd()
18         if err != nil {
19                 t.Fatal(err)
20         }
21         defer os.Chdir(cwd) //nolint:errcheck
22
23         err = os.Chdir("../testdata/project")
24         if err != nil {
25                 t.Fatal(err)
26         }
27
28         tests := []struct {
29                 group  string
30                 exp    map[string]*safcm.File
31                 expErr error
32         }{
33
34                 {
35                         "empty",
36                         nil,
37                         nil,
38                 },
39
40                 {
41                         "group",
42                         map[string]*safcm.File{
43                                 "/": {
44                                         Path: "/",
45                                         Mode: fs.ModeDir | 0755,
46                                         Uid:  -1,
47                                         Gid:  -1,
48                                         TriggerCommands: []string{
49                                                 "touch /.update",
50                                         },
51                                 },
52                                 "/etc": {
53                                         Path: "/etc",
54                                         Mode: fs.ModeDir | 0755,
55                                         Uid:  -1,
56                                         Gid:  -1,
57                                 },
58                                 "/etc/.hidden": {
59                                         Path: "/etc/.hidden",
60                                         Mode: 0644,
61                                         Uid:  -1,
62                                         Gid:  -1,
63                                         Data: []byte("..."),
64                                 },
65                                 "/etc/motd": {
66                                         Path: "/etc/motd",
67                                         Mode: 0644,
68                                         Uid:  -1,
69                                         Gid:  -1,
70                                         Data: []byte(`Welcome to
71 {{- if .IsHost "host1.example.org"}} Host ONE
72 {{- else if "host2"}} Host TWO
73 {{- end}}
74
75 {{if .InGroup "detected_linux"}}
76 This is GNU/Linux host
77 {{end}}
78 {{if .InGroup "detected_freebsd"}}
79 This is FreeBSD host
80 {{end}}
81
82 {{if .InGroup "all"}}
83 all
84 {{end}}
85 {{if .InGroup "host1.example.org"}}
86 host1.example.org
87 {{end}}
88 {{if .InGroup "host2"}}
89 host2
90 {{end}}
91 {{if .InGroup "host3.example.net"}}
92 host3.example.net
93 {{end}}
94 `),
95                                 },
96                                 "/etc/rc.local": {
97                                         Path: "/etc/rc.local",
98                                         Mode: 0755,
99                                         Uid:  -1,
100                                         Gid:  -1,
101                                         Data: []byte("#!/bin/sh\n"),
102                                         TriggerCommands: []string{
103                                                 "/etc/rc.local",
104                                         },
105                                 },
106                                 "/etc/resolv.conf": {
107                                         Path: "/etc/resolv.conf",
108                                         Mode: 0644,
109                                         Uid:  -1,
110                                         Gid:  -1,
111                                         Data: []byte("nameserver ::1\n"),
112                                         TriggerCommands: []string{
113                                                 "echo resolv.conf updated",
114                                         },
115                                 },
116                                 "/etc/test": {
117                                         Path: "/etc/test",
118                                         Mode: fs.ModeSymlink | 0777,
119                                         Uid:  -1,
120                                         Gid:  -1,
121                                         Data: []byte("doesnt-exist"),
122                                 },
123                         },
124                         nil,
125                 },
126
127                 {
128                         "triggers-invalid-path",
129                         nil,
130                         fmt.Errorf("triggers-invalid-path/triggers.yaml: \"/etc/resolv.conf\" does not exist in files/"),
131                 },
132         }
133
134         for _, tc := range tests {
135                 t.Run(tc.group, func(t *testing.T) {
136                         // Use LoadFiles() so we work on real data and don't
137                         // make any mistakes generating it
138                         files, err := LoadFiles(tc.group)
139                         if err != nil {
140                                 t.Fatalf("err = %#v, want nil", err)
141                         }
142                         err = LoadTriggers(tc.group, files)
143
144                         testutil.AssertEqual(t, "res", files, tc.exp)
145                         testutil.AssertErrorEqual(t, "err", err, tc.expErr)
146                 })
147         }
148 }