-// 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 config
if err != nil {
t.Fatal(err)
}
- defer os.Chdir(cwd)
+ defer os.Chdir(cwd) //nolint:errcheck
err = os.Chdir("../testdata/project")
if err != nil {
{
"../testdata/project",
&Config{
- GroupOrder: []string{
+ GroupPriority: []string{
"detected_linux",
"detected_freebsd",
},
"group2:remove": {
"remove",
},
+ "group3": {
+ "host1.example.org",
+ },
+ "group3:remove": {
+ "host2",
+ },
"all_except_some": {
"all",
},
{
"../testdata/project",
&Config{
- GroupOrder: []string{
+ GroupPriority: []string{
"detected_freebsd",
"does-not-exist",
},
},
hosts,
nil,
- fmt.Errorf("config.yaml: group_order: group \"does-not-exist\" does not exist"),
+ fmt.Errorf("config.yaml: group_priority: group \"does-not-exist\" does not exist"),
},
{
"../testdata/project",
&Config{
- GroupOrder: []string{
+ GroupPriority: []string{
"detected_freebsd",
"special:group",
},
},
hosts,
nil,
- fmt.Errorf("config.yaml: group_order: invalid group name \"special:group\""),
+ fmt.Errorf("config.yaml: group_priority: invalid group name \"special:group\""),
},
{
"../testdata/project",
&Config{
- GroupOrder: []string{
+ GroupPriority: []string{
"detected_freebsd",
"group:remove",
},
},
hosts,
nil,
- fmt.Errorf("config.yaml: group_order: invalid group name \"group:remove\""),
+ fmt.Errorf("config.yaml: group_priority: invalid group name \"group:remove\""),
},
{
nil,
fmt.Errorf("groups.yaml: group \"host2\": conflict with existing host"),
},
+ {
+ "../testdata/group-invalid-conflict-remove",
+ &Config{},
+ hosts,
+ nil,
+ fmt.Errorf("groups.yaml: group \"host2:remove\": conflict with existing host"),
+ },
{
"../testdata/group-invalid-detected",
&Config{},
&Config{},
&Hosts{},
nil,
- fmt.Errorf("groups.yaml: group \"1group2\": group \"does-not-exist\" not found"),
+ fmt.Errorf("groups.yaml: group \"group2\": member \"does-not-exist\" not found"),
},
{
"../testdata/group-invalid-name",
if err != nil {
t.Fatal(err)
}
- defer os.Chdir(cwd)
+ defer os.Chdir(cwd) //nolint:errcheck
err = os.Chdir("../testdata/project")
if err != nil {
[]string{
"all",
"group",
+ "group3",
"host1.example.org",
"remove",
},
[]string{
"all",
"detected_mips",
+ "group3",
"host1.example.org",
"remove",
},
})
}
}
+
+func TestTransitivelyDetectedGroups(t *testing.T) {
+ tests := []struct {
+ name string
+ groups map[string][]string
+ exp map[string]bool
+ }{
+
+ {
+ "no detected",
+ map[string][]string{
+ "group-a": {
+ "a",
+ "b",
+ "group-b",
+ },
+ "group-a:remove": {
+ "d",
+ },
+ "group-b": {
+ "c",
+ "d",
+ },
+ },
+ map[string]bool{},
+ },
+
+ {
+ "detected as direct member",
+ map[string][]string{
+ "group-a": {
+ "a",
+ "b",
+ "detected_foo",
+ },
+ "group-b": {
+ "c",
+ "d",
+ },
+ },
+ map[string]bool{
+ "group-a": true,
+ },
+ },
+
+ {
+ "detected as direct :remove member",
+ map[string][]string{
+ "group-a": {
+ "a",
+ "b",
+ "group-b",
+ },
+ "group-a:remove": {
+ "d",
+ "detected_foo",
+ },
+ "group-b": {
+ "c",
+ "d",
+ },
+ },
+ map[string]bool{
+ "group-a": true,
+ },
+ },
+
+ {
+ "detected as transitive member",
+ map[string][]string{
+ "group-a": {
+ "group-b",
+ },
+ "group-b": {
+ "group-c",
+ },
+ "group-c": {
+ "group-d",
+ "detected_bar",
+ },
+ "group-d": {
+ "group-e",
+ },
+ "group-e": {
+ "detected_foo",
+ },
+ "group-f": {
+ "a",
+ "b",
+ },
+ },
+ map[string]bool{
+ "group-a": true,
+ "group-b": true,
+ "group-c": true,
+ "group-d": true,
+ "group-e": true,
+ },
+ },
+
+ {
+ "detected as transitive :remove member",
+ map[string][]string{
+ "group-a": {
+ "group-b",
+ },
+ "group-b": {
+ "group-c",
+ },
+ "group-c": {
+ "group-d",
+ },
+ "group-d": {
+ "group-e",
+ },
+ "group-e": {
+ "all",
+ },
+ "group-e:remove": {
+ "detected_foo",
+ },
+ "group-f": {
+ "a",
+ "b",
+ },
+ },
+ map[string]bool{
+ "group-a": true,
+ "group-b": true,
+ "group-c": true,
+ "group-d": true,
+ "group-e": true,
+ },
+ },
+ }
+
+ for _, tc := range tests {
+ t.Run(tc.name, func(t *testing.T) {
+ res := TransitivelyDetectedGroups(tc.groups)
+ testutil.AssertEqual(t, "res", res, tc.exp)
+ })
+ }
+}