diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2023-02-13 12:26:46 +0100 |
|---|---|---|
| committer | Aleksandr Nogikh <wp32pw@gmail.com> | 2023-02-13 12:59:07 +0100 |
| commit | 5c39b01abfb2d0de51e9c995ab8071abd344ae3c (patch) | |
| tree | f356f41780e7388b699d3a19696d82260a6b9223 /pkg/subsystem | |
| parent | 4d66ad72335dded5c9a6652adf7b767b2dbd1de4 (diff) | |
pkg/subsystem: fix a bug in ReachableParents
Add a test to verify that the function works as intended.
Diffstat (limited to 'pkg/subsystem')
| -rw-r--r-- | pkg/subsystem/entities.go | 9 | ||||
| -rw-r--r-- | pkg/subsystem/entities_test.go | 23 |
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}) +} |
