#!/usr/bin/python # pylint: disable-msg=C0111 import json import os, unittest import common from autotest_lib.client.common_lib import control_data, autotemp ControlData = control_data.ControlData CONTROL = """ AUTHOR = 'Author' DEPENDENCIES = "console, power" DOC = \"\"\"\ doc stuff\"\"\" # EXPERIMENTAL should implicitly be False NAME = 'nA' "mE" RUN_VERIFY = False SYNC_COUNT = 2 TIME='short' TEST_CLASS=u'Kernel' TEST_CATEGORY='Stress' TEST_TYPE='client' REQUIRE_SSP = False ATTRIBUTES = "suite:smoke, suite:bvt" SUITE = "suite-listed-only-in-suite-line" """ # Control data being wrapped into step* functions. WRAPPED_CONTROL = """ def step_init(): step0() def step0(): AUTHOR = 'Author' DEPENDENCIES = "console, power" DOC = \"\"\"\ doc stuff\"\"\" # EXPERIMENTAL should implicitly be False NAME = 'nA' "mE" RUN_VERIFY = False SYNC_COUNT = 2 TIME='short' TEST_CLASS=u'Kernel' TEST_CATEGORY='Stress' TEST_TYPE='client' REQUIRE_SSP = False ATTRIBUTES = "suite:smoke, suite:bvt" SUITE = "suite-listed-only-in-suite-line" MAX_RESULT_SIZE_KB = 20000 step_init() """ class ControlDataTestCase(unittest.TestCase): def setUp(self): self._required_vars = control_data.REQUIRED_VARS control_data.REQUIRED_VARS = set() def tearDown(self): control_data.REQUIRED_VARS = self._required_vars def test_suite_tag_parts(self): cd = ControlData({'suite': 'foo,bar'}, 'filename') self.assertEqual(set(cd.suite_tag_parts), {'foo', 'bar'}) def test_suite_tag_parts_empty_for_non_suite(self): cd = ControlData({}, 'filename') self.assertEqual(cd.suite_tag_parts, []) class ParseControlTest(unittest.TestCase): def setUp(self): self.control_tmp = autotemp.tempfile(unique_id='control_unit', text=True) os.write(self.control_tmp.fd, CONTROL) def tearDown(self): self.control_tmp.clean() def test_parse_control(self): cd = control_data.parse_control(self.control_tmp.name, True) self.assertEquals(cd.author, "Author") self.assertEquals(cd.dependencies, set(['console', 'power'])) self.assertEquals(cd.doc, "doc stuff") self.assertEquals(cd.experimental, False) self.assertEquals(cd.name, "nAmE") self.assertEquals(cd.run_verify, False) self.assertEquals(cd.sync_count, 2) self.assertEquals(cd.time, "short") self.assertEquals(cd.test_class, "kernel") self.assertEquals(cd.test_category, "stress") self.assertEquals(cd.test_type, "client") self.assertEquals(cd.require_ssp, False) self.assertEquals(cd.attributes, set(["suite:smoke","suite:bvt","subsystem:default"])) self.assertEquals(cd.suite, "bvt,smoke,suite-listed-only-in-suite-line") class ParseWrappedControlTest(unittest.TestCase): """Test control data can be retrieved from wrapped step functions.""" def setUp(self): self.control_tmp = autotemp.tempfile(unique_id='wrapped_control_unit', text=True) os.write(self.control_tmp.fd, WRAPPED_CONTROL) def tearDown(self): self.control_tmp.clean() def test_parse_control(self): cd = control_data.parse_control(self.control_tmp.name, True) self.assertEquals(cd.author, "Author") self.assertEquals(cd.dependencies, set(['console', 'power'])) self.assertEquals(cd.doc, "doc stuff") self.assertEquals(cd.experimental, False) self.assertEquals(cd.name, "nAmE") self.assertEquals(cd.run_verify, False) self.assertEquals(cd.sync_count, 2) self.assertEquals(cd.time, "short") self.assertEquals(cd.test_class, "kernel") self.assertEquals(cd.test_category, "stress") self.assertEquals(cd.test_type, "client") self.assertEquals(cd.require_ssp, False) self.assertEquals(cd.attributes, set(["suite:smoke","suite:bvt","subsystem:default"])) self.assertEquals(cd.suite, "bvt,smoke,suite-listed-only-in-suite-line") self.assertEquals(cd.max_result_size_KB, 20000) class ParseControlFileBugTemplate(unittest.TestCase): def setUp(self): self.control_tmp = autotemp.tempfile(unique_id='control_unit', text=True) self.bug_template = { 'owner': 'someone@something.org', 'labels': ['a', 'b'], 'status': None, 'summary': None, 'title': None, 'cc': ['a@something, b@something'], } def tearDown(self): self.control_tmp.clean() def insert_bug_template(self, control_file_string): """Insert a bug template into the control file string. @param control_file_string: A string of the control file contents this test will run on. @return: The control file string with the BUG_TEMPLATE line. """ bug_template_line = 'BUG_TEMPLATE = %s' % json.dumps(self.bug_template) return control_file_string + bug_template_line def verify_bug_template(self, new_bug_template): """Verify that the bug template given matches the original. @param new_bug_template: A bug template pulled off parsing the control file. @raises AssetionError: If a value under a give key in the bug template doesn't match the value in self.bug_template. @raises KeyError: If a key in either bug template is missing. """ for key, value in new_bug_template.iteritems(): self.assertEqual(value, self.bug_template[key]) def test_bug_template_parsing(self): """Basic parsing test for a bug templates in a test control file.""" os.write(self.control_tmp.fd, self.insert_bug_template(CONTROL)) cd = control_data.parse_control(self.control_tmp.name, True) self.verify_bug_template(cd.bug_template) def test_bug_template_list(self): """Test that lists in the bug template can handle other datatypes.""" self.bug_template['labels'].append({'foo': 'bar'}) os.write(self.control_tmp.fd, self.insert_bug_template(CONTROL)) cd = control_data.parse_control(self.control_tmp.name, True) self.verify_bug_template(cd.bug_template) def test_bad_template(self): """Test that a bad bug template doesn't result in a bad control data.""" self.bug_template = 'foobarbug_template' os.write(self.control_tmp.fd, self.insert_bug_template(CONTROL)) cd = control_data.parse_control(self.control_tmp.name, True) self.assertFalse(hasattr(cd, 'bug_template')) class SetMethodTests(unittest.TestCase): def setUp(self): self.required_vars = control_data.REQUIRED_VARS control_data.REQUIRED_VARS = set() def tearDown(self): control_data.REQUIRED_VARS = self.required_vars def test_bool(self): cd = ControlData({}, 'filename') cd._set_bool('foo', 'False') self.assertEquals(cd.foo, False) cd._set_bool('foo', True) self.assertEquals(cd.foo, True) cd._set_bool('foo', 'FALSE') self.assertEquals(cd.foo, False) cd._set_bool('foo', 'true') self.assertEquals(cd.foo, True) self.assertRaises(ValueError, cd._set_bool, 'foo', '') self.assertRaises(ValueError, cd._set_bool, 'foo', 1) self.assertRaises(ValueError, cd._set_bool, 'foo', []) self.assertRaises(ValueError, cd._set_bool, 'foo', None) def test_int(self): cd = ControlData({}, 'filename') cd._set_int('foo', 0) self.assertEquals(cd.foo, 0) cd._set_int('foo', '0') self.assertEquals(cd.foo, 0) cd._set_int('foo', '-1', min=-2, max=10) self.assertEquals(cd.foo, -1) self.assertRaises(ValueError, cd._set_int, 'foo', 0, min=1) self.assertRaises(ValueError, cd._set_int, 'foo', 1, max=0) self.assertRaises(ValueError, cd._set_int, 'foo', 'x') self.assertRaises(ValueError, cd._set_int, 'foo', '') self.assertRaises(TypeError, cd._set_int, 'foo', None) def test_set(self): cd = ControlData({}, 'filename') cd._set_set('foo', 'a') self.assertEquals(cd.foo, set(['a'])) cd._set_set('foo', 'a,b,c') self.assertEquals(cd.foo, set(['a', 'b', 'c'])) cd._set_set('foo', ' a , b , c ') self.assertEquals(cd.foo, set(['a', 'b', 'c'])) cd._set_set('foo', None) self.assertEquals(cd.foo, set(['None'])) def test_string(self): cd = ControlData({}, 'filename') cd._set_string('foo', 'a') self.assertEquals(cd.foo, 'a') cd._set_string('foo', 'b') self.assertEquals(cd.foo, 'b') cd._set_string('foo', 'B') self.assertEquals(cd.foo, 'B') cd._set_string('foo', 1) self.assertEquals(cd.foo, '1') cd._set_string('foo', None) self.assertEquals(cd.foo, 'None') cd._set_string('foo', []) self.assertEquals(cd.foo, '[]') def test_option(self): options = ['a', 'b'] cd = ControlData({}, 'filename') cd._set_option('foo', 'a', options) self.assertEquals(cd.foo, 'a') cd._set_option('foo', 'b', options) self.assertEquals(cd.foo, 'b') cd._set_option('foo', 'B', options) self.assertEquals(cd.foo, 'B') self.assertRaises(ValueError, cd._set_option, 'foo', 'x', options) self.assertRaises(ValueError, cd._set_option, 'foo', 1, options) self.assertRaises(ValueError, cd._set_option, 'foo', [], options) self.assertRaises(ValueError, cd._set_option, 'foo', None, options) def test_set_attributes(self): cd = ControlData({}, 'filename') cd.set_attributes('suite:bvt') self.assertEquals(cd.attributes, set(['suite:bvt', 'subsystem:default'])) cd.set_attributes('suite:bvt, subsystem:network') self.assertEquals(cd.attributes, set(['suite:bvt', 'subsystem:network'])) def test_get_test_time_index(self): inputs = [time.upper() for time in ControlData.TEST_TIME_LIST] time_min_index = [ControlData.get_test_time_index(time) for time in inputs] expected_time_index = range(len(ControlData.TEST_TIME_LIST)) self.assertEqual(time_min_index, expected_time_index) def test_get_test_time_index_failure(self): def fail(): """Test function to raise ControlVariableException exception for invalid TIME setting.""" index = ControlData.get_test_time_index('some invalid TIME') self.assertRaises(control_data.ControlVariableException, fail) # this is so the test can be run in standalone mode if __name__ == '__main__': unittest.main()