blob: ae8419690eabe09095e84e6e6226740d26623b39 [file] [log] [blame]
Kuang-che Wu88875db2017-07-20 10:47:53 +08001# Copyright 2017 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4"""Test runner.py script"""
5
6from __future__ import print_function
7import argparse
8import unittest
9
10import mock
11
12import runner
13
14
15@mock.patch('bisect_kit.common.config_logging', mock.Mock())
16class TestRunner(unittest.TestCase):
17 """Test runner."""
18
19 def test_argtype_ratio(self):
20 self.assertEqual(runner.argtype_ratio('=1'), ('=', 1.0))
21 with self.assertRaises(argparse.ArgumentTypeError):
22 runner.argtype_ratio('hello')
23 with self.assertRaises(argparse.ArgumentTypeError):
24 runner.argtype_ratio('>5')
25
26 def test_is_meet_finished(self):
27 self.assertEqual(
28 runner.criteria_is_met(('=', 0), dict(new=0, old=0, skip=1), 0, 'new'),
29 None)
30
31 self.assertEqual(
32 runner.criteria_is_met(('=', 0), dict(new=0, old=3), 0, 'new'), True)
33 self.assertEqual(
34 runner.criteria_is_met(('<', 0.4), dict(new=3, old=7), 0, 'new'), True)
35 self.assertEqual(
36 runner.criteria_is_met(('<=', 0.4), dict(new=3, old=7), 0, 'new'), True)
37 self.assertEqual(
38 runner.criteria_is_met(('>', 0.2), dict(new=3, old=7), 0, 'new'), True)
39 self.assertEqual(
40 runner.criteria_is_met(('>=', 0.2), dict(new=3, old=7), 0, 'new'), True)
41
42 def test_is_meet_rest(self):
43 self.assertEqual(
44 runner.criteria_is_met(('=', 0), dict(new=0, old=0, skip=1), 1, 'new'),
45 None)
46
47 # Between 0.45 and 0.63
48 self.assertEqual(
49 runner.criteria_is_met(('>', 0.5), dict(old=4, new=5), 2, 'new'), None)
50 # Between 0.5 and 0.6
51 self.assertEqual(
52 runner.criteria_is_met(('>', 0.5), dict(old=4, new=5), 1, 'new'), None)
53 # Between 0.5 and 0.6
54 self.assertEqual(
55 runner.criteria_is_met(('>=', 0.5), dict(old=4, new=5), 1, 'new'), True)
56 # Between 0.4 and 0.5
57 self.assertEqual(
58 runner.criteria_is_met(('>=', 0.5), dict(old=5, new=4), 1, 'new'), None)
59 # Between 0.4 and 0.5
60 self.assertEqual(
61 runner.criteria_is_met(('<', 0.5), dict(old=5, new=4), 1, 'new'), None)
62 # Between 0.5 and 0.6
63 self.assertEqual(
64 runner.criteria_is_met(('<=', 0.5), dict(old=4, new=5), 1, 'new'), None)
65 # Between 0.83 and 1.0
66 self.assertEqual(
67 runner.criteria_is_met(('=', 1.0), dict(old=0, new=5), 1, 'new'), None)
68
69 # It's certain because the result count is impossible non-integer.
70 self.assertEqual(
71 runner.criteria_is_met(('=', 0.5), dict(old=1, new=1), 1, 'new'), False)
72
73 def test_run_once_returncode(self):
74 parser = runner.create_argument_parser()
75 opts = parser.parse_args(['--new', '--returncode=0', 'true'])
76 self.assertEqual(runner.run_once(opts), runner.NEW)
77
78 opts = parser.parse_args(['--new', '--returncode=0', 'false'])
79 self.assertEqual(runner.run_once(opts), runner.OLD)
80
81 opts = parser.parse_args(['--new', '--returncode=0', 'program.not.found'])
82 self.assertEqual(runner.run_once(opts), runner.FATAL)
83
84 opts = parser.parse_args(['--new', '--returncode=0', 'sh', '-c', 'kill $$'])
85 self.assertEqual(runner.run_once(opts), runner.FATAL)
86
87 def test_run_once_output(self):
88 parser = runner.create_argument_parser()
89 opts = parser.parse_args(['--old', '--output', 'OLD', 'echo', 'OLD'])
90 self.assertEqual(runner.run_once(opts), runner.OLD)
91
92 opts = parser.parse_args([
93 '--old', '--output', 'OLD', '--precondition_output', 'foo', 'echo',
94 'foo OLD'
95 ])
96 self.assertEqual(runner.run_once(opts), runner.OLD)
97
98 opts = parser.parse_args([
99 '--old', '--output', 'OLD', '--precondition_output', 'foo', 'echo',
100 'bar OLD'
101 ])
102 self.assertEqual(runner.run_once(opts), runner.SKIP)
103
104 def test_run_once_timeout(self):
105 parser = runner.create_argument_parser()
106 opts = parser.parse_args(['--new', '--timeout=0.1', 'sleep', '0.11'])
107 self.assertEqual(runner.run_once(opts), runner.NEW)
108
109 opts = parser.parse_args(['--new', '--timeout=0.1', 'sleep', '0'])
110 self.assertEqual(runner.run_once(opts), runner.OLD)
111
112 def test_run_once_terminate_output(self):
113 parser = runner.create_argument_parser()
114 opts = parser.parse_args([
115 '--new', '--output=hello', '--terminate_output', 'hello', 'sh', '-c',
116 'echo hello; sleep 100; echo world'
117 ])
118 self.assertEqual(runner.run_once(opts), runner.NEW)
119
120 opts = parser.parse_args([
121 '--new', '--output=world', '--terminate_output', 'hello', 'sh', '-c',
122 'echo hello; sleep 100; echo world'
123 ])
124 self.assertEqual(runner.run_once(opts), runner.OLD)
125
126 def test_main(self):
127 self.assertEqual(
128 runner.main(['--new', '--output', 'hello', 'echo', 'hello']),
129 runner.NEW)
130 self.assertEqual(
131 runner.main(['--old', '--output', 'hello', 'echo', 'hello']),
132 runner.OLD)
133 self.assertEqual(
134 runner.main(['--new', '--output', 'hello', 'echo', 'world']),
135 runner.OLD)
136 self.assertEqual(
137 runner.main([
138 '--new', '--output', 'hello', '--precondition_output', 'hello',
139 'echo', 'world'
140 ]), runner.SKIP)
141
142 def test_main_fatal(self):
143 self.assertEqual(
144 runner.main(['--new', '--output', 'hello', '/non/existing/path']),
145 runner.FATAL)
146
147 def test_main_shortcut(self):
148 with mock.patch.object(
149 runner, 'run_once', return_value=runner.OLD) as mock_run_once:
150 self.assertEqual(
151 runner.main(['--new', '--output=hello', '--repeat=5', 'foo']),
152 runner.OLD)
153 self.assertEqual(mock_run_once.call_count, 1)
154
155 with mock.patch.object(
156 runner, 'run_once', return_value=runner.OLD) as mock_run_once:
157 self.assertEqual(
158 runner.main(
159 ['--new', '--output=hello', '--repeat=10', '--ratio=>0.3',
160 'foo']), runner.OLD)
161 self.assertEqual(mock_run_once.call_count, 7)
162
163 with mock.patch.object(
164 runner, 'run_once', return_value=runner.OLD) as mock_run_once:
165 self.assertEqual(
166 runner.main([
167 '--new', '--output=hello', '--repeat=10', '--ratio=>0.3',
168 '--noshortcut', 'foo'
169 ]), runner.OLD)
170 self.assertEqual(mock_run_once.call_count, 10)
171
172
173if __name__ == '__main__':
174 unittest.main()