#!/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()