# 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()