blob: 91be76e0c1f2c3a2b1be81097e7677feb607c83b [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
showardc4780402009-08-31 18:31:34 +0000176 # create test attributes, test labels, and iterations
showard68693f72009-05-20 00:31:53 +0000177 # like Noah's Ark, include two of each...just in case there's a bug with
178 # multiple related items
showard06b82fc2009-06-30 01:59:42 +0000179 models.TestAttribute.objects.create(test=job1_test1, attribute='myattr',
180 value='myval')
181 models.TestAttribute.objects.create(test=job1_test1,
182 attribute='myattr2', value='myval2')
showardf8b19042009-05-12 17:22:49 +0000183
showardeab66ce2009-12-23 00:03:56 +0000184 self._add_iteration_keyval('tko_iteration_attributes', test=job1_test1,
showard68693f72009-05-20 00:31:53 +0000185 iteration=1, attribute='iattr',
186 value='ival')
showardeab66ce2009-12-23 00:03:56 +0000187 self._add_iteration_keyval('tko_iteration_attributes', test=job1_test1,
showard68693f72009-05-20 00:31:53 +0000188 iteration=1, attribute='iattr2',
189 value='ival2')
showardeab66ce2009-12-23 00:03:56 +0000190 self._add_iteration_keyval('tko_iteration_result', test=job1_test1,
showardc4780402009-08-31 18:31:34 +0000191 iteration=1, attribute='iresult', value=1)
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='iresult2', value=2)
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=2, attribute='iresult', value=3)
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='iresult2', value=4)
showard68693f72009-05-20 00:31:53 +0000198
showard06b82fc2009-06-30 01:59:42 +0000199 label1 = models.TestLabel.objects.create(name='testlabel1')
200 label2 = models.TestLabel.objects.create(name='testlabel2')
201
202 label1.tests.add(job1_test1)
203 label2.tests.add(job1_test1)
showard68693f72009-05-20 00:31:53 +0000204
205
206 def _add_iteration_keyval(self, table, test, iteration, attribute, value):
207 cursor = connection.cursor()
208 cursor.execute('INSERT INTO %s ' 'VALUES (%%s, %%s, %%s, %%s)' % table,
209 (test.test_idx, iteration, attribute, value))
210
211
jamesrencd7a81a2010-04-21 20:39:08 +0000212class RpcInterfaceTest(unittest.TestCase, TkoTestMixin):
213 def setUp(self):
214 self.god = mock.mock_god()
215
216 setup_test_environment.set_up()
217 self._patch_sqlite_stuff()
218 setup_test_view()
219 self._create_initial_data()
220
221
222 def tearDown(self):
223 setup_test_environment.tear_down()
224 self.god.unstub_all()
225
226
showard06b82fc2009-06-30 01:59:42 +0000227 def _check_for_get_test_views(self, test):
228 self.assertEquals(test['test_name'], 'mytest1')
229 self.assertEquals(test['job_tag'], '1-myjobtag1')
230 self.assertEquals(test['job_name'], 'myjob1')
231 self.assertEquals(test['job_owner'], 'myuser')
232 self.assertEquals(test['status'], 'GOOD')
233 self.assertEquals(test['hostname'], 'myhost')
234 self.assertEquals(test['kernel'], 'mykernel1')
showardf8b19042009-05-12 17:22:49 +0000235
236
237 def test_get_detailed_test_views(self):
238 test = rpc_interface.get_detailed_test_views()[0]
239
showard06b82fc2009-06-30 01:59:42 +0000240 self._check_for_get_test_views(test)
showardf8b19042009-05-12 17:22:49 +0000241
showard68693f72009-05-20 00:31:53 +0000242 self.assertEquals(test['attributes'], {'myattr': 'myval',
243 'myattr2': 'myval2'})
244 self.assertEquals(test['iterations'], [{'attr': {'iattr': 'ival',
245 'iattr2': 'ival2'},
246 'perf': {'iresult': 1,
showardc4780402009-08-31 18:31:34 +0000247 'iresult2': 2}},
248 {'attr': {},
249 'perf': {'iresult': 3,
250 'iresult2': 4}}])
showard06b82fc2009-06-30 01:59:42 +0000251 self.assertEquals(test['labels'], ['testlabel1', 'testlabel2'])
showardf8b19042009-05-12 17:22:49 +0000252
253
254 def test_test_attributes(self):
showard06b82fc2009-06-30 01:59:42 +0000255 rpc_interface.set_test_attribute('foo', 'bar', test_name='mytest1')
showardf8b19042009-05-12 17:22:49 +0000256 test = rpc_interface.get_detailed_test_views()[0]
showard68693f72009-05-20 00:31:53 +0000257 self.assertEquals(test['attributes'], {'foo': 'bar',
258 'myattr': 'myval',
259 'myattr2': 'myval2'})
showardf8b19042009-05-12 17:22:49 +0000260
showard06b82fc2009-06-30 01:59:42 +0000261 rpc_interface.set_test_attribute('foo', 'goo', test_name='mytest1')
showardf8b19042009-05-12 17:22:49 +0000262 test = rpc_interface.get_detailed_test_views()[0]
showard68693f72009-05-20 00:31:53 +0000263 self.assertEquals(test['attributes'], {'foo': 'goo',
264 'myattr': 'myval',
265 'myattr2': 'myval2'})
showardf8b19042009-05-12 17:22:49 +0000266
showard06b82fc2009-06-30 01:59:42 +0000267 rpc_interface.set_test_attribute('foo', None, test_name='mytest1')
showardf8b19042009-05-12 17:22:49 +0000268 test = rpc_interface.get_detailed_test_views()[0]
showard68693f72009-05-20 00:31:53 +0000269 self.assertEquals(test['attributes'], {'myattr': 'myval',
270 'myattr2': 'myval2'})
showardf8b19042009-05-12 17:22:49 +0000271
272
273 def test_immutable_attributes(self):
274 self.assertRaises(ValueError, rpc_interface.set_test_attribute,
showard06b82fc2009-06-30 01:59:42 +0000275 'myattr', 'foo', test_name='mytest1')
276
277
278 def test_get_test_views(self):
279 tests = rpc_interface.get_test_views()
280
281 self.assertEquals(len(tests), 3)
282 test = rpc_interface.get_test_views(
283 job_name='myjob1', test_name='mytest1')[0]
284 self.assertEquals(tests[0], test)
285
286 self._check_for_get_test_views(test)
287
288 self.assertEquals(
289 [], rpc_interface.get_test_views(hostname='fakehost'))
290
291
showarda5288b42009-07-28 20:06:08 +0000292 def _check_test_names(self, tests, expected_names):
293 self.assertEquals(set(test['test_name'] for test in tests),
294 set(expected_names))
295
296
297 def test_get_test_views_filter_on_labels(self):
298 tests = rpc_interface.get_test_views(include_labels=['testlabel1'])
299 self._check_test_names(tests, ['mytest1'])
300
301 tests = rpc_interface.get_test_views(exclude_labels=['testlabel1'])
302 self._check_test_names(tests, ['mytest2', 'kernbench'])
303
304
305 def test_get_test_views_filter_on_attributes(self):
306 tests = rpc_interface.get_test_views(
307 include_attributes_where='attribute = "myattr" '
308 'and value = "myval"')
309 self._check_test_names(tests, ['mytest1'])
310
311 tests = rpc_interface.get_test_views(
312 exclude_attributes_where='attribute="myattr2"')
313 self._check_test_names(tests, ['mytest2', 'kernbench'])
314
315
showard06b82fc2009-06-30 01:59:42 +0000316 def test_get_num_test_views(self):
317 self.assertEquals(rpc_interface.get_num_test_views(), 3)
318 self.assertEquals(rpc_interface.get_num_test_views(
319 job_name='myjob1', test_name='mytest1'), 1)
320
321
showard06b82fc2009-06-30 01:59:42 +0000322 def test_get_group_counts(self):
showard06b82fc2009-06-30 01:59:42 +0000323 self.assertEquals(rpc_interface.get_num_groups(['job_name']), 2)
324
325 counts = rpc_interface.get_group_counts(['job_name'])
326 groups = counts['groups']
327 self.assertEquals(len(groups), 2)
showard79097322010-01-20 01:12:25 +0000328 group1, group2 = groups
showard06b82fc2009-06-30 01:59:42 +0000329
330 self.assertEquals(group1['group_count'], 2)
331 self.assertEquals(group1['job_name'], 'myjob1')
332 self.assertEquals(group2['group_count'], 1)
333 self.assertEquals(group2['job_name'], 'myjob2')
334
335 extra = {'extra' : 'kernel_hash'}
336 counts = rpc_interface.get_group_counts(['job_name'],
337 header_groups=[('job_name',)],
338 extra_select_fields=extra)
339 groups = counts['groups']
340 self.assertEquals(len(groups), 2)
showard79097322010-01-20 01:12:25 +0000341 group1, group2 = groups
showard06b82fc2009-06-30 01:59:42 +0000342
343 self.assertEquals(group1['group_count'], 2)
344 self.assertEquals(group1['header_indices'], [0])
345 self.assertEquals(group1['extra'], 'mykernel1')
346 self.assertEquals(group2['group_count'], 1)
347 self.assertEquals(group2['header_indices'], [1])
348 self.assertEquals(group2['extra'], 'mykernel2')
349
350
351 def test_get_status_counts(self):
showard79097322010-01-20 01:12:25 +0000352 counts = rpc_interface.get_status_counts(group_by=['job_name'])
353 group1, group2 = counts['groups']
354 self.assertEquals(group1['pass_count'], 1)
355 self.assertEquals(group1['complete_count'], 2)
356 self.assertEquals(group1['incomplete_count'], 0)
357 self.assertEquals(group2['pass_count'], 1)
358 self.assertEquals(group2['complete_count'], 1)
359 self.assertEquals(group2['incomplete_count'], 0)
showard06b82fc2009-06-30 01:59:42 +0000360
361
362 def test_get_latest_tests(self):
showard79097322010-01-20 01:12:25 +0000363 counts = rpc_interface.get_latest_tests(group_by=['job_name'])
364 group1, group2 = counts['groups']
365 self.assertEquals(group1['pass_count'], 0)
366 self.assertEquals(group1['complete_count'], 1)
367 self.assertEquals(group1['test_idx'], 2)
368 self.assertEquals(group2['test_idx'], 3)
369
370
371 def test_get_latest_tests_extra_info(self):
372 counts = rpc_interface.get_latest_tests(group_by=['job_name'],
373 extra_info=['job_tag'])
374 group1, group2 = counts['groups']
375 self.assertEquals(group1['extra_info'], ['1-myjobtag1'])
376 self.assertEquals(group2['extra_info'], ['2-myjobtag2'])
showard06b82fc2009-06-30 01:59:42 +0000377
378
379 def test_get_job_ids(self):
380 self.assertEquals([1,2], rpc_interface.get_job_ids())
381 self.assertEquals([1], rpc_interface.get_job_ids(test_name='mytest2'))
382
383
384 def test_get_hosts_and_tests(self):
385 host_info = rpc_interface.get_hosts_and_tests()
386 self.assertEquals(len(host_info), 1)
387 info = host_info['myhost']
388
389 self.assertEquals(info['tests'], ['kernbench'])
390 self.assertEquals(info['id'], 1)
391
392
393 def _check_for_get_test_labels(self, label, label_num):
394 self.assertEquals(label['id'], label_num)
395 self.assertEquals(label['description'], '')
396 self.assertEquals(label['name'], 'testlabel%d' % label_num)
397
398
399 def test_test_labels(self):
400 labels = rpc_interface.get_test_labels_for_tests(test_name='mytest1')
401 self.assertEquals(len(labels), 2)
402 label1 = labels[0]
403 label2 = labels[1]
404
405 self._check_for_get_test_labels(label1, 1)
406 self._check_for_get_test_labels(label2, 2)
407
408 rpc_interface.test_label_remove_tests(label1['id'], test_name='mytest1')
409
410 labels = rpc_interface.get_test_labels_for_tests(test_name='mytest1')
411 self.assertEquals(len(labels), 1)
412 label = labels[0]
413
414 self._check_for_get_test_labels(label, 2)
415
416 rpc_interface.test_label_add_tests(label1['id'], test_name='mytest1')
417
418 labels = rpc_interface.get_test_labels_for_tests(test_name='mytest1')
419 self.assertEquals(len(labels), 2)
420 label1 = labels[0]
421 label2 = labels[1]
422
423 self._check_for_get_test_labels(label1, 1)
424 self._check_for_get_test_labels(label2, 2)
showardf8b19042009-05-12 17:22:49 +0000425
426
showard8b0ea222009-12-23 19:23:03 +0000427 def test_get_test_attribute_fields(self):
showard8bfb5cb2009-10-07 20:49:15 +0000428 tests = rpc_interface.get_test_views(
showard8b0ea222009-12-23 19:23:03 +0000429 test_attribute_fields=['myattr', 'myattr2'])
showard8bfb5cb2009-10-07 20:49:15 +0000430 self.assertEquals(len(tests), 3)
431
jamesren708f1c02010-03-31 21:43:57 +0000432 self.assertEquals(tests[0]['test_attribute_myattr'], 'myval')
433 self.assertEquals(tests[0]['test_attribute_myattr2'], 'myval2')
showard8bfb5cb2009-10-07 20:49:15 +0000434
435 for index in (1, 2):
jamesren708f1c02010-03-31 21:43:57 +0000436 self.assertEquals(tests[index]['test_attribute_myattr'], None)
437 self.assertEquals(tests[index]['test_attribute_myattr2'], None)
showard8bfb5cb2009-10-07 20:49:15 +0000438
439
showard8b0ea222009-12-23 19:23:03 +0000440 def test_filtering_on_test_attribute_fields(self):
441 tests = rpc_interface.get_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000442 extra_where='test_attribute_myattr.value = "myval"',
showard8b0ea222009-12-23 19:23:03 +0000443 test_attribute_fields=['myattr'])
444 self.assertEquals(len(tests), 1)
445
446
447 def test_grouping_with_test_attribute_fields(self):
448 num_groups = rpc_interface.get_num_groups(
jamesren708f1c02010-03-31 21:43:57 +0000449 ['test_attribute_myattr'], test_attribute_fields=['myattr'])
showardd2b0c882009-10-19 18:34:11 +0000450 self.assertEquals(num_groups, 2)
451
showard8b0ea222009-12-23 19:23:03 +0000452 counts = rpc_interface.get_group_counts(
jamesren708f1c02010-03-31 21:43:57 +0000453 ['test_attribute_myattr'], test_attribute_fields=['myattr'])
showard8bfb5cb2009-10-07 20:49:15 +0000454 groups = counts['groups']
showardd2b0c882009-10-19 18:34:11 +0000455 self.assertEquals(len(groups), num_groups)
jamesren708f1c02010-03-31 21:43:57 +0000456 self.assertEquals(groups[0]['test_attribute_myattr'], None)
showard8bfb5cb2009-10-07 20:49:15 +0000457 self.assertEquals(groups[0]['group_count'], 2)
jamesren708f1c02010-03-31 21:43:57 +0000458 self.assertEquals(groups[1]['test_attribute_myattr'], 'myval')
showard8bfb5cb2009-10-07 20:49:15 +0000459 self.assertEquals(groups[1]['group_count'], 1)
460
461
showard79097322010-01-20 01:12:25 +0000462 def test_extra_info_test_attributes(self):
463 counts = rpc_interface.get_latest_tests(
jamesren708f1c02010-03-31 21:43:57 +0000464 group_by=['test_idx'], extra_info=['test_attribute_myattr'],
showard79097322010-01-20 01:12:25 +0000465 test_attribute_fields=['myattr'])
466 group1 = counts['groups'][0]
467 self.assertEquals(group1['extra_info'], ['myval'])
468
469
showard8b0ea222009-12-23 19:23:03 +0000470 def test_get_test_label_fields(self):
471 tests = rpc_interface.get_test_views(
472 test_label_fields=['testlabel1', 'testlabel2'])
473 self.assertEquals(len(tests), 3)
474
jamesren708f1c02010-03-31 21:43:57 +0000475 self.assertEquals(tests[0]['test_label_testlabel1'], 'testlabel1')
476 self.assertEquals(tests[0]['test_label_testlabel2'], 'testlabel2')
showard8b0ea222009-12-23 19:23:03 +0000477
478 for index in (1, 2):
jamesren708f1c02010-03-31 21:43:57 +0000479 self.assertEquals(tests[index]['test_label_testlabel1'], None)
480 self.assertEquals(tests[index]['test_label_testlabel2'], None)
showard8b0ea222009-12-23 19:23:03 +0000481
482
483 def test_filtering_on_test_label_fields(self):
484 tests = rpc_interface.get_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000485 extra_where='test_label_testlabel1 = "testlabel1"',
showard8b0ea222009-12-23 19:23:03 +0000486 test_label_fields=['testlabel1'])
487 self.assertEquals(len(tests), 1)
488
489
490 def test_grouping_on_test_label_fields(self):
491 num_groups = rpc_interface.get_num_groups(
jamesren708f1c02010-03-31 21:43:57 +0000492 ['test_label_testlabel1'], test_label_fields=['testlabel1'])
showard8b0ea222009-12-23 19:23:03 +0000493 self.assertEquals(num_groups, 2)
494
495 counts = rpc_interface.get_group_counts(
jamesren708f1c02010-03-31 21:43:57 +0000496 ['test_label_testlabel1'], test_label_fields=['testlabel1'])
showard8b0ea222009-12-23 19:23:03 +0000497 groups = counts['groups']
498 self.assertEquals(len(groups), 2)
jamesren708f1c02010-03-31 21:43:57 +0000499 self.assertEquals(groups[0]['test_label_testlabel1'], None)
showard8b0ea222009-12-23 19:23:03 +0000500 self.assertEquals(groups[0]['group_count'], 2)
jamesren708f1c02010-03-31 21:43:57 +0000501 self.assertEquals(groups[1]['test_label_testlabel1'], 'testlabel1')
showard8b0ea222009-12-23 19:23:03 +0000502 self.assertEquals(groups[1]['group_count'], 1)
503
504
jamesren708f1c02010-03-31 21:43:57 +0000505 def test_get_iteration_result_fields(self):
showard8b0ea222009-12-23 19:23:03 +0000506 num_iterations = rpc_interface.get_num_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000507 iteration_result_fields=['iresult', 'iresult2'])
showard8b0ea222009-12-23 19:23:03 +0000508 self.assertEquals(num_iterations, 2)
509
510 iterations = rpc_interface.get_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000511 iteration_result_fields=['iresult', 'iresult2'])
showard8b0ea222009-12-23 19:23:03 +0000512 self.assertEquals(len(iterations), 2)
513
514 for index in (0, 1):
515 self.assertEquals(iterations[index]['test_idx'], 1)
516
517 self.assertEquals(iterations[0]['iteration_index'], 1)
jamesren708f1c02010-03-31 21:43:57 +0000518 self.assertEquals(iterations[0]['iteration_result_iresult'], 1)
519 self.assertEquals(iterations[0]['iteration_result_iresult2'], 2)
showard8b0ea222009-12-23 19:23:03 +0000520
521 self.assertEquals(iterations[1]['iteration_index'], 2)
jamesren708f1c02010-03-31 21:43:57 +0000522 self.assertEquals(iterations[1]['iteration_result_iresult'], 3)
523 self.assertEquals(iterations[1]['iteration_result_iresult2'], 4)
showard8b0ea222009-12-23 19:23:03 +0000524
525
jamesren708f1c02010-03-31 21:43:57 +0000526 def test_filtering_on_iteration_result_fields(self):
showard8b0ea222009-12-23 19:23:03 +0000527 iterations = rpc_interface.get_test_views(
jamesren708f1c02010-03-31 21:43:57 +0000528 extra_where='iteration_result_iresult.value = 1',
529 iteration_result_fields=['iresult'])
showard8b0ea222009-12-23 19:23:03 +0000530 self.assertEquals(len(iterations), 1)
531
532
jamesren708f1c02010-03-31 21:43:57 +0000533 def test_grouping_with_iteration_result_fields(self):
534 num_groups = rpc_interface.get_num_groups(
535 ['iteration_result_iresult'],
536 iteration_result_fields=['iresult'])
showard8b0ea222009-12-23 19:23:03 +0000537 self.assertEquals(num_groups, 2)
538
jamesren708f1c02010-03-31 21:43:57 +0000539 counts = rpc_interface.get_group_counts(
540 ['iteration_result_iresult'],
541 iteration_result_fields=['iresult'])
showard8b0ea222009-12-23 19:23:03 +0000542 groups = counts['groups']
543 self.assertEquals(len(groups), 2)
jamesren708f1c02010-03-31 21:43:57 +0000544 self.assertEquals(groups[0]['iteration_result_iresult'], 1)
showard8b0ea222009-12-23 19:23:03 +0000545 self.assertEquals(groups[0]['group_count'], 1)
jamesren708f1c02010-03-31 21:43:57 +0000546 self.assertEquals(groups[1]['iteration_result_iresult'], 3)
showard8b0ea222009-12-23 19:23:03 +0000547 self.assertEquals(groups[1]['group_count'], 1)
548
549
550 def _setup_machine_labels(self):
551 models.TestAttribute.objects.create(test=self.first_test,
552 attribute='host-labels',
553 value='label1,label2')
554
555
556 def test_get_machine_label_fields(self):
557 self._setup_machine_labels()
558
559 tests = rpc_interface.get_test_views(
560 machine_label_fields=['label1', 'otherlabel'])
561 self.assertEquals(len(tests), 3)
562
563 self.assertEquals(tests[0]['machine_label_label1'], 'label1')
564 self.assertEquals(tests[0]['machine_label_otherlabel'], None)
565
566 for index in (1, 2):
567 self.assertEquals(tests[index]['machine_label_label1'], None)
568 self.assertEquals(tests[index]['machine_label_otherlabel'], None)
569
570
571 def test_grouping_with_machine_label_fields(self):
572 self._setup_machine_labels()
573
574 counts = rpc_interface.get_group_counts(['machine_label_label1'],
575 machine_label_fields=['label1'])
576 groups = counts['groups']
577 self.assertEquals(len(groups), 2)
578 self.assertEquals(groups[0]['machine_label_label1'], None)
579 self.assertEquals(groups[0]['group_count'], 2)
580 self.assertEquals(groups[1]['machine_label_label1'], 'label1')
581 self.assertEquals(groups[1]['group_count'], 1)
582
583
584 def test_filtering_on_machine_label_fields(self):
585 self._setup_machine_labels()
586
587 tests = rpc_interface.get_test_views(
588 extra_where='machine_label_label1 = "label1"',
589 machine_label_fields=['label1'])
590 self.assertEquals(len(tests), 1)
591
592
593 def test_quoting_fields(self):
594 # ensure fields with special characters are properly quoted throughout
595 rpc_interface.add_test_label('hyphen-label')
596 rpc_interface.get_group_counts(
jamesren708f1c02010-03-31 21:43:57 +0000597 ['test_attribute_hyphen-attr', 'test_label_hyphen-label',
598 'machine_label_hyphen-label',
599 'iteration_result_hyphen-result'],
showard8b0ea222009-12-23 19:23:03 +0000600 test_attribute_fields=['hyphen-attr'],
601 test_label_fields=['hyphen-label'],
602 machine_label_fields=['hyphen-label'],
jamesren708f1c02010-03-31 21:43:57 +0000603 iteration_result_fields=['hyphen-result'])
showard8b0ea222009-12-23 19:23:03 +0000604
605
showardf8b19042009-05-12 17:22:49 +0000606if __name__ == '__main__':
607 unittest.main()