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