]> ruderich.org/simon Gitweb - safcm/safcm.git/blob - cmd/safcm/config/hosts_test.go
4f04a299083ca908c4682462ceae002382577b91
[safcm/safcm.git] / cmd / safcm / config / hosts_test.go
1 // Copyright (C) 2021-2024  Simon Ruderich
2 //
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 package config
17
18 import (
19         "fmt"
20         "os"
21         "path/filepath"
22         "testing"
23
24         "ruderich.org/simon/safcm/testutil"
25 )
26
27 func TestLoadHosts(t *testing.T) {
28         cwd, err := os.Getwd()
29         if err != nil {
30                 t.Fatal(err)
31         }
32         defer os.Chdir(cwd) //nolint:errcheck
33
34         sliceToHosts := func(hosts []*Host) *Hosts {
35                 res := &Hosts{
36                         List: hosts,
37                         Map:  make(map[string]*Host),
38                 }
39                 for _, x := range hosts {
40                         res.Map[x.Name] = x
41                 }
42                 return res
43         }
44
45         tests := []struct {
46                 path   string
47                 exp    *Hosts
48                 expErr error
49         }{
50
51                 {
52                         "../testdata/project",
53                         sliceToHosts([]*Host{
54                                 {
55                                         Name: "host1.example.org",
56                                 },
57                                 {
58                                         Name: "host2",
59                                 },
60                                 {
61                                         Name: "host3.example.net",
62                                 },
63                         }),
64                         nil,
65                 },
66
67                 {
68                         "../testdata/host-invalid-duplicate",
69                         nil,
70                         fmt.Errorf("hosts.yaml: host \"host1.example.org\": host name already exists"),
71                 },
72                 {
73                         "../testdata/host-invalid-all",
74                         nil,
75                         fmt.Errorf("hosts.yaml: host \"all\": conflict with pre-defined group \"all\""),
76                 },
77                 {
78                         "../testdata/host-invalid-detected",
79                         nil,
80                         fmt.Errorf("hosts.yaml: host \"detected\": name must not start with \"detected\" (reserved for detected groups)"),
81                 },
82                 {
83                         "../testdata/host-invalid-special",
84                         nil,
85                         fmt.Errorf("hosts.yaml: host \"special:host\": name must not contain \":\""),
86                 },
87         }
88
89         for _, tc := range tests {
90                 t.Run(tc.path, func(t *testing.T) {
91                         err := os.Chdir(filepath.Join(cwd, tc.path))
92                         if err != nil {
93                                 t.Fatal(err)
94                         }
95
96                         res, err := LoadHosts()
97                         testutil.AssertEqual(t, "res", res, tc.exp)
98                         testutil.AssertErrorEqual(t, "err", err, tc.expErr)
99                 })
100         }
101 }