| #!/usr/bin/env fuchsia-vendored-python |
| # Copyright 2023 The Fuchsia Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Tests for Readme and ReadmesDB.""" |
| |
| |
| import dataclasses |
| from pathlib import Path |
| from typing import Dict, List |
| from file_access import FileAccess |
| from gn_label import GnLabel |
| from readme_fuchsia import Readme, ReadmesDB |
| import unittest |
| |
| |
| class ReadmeTest(unittest.TestCase): |
| def setUp(self) -> None: |
| return super().setUp() |
| |
| def test_readme_from_text(self): |
| readme = Readme.from_text( |
| readme_label=GnLabel.from_str("//some/path/README.fuchsia"), |
| applicable_target=GnLabel.from_str("//some/other/path:to_target"), |
| file_text=""" |
| X: 123 |
| Y: abc |
| Name: Some Name |
| License File: license1 |
| License File: child/license2 |
| License File: ../sibling/license3 |
| |
| Some text |
| """, |
| ) |
| |
| self.assertEqual(readme.package_name, "Some Name") |
| self.assertEqual( |
| readme.license_files, |
| ( |
| GnLabel.from_str("//some/other/path/license1"), |
| GnLabel.from_str("//some/other/path/child/license2"), |
| GnLabel.from_str("//some/other/sibling/license3"), |
| ), |
| ) |
| |
| def test_readme_from_text_missing_fields(self): |
| readme = Readme.from_text( |
| readme_label=GnLabel.from_str("//some/path/README.fuchsia"), |
| applicable_target=GnLabel.from_str("//some/other/path:to_target"), |
| file_text=""" |
| X: 123 |
| Y: abc |
| |
| Some text |
| """, |
| ) |
| |
| self.assertIsNone(readme.package_name) |
| self.assertEqual(readme.license_files, tuple()) |
| |
| |
| @dataclasses.dataclass |
| class MockFileAccess(FileAccess): |
| readme_content_by_path: Dict[str, str] = None |
| |
| def read_text(self, label: GnLabel) -> str: |
| return self.readme_content_by_path[label.path_str] |
| |
| def file_exists(self, label: GnLabel) -> bool: |
| return label.path_str in self.readme_content_by_path |
| |
| |
| class ReadmesDBTest(unittest.TestCase): |
| db: ReadmesDB |
| mock_content_by_path: Dict[Path, str] |
| |
| def setUp(self) -> None: |
| self.mock_content_by_path = {} |
| |
| file_access = MockFileAccess( |
| fuchsia_source_path_str=None, |
| readme_content_by_path=self.mock_content_by_path, |
| ) |
| self.db = ReadmesDB(file_access=file_access) |
| |
| return super().setUp() |
| |
| def _mock_readme_files(self, file_paths: List[str]): |
| for path in file_paths: |
| self.mock_content_by_path[path] = "Name: Foo" |
| |
| def _assert_found_readme(self, for_label: str, expected_readme_path: str): |
| readme = self.db.find_readme_for_label(GnLabel.from_str(for_label)) |
| self.assertIsNotNone(readme) |
| self.assertEqual(readme.readme_label.path_str, expected_readme_path) |
| |
| def _assert_readme_not_found(self, for_label: str): |
| readme = self.db.find_readme_for_label(GnLabel.from_str(for_label)) |
| self.assertIsNone(readme) |
| |
| def test_find_readme_in_same_folder(self): |
| self._mock_readme_files(["foo/README.fuchsia"]) |
| self._assert_found_readme("//foo", "foo/README.fuchsia") |
| self._assert_found_readme("//foo:foo", "foo/README.fuchsia") |
| self._assert_found_readme("//foo:bar", "foo/README.fuchsia") |
| |
| def test_find_readme_for_sub_folder(self): |
| self._mock_readme_files(["foo/README.fuchsia"]) |
| self._assert_found_readme("//foo/bar", "foo/README.fuchsia") |
| self._assert_found_readme("//foo/bar/baz", "foo/README.fuchsia") |
| |
| def test_barrier_folders(self): |
| self._mock_readme_files(["foo/README.fuchsia"]) |
| |
| self._assert_found_readme("//foo", "foo/README.fuchsia") |
| |
| self._assert_readme_not_found("//foo/third_party:bar") |
| self._assert_readme_not_found("//foo/third_party/bar") |
| self._assert_readme_not_found("//foo/third_party/bar:baz") |
| self._assert_readme_not_found("//foo/third_party/bar/baz") |
| self._assert_readme_not_found("//foo/thirdparty/bar") |
| self._assert_readme_not_found("//foo/prebuilt/bar") |
| self._assert_readme_not_found("//foo/prebuilts/bar") |
| |
| def test_find_closest_readme(self): |
| self._mock_readme_files( |
| [ |
| "foo/README.fuchsia", |
| "foo/bar/README.fuchsia", |
| "foo/bar/baz/README.fuchsia", |
| ] |
| ) |
| self._assert_found_readme("//foo", "foo/README.fuchsia") |
| self._assert_found_readme("//foo/qaz", "foo/README.fuchsia") |
| self._assert_found_readme("//foo/bar", "foo/bar/README.fuchsia") |
| self._assert_found_readme("//foo/bar/qaz", "foo/bar/README.fuchsia") |
| self._assert_found_readme("//foo/bar/baz", "foo/bar/baz/README.fuchsia") |
| self._assert_found_readme( |
| "//foo/bar/baz/qaz", "foo/bar/baz/README.fuchsia" |
| ) |
| |
| def test_find_in_assets_folders(self): |
| self._mock_readme_files( |
| [ |
| "foo/README.fuchsia", |
| "tools/check-licenses/assets/readmes/foo/README.fuchsia", |
| "vendor/google/tools/check-licenses/assets/readmes/foo/README.fuchsia", |
| "bar/README.fuchsia", |
| "tools/check-licenses/assets/readmes/bar/README.fuchsia", |
| ] |
| ) |
| |
| # vendor/google/tools/check-licenses/assets takes precedence |
| self._assert_found_readme( |
| "//foo", |
| "vendor/google/tools/check-licenses/assets/readmes/foo/README.fuchsia", |
| ) |
| |
| # otherwise tools/check-licenses/assets takes precedence |
| self._assert_found_readme( |
| "//bar", "tools/check-licenses/assets/readmes/bar/README.fuchsia" |
| ) |
| |
| |
| if __name__ == "__main__": |
| unittest.main() |