| #!/usr/bin/env vpython3 |
| # Copyright 2023 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """File for testing common.py.""" |
| |
| import os |
| import tempfile |
| import unittest |
| import unittest.mock as mock |
| |
| from types import SimpleNamespace |
| |
| import common |
| |
| |
| # Tests should use their names to explain the meaning of the tests rather than |
| # relying on the extra docstrings. |
| # pylint: disable=missing-function-docstring |
| @unittest.skipIf(os.name == 'nt', 'Fuchsia tests not supported on Windows') |
| class CommonTest(unittest.TestCase): |
| """Test common.py methods.""" |
| def test_find_in_dir_returns_file_or_dir_if_searching(self) -> None: |
| """Test |find_in_dir| returns files if searching for file, or None.""" |
| # Make the directory structure. |
| with tempfile.TemporaryDirectory() as tmp_dir: |
| with tempfile.NamedTemporaryFile(dir=tmp_dir) as tmp_file, \ |
| tempfile.TemporaryDirectory(dir=tmp_dir) as inner_tmp_dir: |
| |
| # Structure is now: |
| # temp_dir/ |
| # temp_dir/inner_dir1 |
| # temp_dir/tempfile1 |
| # File is not a dir, so returns None. |
| self.assertIsNone( |
| common.find_in_dir(os.path.basename(tmp_file.name), |
| parent_dir=tmp_dir)) |
| |
| # Repeat for directory. |
| self.assertEqual( |
| common.find_in_dir(inner_tmp_dir, parent_dir=tmp_dir), |
| inner_tmp_dir) |
| |
| def test_find_image_in_sdk_searches_images_in_product_bundle(self): |
| """Test |find_image_in_sdk| searches for 'images' if product-bundle.""" |
| with tempfile.TemporaryDirectory() as tmp_dir: |
| os.makedirs(os.path.join(tmp_dir, 'sdk'), exist_ok=True) |
| os.makedirs(os.path.join(tmp_dir, 'images', 'workstation-product', |
| 'images'), |
| exist_ok=True) |
| with mock.patch('common.SDK_ROOT', os.path.join(tmp_dir, 'sdk')): |
| self.assertEqual( |
| common.find_image_in_sdk('workstation-product'), |
| os.path.join(tmp_dir, 'images', 'workstation-product', |
| 'images')) |
| |
| def test_images_root_should_not_end_with_path_sep(self): |
| """INTERNAL_IMAGES_ROOT appends -internal at the end of the IMAGES_ROOT, |
| so the later one should not end with a /, otherwise the folder name will |
| become 'images/-internal'.""" |
| # Avoid the logic being bypassed. |
| self.assertIsNone(os.environ.get('FUCHSIA_INTERNAL_IMAGES_ROOT')) |
| self.assertFalse(common.IMAGES_ROOT.endswith(os.path.sep)) |
| |
| @mock.patch('common.run_ffx_command') |
| def test_get_system_info_parse_version_and_product(self, ffx_mock): |
| ffx_mock.return_value = SimpleNamespace( |
| returncode=0, stdout='{"build": {"version": "v", "product": "p"}}') |
| self.assertEqual(common.get_system_info(), ('p', 'v')) |
| |
| @mock.patch('common.run_ffx_command') |
| def test_get_system_info_parse_version_only(self, ffx_mock): |
| ffx_mock.return_value = SimpleNamespace( |
| returncode=0, stdout='{"build": {"version": "v"}}') |
| self.assertEqual(common.get_system_info(), ('', 'v')) |
| |
| @mock.patch('common.run_ffx_command') |
| def test_get_system_info_ffx_error(self, ffx_mock): |
| ffx_mock.return_value = SimpleNamespace(returncode=100, |
| stdout='{"build": {}}') |
| self.assertEqual(common.get_system_info(), ('', '')) |
| |
| @mock.patch('common.run_ffx_command') |
| def test_get_system_info_never_returns_none(self, ffx_mock): |
| ffx_mock.return_value = SimpleNamespace(returncode=0, |
| stdout='{"build": {}}') |
| self.assertEqual(common.get_system_info(), ('', '')) |
| |
| @mock.patch('common.run_ffx_command') |
| def test_get_system_info_ignore_no_build(self, ffx_mock): |
| ffx_mock.return_value = SimpleNamespace( |
| returncode=0, stdout='{"thisisnotbuild": {}}') |
| self.assertEqual(common.get_system_info(), ('', '')) |
| |
| @mock.patch('common.run_ffx_command') |
| def test_get_system_info_ignore_bad_build_type(self, ffx_mock): |
| ffx_mock.return_value = SimpleNamespace(returncode=0, |
| stdout='{"build": []}') |
| self.assertEqual(common.get_system_info(), ('', '')) |
| |
| @mock.patch('common.run_ffx_command') |
| def test_get_system_info_ignore_bad_build_type2(self, ffx_mock): |
| ffx_mock.return_value = SimpleNamespace(returncode=0, |
| stdout='{"build": "hello"}') |
| self.assertEqual(common.get_system_info(), ('', '')) |
| |
| @mock.patch('common.run_ffx_command') |
| def test_get_system_info_not_a_json(self, ffx_mock): |
| ffx_mock.return_value = SimpleNamespace(returncode=0, stdout='hello') |
| self.assertEqual(common.get_system_info(), ('', '')) |
| |
| if __name__ == '__main__': |
| unittest.main() |