blob: 6649a637f31d37dcf1a162984057edbed3d316b2 [file] [log] [blame]
showard06b82fc2009-06-30 01:59:42 +00001#!/usr/bin/python
showardf8b19042009-05-12 17:22:49 +00002
showard8b0ea222009-12-23 19:23:03 +00003import re, unittest
showardf8b19042009-05-12 17:22:49 +00004import common
showard250d84d2010-01-12 21:59:48 +00005from autotest_lib.frontend import setup_django_environment
showardf8b19042009-05-12 17:22:49 +00006from autotest_lib.frontend import setup_test_environment
showard06b82fc2009-06-30 01:59:42 +00007from autotest_lib.client.common_lib.test_utils import mock
showardf8b19042009-05-12 17:22:49 +00008from django.db import connection
showard250d84d2010-01-12 21:59:48 +00009from autotest_lib.frontend.tko import models, rpc_interface
showardf8b19042009-05-12 17:22:49 +000010
11# this will need to be updated when the view changes for the test to be
12# consistent with reality
13_CREATE_TEST_VIEW = """
showardeab66ce2009-12-23 00:03:56 +000014CREATE VIEW tko_test_view_2 AS
15SELECT tko_tests.test_idx AS test_idx,
16 tko_tests.job_idx AS job_idx,
17 tko_tests.test AS test_name,
18 tko_tests.subdir AS subdir,
19 tko_tests.kernel_idx AS kernel_idx,
20 tko_tests.status AS status_idx,
21 tko_tests.reason AS reason,
22 tko_tests.machine_idx AS machine_idx,
23 tko_tests.started_time AS test_started_time,
24 tko_tests.finished_time AS test_finished_time,
25 tko_jobs.tag AS job_tag,
26 tko_jobs.label AS job_name,
27 tko_jobs.username AS job_owner,
28 tko_jobs.queued_time AS job_queued_time,
29 tko_jobs.started_time AS job_started_time,
30 tko_jobs.finished_time AS job_finished_time,
31 tko_jobs.afe_job_id AS afe_job_id,
32 tko_machines.hostname AS hostname,
33 tko_machines.machine_group AS platform,
34 tko_machines.owner AS machine_owner,
35 tko_kernels.kernel_hash AS kernel_hash,
36 tko_kernels.base AS kernel_base,
37 tko_kernels.printable AS kernel,
38 tko_status.word AS status
39FROM tko_tests
40INNER JOIN tko_jobs ON tko_jobs.job_idx = tko_tests.job_idx
41INNER JOIN tko_machines ON tko_machines.machine_idx = tko_jobs.machine_idx
42INNER JOIN tko_kernels ON tko_kernels.kernel_idx = tko_tests.kernel_idx
43INNER JOIN tko_status ON tko_status.status_idx = tko_tests.status;
showardf8b19042009-05-12 17:22:49 +000044"""
45
showard68693f72009-05-20 00:31:53 +000046# this will need to be updated if the table schemas change (or removed if we
47# add proper primary keys)
48_CREATE_ITERATION_ATTRIBUTES = """
showardeab66ce2009-12-23 00:03:56 +000049CREATE TABLE "tko_iteration_attributes" (
50 "test_idx" integer NOT NULL REFERENCES "tko_tests" ("test_idx"),
showard68693f72009-05-20 00:31:53 +000051 "iteration" integer NOT NULL,
52 "attribute" varchar(90) NOT NULL,
53 "value" varchar(300) NOT NULL
54);
55"""
56
57_CREATE_ITERATION_RESULTS = """
showardeab66ce2009-12-23 00:03:56 +000058CREATE TABLE "tko_iteration_result" (
59 "test_idx" integer NOT NULL REFERENCES "tko_tests" ("test_idx"),
showard68693f72009-05-20 00:31:53 +000060 "iteration" integer NOT NULL,
61 "attribute" varchar(90) NOT NULL,
62 "value" numeric(12, 31) NULL
63);
64"""
65
66
showardf8b19042009-05-12 17:22:49 +000067def setup_test_view():
68 """
69 Django has no way to actually represent a view; we simply create a model for
70 TestView. This means when we syncdb, Django will create a table for it.
71 So manually remove that table and replace it with a view.
72 """
73 cursor = connection.cursor()
showardeab66ce2009-12-23 00:03:56 +000074 cursor.execute('DROP TABLE tko_test_view_2')
showardf8b19042009-05-12 17:22:49 +000075 cursor.execute(_CREATE_TEST_VIEW)
76
77
showard68693f72009-05-20 00:31:53 +000078def fix_iteration_tables():
79 """
80 Since iteration tables don't have any real primary key, we "fake" one in the
81 Django models. So fix up the generated schema to match the real schema.
82 """
83 cursor = connection.cursor()
showardeab66ce2009-12-23 00:03:56 +000084 cursor.execute('DROP TABLE tko_iteration_attributes')
showard68693f72009-05-20 00:31:53 +000085 cursor.execute(_CREATE_ITERATION_ATTRIBUTES)
showardeab66ce2009-12-23 00:03:56 +000086 cursor.execute('DROP TABLE tko_iteration_result')
showard68693f72009-05-20 00:31:53 +000087 cursor.execute(_CREATE_ITERATION_RESULTS)
88
89
jamesrencd7a81a2010-04-21 20:39:08 +000090class TkoTestMixin(object):
91 def _patch_sqlite_stuff(self):
92 self.god.stub_with(models.TempManager, '_get_column_names',
93 self._get_column_names_for_sqlite3)
94 self.god.stub_with(models.TempManager, '_cursor_rowcount',
95 self._cursor_rowcount_for_sqlite3)
showard8b0ea222009-12-23 19:23:03 +000096
97 # add some functions to SQLite for MySQL compatibility
98 connection.cursor() # ensure connection is alive
99 connection.connection.create_function('if', 3, self._sqlite_if)
100 connection.connection.create_function('find_in_set', 2,
101 self._sqlite_find_in_set)
102
showard68693f72009-05-20 00:31:53 +0000103 fix_iteration_tables()
showardf8b19042009-05-12 17:22:49 +0000104
105
showardd2b0c882009-10-19 18:34:11 +0000106 def _cursor_rowcount_for_sqlite3(self, cursor):
107 return len(cursor.fetchall())
108
109
showard8b0ea222009-12-23 19:23:03 +0000110 def _sqlite_find_in_set(self, needle, haystack):
111 return needle in haystack.split(',')
112
113
114 def _sqlite_if(self, condition, true_result, false_result):
115 if condition:
116 return true_result
117 return false_result
118
119
120 # sqlite takes any columns that don't have aliases and names them
121 # "table_name"."column_name". we map these to just column_name.
122 _SQLITE_AUTO_COLUMN_ALIAS_RE = re.compile(r'".+"\."(.+)"')
123
124
125 def _get_column_names_for_sqlite3(self, cursor):
126 names = [column_info[0] for column_info in cursor.description]
127
128 # replace all "table_name"."column_name" constructs with just
129 # column_name
130 for i, name in enumerate(names):
131 match = self._SQLITE_AUTO_COLUMN_ALIAS_RE.match(name)
132 if match:
133 names[i] = match.group(1)
134
135 return names
136
137
showardf8b19042009-05-12 17:22:49 +0000138 def _create_initial_data(self):
showard06b82fc2009-06-30 01:59:42 +0000139 machine = models.Machine.objects.create(hostname='myhost')
showardf8b19042009-05-12 17:22:49 +0000140
showardc4780402009-08-31 18:31:34 +0000141 # create basic objects
showard06b82fc2009-06-30 01:59:42 +0000142 kernel_name = 'mykernel1'
143 kernel1 = models.Kernel.objects.create(kernel_hash=kernel_name,
144 base=kernel_name,
145 printable=kernel_name)
showardf8b19042009-05-12 17:22:49 +0000146
showard06b82fc2009-06-30 01:59:42 +0000147 kernel_name = 'mykernel2'
148 kernel2 = models.Kernel.objects.create(kernel_hash=kernel_name,
149 base=kernel_name,
150 printable=kernel_name)
showardf8b19042009-05-12 17:22:49 +0000151
showard06b82fc2009-06-30 01:59:42 +0000152 good_status = models.Status.objects.create(word='GOOD')
153 failed_status = models.Status.objects.create(word='FAILED')
showardf8b19042009-05-12 17:22:49 +0000154
showard06b82fc2009-06-30 01:59:42 +0000155 job1 = models.Job.objects.create(tag='1-myjobtag1', label='myjob1',
jamesrencd7a81a2010-04-21 20:39:08 +0000156 username='myuser', machine=machine,
157 afe_job_id=1)
showard06b82fc2009-06-30 01:59:42 +0000158 job2 = models.Job.objects.create(tag='2-myjobtag2', label='myjob2',
jamesrencd7a81a2010-04-21 20:39:08 +0000159 username='myuser', machine=machine,
160 afe_job_id=2)
showard06b82fc2009-06-30 01:59:42 +0000161
162 job1_test1 = models.Test.objects.create(job=job1, test='mytest1',
163 kernel=kernel1,
164 status=good_status,
165 machine=machine)
showard8b0ea222009-12-23 19:23:03 +0000166 self.first_test = job1_test1
showard06b82fc2009-06-30 01:59:42 +0000167 job1_test2 = models.Test.objects.create(job=job1, test='mytest2',
168 kernel=kernel1,
169 status=failed_status,
170 machine=machine)
171 job2_test1 = models.Test.objects.create(job=job2, test='kernbench',
172 kernel=kernel2,
173 status=good_status,
174 machine=machine)
showardf8b19042009-05-12 17:22:49 +0000175
Eric Li6f27d4f2010-09-29 10:55:17 -0700176 job1.jobkeyval_set.create(key='keyval_key', value='keyval_value')
177
showardc4780402009-08-31 18:31:34 +0000178 # create test attributes, test labels, and iterations
showard68693f72009-05-20 00:31:53 +0000179 # like Noah's Ark, include two of each...just in case there's a bug with
180 # multiple related items
showard06b82fc2009-06-30 01:59:42 +0000181 models.TestAttribute.objects.create(test=job1_test1, attribute='myattr',
182 value='myval')
183 models.TestAttribute.objects.create(test=job1_test1,
184 attribute='myattr2', value='myval2')
showardf8b19042009-05-12 17:22:49 +0000185
showardeab66ce2009-12-23 00:03:56 +0000186 self._add_iteration_keyval('tko_iteration_attributes', test=job1_test1,
showard68693f72009-05-20 00:31:53 +0000187 iteration=1, attribute='iattr',
188 value='ival')
showardeab66ce2009-12-23 00:03:56 +0000189 self._add_iteration_keyval('tko_iteration_attributes', test=job1_test1,
showard68693f72009-05-20 00:31:53 +0000190 iteration=1, attribute='iattr2',
191 value='ival2')
showardeab66ce2009-12-23 00:03:56 +0000192 self._add_iteration_keyval('tko_iteration_result', test=job1_test1,
showardc4780402009-08-31 18:31:34 +0000193 iteration=1, attribute='iresult', value=1)
showardeab66ce2009-12-23 00:03:56 +0000194 self._add_iteration_keyval('tko_iteration_result', test=job1_test1,
showardc4780402009-08-31 18:31:34 +0000195 iteration=1, attribute='iresult2', value=2)
showardeab66ce2009-12-23 00:03:56 +0000196 self._add_iteration_keyval('tko_iteration_result', test=job1_test1,
showardc4780402009-08-31 18:31:34 +0000197 iteration=2, attribute='iresult', value=3)
showardeab66ce2009-12-23 00:03:56 +0000198 self._add_iteration_keyval('tko_iteration_result', test=job1_test1,
showardc4780402009-08-31 18:31:34 +0000199 iteration=2, attribute='iresult2', value=4)
showard68693f72009-05-20 00:31:53 +0000200
showard06b82fc2009-06-30 01:59:42 +0000201 label1 = models.TestLabel.objects.create(name='testlabel1')
202 label2 = models.TestLabel.objects.create(name='testlabel2')
203
204 label1.tests.add(job1_test1)
205 label2.tests.add(job1_test1)
showard68693f72009-05-20 00:31:53 +0000206
207
208 def _add_iteration_keyval(self, table, test, iteration, attribute, value):
209 cursor = connection.cursor()
210 cursor.execute('INSERT INTO %s ' 'VALUES (%%s, %%s, %%s, %%s)' % table,
211 (test.test_idx, iteration, attribute, value))
212
213
jamesrencd7a81a2010-04-21 20:39:08 +0000214class RpcInterfaceTest(unittest.TestCase, TkoTestMixin):
215 def setUp(self):
216 self.god = mock.mock_god()
217
218 setup_test_environment.set_up()
219 self._patch_sqlite_stuff()
220 setup_test_view()
221 self._create_initial_data()
222
223
224 def tearDown(self):
225 setup_test_environment.tear_down()
226 self.god.unstub_all()
227
228
showard06b82fc2009-06-30 01:59:42 +0000229 def _check_for_get_test_views(self, test):
230 self.assertEquals(test['test_name'], 'mytest1')
231 self.assertEquals(test['job_tag'], '1-myjobtag1')
232 self.assertEquals(test['job_name'], 'myjob1')
233 self.assertEquals(test['job_owner'], 'myuser')
234 self.assertEquals(test['status'], 'GOOD')
235 self.assertEquals(test['hostname'], 'myhost')
236 self.assertEquals(test['kernel'], 'mykernel1')
showardf8b19042009-05-12 17:22:49 +0000237
238
239 def test_get_detailed_test_views(self):
240 test = rpc_interface.get_detailed_test_views()[0]
241
showard06b82fc2009-06-30 01:59:42 +0000242 self._check_for_get_test_views(test)
showardf8b19042009-05-12 17:22:49 +0000243
showard68693f72009-05-20 00:31:53 +0000244 self.assertEquals(test['attributes'], {'myattr': 'myval',
245 'myattr2': 'myval2'})
246 self.assertEquals(test['iterations'], [{'attr': {'iattr': 'ival',
247 'iattr2': 'ival2'},
248 'perf': {'iresult': 1,
showardc4780402009-08-31 18:31:34 +0000249 'iresult2': 2}},
250 {'attr': {},
251 'perf': {'iresult': 3,
252 'iresult2': 4}}])
showard06b82fc2009-06-30 01:59:42 +0000253 self.assertEquals(test['labels'], ['testlabel1', 'testlabel2'])
Eric Li6f27d4f2010-09-29 10:55:17 -0700254 self.assertEquals(test['job_keyvals'], {'keyval_key': 'keyval_value'})
showardf8b19042009-05-12 17:22:49 +0000255
256
257 def test_test_attributes(self):
showard06b82fc2009-06-30 01:59:42 +0000258 rpc_interface.set_test_attribute('foo', 'bar', test_name='mytest1')
showardf8b19042009-05-12 17:22:49 +0000259 test = rpc_interface.get_detailed_test_views()[0]
showard68693f72009-05-20 00:31:53 +0000260 self.assertEquals(test['attributes'], {'foo': 'bar',
261 'myattr': 'myval',
262 'myattr2': 'myval2'})
showardf8b19042009-05-12 17:22:49 +0000263
showard06b82fc2009-06-30 01:59:42 +0000264 rpc_interface.set_test_attribute('foo', 'goo', test_name='mytest1')
showardf8b19042009-05-12 17:22:49 +0000265 test = rpc_interface.get_detailed_test_views()[0]
showard68693f72009-05-20 00:31:53 +0000266 self.assertEquals(test['attributes'], {'foo': 'goo',
267 'myattr': 'myval',
268 'myattr2': 'myval2'})
showardf8b19042009-05-12 17:22:49 +0000269
showard06b82fc2009-06-30 01:59:42 +0000270 rpc_interface.set_test_attribute('foo', None, test_name='mytest1')
showardf8b19042009-05-12 17:22:49 +0000271 test = rpc_interface.get_detailed_test_views()[0]
showard68693f72009-05-20 00:31:53 +0000272 self.assertEquals(test['attributes'], {'myattr': 'myval',
273 'myattr2': 'myval2'})
showardf8b19042009-05-12 17:22:49 +0000274
275
276 def test_immutable_attributes(self):
277 self.assertRaises(ValueError, rpc_interface.set_test_attribute,
showard06b82fc2009-06-30 01:59:42 +0000278 'myattr', 'foo', test_name='mytest1')
279
280
281 def test_get_test_views(self):
282 tests = rpc_interface.get_test_views()
283
284 self.assertEquals(len(tests), 3)
285 test = rpc_interface.get_test_views(
286 job_name='myjob1', test_name='mytest1')[0]
287 self.assertEquals(tests[0], test)
288
289 self._check_for_get_test_views(test)
290
291 self.assertEquals(
292 [], rpc_interface.get_test_views(hostname='fakehost'))
293
294
showarda5288b42009-07-28 20:06:08 +0000295 def _check_test_names(self, tests, expected_names):
296 self.assertEquals(set(test['test_name'] for test in tests),
297 set(expected_names))
298
299
300 def test_get_test_views_filter_on_labels(self):
301 tests = rpc_interface.get_test_views(include_labels=['testlabel1'])
302 self._check_test_names(tests, ['mytest1'])
303
304 tests = rpc_interface.get_test_views(exclude_labels=['testlabel1'])
305 self._check_test_names(tests, ['mytest2', 'kernbench'])
306
307
308 def test_get_test_views_filter_on_attributes(self):
309 tests = rpc_interface.get_test_views(
310 include_attributes_where='attribute = "myattr" '
311 'and value = "myval"')
312 self._check_test_names(tests, ['mytest1'])
313
314 tests = rpc_interface.get_test_views(
315 exclude_attributes_where='attribute="myattr2"')
316 self._check_test_names(tests, ['mytest2', 'kernbench'])
317
318
showard06b82fc2009-06-30 01:59:42 +0000319 def test_get_num_test_views(self):
320 self.assertEquals(rpc_interface.get_num_test_views(), 3)
321 self.assertEquals(rpc_interface.get_num_test_views(
322 job_name='myjob1', test_name='mytest1'), 1)
323
324
showard06b82fc2009-06-30 01:59:42 +0000325 def test_get_group_counts(self):
showard06b82fc2009-06-30 01:59:42 +0000326 self.assertEquals(rpc_interface.get_num_groups(['job_name']), 2)
327
328 counts = rpc_interface.get_group_counts(['job_name'])
329 groups = counts['groups']
330 self.assertEquals(len(groups), 2)
showard79097322010-01-20 01:12:25 +0000331 group1, group2 = groups
showard06b82fc2009-06-30 01:59:42 +0000332
333 self.assertEquals(group1['group_count'], 2)
334 self.assertEquals(group1['job_name'], 'myjob1')
335 self.assertEquals(group2['group_count'], 1)
336 self.assertEquals(group2['job_name'], 'myjob2')
337
338 extra = {'extra' : 'kernel_hash'}
339 counts = rpc_interface.get_group_counts(['job_name'],
340 header_groups=[('job_name',)],
341 extra_select_fields=extra)
342 groups = counts['groups']
343 self.assertEquals(len(groups), 2)
showard79097322010-01-20 01:12:25 +0000344 group1, group2 = groups
showard06b82fc2009-06-30 01:59:42 +0000345
346 self.assertEquals(group1['group_count'], 2)
347 self.assertEquals(group1['header_indices'], [0])
348 self.assertEquals(group1['extra'], 'mykernel1')
349 self.assertEquals(group2['group_count'], 1)
350 self.assertEquals(group2['header_indices'], [1])
351 self.assertEquals(group2['extra'], 'mykernel2')
352
353
354 def test_get_status_counts(self):
showard79097322010-01-20 01:12:25 +0000355 counts = rpc_interface.get_status_counts(group_by=['job_name'])
356 group1, group2 = counts['groups']
357 self.assertEquals(group1['pass_count'], 1)
358 self.assertEquals(group1['complete_count'], 2)
359 self.assertEquals(group1['incomplete_count'], 0)
360 self.assertEquals(group2['pass_count'], 1)
361 self.assertEquals(group2['complete_count'], 1)
362 self.assertEquals(group2['incomplete_count'], 0)
showard06b82fc2009-06-30 01:59:42 +0000363
364
365 def test_get_latest_tests(self):
showard79097322010-01-20 01:12:25 +0000366 counts = rpc_interface.get_latest_tests(group_by=['job_name'])
367 group1, group2 = counts['groups']
368 self.assertEquals(group1['pass_count'], 0)
369 self.assertEquals(group1['complete_count'], 1)
370 self.assertEquals(group1['test_idx'], 2)
371 self.assertEquals(group2['test_idx'], 3)
372
373
374 def test_get_latest_tests_extra_info(self):
375 counts = rpc_interface.get_latest_tests(group_by=['job_name'],
376 extra_info=['job_tag'])
377 group1, group2 = counts['groups']
378 self.assertEquals(group1['extra_info'], ['1-myjobtag1'])
379 self.assertEquals(group2['extra_info'], ['2-myjobtag2'])
showard06b82fc2009-06-30 01:59:42 +0000380
381
382 def test_get_job_ids(self):
383 self.assertEquals([1,2], rpc_interface.get_job_ids())
384 self.assertEquals([1], rpc_interface.get_job_ids(test_name='mytest2'))
385
386
387 def test_get_hosts_and_tests(self):
388 host_info = rpc_interface.get_hosts_and_tests()
389 self.assertEquals(len(host_info), 1)
390 info = host_info['myhost']
391
392 self.assertEquals(info['tests'], ['kernbench'])
393 self.assertEquals(info['id'], 1)
394
395
396 def _check_for_get_test_labels(self, label, label_num):
397 self.assertEquals(label['id'], label_num)
398 self.assertEquals(label['description'], '')
399 self.assertEquals(label['name'], 'testlabel%d' % label_num)
400
401
402 def test_test_labels(self):
403 labels = rpc_interface.get_test_labels_for_tests(test_name='mytest1')
404 self.assertEquals(len(labels), 2)
405 label1 = labels[0]
406 label2 = labels[1]
407
408 self._check_for_get_test_labels(label1, 1)
409 self._check_for_get_test_labels(label2, 2)
410
411 rpc_interface.test_label_remove_tests(label1['id'], test_name='mytest1')
412
413 labels = rpc_interface.get_test_labels_for_tests(test_name='mytest1')
414 self.assertEquals(len(labels), 1)
415 label = labels[0]
416
417 self._check_for_get_test_labels(label, 2)
418
419 rpc_interface.test_label_add_tests(label1['id'], test_name='mytest1')
420
421 labels = rpc_interface.get_test_labels_for_tests(test_name='mytest1')
422 self.assertEquals(len(labels), 2)
423 label1 = labels[0]
424 label2 = labels[1]
425
426 self._check_for_get_test_labels(label1, 1)
427 self._check_for_get_test_labels(label2, 2)
showardf8b19042009-05-12 17:22:49 +0000428
429
showard8b0ea222009-12-23 19:23:03 +0000430 def test_get_test_attribute_fields(self):
showard8bfb5cb2009-10-07 20:49:15 +0000431 tests = rpc_interface.get_test_views(
showard8b0ea222009-12-23 19:23:03 +0000432 test_attribute_fields=['myattr', 'myattr2'])
showard8bfb5cb2009-10-07 20:49:15 +0000433 self.assertEquals(len(tests), 3)
434
jamesren708f1c02010-03-31 21:43:57 +0000435 self.assertEquals(tests[0]['test_attribute_myattr'], 'myval')
436 self.assertEquals(tests[0]['test_attribute_myattr2'], 'myval2')
showard8bfb5cb2009-10-07 20:49:15 +0000437
438 for index in (1, 2):
jamesren708f1c02010-03-31 21:43:57 +0000439 self.assertEquals(tests[index]['test_attribute_myattr'], None)
440 self.assertEquals(tests[index]['test_attribute_myattr2'], None)
showard8bfb5cb2009-10-07 20:49:15 +0000441
442
showard8b0ea222009-12-23 19:23:03 +0000443 def test_filtering_on_test_attribute_fields(self):
444 tests = rpc_interface.get_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000445 extra_where='test_attribute_myattr.value = "myval"',
showard8b0ea222009-12-23 19:23:03 +0000446 test_attribute_fields=['myattr'])
447 self.assertEquals(len(tests), 1)
448
449
450 def test_grouping_with_test_attribute_fields(self):
451 num_groups = rpc_interface.get_num_groups(
jamesren708f1c02010-03-31 21:43:57 +0000452 ['test_attribute_myattr'], test_attribute_fields=['myattr'])
showardd2b0c882009-10-19 18:34:11 +0000453 self.assertEquals(num_groups, 2)
454
showard8b0ea222009-12-23 19:23:03 +0000455 counts = rpc_interface.get_group_counts(
jamesren708f1c02010-03-31 21:43:57 +0000456 ['test_attribute_myattr'], test_attribute_fields=['myattr'])
showard8bfb5cb2009-10-07 20:49:15 +0000457 groups = counts['groups']
showardd2b0c882009-10-19 18:34:11 +0000458 self.assertEquals(len(groups), num_groups)
jamesren708f1c02010-03-31 21:43:57 +0000459 self.assertEquals(groups[0]['test_attribute_myattr'], None)
showard8bfb5cb2009-10-07 20:49:15 +0000460 self.assertEquals(groups[0]['group_count'], 2)
jamesren708f1c02010-03-31 21:43:57 +0000461 self.assertEquals(groups[1]['test_attribute_myattr'], 'myval')
showard8bfb5cb2009-10-07 20:49:15 +0000462 self.assertEquals(groups[1]['group_count'], 1)
463
464
showard79097322010-01-20 01:12:25 +0000465 def test_extra_info_test_attributes(self):
466 counts = rpc_interface.get_latest_tests(
jamesren708f1c02010-03-31 21:43:57 +0000467 group_by=['test_idx'], extra_info=['test_attribute_myattr'],
showard79097322010-01-20 01:12:25 +0000468 test_attribute_fields=['myattr'])
469 group1 = counts['groups'][0]
470 self.assertEquals(group1['extra_info'], ['myval'])
471
472
showard8b0ea222009-12-23 19:23:03 +0000473 def test_get_test_label_fields(self):
474 tests = rpc_interface.get_test_views(
475 test_label_fields=['testlabel1', 'testlabel2'])
476 self.assertEquals(len(tests), 3)
477
jamesren708f1c02010-03-31 21:43:57 +0000478 self.assertEquals(tests[0]['test_label_testlabel1'], 'testlabel1')
479 self.assertEquals(tests[0]['test_label_testlabel2'], 'testlabel2')
showard8b0ea222009-12-23 19:23:03 +0000480
481 for index in (1, 2):
jamesren708f1c02010-03-31 21:43:57 +0000482 self.assertEquals(tests[index]['test_label_testlabel1'], None)
483 self.assertEquals(tests[index]['test_label_testlabel2'], None)
showard8b0ea222009-12-23 19:23:03 +0000484
485
486 def test_filtering_on_test_label_fields(self):
487 tests = rpc_interface.get_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000488 extra_where='test_label_testlabel1 = "testlabel1"',
showard8b0ea222009-12-23 19:23:03 +0000489 test_label_fields=['testlabel1'])
490 self.assertEquals(len(tests), 1)
491
492
493 def test_grouping_on_test_label_fields(self):
494 num_groups = rpc_interface.get_num_groups(
jamesren708f1c02010-03-31 21:43:57 +0000495 ['test_label_testlabel1'], test_label_fields=['testlabel1'])
showard8b0ea222009-12-23 19:23:03 +0000496 self.assertEquals(num_groups, 2)
497
498 counts = rpc_interface.get_group_counts(
jamesren708f1c02010-03-31 21:43:57 +0000499 ['test_label_testlabel1'], test_label_fields=['testlabel1'])
showard8b0ea222009-12-23 19:23:03 +0000500 groups = counts['groups']
501 self.assertEquals(len(groups), 2)
jamesren708f1c02010-03-31 21:43:57 +0000502 self.assertEquals(groups[0]['test_label_testlabel1'], None)
showard8b0ea222009-12-23 19:23:03 +0000503 self.assertEquals(groups[0]['group_count'], 2)
jamesren708f1c02010-03-31 21:43:57 +0000504 self.assertEquals(groups[1]['test_label_testlabel1'], 'testlabel1')
showard8b0ea222009-12-23 19:23:03 +0000505 self.assertEquals(groups[1]['group_count'], 1)
506
507
jamesren708f1c02010-03-31 21:43:57 +0000508 def test_get_iteration_result_fields(self):
showard8b0ea222009-12-23 19:23:03 +0000509 num_iterations = rpc_interface.get_num_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000510 iteration_result_fields=['iresult', 'iresult2'])
showard8b0ea222009-12-23 19:23:03 +0000511 self.assertEquals(num_iterations, 2)
512
513 iterations = rpc_interface.get_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000514 iteration_result_fields=['iresult', 'iresult2'])
showard8b0ea222009-12-23 19:23:03 +0000515 self.assertEquals(len(iterations), 2)
516
517 for index in (0, 1):
518 self.assertEquals(iterations[index]['test_idx'], 1)
519
520 self.assertEquals(iterations[0]['iteration_index'], 1)
jamesren708f1c02010-03-31 21:43:57 +0000521 self.assertEquals(iterations[0]['iteration_result_iresult'], 1)
522 self.assertEquals(iterations[0]['iteration_result_iresult2'], 2)
showard8b0ea222009-12-23 19:23:03 +0000523
524 self.assertEquals(iterations[1]['iteration_index'], 2)
jamesren708f1c02010-03-31 21:43:57 +0000525 self.assertEquals(iterations[1]['iteration_result_iresult'], 3)
526 self.assertEquals(iterations[1]['iteration_result_iresult2'], 4)
showard8b0ea222009-12-23 19:23:03 +0000527
528
jamesren708f1c02010-03-31 21:43:57 +0000529 def test_filtering_on_iteration_result_fields(self):
showard8b0ea222009-12-23 19:23:03 +0000530 iterations = rpc_interface.get_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000531 extra_where='iteration_result_iresult.value = 1',
532 iteration_result_fields=['iresult'])
showard8b0ea222009-12-23 19:23:03 +0000533 self.assertEquals(len(iterations), 1)
534
535
jamesren708f1c02010-03-31 21:43:57 +0000536 def test_grouping_with_iteration_result_fields(self):
537 num_groups = rpc_interface.get_num_groups(
538 ['iteration_result_iresult'],
539 iteration_result_fields=['iresult'])
showard8b0ea222009-12-23 19:23:03 +0000540 self.assertEquals(num_groups, 2)
541
jamesren708f1c02010-03-31 21:43:57 +0000542 counts = rpc_interface.get_group_counts(
543 ['iteration_result_iresult'],
544 iteration_result_fields=['iresult'])
showard8b0ea222009-12-23 19:23:03 +0000545 groups = counts['groups']
546 self.assertEquals(len(groups), 2)
jamesren708f1c02010-03-31 21:43:57 +0000547 self.assertEquals(groups[0]['iteration_result_iresult'], 1)
showard8b0ea222009-12-23 19:23:03 +0000548 self.assertEquals(groups[0]['group_count'], 1)
jamesren708f1c02010-03-31 21:43:57 +0000549 self.assertEquals(groups[1]['iteration_result_iresult'], 3)
showard8b0ea222009-12-23 19:23:03 +0000550 self.assertEquals(groups[1]['group_count'], 1)
551
552
553 def _setup_machine_labels(self):
554 models.TestAttribute.objects.create(test=self.first_test,
555 attribute='host-labels',
556 value='label1,label2')
557
558
559 def test_get_machine_label_fields(self):
560 self._setup_machine_labels()
561
562 tests = rpc_interface.get_test_views(
563 machine_label_fields=['label1', 'otherlabel'])
564 self.assertEquals(len(tests), 3)
565
566 self.assertEquals(tests[0]['machine_label_label1'], 'label1')
567 self.assertEquals(tests[0]['machine_label_otherlabel'], None)
568
569 for index in (1, 2):
570 self.assertEquals(tests[index]['machine_label_label1'], None)
571 self.assertEquals(tests[index]['machine_label_otherlabel'], None)
572
573
574 def test_grouping_with_machine_label_fields(self):
575 self._setup_machine_labels()
576
577 counts = rpc_interface.get_group_counts(['machine_label_label1'],
578 machine_label_fields=['label1'])
579 groups = counts['groups']
580 self.assertEquals(len(groups), 2)
581 self.assertEquals(groups[0]['machine_label_label1'], None)
582 self.assertEquals(groups[0]['group_count'], 2)
583 self.assertEquals(groups[1]['machine_label_label1'], 'label1')
584 self.assertEquals(groups[1]['group_count'], 1)
585
586
587 def test_filtering_on_machine_label_fields(self):
588 self._setup_machine_labels()
589
590 tests = rpc_interface.get_test_views(
591 extra_where='machine_label_label1 = "label1"',
592 machine_label_fields=['label1'])
593 self.assertEquals(len(tests), 1)
594
595
596 def test_quoting_fields(self):
597 # ensure fields with special characters are properly quoted throughout
598 rpc_interface.add_test_label('hyphen-label')
599 rpc_interface.get_group_counts(
jamesren708f1c02010-03-31 21:43:57 +0000600 ['test_attribute_hyphen-attr', 'test_label_hyphen-label',
601 'machine_label_hyphen-label',
602 'iteration_result_hyphen-result'],
showard8b0ea222009-12-23 19:23:03 +0000603 test_attribute_fields=['hyphen-attr'],
604 test_label_fields=['hyphen-label'],
605 machine_label_fields=['hyphen-label'],
jamesren708f1c02010-03-31 21:43:57 +0000606 iteration_result_fields=['hyphen-result'])
showard8b0ea222009-12-23 19:23:03 +0000607
608
showardf8b19042009-05-12 17:22:49 +0000609if __name__ == '__main__':
610 unittest.main()