Exemple #1
0
class RouteMessagesTest(TestCase):

    def setUp(self):
        self.processor = TestMessageProcessor()
        self.router = Router(self.processor, "")

    def update_rules(self, rules_config):
        self.router.rules = self.router.build_rules(rules_config)

    def test_message_processor_integration(self):
        """
        A message gets routed to the processor.
        """
        processor = MessageProcessor()
        router = Router(processor, "")
        router.process("gorets:1|c")
        self.assertEqual(len(processor.counter_metrics), 1)

    def test_receive_counter(self):
        self.router.process("gorets:1|c")
        self.assertEqual(len(self.processor.messages), 1)

    def test_any_and_drop(self):
        """
        Any message gets dropped with the drop rule.
        """
        self.update_rules("any => drop")
        self.router.process("gorets:1|c")
        self.assertEqual(len(self.processor.messages), 0)

    def test_metric_path_like(self):
        """
        path_like matches glob expressions.
        """
        self.update_rules("path_like goret* => drop")
        self.router.process("gorets:1|c")
        self.router.process("gorets:1|d")
        self.router.process("goret:1|d")
        self.router.process("nomatch:1|d")
        self.assertEqual(len(self.processor.messages), 1)
        self.assertEqual(self.processor.messages[0][2], "nomatch")

    def test_receive_two_rules_no_match(self):
        """
        Messages that do not match more than one rule are processed just fine.
        """
        self.update_rules("path_like goret* => drop\npath_like glork* => drop\n")
        self.router.process("nomatch:1|c")
        self.assertEqual(len(self.processor.messages), 1)

    def test_not(self):
        """
        Messages not matching the path_like expression get dropped.
        """
        self.update_rules("not path_like goret* => drop")
        self.router.process("gorets:1|c")
        self.router.process("nomatch:1|d")
        self.assertEqual(len(self.processor.messages), 1)
        self.assertEqual(self.processor.messages[0][2], "gorets")

    def test_rewrite(self):
        """
        Process all messages but only rewrite matching ones.
        """
        self.update_rules(r"any => rewrite (gorets) glork.\1")
        self.router.process("gorets:1|c")
        self.router.process("nomatch:1|d")
        self.assertEqual(len(self.processor.messages), 2)
        self.assertEqual(self.processor.messages[0][2], "glork.gorets")
        self.assertEqual(self.processor.messages[1][2], "nomatch")

    def test_rewrite_and_dup(self):
        """
        Process all messages but only rewrite matching ones. If dup flag is set
        then duplicate original message without rewriting it.
        """
        self.update_rules(r"any => rewrite (gorets) glork.\1 dup")
        self.router.process("gorets:1|c")
        self.router.process("nomatch:1|d")
        self.assertEqual(len(self.processor.messages), 3)
        self.assertEqual(self.processor.messages[0][2], "gorets")
        self.assertEqual(self.processor.messages[1][2], "glork.gorets")
        self.assertEqual(self.processor.messages[2][2], "nomatch")

    def test_rewrite_and_no_dup(self):
        """
        Process all messages but only rewrite matching ones. If dup flag is set
        to no-dup, then the original message is not duplicated.
        """
        self.update_rules(r"any => rewrite (gorets) glork.\1 no-dup")
        self.router.process("gorets:1|c")
        self.router.process("nomatch:1|d")
        self.assertEqual(len(self.processor.messages), 2)
        self.assertEqual(self.processor.messages[0][2], "glork.gorets")
        self.assertEqual(self.processor.messages[1][2], "nomatch")

    def test_set_metric_type(self):
        """
        Set metric type to something else.
        """
        self.update_rules(r"any => set_metric_type d")
        self.router.process("gorets:1|c")
        self.assertEqual(self.processor.messages[0][1], "d")
        self.assertEqual(self.processor.messages[0][2], "gorets")

    def test_set_metric_type_dup(self):
        """
        Set metric type to something else. If the dup flag is set, duplicate
        the original message.
        """
        self.update_rules(r"any => set_metric_type d dup")
        self.router.process("gorets:1|c")
        self.assertEqual(self.processor.messages[0][1], "c")
        self.assertEqual(self.processor.messages[0][2], "gorets")
        self.assertEqual(self.processor.messages[1][1], "d")
        self.assertEqual(self.processor.messages[1][2], "gorets")

    def test_set_metric_type_no_dup(self):
        """
        Set metric type to something else. If the dup flag is set to no-dup
        then do not duplicate the original message.
        """
        self.update_rules(r"any => set_metric_type d no-dup")
        self.router.process("gorets:1|c")
        self.assertEqual(self.processor.messages[0][1], "d")
        self.assertEqual(self.processor.messages[0][2], "gorets")