blob: 4114c59cc9415ec93f46c9ae3d023f04a8687b2f [file] [log] [blame]
jadmanski6e8bf752008-05-14 00:17:48 +00001#!/usr/bin/python
2
lmr6f80e7a2010-02-04 03:18:28 +00003import unittest, datetime, time
jadmanski6e8bf752008-05-14 00:17:48 +00004
5import common
lmr6f80e7a2010-02-04 03:18:28 +00006from autotest_lib.client.common_lib import utils
jadmanski6e8bf752008-05-14 00:17:48 +00007from autotest_lib.tko.parsers import version_1
8
9
10class test_status_line(unittest.TestCase):
jadmanski0afbb632008-06-06 21:10:57 +000011 statuses = ["GOOD", "WARN", "FAIL", "ABORT"]
jadmanski6e8bf752008-05-14 00:17:48 +000012
13
jadmanski0afbb632008-06-06 21:10:57 +000014 def test_handles_start(self):
15 line = version_1.status_line(0, "START", "----", "test",
16 "", {})
17 self.assertEquals(line.type, "START")
18 self.assertEquals(line.status, None)
jadmanski6e8bf752008-05-14 00:17:48 +000019
20
jadmanski807490c2008-09-15 19:15:02 +000021 def test_handles_info(self):
22 line = version_1.status_line(0, "INFO", "----", "----",
23 "", {})
24 self.assertEquals(line.type, "INFO")
25 self.assertEquals(line.status, None)
26
27
jadmanski0afbb632008-06-06 21:10:57 +000028 def test_handles_status(self):
29 for stat in self.statuses:
30 line = version_1.status_line(0, stat, "----", "test",
31 "", {})
32 self.assertEquals(line.type, "STATUS")
33 self.assertEquals(line.status, stat)
jadmanski6e8bf752008-05-14 00:17:48 +000034
35
jadmanski0afbb632008-06-06 21:10:57 +000036 def test_handles_endstatus(self):
37 for stat in self.statuses:
38 line = version_1.status_line(0, "END " + stat, "----",
39 "test", "", {})
40 self.assertEquals(line.type, "END")
41 self.assertEquals(line.status, stat)
jadmanski6e8bf752008-05-14 00:17:48 +000042
43
jadmanski0afbb632008-06-06 21:10:57 +000044 def test_fails_on_bad_status(self):
45 for stat in self.statuses:
46 self.assertRaises(AssertionError,
47 version_1.status_line, 0,
48 "BAD " + stat, "----", "test",
49 "", {})
jadmanski6e8bf752008-05-14 00:17:48 +000050
51
jadmanski0afbb632008-06-06 21:10:57 +000052 def test_saves_all_fields(self):
53 line = version_1.status_line(5, "GOOD", "subdir_name",
54 "test_name", "my reason here",
55 {"key1": "value",
56 "key2": "another value",
57 "key3": "value3"})
58 self.assertEquals(line.indent, 5)
59 self.assertEquals(line.status, "GOOD")
60 self.assertEquals(line.subdir, "subdir_name")
61 self.assertEquals(line.testname, "test_name")
62 self.assertEquals(line.reason, "my reason here")
63 self.assertEquals(line.optional_fields,
64 {"key1": "value", "key2": "another value",
65 "key3": "value3"})
jadmanski6e8bf752008-05-14 00:17:48 +000066
67
jadmanski0afbb632008-06-06 21:10:57 +000068 def test_parses_blank_subdir(self):
69 line = version_1.status_line(0, "GOOD", "----", "test",
70 "", {})
71 self.assertEquals(line.subdir, None)
jadmanski6e8bf752008-05-14 00:17:48 +000072
73
jadmanski0afbb632008-06-06 21:10:57 +000074 def test_parses_blank_testname(self):
75 line = version_1.status_line(0, "GOOD", "subdir", "----",
76 "", {})
77 self.assertEquals(line.testname, None)
jadmanski6e8bf752008-05-14 00:17:48 +000078
79
jadmanski0afbb632008-06-06 21:10:57 +000080 def test_parse_line_smoketest(self):
81 input_data = ("\t\t\tGOOD\t----\t----\t"
82 "field1=val1\tfield2=val2\tTest Passed")
83 line = version_1.status_line.parse_line(input_data)
84 self.assertEquals(line.indent, 3)
85 self.assertEquals(line.type, "STATUS")
86 self.assertEquals(line.status, "GOOD")
87 self.assertEquals(line.subdir, None)
88 self.assertEquals(line.testname, None)
89 self.assertEquals(line.reason, "Test Passed")
90 self.assertEquals(line.optional_fields,
91 {"field1": "val1", "field2": "val2"})
jadmanski6e8bf752008-05-14 00:17:48 +000092
jadmanski0afbb632008-06-06 21:10:57 +000093 def test_parse_line_handles_newline(self):
94 input_data = ("\t\tGOOD\t----\t----\t"
95 "field1=val1\tfield2=val2\tNo newline here!")
96 for suffix in ("", "\n"):
97 line = version_1.status_line.parse_line(input_data +
98 suffix)
99 self.assertEquals(line.indent, 2)
100 self.assertEquals(line.type, "STATUS")
101 self.assertEquals(line.status, "GOOD")
102 self.assertEquals(line.subdir, None)
103 self.assertEquals(line.testname, None)
104 self.assertEquals(line.reason, "No newline here!")
105 self.assertEquals(line.optional_fields,
106 {"field1": "val1",
107 "field2": "val2"})
jadmanski6e8bf752008-05-14 00:17:48 +0000108
109
jadmanski0afbb632008-06-06 21:10:57 +0000110 def test_parse_line_fails_on_untabbed_lines(self):
111 input_data = " GOOD\trandom\tfields\tof text"
112 line = version_1.status_line.parse_line(input_data)
113 self.assertEquals(line, None)
114 line = version_1.status_line.parse_line(input_data.lstrip())
115 self.assertEquals(line.indent, 0)
116 self.assertEquals(line.type, "STATUS")
117 self.assertEquals(line.status, "GOOD")
118 self.assertEquals(line.subdir, "random")
119 self.assertEquals(line.testname, "fields")
120 self.assertEquals(line.reason, "of text")
121 self.assertEquals(line.optional_fields, {})
jadmanski6e8bf752008-05-14 00:17:48 +0000122
123
jadmanskibf446192008-08-13 21:51:03 +0000124 def test_parse_line_fails_on_incomplete_lines(self):
125 input_data = "\t\tGOOD\tfield\tsecond field"
126 complete_data = input_data + "\tneeded last field"
127 line = version_1.status_line.parse_line(input_data)
128 self.assertEquals(line, None)
129 line = version_1.status_line.parse_line(complete_data)
130 self.assertEquals(line.indent, 2)
131 self.assertEquals(line.type, "STATUS")
132 self.assertEquals(line.status, "GOOD")
133 self.assertEquals(line.subdir, "field")
134 self.assertEquals(line.testname, "second field")
135 self.assertEquals(line.reason, "needed last field")
136 self.assertEquals(line.optional_fields, {})
137
138
jadmanski0afbb632008-06-06 21:10:57 +0000139 def test_parse_line_fails_on_bad_optional_fields(self):
140 input_data = "GOOD\tfield1\tfield2\tfield3\tfield4"
141 self.assertRaises(AssertionError,
142 version_1.status_line.parse_line,
143 input_data)
jadmanski6e8bf752008-05-14 00:17:48 +0000144
145
jadmanski0afbb632008-06-06 21:10:57 +0000146 def test_good_reboot_passes_success_test(self):
147 line = version_1.status_line(0, "NOSTATUS", None, "reboot",
148 "reboot success", {})
149 self.assertEquals(line.is_successful_reboot("GOOD"), True)
150 self.assertEquals(line.is_successful_reboot("WARN"), True)
jadmanski6e8bf752008-05-14 00:17:48 +0000151
152
jadmanski0afbb632008-06-06 21:10:57 +0000153 def test_bad_reboot_passes_success_test(self):
154 line = version_1.status_line(0, "NOSTATUS", None, "reboot",
155 "reboot success", {})
156 self.assertEquals(line.is_successful_reboot("FAIL"), False)
157 self.assertEquals(line.is_successful_reboot("ABORT"), False)
jadmanski6e8bf752008-05-14 00:17:48 +0000158
159
jadmanski0afbb632008-06-06 21:10:57 +0000160 def test_get_kernel_returns_kernel_plus_patches(self):
161 line = version_1.status_line(0, "GOOD", "subdir", "testname",
162 "reason text",
163 {"kernel": "2.6.24-rc40",
164 "patch0": "first_patch 0 0",
165 "patch1": "another_patch 0 0"})
166 kern = line.get_kernel()
lmr6f80e7a2010-02-04 03:18:28 +0000167 kernel_hash = utils.hash("md5", "2.6.24-rc40,0,0").hexdigest()
jadmanski0afbb632008-06-06 21:10:57 +0000168 self.assertEquals(kern.base, "2.6.24-rc40")
169 self.assertEquals(kern.patches[0].spec, "first_patch")
170 self.assertEquals(kern.patches[1].spec, "another_patch")
171 self.assertEquals(len(kern.patches), 2)
172 self.assertEquals(kern.kernel_hash, kernel_hash)
jadmanski6e8bf752008-05-14 00:17:48 +0000173
174
jadmanski0afbb632008-06-06 21:10:57 +0000175 def test_get_kernel_ignores_out_of_sequence_patches(self):
176 line = version_1.status_line(0, "GOOD", "subdir", "testname",
177 "reason text",
178 {"kernel": "2.6.24-rc40",
179 "patch0": "first_patch 0 0",
180 "patch2": "another_patch 0 0"})
181 kern = line.get_kernel()
lmr6f80e7a2010-02-04 03:18:28 +0000182 kernel_hash = utils.hash("md5", "2.6.24-rc40,0").hexdigest()
jadmanski0afbb632008-06-06 21:10:57 +0000183 self.assertEquals(kern.base, "2.6.24-rc40")
184 self.assertEquals(kern.patches[0].spec, "first_patch")
185 self.assertEquals(len(kern.patches), 1)
186 self.assertEquals(kern.kernel_hash, kernel_hash)
jadmanski6e8bf752008-05-14 00:17:48 +0000187
188
jadmanski0afbb632008-06-06 21:10:57 +0000189 def test_get_kernel_returns_unknown_with_no_kernel(self):
190 line = version_1.status_line(0, "GOOD", "subdir", "testname",
191 "reason text",
192 {"patch0": "first_patch 0 0",
193 "patch2": "another_patch 0 0"})
194 kern = line.get_kernel()
195 self.assertEquals(kern.base, "UNKNOWN")
196 self.assertEquals(kern.patches, [])
197 self.assertEquals(kern.kernel_hash, "UNKNOWN")
jadmanski6e8bf752008-05-14 00:17:48 +0000198
199
jadmanski0afbb632008-06-06 21:10:57 +0000200 def test_get_timestamp_returns_timestamp_field(self):
201 timestamp = datetime.datetime(1970, 1, 1, 4, 30)
202 timestamp -= datetime.timedelta(seconds=time.timezone)
203 line = version_1.status_line(0, "GOOD", "subdir", "testname",
204 "reason text",
205 {"timestamp": "16200"})
206 self.assertEquals(timestamp, line.get_timestamp())
jadmanski6e8bf752008-05-14 00:17:48 +0000207
208
jadmanski0afbb632008-06-06 21:10:57 +0000209 def test_get_timestamp_returns_none_on_missing_field(self):
210 line = version_1.status_line(0, "GOOD", "subdir", "testname",
211 "reason text", {})
212 self.assertEquals(None, line.get_timestamp())
jadmanski6e8bf752008-05-14 00:17:48 +0000213
214
jadmanskid2e0f0c2009-07-20 17:52:57 +0000215class iteration_parse_line_into_dicts(unittest.TestCase):
216 def parse_line(self, line):
217 attr, perf = {}, {}
218 version_1.iteration.parse_line_into_dicts(line, attr, perf)
219 return attr, perf
220
221
222 def test_perf_entry(self):
Eric Li7edb3042011-01-06 17:57:17 -0800223 result = self.parse_line("perf-val{perf}=-173")
224 self.assertEqual(({}, {"perf-val": -173}), result)
jadmanskid2e0f0c2009-07-20 17:52:57 +0000225
226
227 def test_attr_entry(self):
228 result = self.parse_line("attr-val{attr}=173")
229 self.assertEqual(({"attr-val": "173"}, {}), result)
230
231
232 def test_untagged_is_perf(self):
Eric Li7edb3042011-01-06 17:57:17 -0800233 result = self.parse_line("untagged=-678.5e5")
234 self.assertEqual(({}, {"untagged": -678.5e5}), result)
jadmanskid2e0f0c2009-07-20 17:52:57 +0000235
236
237 def test_invalid_tag_ignored(self):
238 result = self.parse_line("bad-tag{invalid}=56")
239 self.assertEqual(({}, {}), result)
240
241
242 def test_non_numeric_perf_ignored(self):
Eric Li7edb3042011-01-06 17:57:17 -0800243 result = self.parse_line("perf-val{perf}=FooBar")
jadmanskid2e0f0c2009-07-20 17:52:57 +0000244 self.assertEqual(({}, {}), result)
245
246
247 def test_non_numeric_untagged_ignored(self):
Eric Li7edb3042011-01-06 17:57:17 -0800248 result = self.parse_line("untagged=FooBar")
jadmanskid2e0f0c2009-07-20 17:52:57 +0000249 self.assertEqual(({}, {}), result)
250
mblighb22c21f2008-11-27 00:40:38 +0000251
252class DummyAbortTestCase(unittest.TestCase):
253 def setUp(self):
254 self.indent = 3
255 self.testname = 'testname'
256 self.timestamp = 1220565792
257 self.reason = 'Job aborted unexpectedly'
258
259
260 def test_make_dummy_abort_with_timestamp(self):
261 abort = version_1.parser.make_dummy_abort(
262 self.indent, None, self.testname, self.timestamp, self.reason)
263 self.assertEquals(
264 abort, '%sEND ABORT\t----\t%s\ttimestamp=%d\t%s' % (
265 '\t'*self.indent, self.testname, self.timestamp, self.reason))
266
267
268 def test_make_dummy_abort_no_timestamp(self):
269 abort = version_1.parser.make_dummy_abort(
270 self.indent, None, self.testname, None, self.reason)
271 self.assertEquals(
272 abort, '%sEND ABORT\t----\t%s\t%s' % (
273 '\t'*self.indent, self.testname, self.reason))
274
275
jadmanski6e8bf752008-05-14 00:17:48 +0000276if __name__ == "__main__":
jadmanski0afbb632008-06-06 21:10:57 +0000277 unittest.main()