stacktach-winchester/tests/test_debugger.py
Sandy Walsh ac49955386 Adding debugger from oahu
Allows for per-trigger-definition debugging. Simply add
debug_level=1 to your trigger definition.

debug_level=2 gives detailed explainations of why your
stream didn't fire or trigger.

This way, you can leave the overall debug level at INFO
and still get details on the stream you're working on.

Yagi worker now uses idle() callback for debug updates.

and minor cleanups for pep8/HACKING

Change-Id: Id0af7a0adbcc47335ad250130958932c708b5c18
2014-10-02 20:50:31 +00:00

220 lines
8.1 KiB
Python

import unittest2 as unittest
import mock
from winchester import debugging
class TestDebugManager(unittest.TestCase):
def setUp(self):
super(TestDebugManager, self).setUp()
self.debug_manager = debugging.DebugManager()
def test_get_debugger_none(self):
debugger = self.debug_manager.get_debugger(None)
self.assertEquals("n/a", debugger._name)
self.assertEquals(2, debugger._debug_level)
def test_get_debugger_off(self):
tdef = mock.MagicMock(name="tdef")
tdef.name = "my_trigger"
tdef.debug_level = 0
debugger = self.debug_manager.get_debugger(tdef)
self.assertTrue(isinstance(debugger, debugging.NoOpDebugger))
self.assertEquals(debugger,
self.debug_manager._debuggers['my_trigger'])
debugger2 = self.debug_manager.get_debugger(tdef)
self.assertEquals(debugger, debugger2)
def test_get_debugger_on(self):
tdef = mock.MagicMock(name="tdef")
tdef.name = "my_trigger"
tdef.debug_level = 1
debugger = self.debug_manager.get_debugger(tdef)
self.assertTrue(isinstance(debugger, debugging.DetailedDebugger))
self.assertEquals(debugger,
self.debug_manager._debuggers['my_trigger'])
debugger2 = self.debug_manager.get_debugger(tdef)
self.assertEquals(debugger, debugger2)
def test_dump_group_level1(self):
debugger = mock.MagicMock(name="debugger")
debugger.get_debug_level.return_value = 1
group = mock.MagicMock(name="group")
group._name = "my_group"
group._match = 1
group._mismatch = 2
debugger.get_group.return_value = group
with mock.patch.object(debugging, "logger") as log:
self.debug_manager.dump_group(debugger, "my_group")
log.info.assert_called_once_with(
"my_group Criteria: 3 checks, 1 passed")
def test_dump_group_level2(self):
debugger = mock.MagicMock(name="debugger")
debugger.get_debug_level.return_value = 2
group = mock.MagicMock(name="group")
group._name = "my_group"
group._match = 1
group._mismatch = 2
group._reasons = {"foo": 12}
debugger.get_group.return_value = group
with mock.patch.object(debugging, "logger") as log:
self.debug_manager.dump_group(debugger, "my_group")
self.assertEquals(log.info.call_args_list,
[mock.call("my_group Criteria: 3 checks, 1 passed"),
mock.call(" - foo = 12")])
def test_dump_counters(self):
debugger = mock.MagicMock(name="debugger")
debugger._counters = {'foo': 12}
with mock.patch.object(debugging, "logger") as log:
self.debug_manager.dump_counters(debugger)
log.info.assert_called_once_with('Counter "foo" = 12')
def test_dump_debuggers_off(self):
debugger = mock.MagicMock(name="debugger")
debugger.get_debug_level.return_value = 0
self.debug_manager._debuggers = {"foo": debugger}
with mock.patch.object(debugging, "logger") as log:
self.debug_manager.dump_debuggers()
self.assertEqual(0, log.info.call_count)
def test_dump_debuggers_on(self):
debugger = mock.MagicMock(name="debugger")
debugger.get_debug_level.return_value = 1
debugger._name = "my_debugger"
group = mock.MagicMock(name="group")
debugger._groups = {"my_group": group}
self.debug_manager._debuggers = {"foo": debugger}
with mock.patch.object(self.debug_manager, "dump_counters") as ctr:
with mock.patch.object(self.debug_manager, "dump_group") as grp:
with mock.patch.object(debugging, "logger") as log:
self.debug_manager.dump_debuggers()
self.assertEquals(log.info.call_args_list,
[mock.call("---- Trigger Definition: my_debugger ----"),
mock.call("----------------------------")])
grp.assert_called_once_with(debugger, "my_group")
ctr.assert_called_once_with(debugger)
debugger.reset.assert_called_once_with()
class TestDetailedDebugger(unittest.TestCase):
def setUp(self):
super(TestDetailedDebugger, self).setUp()
self.debugger = debugging.DetailedDebugger("my_debugger", 2)
def test_constructor(self):
with mock.patch("winchester.debugging.DetailedDebugger.reset") \
as reset:
d = debugging.DetailedDebugger("my_debugger", 2)
reset.assert_called_once_with()
self.assertEquals(self.debugger._name, "my_debugger")
self.assertEquals(self.debugger._debug_level, 2)
def test_reset(self):
self.assertEquals(self.debugger._groups, {})
self.assertEquals(self.debugger._counters, {})
def test_get_group(self):
self.assertEquals(self.debugger._groups, {})
g = self.debugger.get_group("foo")
self.assertEquals(g._name, "foo")
self.assertTrue(self.debugger._groups['foo'])
def test_bump_counter(self):
self.assertEquals(self.debugger._counters, {})
self.debugger.bump_counter("foo")
self.assertEquals(self.debugger._counters['foo'], 1)
self.debugger.bump_counter("foo", 2)
self.assertEquals(self.debugger._counters['foo'], 3)
def test_get_debug_level(self):
self.assertEquals(self.debugger.get_debug_level(), 2)
class TestNoOpDebugger(unittest.TestCase):
def setUp(self):
super(TestNoOpDebugger, self).setUp()
self.debugger = debugging.NoOpDebugger("my_debugger", 2)
def test_reset(self):
self.debugger.reset()
def test_get_group(self):
g = self.debugger.get_group("foo")
self.assertEquals(g, self.debugger.noop_group)
def test_bump_counter(self):
self.debugger.bump_counter("foo")
self.debugger.bump_counter("foo", 2)
def test_get_debug_level(self):
self.assertEquals(self.debugger.get_debug_level(), 0)
class TestGroup(unittest.TestCase):
def setUp(self):
super(TestGroup, self).setUp()
self.group = debugging.Group("my_group")
def test_constructor(self):
self.assertEquals("my_group", self.group._name)
self.assertEquals(0, self.group._match)
self.assertEquals(0, self.group._mismatch)
self.assertEquals({}, self.group._reasons)
def test_match(self):
self.assertTrue(self.group.match())
self.assertEquals(1, self.group._match)
def test_mismatch(self):
self.assertFalse(self.group.mismatch("reason"))
self.assertEquals(1, self.group._mismatch)
self.assertEquals(1, self.group._reasons['reason'])
def test_check(self):
self.assertTrue(self.group.check(True, "reason"))
self.assertEquals(1, self.group._match)
self.assertEquals(0, self.group._mismatch)
self.assertEquals({}, self.group._reasons)
self.assertTrue(self.group.check(True, "reason"))
self.assertEquals(2, self.group._match)
self.assertEquals(0, self.group._mismatch)
self.assertEquals({}, self.group._reasons)
self.assertFalse(self.group.check(False, "reason"))
self.assertEquals(2, self.group._match)
self.assertEquals(1, self.group._mismatch)
self.assertEquals(1, self.group._reasons['reason'])
self.assertFalse(self.group.check(False, "reason"))
self.assertEquals(2, self.group._match)
self.assertEquals(2, self.group._mismatch)
self.assertEquals(2, self.group._reasons['reason'])
class TestNoOpGroup(unittest.TestCase):
def setUp(self):
super(TestNoOpGroup, self).setUp()
self.group = debugging.NoOpGroup()
def test_match(self):
self.assertTrue(self.group.match())
def test_mismatch(self):
self.assertFalse(self.group.mismatch("reason"))
def test_check(self):
self.assertTrue(self.group.check(True, "reason"))
self.assertFalse(self.group.check(False, "reason"))