aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2023-02-13 12:26:46 +0100
committerAleksandr Nogikh <wp32pw@gmail.com>2023-02-13 12:59:07 +0100
commit5c39b01abfb2d0de51e9c995ab8071abd344ae3c (patch)
treef356f41780e7388b699d3a19696d82260a6b9223
parent4d66ad72335dded5c9a6652adf7b767b2dbd1de4 (diff)
pkg/subsystem: fix a bug in ReachableParents
Add a test to verify that the function works as intended.
-rw-r--r--pkg/subsystem/entities.go9
-rw-r--r--pkg/subsystem/entities_test.go23
2 files changed, 27 insertions, 5 deletions
diff --git a/pkg/subsystem/entities.go b/pkg/subsystem/entities.go
index b74217bcd..05032e6c2 100644
--- a/pkg/subsystem/entities.go
+++ b/pkg/subsystem/entities.go
@@ -17,15 +17,14 @@ func (subsystem *Subsystem) ReachableParents() map[*Subsystem]struct{} {
ret := make(map[*Subsystem]struct{})
var dfs func(node *Subsystem)
dfs = func(node *Subsystem) {
- if _, visited := ret[node]; visited {
- return
- }
for _, p := range node.Parents {
if p == subsystem {
panic("loop in the parents relation")
}
- ret[p] = struct{}{}
- dfs(p)
+ if _, visited := ret[p]; !visited {
+ ret[p] = struct{}{}
+ dfs(p)
+ }
}
}
dfs(subsystem)
diff --git a/pkg/subsystem/entities_test.go b/pkg/subsystem/entities_test.go
new file mode 100644
index 000000000..df65dbd5a
--- /dev/null
+++ b/pkg/subsystem/entities_test.go
@@ -0,0 +1,23 @@
+// Copyright 2023 syzkaller project authors. All rights reserved.
+// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
+
+package subsystem
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestReachableParents(t *testing.T) {
+ parentParent := &Subsystem{}
+ parentA := &Subsystem{Parents: []*Subsystem{parentParent}}
+ parentB := &Subsystem{Parents: []*Subsystem{parentParent}}
+ entity := &Subsystem{Parents: []*Subsystem{parentA, parentB}}
+
+ retParents := []*Subsystem{}
+ for item := range entity.ReachableParents() {
+ retParents = append(retParents, item)
+ }
+ assert.ElementsMatch(t, retParents, []*Subsystem{parentA, parentB, parentParent})
+}