xref: /aosp_15_r20/external/angle/build/fuchsia/test/common_unittests.py (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/env vpython3
2*8975f5c5SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors
3*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker"""File for testing common.py."""
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Workerimport os
8*8975f5c5SAndroid Build Coastguard Workerimport tempfile
9*8975f5c5SAndroid Build Coastguard Workerimport unittest
10*8975f5c5SAndroid Build Coastguard Workerimport unittest.mock as mock
11*8975f5c5SAndroid Build Coastguard Worker
12*8975f5c5SAndroid Build Coastguard Workerfrom types import SimpleNamespace
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Workerimport common
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker
17*8975f5c5SAndroid Build Coastguard Worker# Tests should use their names to explain the meaning of the tests rather than
18*8975f5c5SAndroid Build Coastguard Worker# relying on the extra docstrings.
19*8975f5c5SAndroid Build Coastguard Worker# pylint: disable=missing-function-docstring
20*8975f5c5SAndroid Build Coastguard Worker@unittest.skipIf(os.name == 'nt', 'Fuchsia tests not supported on Windows')
21*8975f5c5SAndroid Build Coastguard Workerclass CommonTest(unittest.TestCase):
22*8975f5c5SAndroid Build Coastguard Worker    """Test common.py methods."""
23*8975f5c5SAndroid Build Coastguard Worker    def test_find_in_dir_returns_file_or_dir_if_searching(self) -> None:
24*8975f5c5SAndroid Build Coastguard Worker        """Test |find_in_dir| returns files if searching for file, or None."""
25*8975f5c5SAndroid Build Coastguard Worker        # Make the directory structure.
26*8975f5c5SAndroid Build Coastguard Worker        with tempfile.TemporaryDirectory() as tmp_dir:
27*8975f5c5SAndroid Build Coastguard Worker            with tempfile.NamedTemporaryFile(dir=tmp_dir) as tmp_file, \
28*8975f5c5SAndroid Build Coastguard Worker                tempfile.TemporaryDirectory(dir=tmp_dir) as inner_tmp_dir:
29*8975f5c5SAndroid Build Coastguard Worker
30*8975f5c5SAndroid Build Coastguard Worker                # Structure is now:
31*8975f5c5SAndroid Build Coastguard Worker                # temp_dir/
32*8975f5c5SAndroid Build Coastguard Worker                # temp_dir/inner_dir1
33*8975f5c5SAndroid Build Coastguard Worker                # temp_dir/tempfile1
34*8975f5c5SAndroid Build Coastguard Worker                # File is not a dir, so returns None.
35*8975f5c5SAndroid Build Coastguard Worker                self.assertIsNone(
36*8975f5c5SAndroid Build Coastguard Worker                    common.find_in_dir(os.path.basename(tmp_file.name),
37*8975f5c5SAndroid Build Coastguard Worker                                       parent_dir=tmp_dir))
38*8975f5c5SAndroid Build Coastguard Worker
39*8975f5c5SAndroid Build Coastguard Worker                # Repeat for directory.
40*8975f5c5SAndroid Build Coastguard Worker                self.assertEqual(
41*8975f5c5SAndroid Build Coastguard Worker                    common.find_in_dir(inner_tmp_dir, parent_dir=tmp_dir),
42*8975f5c5SAndroid Build Coastguard Worker                    inner_tmp_dir)
43*8975f5c5SAndroid Build Coastguard Worker
44*8975f5c5SAndroid Build Coastguard Worker    def test_find_image_in_sdk_searches_images_in_product_bundle(self):
45*8975f5c5SAndroid Build Coastguard Worker        """Test |find_image_in_sdk| searches for 'images' if product-bundle."""
46*8975f5c5SAndroid Build Coastguard Worker        with tempfile.TemporaryDirectory() as tmp_dir:
47*8975f5c5SAndroid Build Coastguard Worker            os.makedirs(os.path.join(tmp_dir, 'sdk'), exist_ok=True)
48*8975f5c5SAndroid Build Coastguard Worker            os.makedirs(os.path.join(tmp_dir, 'images', 'workstation-product',
49*8975f5c5SAndroid Build Coastguard Worker                                     'images'),
50*8975f5c5SAndroid Build Coastguard Worker                        exist_ok=True)
51*8975f5c5SAndroid Build Coastguard Worker            with mock.patch('common.SDK_ROOT', os.path.join(tmp_dir, 'sdk')):
52*8975f5c5SAndroid Build Coastguard Worker                self.assertEqual(
53*8975f5c5SAndroid Build Coastguard Worker                    common.find_image_in_sdk('workstation-product'),
54*8975f5c5SAndroid Build Coastguard Worker                    os.path.join(tmp_dir, 'images', 'workstation-product',
55*8975f5c5SAndroid Build Coastguard Worker                                 'images'))
56*8975f5c5SAndroid Build Coastguard Worker
57*8975f5c5SAndroid Build Coastguard Worker    def test_images_root_should_not_end_with_path_sep(self):
58*8975f5c5SAndroid Build Coastguard Worker        """INTERNAL_IMAGES_ROOT appends -internal at the end of the IMAGES_ROOT,
59*8975f5c5SAndroid Build Coastguard Worker        so the later one should not end with a /, otherwise the folder name will
60*8975f5c5SAndroid Build Coastguard Worker        become 'images/-internal'."""
61*8975f5c5SAndroid Build Coastguard Worker        # Avoid the logic being bypassed.
62*8975f5c5SAndroid Build Coastguard Worker        self.assertIsNone(os.environ.get('FUCHSIA_INTERNAL_IMAGES_ROOT'))
63*8975f5c5SAndroid Build Coastguard Worker        self.assertFalse(common.IMAGES_ROOT.endswith(os.path.sep))
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker    @mock.patch('common.run_ffx_command')
66*8975f5c5SAndroid Build Coastguard Worker    def test_get_system_info_parse_version_and_product(self, ffx_mock):
67*8975f5c5SAndroid Build Coastguard Worker        ffx_mock.return_value = SimpleNamespace(
68*8975f5c5SAndroid Build Coastguard Worker            returncode=0, stdout='{"build": {"version": "v", "product": "p"}}')
69*8975f5c5SAndroid Build Coastguard Worker        self.assertEqual(common.get_system_info(), ('p', 'v'))
70*8975f5c5SAndroid Build Coastguard Worker
71*8975f5c5SAndroid Build Coastguard Worker    @mock.patch('common.run_ffx_command')
72*8975f5c5SAndroid Build Coastguard Worker    def test_get_system_info_parse_version_only(self, ffx_mock):
73*8975f5c5SAndroid Build Coastguard Worker        ffx_mock.return_value = SimpleNamespace(
74*8975f5c5SAndroid Build Coastguard Worker            returncode=0, stdout='{"build": {"version": "v"}}')
75*8975f5c5SAndroid Build Coastguard Worker        self.assertEqual(common.get_system_info(), ('', 'v'))
76*8975f5c5SAndroid Build Coastguard Worker
77*8975f5c5SAndroid Build Coastguard Worker    @mock.patch('common.run_ffx_command')
78*8975f5c5SAndroid Build Coastguard Worker    def test_get_system_info_ffx_error(self, ffx_mock):
79*8975f5c5SAndroid Build Coastguard Worker        ffx_mock.return_value = SimpleNamespace(returncode=100,
80*8975f5c5SAndroid Build Coastguard Worker                                                stdout='{"build": {}}')
81*8975f5c5SAndroid Build Coastguard Worker        self.assertEqual(common.get_system_info(), ('', ''))
82*8975f5c5SAndroid Build Coastguard Worker
83*8975f5c5SAndroid Build Coastguard Worker    @mock.patch('common.run_ffx_command')
84*8975f5c5SAndroid Build Coastguard Worker    def test_get_system_info_never_returns_none(self, ffx_mock):
85*8975f5c5SAndroid Build Coastguard Worker        ffx_mock.return_value = SimpleNamespace(returncode=0,
86*8975f5c5SAndroid Build Coastguard Worker                                                stdout='{"build": {}}')
87*8975f5c5SAndroid Build Coastguard Worker        self.assertEqual(common.get_system_info(), ('', ''))
88*8975f5c5SAndroid Build Coastguard Worker
89*8975f5c5SAndroid Build Coastguard Worker    @mock.patch('common.run_ffx_command')
90*8975f5c5SAndroid Build Coastguard Worker    def test_get_system_info_ignore_no_build(self, ffx_mock):
91*8975f5c5SAndroid Build Coastguard Worker        ffx_mock.return_value = SimpleNamespace(
92*8975f5c5SAndroid Build Coastguard Worker            returncode=0, stdout='{"thisisnotbuild": {}}')
93*8975f5c5SAndroid Build Coastguard Worker        self.assertEqual(common.get_system_info(), ('', ''))
94*8975f5c5SAndroid Build Coastguard Worker
95*8975f5c5SAndroid Build Coastguard Worker    @mock.patch('common.run_ffx_command')
96*8975f5c5SAndroid Build Coastguard Worker    def test_get_system_info_ignore_bad_build_type(self, ffx_mock):
97*8975f5c5SAndroid Build Coastguard Worker        ffx_mock.return_value = SimpleNamespace(returncode=0,
98*8975f5c5SAndroid Build Coastguard Worker                                                stdout='{"build": []}')
99*8975f5c5SAndroid Build Coastguard Worker        self.assertEqual(common.get_system_info(), ('', ''))
100*8975f5c5SAndroid Build Coastguard Worker
101*8975f5c5SAndroid Build Coastguard Worker    @mock.patch('common.run_ffx_command')
102*8975f5c5SAndroid Build Coastguard Worker    def test_get_system_info_ignore_bad_build_type2(self, ffx_mock):
103*8975f5c5SAndroid Build Coastguard Worker        ffx_mock.return_value = SimpleNamespace(returncode=0,
104*8975f5c5SAndroid Build Coastguard Worker                                                stdout='{"build": "hello"}')
105*8975f5c5SAndroid Build Coastguard Worker        self.assertEqual(common.get_system_info(), ('', ''))
106*8975f5c5SAndroid Build Coastguard Worker
107*8975f5c5SAndroid Build Coastguard Worker    @mock.patch('common.run_ffx_command')
108*8975f5c5SAndroid Build Coastguard Worker    def test_get_system_info_not_a_json(self, ffx_mock):
109*8975f5c5SAndroid Build Coastguard Worker        ffx_mock.return_value = SimpleNamespace(returncode=0, stdout='hello')
110*8975f5c5SAndroid Build Coastguard Worker        self.assertEqual(common.get_system_info(), ('', ''))
111*8975f5c5SAndroid Build Coastguard Worker
112*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__':
113*8975f5c5SAndroid Build Coastguard Worker    unittest.main()
114