diff options
author | Emiliano Ciavatta | 2020-04-15 10:10:21 +0000 |
---|---|---|
committer | Emiliano Ciavatta | 2020-04-15 10:10:21 +0000 |
commit | a32ff72dfe0c2aba3e51bd9536d5e11a30a9d73d (patch) | |
tree | 4d7b0f9e6b4b5dfeda26328df31b773919cf0d79 /rules_manager.go | |
parent | a56a4e391d541ae05de0203f3d493edc3b04681d (diff) |
Add rules_manager tests
Diffstat (limited to 'rules_manager.go')
-rw-r--r-- | rules_manager.go | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/rules_manager.go b/rules_manager.go index 57f8768..89b6153 100644 --- a/rules_manager.go +++ b/rules_manager.go @@ -64,7 +64,7 @@ type RulesManager interface { LoadRules() error AddRule(context context.Context, rule Rule) (RowID, error) GetRule(id RowID) (Rule, bool) - UpdateRule(context context.Context, id RowID, rule Rule) bool + UpdateRule(context context.Context, id RowID, rule Rule) (bool, error) GetRules() []Rule FillWithMatchedRules(connection *Connection, clientMatches map[uint][]PatternSlice, serverMatches map[uint][]PatternSlice) DatabaseUpdateChannel() chan RulesDatabase @@ -138,10 +138,15 @@ func (rm *rulesManagerImpl) GetRule(id RowID) (Rule, bool) { return rule, isPresent } -func (rm *rulesManagerImpl) UpdateRule(context context.Context, id RowID, rule Rule) bool { +func (rm *rulesManagerImpl) UpdateRule(context context.Context, id RowID, rule Rule) (bool, error) { newRule, isPresent := rm.rules[id] if !isPresent { - return false + return false, nil + } + + sameName, isPresent := rm.rulesByName[rule.Name] + if isPresent && sameName.ID != id { + return false, errors.New("already exists another rule with the same name") } updated, err := rm.storage.Update(Rules).Context(context).Filter(OrderedDocument{{"_id", id}}). @@ -161,7 +166,7 @@ func (rm *rulesManagerImpl) UpdateRule(context context.Context, id RowID, rule R rm.mutex.Unlock() } - return updated + return updated, nil } func (rm *rulesManagerImpl) GetRules() []Rule { @@ -201,6 +206,7 @@ func (rm *rulesManagerImpl) validateAndAddRuleLocal(rule *Rule) error { } newPatterns := make([]*hyperscan.Pattern, 0, len(rule.Patterns)) + duplicatePatterns := make(map[string]bool) for i, pattern := range rule.Patterns { if err := rm.validate.Struct(pattern); err != nil { return err @@ -210,7 +216,11 @@ func (rm *rulesManagerImpl) validateAndAddRuleLocal(rule *Rule) error { if err != nil { return err } - if existingPattern, isPresent := rm.patternsIds[compiledPattern.String()]; isPresent { + regex := compiledPattern.String() + if _, isPresent := duplicatePatterns[regex]; isPresent { + return errors.New("duplicate pattern") + } + if existingPattern, isPresent := rm.patternsIds[regex]; isPresent { rule.Patterns[i].internalID = existingPattern continue } @@ -219,6 +229,7 @@ func (rm *rulesManagerImpl) validateAndAddRuleLocal(rule *Rule) error { rule.Patterns[i].internalID = id compiledPattern.Id = id newPatterns = append(newPatterns, compiledPattern) + duplicatePatterns[regex] = true } startId := len(rm.patterns) |