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