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