Skip to content

Commit c2644a8

Browse files
committed
Adding test case to handle folder of rules/ruleset.yaml and dir's
Signed-off-by: Shawn Hurley <shawn@hurley.page>
1 parent 942fca1 commit c2644a8

File tree

8 files changed

+143
-27
lines changed

8 files changed

+143
-27
lines changed

parser/rule_parser.go

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package parser
22

33
import (
44
"context"
5+
"errors"
56
"fmt"
67
"maps"
78
"os"
@@ -37,21 +38,6 @@ func (e MissingProviderError) Error() string {
3738
return fmt.Sprintf("unable to find provider for: %v", e.Provider)
3839
}
3940

40-
type parserErrors struct {
41-
errs []error
42-
}
43-
44-
func (e parserErrors) Error() string {
45-
s := ""
46-
for i, e := range e.errs {
47-
if i == 0 {
48-
s = e.Error()
49-
}
50-
s = fmt.Sprintf("%s\n%s", s, e.Error())
51-
}
52-
return s
53-
}
54-
5541
type ruleParseReturn struct {
5642
rules []engine.Rule
5743
conditionsByCap map[string][]provider.ConditionsByCap
@@ -136,21 +122,21 @@ func (r *RuleParser) LoadRules(filepath string) ([]engine.RuleSet, map[string]pr
136122
}
137123
var ruleSet *engine.RuleSet
138124
rules := []engine.Rule{}
139-
parserErr := &parserErrors{}
125+
var parseErr error
140126
ruleParserWG := sync.WaitGroup{}
141127
ruleLoadChan := make(chan ruleParseReturn, 10)
142128

143-
loadCtx, _ := context.WithTimeout(context.Background(), 5*time.Minute)
129+
loadCtx, cancelFunc := context.WithTimeout(context.Background(), 5*time.Minute)
144130
for _, f := range files {
145131
info, err := os.Stat(path.Join(filepath, f.Name()))
146132
if err != nil {
147-
parserErr.errs = append(parserErr.errs, err)
133+
parseErr = errors.Join(parseErr, err)
148134
continue
149135
}
150136
if info.IsDir() {
151137
r, m, provConditions, err := r.LoadRules(path.Join(filepath, f.Name()))
152138
if err != nil {
153-
parserErr.errs = append(parserErr.errs, err)
139+
parseErr = errors.Join(parseErr, err)
154140
continue
155141
}
156142
ruleSets = append(ruleSets, r...)
@@ -211,7 +197,7 @@ func (r *RuleParser) LoadRules(filepath string) ([]engine.RuleSet, map[string]pr
211197
continue
212198
}
213199
if load.err != nil {
214-
parserErr.errs = append(parserErr.errs, load.err)
200+
parseErr = errors.Join(parseErr, err)
215201
ruleParserWG.Done()
216202
continue
217203
}
@@ -242,18 +228,16 @@ func (r *RuleParser) LoadRules(filepath string) ([]engine.RuleSet, map[string]pr
242228
}
243229
if ok, err := r.Selector.Matches(meta); !ok && err == nil {
244230
r.Log.V(6).Info("ruleset does not have any rules that match selector, filtering out", "ruleSet", ruleSet.Name)
245-
return nil, nil, nil, nil
231+
cancelFunc()
232+
return ruleSets, clientMap, providerConditions, parseErr
246233
}
247234
}
248235

249236
ruleSet.Rules = rules
250237
ruleSets = append(ruleSets, *ruleSet)
251238
}
252-
// Return nil if there are no captured errors
253-
if len(parserErr.errs) == 0 {
254-
return ruleSets, clientMap, providerConditions, nil
255-
}
256-
return ruleSets, clientMap, providerConditions, parserErr
239+
cancelFunc()
240+
return ruleSets, clientMap, providerConditions, parseErr
257241
}
258242

259243
func (r *RuleParser) LoadRule(filepath string) ([]engine.Rule, map[string]provider.InternalProviderClient, map[string][]provider.ConditionsByCap, error) {

parser/rule_parser_test.go

Lines changed: 108 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,113 @@ func TestLoadRules(t *testing.T) {
653653
},
654654
},
655655
},
656+
{
657+
Name: "folder of rules ruleset",
658+
testFileName: "folder-of-rules-ruleset",
659+
providerNameClient: map[string]provider.InternalProviderClient{
660+
"builtin": testProvider{
661+
caps: []provider.Capability{{
662+
Name: "file",
663+
}},
664+
},
665+
"notadded": testProvider{
666+
caps: []provider.Capability{{
667+
Name: "fake",
668+
}},
669+
},
670+
},
671+
ExpectedRuleSet: map[string]engine.RuleSet{
672+
"folder-of-rules-rulesets": {
673+
Rules: []engine.Rule{
674+
{
675+
RuleMeta: engine.RuleMeta{
676+
RuleID: "file-001",
677+
Effort: &effort,
678+
Category: &konveyor.Potential,
679+
},
680+
Perform: engine.Perform{
681+
Message: engine.Message{
682+
Text: &allGoFiles,
683+
Links: []konveyor.Link{},
684+
},
685+
},
686+
When: engine.ConditionEntry{},
687+
},
688+
},
689+
},
690+
"file-ruleset-a": {
691+
Rules: []engine.Rule{
692+
{
693+
RuleMeta: engine.RuleMeta{
694+
RuleID: "file-001",
695+
Description: "",
696+
Category: &konveyor.Potential,
697+
},
698+
Perform: engine.Perform{Message: engine.Message{Text: &allGoFiles, Links: []konveyor.Link{}}},
699+
When: engine.ConditionEntry{},
700+
},
701+
},
702+
},
703+
"file-ruleset-b": {
704+
Rules: []engine.Rule{
705+
{
706+
RuleMeta: engine.RuleMeta{RuleID: "file-001",
707+
Description: "",
708+
Category: &konveyor.Potential,
709+
},
710+
Perform: engine.Perform{Message: engine.Message{Text: &allGoFiles, Links: []konveyor.Link{}}},
711+
When: engine.ConditionEntry{},
712+
},
713+
},
714+
},
715+
},
716+
ExpectedProvider: map[string]provider.InternalProviderClient{
717+
"builtin": testProvider{
718+
caps: []provider.Capability{{
719+
Name: "file",
720+
}},
721+
},
722+
},
723+
},
724+
{
725+
Name: "folder of rules ruleset filter",
726+
testFileName: "folder-of-rules-ruleset",
727+
providerNameClient: map[string]provider.InternalProviderClient{
728+
"builtin": testProvider{
729+
caps: []provider.Capability{{
730+
Name: "file",
731+
}},
732+
},
733+
"notadded": testProvider{
734+
caps: []provider.Capability{{
735+
Name: "fake",
736+
}},
737+
},
738+
},
739+
ExpectedRuleSet: map[string]engine.RuleSet{
740+
"file-ruleset-a": {
741+
Rules: []engine.Rule{
742+
{
743+
RuleMeta: engine.RuleMeta{
744+
RuleID: "file-001",
745+
Description: "",
746+
Category: &konveyor.Potential,
747+
},
748+
Perform: engine.Perform{Message: engine.Message{Text: &allGoFiles, Links: []konveyor.Link{}}},
749+
When: engine.ConditionEntry{},
750+
},
751+
},
752+
},
753+
},
754+
ExpectedProvider: map[string]provider.InternalProviderClient{
755+
"builtin": testProvider{
756+
caps: []provider.Capability{{
757+
Name: "file",
758+
}},
759+
},
760+
},
761+
Selector: "test=filter",
762+
},
656763
{
657764
Name: "handle not-valid category",
658765
testFileName: "invalid-category.yaml",
@@ -1053,7 +1160,7 @@ func TestLoadRules(t *testing.T) {
10531160
compareWhens(expectedRule.When, rule.When, t)
10541161
}
10551162
if !foundRule {
1056-
t.Errorf("not have matching rule go: %#v, expected rules: %#v", rule, expectedSet.Rules)
1163+
t.Errorf("not have matching rule go: %#v\nin ruleset: %v\nexpected rules: %#v", rule, ruleSet.Name, expectedSet.Rules)
10571164
}
10581165
}
10591166
// We will test the conditions getter by itself.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
- message: all go files
3+
ruleID: file-001
4+
category: potential
5+
effort: 3
6+
when:
7+
builtin.file: "*.go"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
- message: all go files
3+
ruleID: file-001
4+
when:
5+
builtin.file: "*.go"
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
name: "file-ruleset-a"
2+
description: "testing"
3+
labels:
4+
- test=filter
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
- message: all go files
3+
ruleID: file-001
4+
when:
5+
builtin.file: "*.go"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
name: "file-ruleset-b"
2+
description: "testing"
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
name: "folder-of-rules-rulesets"
2+
description: "testing"

0 commit comments

Comments
 (0)