예제 #1
0
    def evaluate_rules_with_cookie(self, cookie: Cookie) -> bool:
        rule_queue = RuleQueue(self.rules)
        terminate = False

        while not terminate and rule_queue.has_unapplied_rules():
            rule = rule_queue.get_next()
            isolated_cookie = copy.deepcopy(cookie)
            try:
                matches = rule.matches(isolated_cookie)
                if matches:
                    terminate = rule.execute_action(isolated_cookie)
            except:
                matches = False
                logging.error("Error applying rule; Rule: %s; Error: %s" % (rule, traceback.format_exc()))

            if matches:
                log = RuleApplicationLog(rule.id, terminate)
                log_as_dict = BasicProcessor._RULE_APPLICATION_LOG_JSON_ENCODER.default(log)
                enrichment = Enrichment(RULE_APPLICATION, datetime.now(tz=timezone.utc), Metadata(log_as_dict))
                self.cookie_jar.enrich_cookie(cookie.identifier, enrichment, mark_for_processing=False)
                # Update in-memory copy of cookie
                cookie.enrichments.add(enrichment)
            rule_queue.mark_as_applied(rule)

        return terminate
예제 #2
0
    def test_constructor(self):
        rule_queue = RuleQueue(self.rules)
        self.assertTrue(rule_queue.has_unapplied_rules())

        rules = []
        while rule_queue.has_unapplied_rules():
            rules.append(rule_queue.get_next())

        self.assertCountEqual(rules, self.rules)
예제 #3
0
    def test_mark_as_applied_unapplied_rule(self):
        rule_queue = RuleQueue(self.rules)

        applied_rules = []
        while rule_queue.has_unapplied_rules():
            rule = rule_queue.get_next()
            self.assertNotIn(rule, applied_rules)
            rule_queue.mark_as_applied(rule)
            applied_rules.append(rule)
예제 #4
0
    def evaluate_rules_with_cookie(self, cookie: Cookie) -> bool:
        rule_queue = RuleQueue(self.rules)
        terminate = False

        while not terminate and rule_queue.has_unapplied_rules():
            rule = rule_queue.get_next()
            isolated_cookie = copy.deepcopy(cookie)
            try:
                if rule.matches(isolated_cookie):
                    terminate = rule.execute_action(isolated_cookie)
            except Exception:
                logging.error("Error applying rule; Rule: %s; Error: %s" % (rule, traceback.format_exc()))
            rule_queue.mark_as_applied(rule)

        return terminate
예제 #5
0
    def test_get_next_can_get_all_in_correct_order(self):
        rule_queue = RuleQueue(self.rules)

        rules = []  # type: List[Rule]
        while rule_queue.has_unapplied_rules():
            rule = rule_queue.get_next()

            for previous_rule in rules:
                self.assertGreaterEqual(
                    abs(Priority.MAX_PRIORITY - rule.priority), abs(Priority.MAX_PRIORITY - previous_rule.priority))

            self.assertIn(rule, self.rules)
            rules.append(rule)

        self.assertCountEqual(rules, self.rules)
예제 #6
0
 def test_mark_as_applied_applied(self):
     rule_queue = RuleQueue(self.rules)
     rule = rule_queue.get_next()
     rule_queue.mark_as_applied(rule)
     self.assertRaises(ValueError, rule_queue.mark_as_applied, rule)
예제 #7
0
 def test_get_next_when_no_next_exists(self):
     rule_queue = RuleQueue([])
     self.assertIsNone(rule_queue.get_next())
예제 #8
0
 def test_has_unapplied_rules_with_no_unapplied_rules(self):
     rule_queue = RuleQueue([])
     self.assertFalse(rule_queue.has_unapplied_rules())
예제 #9
0
 def test_has_unapplied_rules_with_unapplied_rules(self):
     rule_queue = RuleQueue(self.rules)
     self.assertTrue(rule_queue.has_unapplied_rules())
예제 #10
0
    def test_reset(self):
        rule_queue = RuleQueue(self.rules)
        rule_1 = rule_queue.get_next()
        rule_queue.mark_as_applied(rule_1)
        rule_2 = rule_queue.get_next()
        rule_queue.mark_as_applied(rule_2)
        rule_queue.reset()

        unapplied_counter = 0
        while rule_queue.has_unapplied_rules():
            rule = rule_queue.get_next()
            rule_queue.mark_as_applied(rule)
            unapplied_counter += 1
        self.assertEqual(unapplied_counter, len(self.rules))