stacktach-winchester/tests/test_debugger.py

239 lines
8.7 KiB
Python

# Copyright (c) 2014 Dark Secret Software Inc.
# Copyright (c) 2015 Rackspace
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
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.assertEqual("n/a", debugger._name)
self.assertEqual(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.assertEqual(debugger,
self.debug_manager._debuggers['my_trigger'])
debugger2 = self.debug_manager.get_debugger(tdef)
self.assertEqual(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.assertEqual(debugger,
self.debug_manager._debuggers['my_trigger'])
debugger2 = self.debug_manager.get_debugger(tdef)
self.assertEqual(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.assertEqual(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.assertEqual(
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:
debugging.DetailedDebugger("my_debugger", 2)
reset.assert_called_once_with()
self.assertEqual(self.debugger._name, "my_debugger")
self.assertEqual(self.debugger._debug_level, 2)
def test_reset(self):
self.assertEqual(self.debugger._groups, {})
self.assertEqual(self.debugger._counters, {})
def test_get_group(self):
self.assertEqual(self.debugger._groups, {})
g = self.debugger.get_group("foo")
self.assertEqual(g._name, "foo")
self.assertTrue(self.debugger._groups['foo'])
def test_bump_counter(self):
self.assertEqual(self.debugger._counters, {})
self.debugger.bump_counter("foo")
self.assertEqual(self.debugger._counters['foo'], 1)
self.debugger.bump_counter("foo", 2)
self.assertEqual(self.debugger._counters['foo'], 3)
def test_get_debug_level(self):
self.assertEqual(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.assertEqual(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.assertEqual(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.assertEqual("my_group", self.group._name)
self.assertEqual(0, self.group._match)
self.assertEqual(0, self.group._mismatch)
self.assertEqual({}, self.group._reasons)
def test_match(self):
self.assertTrue(self.group.match())
self.assertEqual(1, self.group._match)
def test_mismatch(self):
self.assertFalse(self.group.mismatch("reason"))
self.assertEqual(1, self.group._mismatch)
self.assertEqual(1, self.group._reasons['reason'])
def test_check(self):
self.assertTrue(self.group.check(True, "reason"))
self.assertEqual(1, self.group._match)
self.assertEqual(0, self.group._mismatch)
self.assertEqual({}, self.group._reasons)
self.assertTrue(self.group.check(True, "reason"))
self.assertEqual(2, self.group._match)
self.assertEqual(0, self.group._mismatch)
self.assertEqual({}, self.group._reasons)
self.assertFalse(self.group.check(False, "reason"))
self.assertEqual(2, self.group._match)
self.assertEqual(1, self.group._mismatch)
self.assertEqual(1, self.group._reasons['reason'])
self.assertFalse(self.group.check(False, "reason"))
self.assertEqual(2, self.group._match)
self.assertEqual(2, self.group._mismatch)
self.assertEqual(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"))