xref: /aosp_15_r20/external/autotest/utils/generate_metadata_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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