1*9c5db199SXin Li#!/usr/bin/python3 2*9c5db199SXin Li 3*9c5db199SXin Li# Copyright (c) 2021 The Chromium OS Authors. All rights reserved. 4*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 5*9c5db199SXin Li# found in the LICENSE file. 6*9c5db199SXin Li 7*9c5db199SXin Liimport os 8*9c5db199SXin Liimport six 9*9c5db199SXin Liimport unittest 10*9c5db199SXin Liimport tempfile 11*9c5db199SXin Liimport shutil 12*9c5db199SXin Li 13*9c5db199SXin Lios.environ["PY_VERSION"] = '3' 14*9c5db199SXin Li 15*9c5db199SXin Liimport common 16*9c5db199SXin Li 17*9c5db199SXin Li# These tests are strictly not supported in python2. 18*9c5db199SXin Liif six.PY2: 19*9c5db199SXin Li exit(0) 20*9c5db199SXin Li 21*9c5db199SXin Lifrom autotest_lib.client.common_lib import control_data 22*9c5db199SXin Lifrom autotest_lib.utils import generate_metadata 23*9c5db199SXin Li 24*9c5db199SXin LiCONTROL_DATA1 = """ 25*9c5db199SXin Li# Copyright 2021 The Chromium OS Authors. All rights reserved. 26*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 27*9c5db199SXin Li# found in the LICENSE file. 28*9c5db199SXin Li 29*9c5db199SXin LiAUTHOR = 'an author with [email protected]' 30*9c5db199SXin LiNAME = 'fake_test1' 31*9c5db199SXin LiPURPOSE = 'A fake test.' 32*9c5db199SXin LiATTRIBUTES = 'suite:fake_suite1, suite:fake_suite2' 33*9c5db199SXin LiTIME = 'SHORT' 34*9c5db199SXin LiTEST_CATEGORY = 'Functional' 35*9c5db199SXin LiTEST_CLASS = 'audio' 36*9c5db199SXin LiTEST_TYPE = 'client' 37*9c5db199SXin LiDEPENDENCIES = 'fakedep1' 38*9c5db199SXin Li 39*9c5db199SXin LiDOC = ''' 40*9c5db199SXin Lia doc 41*9c5db199SXin Li''' 42*9c5db199SXin Li 43*9c5db199SXin Lijob.run_test('fake_test1') 44*9c5db199SXin Li 45*9c5db199SXin Li""" 46*9c5db199SXin Li 47*9c5db199SXin LiCONTROL_DATA2 = """ 48*9c5db199SXin Li# Copyright 2021 The Chromium OS Authors. All rights reserved. 49*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be 50*9c5db199SXin Li# found in the LICENSE file. 51*9c5db199SXin Li 52*9c5db199SXin LiAUTHOR = 'an author with [email protected]' 53*9c5db199SXin LiNAME = 'fake_test2' 54*9c5db199SXin LiPURPOSE = 'A fake test.' 55*9c5db199SXin LiATTRIBUTES = 'suite:fake_suite1, suite:fake_suite2' 56*9c5db199SXin LiTIME = 'SHORT' 57*9c5db199SXin LiTEST_CATEGORY = 'Functional' 58*9c5db199SXin LiTEST_CLASS = 'audio' 59*9c5db199SXin LiTEST_TYPE = 'client' 60*9c5db199SXin LiDEPENDENCIES = 'fakedep2' 61*9c5db199SXin Li 62*9c5db199SXin LiDOC = ''' 63*9c5db199SXin Lia doc 64*9c5db199SXin Li''' 65*9c5db199SXin Li 66*9c5db199SXin Lijob.run_test('fake_test2') 67*9c5db199SXin Li 68*9c5db199SXin Li""" 69*9c5db199SXin Li 70*9c5db199SXin Li 71*9c5db199SXin Liclass Namespace: 72*9c5db199SXin Li """Stub for mocking args.""" 73*9c5db199SXin Li 74*9c5db199SXin Li def __init__(self, **kwargs): 75*9c5db199SXin Li self.__dict__.update(kwargs) 76*9c5db199SXin Li 77*9c5db199SXin Li 78*9c5db199SXin Liclass MetadataTest(unittest.TestCase): 79*9c5db199SXin Li """Test generate_metadata.""" 80*9c5db199SXin Li 81*9c5db199SXin Li def setUp(self): 82*9c5db199SXin Li """Build up a tmp directory to host control files.""" 83*9c5db199SXin Li self.tmp_dir = tempfile.mkdtemp() 84*9c5db199SXin Li os.makedirs(os.path.join(self.tmp_dir, 'server/site_tests')) 85*9c5db199SXin Li os.makedirs(os.path.join(self.tmp_dir, 'client/site_tests')) 86*9c5db199SXin Li self.path1 = os.path.join(self.tmp_dir, 'server/site_tests', 87*9c5db199SXin Li 'control.1') 88*9c5db199SXin Li self.path2 = os.path.join(self.tmp_dir, 'client/site_tests', 89*9c5db199SXin Li 'control.2') 90*9c5db199SXin Li self.test1 = control_data.parse_control_string(CONTROL_DATA1, 91*9c5db199SXin Li raise_warnings=True, 92*9c5db199SXin Li path=self.path1) 93*9c5db199SXin Li self.test2 = control_data.parse_control_string(CONTROL_DATA2, 94*9c5db199SXin Li raise_warnings=True, 95*9c5db199SXin Li path=self.path2) 96*9c5db199SXin Li 97*9c5db199SXin Li def tearDown(self): 98*9c5db199SXin Li """Delete the tmp directory.""" 99*9c5db199SXin Li shutil.rmtree(self.tmp_dir) 100*9c5db199SXin Li 101*9c5db199SXin Li def test_args(self): 102*9c5db199SXin Li """Test CLI.""" 103*9c5db199SXin Li parsed = generate_metadata.parse_local_arguments( 104*9c5db199SXin Li ['-autotest_path', '/tauto/path', '-output_file', 'testout']) 105*9c5db199SXin Li self.assertEqual(parsed.autotest_path, '/tauto/path') 106*9c5db199SXin Li self.assertEqual(parsed.output_file, 'testout') 107*9c5db199SXin Li 108*9c5db199SXin Li def test_all_control_files(self): 109*9c5db199SXin Li """Test all_control_files finds all ctrl files in the expected dirs.""" 110*9c5db199SXin Li with open(self.path1, 'w') as wf: 111*9c5db199SXin Li wf.write(CONTROL_DATA1) 112*9c5db199SXin Li with open(self.path2, 'w') as wf: 113*9c5db199SXin Li wf.write(CONTROL_DATA2) 114*9c5db199SXin Li 115*9c5db199SXin Li files = generate_metadata.all_control_files( 116*9c5db199SXin Li Namespace(autotest_path=self.tmp_dir)) 117*9c5db199SXin Li 118*9c5db199SXin Li # Verify the files are found. 119*9c5db199SXin Li self.assertEqual(set(files), set([self.path1, self.path2])) 120*9c5db199SXin Li 121*9c5db199SXin Li def test_serialization(self): 122*9c5db199SXin Li """Test a single control file gets properly serialized.""" 123*9c5db199SXin Li meta_data = generate_metadata.serialized_test_case_metadata(self.test1) 124*9c5db199SXin Li self.assertEqual(meta_data.test_case.id.value, 'tauto.fake_test1') 125*9c5db199SXin Li self.assertEqual(meta_data.test_case.name, 'fake_test1') 126*9c5db199SXin Li # verify tags 127*9c5db199SXin Li expected_tags = set([ 128*9c5db199SXin Li 'fakedep1', 'test_class:audio', 'suite:fake_suite1', 129*9c5db199SXin Li 'suite:fake_suite2' 130*9c5db199SXin Li ]) 131*9c5db199SXin Li actual_tags = set([item.value for item in meta_data.test_case.tags]) 132*9c5db199SXin Li self.assertEqual(expected_tags, actual_tags) 133*9c5db199SXin Li # verify harness. This is a bit of a hack but works and keeps import 134*9c5db199SXin Li # hacking down. 135*9c5db199SXin Li self.assertIn('tauto', str(meta_data.test_case_exec.test_harness)) 136*9c5db199SXin Li # verify owners 137*9c5db199SXin Li expected_owners = set( 138*9c5db199SXin Li [item.email for item in meta_data.test_case_info.owners]) 139*9c5db199SXin Li self.assertEqual(expected_owners, 140*9c5db199SXin Li set(['an author with [email protected]'])) 141*9c5db199SXin Li 142*9c5db199SXin Li def test_serialized_test_case_metadata_list(self): 143*9c5db199SXin Li """Test all control file get properly serialized.""" 144*9c5db199SXin Li serialized_list = generate_metadata.serialized_test_case_metadata_list( 145*9c5db199SXin Li [ 146*9c5db199SXin Li generate_metadata.serialized_test_case_metadata( 147*9c5db199SXin Li self.test1), 148*9c5db199SXin Li generate_metadata.serialized_test_case_metadata( 149*9c5db199SXin Li self.test2) 150*9c5db199SXin Li ]) 151*9c5db199SXin Li names = set([item.test_case.name for item in serialized_list.values]) 152*9c5db199SXin Li self.assertEqual(set(['fake_test1', 'fake_test2']), names) 153*9c5db199SXin Li 154*9c5db199SXin Li 155*9c5db199SXin Liif __name__ == '__main__': 156*9c5db199SXin Li if six.PY2: 157*9c5db199SXin Li print('cannot run in py2') 158*9c5db199SXin Li exit(0) 159*9c5db199SXin Li else: 160*9c5db199SXin Li unittest.main() 161