blob: 5110fe8025c7f1ef02670e974bd630d523e1bcba [file] [log] [blame]
jadmanski6e8bf752008-05-14 00:17:48 +00001#!/usr/bin/python
2
3import unittest, datetime, time, md5
4
5import common
6from autotest_lib.tko.parsers import version_1
7
8
9class test_status_line(unittest.TestCase):
jadmanski0afbb632008-06-06 21:10:57 +000010 statuses = ["GOOD", "WARN", "FAIL", "ABORT"]
jadmanski6e8bf752008-05-14 00:17:48 +000011
12
jadmanski0afbb632008-06-06 21:10:57 +000013 def test_handles_start(self):
14 line = version_1.status_line(0, "START", "----", "test",
15 "", {})
16 self.assertEquals(line.type, "START")
17 self.assertEquals(line.status, None)
jadmanski6e8bf752008-05-14 00:17:48 +000018
19
jadmanski807490c2008-09-15 19:15:02 +000020 def test_handles_info(self):
21 line = version_1.status_line(0, "INFO", "----", "----",
22 "", {})
23 self.assertEquals(line.type, "INFO")
24 self.assertEquals(line.status, None)
25
26
jadmanski0afbb632008-06-06 21:10:57 +000027 def test_handles_status(self):
28 for stat in self.statuses:
29 line = version_1.status_line(0, stat, "----", "test",
30 "", {})
31 self.assertEquals(line.type, "STATUS")
32 self.assertEquals(line.status, stat)
jadmanski6e8bf752008-05-14 00:17:48 +000033
34
jadmanski0afbb632008-06-06 21:10:57 +000035 def test_handles_endstatus(self):
36 for stat in self.statuses:
37 line = version_1.status_line(0, "END " + stat, "----",
38 "test", "", {})
39 self.assertEquals(line.type, "END")
40 self.assertEquals(line.status, stat)
jadmanski6e8bf752008-05-14 00:17:48 +000041
42
jadmanski0afbb632008-06-06 21:10:57 +000043 def test_fails_on_bad_status(self):
44 for stat in self.statuses:
45 self.assertRaises(AssertionError,
46 version_1.status_line, 0,
47 "BAD " + stat, "----", "test",
48 "", {})
jadmanski6e8bf752008-05-14 00:17:48 +000049
50
jadmanski0afbb632008-06-06 21:10:57 +000051 def test_saves_all_fields(self):
52 line = version_1.status_line(5, "GOOD", "subdir_name",
53 "test_name", "my reason here",
54 {"key1": "value",
55 "key2": "another value",
56 "key3": "value3"})
57 self.assertEquals(line.indent, 5)
58 self.assertEquals(line.status, "GOOD")
59 self.assertEquals(line.subdir, "subdir_name")
60 self.assertEquals(line.testname, "test_name")
61 self.assertEquals(line.reason, "my reason here")
62 self.assertEquals(line.optional_fields,
63 {"key1": "value", "key2": "another value",
64 "key3": "value3"})
jadmanski6e8bf752008-05-14 00:17:48 +000065
66
jadmanski0afbb632008-06-06 21:10:57 +000067 def test_parses_blank_subdir(self):
68 line = version_1.status_line(0, "GOOD", "----", "test",
69 "", {})
70 self.assertEquals(line.subdir, None)
jadmanski6e8bf752008-05-14 00:17:48 +000071
72
jadmanski0afbb632008-06-06 21:10:57 +000073 def test_parses_blank_testname(self):
74 line = version_1.status_line(0, "GOOD", "subdir", "----",
75 "", {})
76 self.assertEquals(line.testname, None)
jadmanski6e8bf752008-05-14 00:17:48 +000077
78
jadmanski0afbb632008-06-06 21:10:57 +000079 def test_parse_line_smoketest(self):
80 input_data = ("\t\t\tGOOD\t----\t----\t"
81 "field1=val1\tfield2=val2\tTest Passed")
82 line = version_1.status_line.parse_line(input_data)
83 self.assertEquals(line.indent, 3)
84 self.assertEquals(line.type, "STATUS")
85 self.assertEquals(line.status, "GOOD")
86 self.assertEquals(line.subdir, None)
87 self.assertEquals(line.testname, None)
88 self.assertEquals(line.reason, "Test Passed")
89 self.assertEquals(line.optional_fields,
90 {"field1": "val1", "field2": "val2"})
jadmanski6e8bf752008-05-14 00:17:48 +000091
jadmanski0afbb632008-06-06 21:10:57 +000092 def test_parse_line_handles_newline(self):
93 input_data = ("\t\tGOOD\t----\t----\t"
94 "field1=val1\tfield2=val2\tNo newline here!")
95 for suffix in ("", "\n"):
96 line = version_1.status_line.parse_line(input_data +
97 suffix)
98 self.assertEquals(line.indent, 2)
99 self.assertEquals(line.type, "STATUS")
100 self.assertEquals(line.status, "GOOD")
101 self.assertEquals(line.subdir, None)
102 self.assertEquals(line.testname, None)
103 self.assertEquals(line.reason, "No newline here!")
104 self.assertEquals(line.optional_fields,
105 {"field1": "val1",
106 "field2": "val2"})
jadmanski6e8bf752008-05-14 00:17:48 +0000107
108
jadmanski0afbb632008-06-06 21:10:57 +0000109 def test_parse_line_fails_on_untabbed_lines(self):
110 input_data = " GOOD\trandom\tfields\tof text"
111 line = version_1.status_line.parse_line(input_data)
112 self.assertEquals(line, None)
113 line = version_1.status_line.parse_line(input_data.lstrip())
114 self.assertEquals(line.indent, 0)
115 self.assertEquals(line.type, "STATUS")
116 self.assertEquals(line.status, "GOOD")
117 self.assertEquals(line.subdir, "random")
118 self.assertEquals(line.testname, "fields")
119 self.assertEquals(line.reason, "of text")
120 self.assertEquals(line.optional_fields, {})
jadmanski6e8bf752008-05-14 00:17:48 +0000121
122
jadmanskibf446192008-08-13 21:51:03 +0000123 def test_parse_line_fails_on_incomplete_lines(self):
124 input_data = "\t\tGOOD\tfield\tsecond field"
125 complete_data = input_data + "\tneeded last field"
126 line = version_1.status_line.parse_line(input_data)
127 self.assertEquals(line, None)
128 line = version_1.status_line.parse_line(complete_data)
129 self.assertEquals(line.indent, 2)
130 self.assertEquals(line.type, "STATUS")
131 self.assertEquals(line.status, "GOOD")
132 self.assertEquals(line.subdir, "field")
133 self.assertEquals(line.testname, "second field")
134 self.assertEquals(line.reason, "needed last field")
135 self.assertEquals(line.optional_fields, {})
136
137
jadmanski0afbb632008-06-06 21:10:57 +0000138 def test_parse_line_fails_on_bad_optional_fields(self):
139 input_data = "GOOD\tfield1\tfield2\tfield3\tfield4"
140 self.assertRaises(AssertionError,
141 version_1.status_line.parse_line,
142 input_data)
jadmanski6e8bf752008-05-14 00:17:48 +0000143
144
jadmanski0afbb632008-06-06 21:10:57 +0000145 def test_good_reboot_passes_success_test(self):
146 line = version_1.status_line(0, "NOSTATUS", None, "reboot",
147 "reboot success", {})
148 self.assertEquals(line.is_successful_reboot("GOOD"), True)
149 self.assertEquals(line.is_successful_reboot("WARN"), True)
jadmanski6e8bf752008-05-14 00:17:48 +0000150
151
jadmanski0afbb632008-06-06 21:10:57 +0000152 def test_bad_reboot_passes_success_test(self):
153 line = version_1.status_line(0, "NOSTATUS", None, "reboot",
154 "reboot success", {})
155 self.assertEquals(line.is_successful_reboot("FAIL"), False)
156 self.assertEquals(line.is_successful_reboot("ABORT"), False)
jadmanski6e8bf752008-05-14 00:17:48 +0000157
158
jadmanski0afbb632008-06-06 21:10:57 +0000159 def test_get_kernel_returns_kernel_plus_patches(self):
160 line = version_1.status_line(0, "GOOD", "subdir", "testname",
161 "reason text",
162 {"kernel": "2.6.24-rc40",
163 "patch0": "first_patch 0 0",
164 "patch1": "another_patch 0 0"})
165 kern = line.get_kernel()
166 kernel_hash = md5.new("2.6.24-rc40,0,0").hexdigest()
167 self.assertEquals(kern.base, "2.6.24-rc40")
168 self.assertEquals(kern.patches[0].spec, "first_patch")
169 self.assertEquals(kern.patches[1].spec, "another_patch")
170 self.assertEquals(len(kern.patches), 2)
171 self.assertEquals(kern.kernel_hash, kernel_hash)
jadmanski6e8bf752008-05-14 00:17:48 +0000172
173
jadmanski0afbb632008-06-06 21:10:57 +0000174 def test_get_kernel_ignores_out_of_sequence_patches(self):
175 line = version_1.status_line(0, "GOOD", "subdir", "testname",
176 "reason text",
177 {"kernel": "2.6.24-rc40",
178 "patch0": "first_patch 0 0",
179 "patch2": "another_patch 0 0"})
180 kern = line.get_kernel()
181 kernel_hash = md5.new("2.6.24-rc40,0").hexdigest()
182 self.assertEquals(kern.base, "2.6.24-rc40")
183 self.assertEquals(kern.patches[0].spec, "first_patch")
184 self.assertEquals(len(kern.patches), 1)
185 self.assertEquals(kern.kernel_hash, kernel_hash)
jadmanski6e8bf752008-05-14 00:17:48 +0000186
187
jadmanski0afbb632008-06-06 21:10:57 +0000188 def test_get_kernel_returns_unknown_with_no_kernel(self):
189 line = version_1.status_line(0, "GOOD", "subdir", "testname",
190 "reason text",
191 {"patch0": "first_patch 0 0",
192 "patch2": "another_patch 0 0"})
193 kern = line.get_kernel()
194 self.assertEquals(kern.base, "UNKNOWN")
195 self.assertEquals(kern.patches, [])
196 self.assertEquals(kern.kernel_hash, "UNKNOWN")
jadmanski6e8bf752008-05-14 00:17:48 +0000197
198
jadmanski0afbb632008-06-06 21:10:57 +0000199 def test_get_timestamp_returns_timestamp_field(self):
200 timestamp = datetime.datetime(1970, 1, 1, 4, 30)
201 timestamp -= datetime.timedelta(seconds=time.timezone)
202 line = version_1.status_line(0, "GOOD", "subdir", "testname",
203 "reason text",
204 {"timestamp": "16200"})
205 self.assertEquals(timestamp, line.get_timestamp())
jadmanski6e8bf752008-05-14 00:17:48 +0000206
207
jadmanski0afbb632008-06-06 21:10:57 +0000208 def test_get_timestamp_returns_none_on_missing_field(self):
209 line = version_1.status_line(0, "GOOD", "subdir", "testname",
210 "reason text", {})
211 self.assertEquals(None, line.get_timestamp())
jadmanski6e8bf752008-05-14 00:17:48 +0000212
213
jadmanskid2e0f0c2009-07-20 17:52:57 +0000214class iteration_parse_line_into_dicts(unittest.TestCase):
215 def parse_line(self, line):
216 attr, perf = {}, {}
217 version_1.iteration.parse_line_into_dicts(line, attr, perf)
218 return attr, perf
219
220
221 def test_perf_entry(self):
222 result = self.parse_line("perf-val{perf}=173")
223 self.assertEqual(({}, {"perf-val": 173}), result)
224
225
226 def test_attr_entry(self):
227 result = self.parse_line("attr-val{attr}=173")
228 self.assertEqual(({"attr-val": "173"}, {}), result)
229
230
231 def test_untagged_is_perf(self):
232 result = self.parse_line("untagged=678.5")
233 self.assertEqual(({}, {"untagged": 678.5}), result)
234
235
236 def test_invalid_tag_ignored(self):
237 result = self.parse_line("bad-tag{invalid}=56")
238 self.assertEqual(({}, {}), result)
239
240
241 def test_non_numeric_perf_ignored(self):
242 result = self.parse_line("perf-val{perf}=NaN")
243 self.assertEqual(({}, {}), result)
244
245
246 def test_non_numeric_untagged_ignored(self):
247 result = self.parse_line("untagged=NaN")
248 self.assertEqual(({}, {}), result)
249
mblighb22c21f2008-11-27 00:40:38 +0000250
251class DummyAbortTestCase(unittest.TestCase):
252 def setUp(self):
253 self.indent = 3
254 self.testname = 'testname'
255 self.timestamp = 1220565792
256 self.reason = 'Job aborted unexpectedly'
257
258
259 def test_make_dummy_abort_with_timestamp(self):
260 abort = version_1.parser.make_dummy_abort(
261 self.indent, None, self.testname, self.timestamp, self.reason)
262 self.assertEquals(
263 abort, '%sEND ABORT\t----\t%s\ttimestamp=%d\t%s' % (
264 '\t'*self.indent, self.testname, self.timestamp, self.reason))
265
266
267 def test_make_dummy_abort_no_timestamp(self):
268 abort = version_1.parser.make_dummy_abort(
269 self.indent, None, self.testname, None, self.reason)
270 self.assertEquals(
271 abort, '%sEND ABORT\t----\t%s\t%s' % (
272 '\t'*self.indent, self.testname, self.reason))
273
274
jadmanski6e8bf752008-05-14 00:17:48 +0000275if __name__ == "__main__":
jadmanski0afbb632008-06-06 21:10:57 +0000276 unittest.main()