| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import threading |
| import unittest |
| |
| import stress |
| |
| |
| class StopThreadForTesting(Exception): |
| pass |
| |
| |
| class StressorTest(unittest.TestCase): |
| |
| def testEscalateExceptions(self): |
| def stress_event(): |
| raise StopThreadForTesting |
| |
| stressor = stress.CountedStressor(stress_event) |
| stressor.start(1) |
| self.assertRaises(StopThreadForTesting, stressor.wait) |
| |
| |
| def testDontEscalateExceptions(self): |
| event = threading.Event() |
| def stress_event(): |
| event.set() |
| raise StopThreadForTesting |
| |
| stressor = stress.CountedStressor(stress_event, |
| escalate_exceptions=False) |
| stressor.start(1) |
| stressor.wait() |
| self.assertTrue(event.is_set(), 'The stress event did not run') |
| |
| |
| def testOnExit(self): |
| def stress_event(): |
| pass |
| |
| event = threading.Event() |
| def on_exit(): |
| event.set() |
| |
| stressor = stress.CountedStressor(stress_event, on_exit=on_exit) |
| stressor.start(1) |
| stressor.wait() |
| self.assertTrue(event.is_set()) |
| |
| |
| def testOnExitWithException(self): |
| def stress_event(): |
| raise StopThreadForTesting |
| |
| event = threading.Event() |
| def on_exit(): |
| event.set() |
| |
| stressor = stress.CountedStressor(stress_event, on_exit=on_exit) |
| stressor.start(1) |
| self.assertRaises(StopThreadForTesting, stressor.wait) |
| self.assertTrue(event.is_set()) |
| |
| |
| def testCountedStressorStartCondition(self): |
| event = threading.Event() |
| |
| def start_condition(): |
| if event.is_set(): |
| return True |
| event.set() |
| return False |
| |
| def stress_event(): |
| raise StopThreadForTesting |
| |
| stressor = stress.CountedStressor(stress_event) |
| stressor.start(1, start_condition=start_condition) |
| self.assertRaises(StopThreadForTesting, stressor.wait) |
| self.assertTrue(event.is_set(), |
| 'Stress event ran despite a False start condition') |
| |
| |
| def testControlledStressorStartCondition(self): |
| start_event = threading.Event() |
| ran_event = threading.Event() |
| |
| def start_condition(): |
| if start_event.is_set(): |
| return True |
| start_event.set() |
| return False |
| |
| def stress_event(): |
| ran_event.set() |
| raise StopThreadForTesting |
| |
| stressor = stress.ControlledStressor(stress_event) |
| stressor.start(start_condition=start_condition) |
| ran_event.wait() |
| self.assertRaises(StopThreadForTesting, stressor.stop) |
| self.assertTrue(start_event.is_set(), |
| 'Stress event ran despite a False start condition') |
| |
| |
| def testCountedStressorIterations(self): |
| # This is a list to get around scoping rules in Python 2.x. See |
| # 'nonlocal' for the Python 3 remedy. |
| count = [0] |
| |
| def stress_event(): |
| count[0] += 1 |
| |
| stressor = stress.CountedStressor(stress_event) |
| stressor.start(10) |
| stressor.wait() |
| self.assertEqual(10, count[0], 'Stress event did not run the expected ' |
| 'number of iterations') |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |