xref: /aosp_15_r20/external/autotest/server/cros/stress_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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