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