1*9c5db199SXin Li# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 3*9c5db199SXin Li# found in the LICENSE file. 4*9c5db199SXin Li 5*9c5db199SXin Liimport threading 6*9c5db199SXin Liimport unittest 7*9c5db199SXin Li 8*9c5db199SXin Liimport common 9*9c5db199SXin Li 10*9c5db199SXin Lifrom autotest_lib.server.cros import stress 11*9c5db199SXin Li 12*9c5db199SXin Li 13*9c5db199SXin Liclass StopThreadForTesting(Exception): 14*9c5db199SXin Li pass 15*9c5db199SXin Li 16*9c5db199SXin Li 17*9c5db199SXin Liclass StressorTest(unittest.TestCase): 18*9c5db199SXin Li 19*9c5db199SXin Li def testEscalateExceptions(self): 20*9c5db199SXin Li def stress_event(): 21*9c5db199SXin Li raise StopThreadForTesting 22*9c5db199SXin Li 23*9c5db199SXin Li stressor = stress.CountedStressor(stress_event) 24*9c5db199SXin Li stressor.start(1) 25*9c5db199SXin Li self.assertRaises(StopThreadForTesting, stressor.wait) 26*9c5db199SXin Li 27*9c5db199SXin Li 28*9c5db199SXin Li def testDontEscalateExceptions(self): 29*9c5db199SXin Li event = threading.Event() 30*9c5db199SXin Li def stress_event(): 31*9c5db199SXin Li event.set() 32*9c5db199SXin Li raise StopThreadForTesting 33*9c5db199SXin Li 34*9c5db199SXin Li stressor = stress.CountedStressor(stress_event, 35*9c5db199SXin Li escalate_exceptions=False) 36*9c5db199SXin Li stressor.start(1) 37*9c5db199SXin Li stressor.wait() 38*9c5db199SXin Li self.assertTrue(event.is_set(), 'The stress event did not run') 39*9c5db199SXin Li 40*9c5db199SXin Li 41*9c5db199SXin Li def testOnExit(self): 42*9c5db199SXin Li def stress_event(): 43*9c5db199SXin Li pass 44*9c5db199SXin Li 45*9c5db199SXin Li event = threading.Event() 46*9c5db199SXin Li def on_exit(): 47*9c5db199SXin Li event.set() 48*9c5db199SXin Li 49*9c5db199SXin Li stressor = stress.CountedStressor(stress_event, on_exit=on_exit) 50*9c5db199SXin Li stressor.start(1) 51*9c5db199SXin Li stressor.wait() 52*9c5db199SXin Li self.assertTrue(event.is_set()) 53*9c5db199SXin Li 54*9c5db199SXin Li 55*9c5db199SXin Li def testOnExitWithException(self): 56*9c5db199SXin Li def stress_event(): 57*9c5db199SXin Li raise StopThreadForTesting 58*9c5db199SXin Li 59*9c5db199SXin Li event = threading.Event() 60*9c5db199SXin Li def on_exit(): 61*9c5db199SXin Li event.set() 62*9c5db199SXin Li 63*9c5db199SXin Li stressor = stress.CountedStressor(stress_event, on_exit=on_exit) 64*9c5db199SXin Li stressor.start(1) 65*9c5db199SXin Li self.assertRaises(StopThreadForTesting, stressor.wait) 66*9c5db199SXin Li self.assertTrue(event.is_set()) 67*9c5db199SXin Li 68*9c5db199SXin Li 69*9c5db199SXin Li def testCountedStressorStartCondition(self): 70*9c5db199SXin Li event = threading.Event() 71*9c5db199SXin Li 72*9c5db199SXin Li def start_condition(): 73*9c5db199SXin Li if event.is_set(): 74*9c5db199SXin Li return True 75*9c5db199SXin Li event.set() 76*9c5db199SXin Li return False 77*9c5db199SXin Li 78*9c5db199SXin Li def stress_event(): 79*9c5db199SXin Li raise StopThreadForTesting 80*9c5db199SXin Li 81*9c5db199SXin Li stressor = stress.CountedStressor(stress_event) 82*9c5db199SXin Li stressor.start(1, start_condition=start_condition) 83*9c5db199SXin Li self.assertRaises(StopThreadForTesting, stressor.wait) 84*9c5db199SXin Li self.assertTrue(event.is_set(), 85*9c5db199SXin Li 'Stress event ran despite a False start condition') 86*9c5db199SXin Li 87*9c5db199SXin Li 88*9c5db199SXin Li def testControlledStressorStartCondition(self): 89*9c5db199SXin Li start_event = threading.Event() 90*9c5db199SXin Li ran_event = threading.Event() 91*9c5db199SXin Li 92*9c5db199SXin Li def start_condition(): 93*9c5db199SXin Li if start_event.is_set(): 94*9c5db199SXin Li return True 95*9c5db199SXin Li start_event.set() 96*9c5db199SXin Li return False 97*9c5db199SXin Li 98*9c5db199SXin Li def stress_event(): 99*9c5db199SXin Li ran_event.set() 100*9c5db199SXin Li raise StopThreadForTesting 101*9c5db199SXin Li 102*9c5db199SXin Li stressor = stress.ControlledStressor(stress_event) 103*9c5db199SXin Li stressor.start(start_condition=start_condition) 104*9c5db199SXin Li ran_event.wait() 105*9c5db199SXin Li self.assertRaises(StopThreadForTesting, stressor.stop) 106*9c5db199SXin Li self.assertTrue(start_event.is_set(), 107*9c5db199SXin Li 'Stress event ran despite a False start condition') 108*9c5db199SXin Li 109*9c5db199SXin Li 110*9c5db199SXin Li def testCountedStressorIterations(self): 111*9c5db199SXin Li # This is a list to get around scoping rules in Python 2.x. See 112*9c5db199SXin Li # 'nonlocal' for the Python 3 remedy. 113*9c5db199SXin Li count = [0] 114*9c5db199SXin Li 115*9c5db199SXin Li def stress_event(): 116*9c5db199SXin Li count[0] += 1 117*9c5db199SXin Li 118*9c5db199SXin Li stressor = stress.CountedStressor(stress_event) 119*9c5db199SXin Li stressor.start(10) 120*9c5db199SXin Li stressor.wait() 121*9c5db199SXin Li self.assertEqual(10, count[0], 'Stress event did not run the expected ' 122*9c5db199SXin Li 'number of iterations') 123*9c5db199SXin Li 124*9c5db199SXin Li 125*9c5db199SXin Liif __name__ == '__main__': 126*9c5db199SXin Li unittest.main() 127