diff --git a/client/internal/engine.go b/client/internal/engine.go index 1abb8163d..079adf7e8 100644 --- a/client/internal/engine.go +++ b/client/internal/engine.go @@ -1968,21 +1968,24 @@ func (e *Engine) toExcludedLazyPeers(rules []firewallManager.ForwardRule, peers } // isChecksEqual checks if two slices of checks are equal. -func isChecksEqual(checks []*mgmProto.Checks, oChecks []*mgmProto.Checks) bool { - for _, check := range checks { - sort.Slice(check.Files, func(i, j int) bool { - return check.Files[i] < check.Files[j] - }) - } - for _, oCheck := range oChecks { - sort.Slice(oCheck.Files, func(i, j int) bool { - return oCheck.Files[i] < oCheck.Files[j] - }) +func isChecksEqual(checks1, checks2 []*mgmProto.Checks) bool { + normalize := func(checks []*mgmProto.Checks) []string { + normalized := make([]string, len(checks)) + + for i, check := range checks { + sortedFiles := slices.Clone(check.Files) + sort.Strings(sortedFiles) + normalized[i] = strings.Join(sortedFiles, "|") + } + + sort.Strings(normalized) + return normalized } - return slices.EqualFunc(checks, oChecks, func(checks, oChecks *mgmProto.Checks) bool { - return slices.Equal(checks.Files, oChecks.Files) - }) + n1 := normalize(checks1) + n2 := normalize(checks2) + + return slices.Equal(n1, n2) } func getInterfacePrefixes() ([]netip.Prefix, error) { diff --git a/client/internal/engine_test.go b/client/internal/engine_test.go index f02138686..fffbed533 100644 --- a/client/internal/engine_test.go +++ b/client/internal/engine_test.go @@ -1270,6 +1270,82 @@ func Test_CheckFilesEqual(t *testing.T) { }, expectedBool: false, }, + { + name: "Compared Slices with same files but different order should return true", + inputChecks1: []*mgmtProto.Checks{ + { + Files: []string{ + "testfile1", + "testfile2", + }, + }, + { + Files: []string{ + "testfile4", + "testfile3", + }, + }, + }, + inputChecks2: []*mgmtProto.Checks{ + { + Files: []string{ + "testfile3", + "testfile4", + }, + }, + { + Files: []string{ + "testfile2", + "testfile1", + }, + }, + }, + expectedBool: true, + }, + { + name: "Compared Slices with same files but different order while first is equal should return true", + inputChecks1: []*mgmtProto.Checks{ + { + Files: []string{ + "testfile0", + "testfile1", + }, + }, + { + Files: []string{ + "testfile0", + "testfile2", + }, + }, + { + Files: []string{ + "testfile0", + "testfile3", + }, + }, + }, + inputChecks2: []*mgmtProto.Checks{ + { + Files: []string{ + "testfile0", + "testfile1", + }, + }, + { + Files: []string{ + "testfile0", + "testfile3", + }, + }, + { + Files: []string{ + "testfile0", + "testfile2", + }, + }, + }, + expectedBool: true, + }, } for _, testCase := range testCases { t.Run(testCase.name, func(t *testing.T) {