| # 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. |
| |
| import os |
| import unittest |
| from unittest import mock |
| |
| import args |
| import environment |
| import selection |
| import selection_types |
| import test_list_file |
| import tests_json_file |
| |
| |
| class MatchGroupTest(unittest.TestCase): |
| """Test creating and printing MatchGroups.""" |
| |
| def test_parse_empty(self) -> None: |
| """Ensure that an empty selection produces no groups.""" |
| groups = selection._parse_selection_command_line([]) |
| self.assertEqual(len(groups), 0) |
| |
| def assertMatchContents( |
| self, |
| group: selection_types.MatchGroup, |
| names: set[str], |
| packages: set[str], |
| components: set[str], |
| ) -> None: |
| """Helper to assert string sets against MatchGroup fields. |
| |
| Args: |
| group (MatchGroup): Group to check. |
| names (set[str]): Expected names. |
| packages (set[str]): Expected packages. |
| components (set[str]): Expected components. |
| """ |
| self.assertSetEqual(group.names, names) |
| self.assertSetEqual(group.packages, packages) |
| self.assertSetEqual(group.components, components) |
| |
| def test_parse_single(self) -> None: |
| """Test parsing and formatting single arguments.""" |
| name_group = selection._parse_selection_command_line(["name"]) |
| package_group = selection._parse_selection_command_line( |
| ["--package", "name"] |
| ) |
| component_group = selection._parse_selection_command_line( |
| ["--component", "name"] |
| ) |
| |
| self.assertMatchContents(name_group[0], {"name"}, set(), set()) |
| self.assertMatchContents(package_group[0], set(), {"name"}, set()) |
| self.assertMatchContents(component_group[0], set(), set(), {"name"}) |
| |
| self.assertEqual(str(name_group[0]), "name") |
| self.assertEqual(str(package_group[0]), "--package name") |
| self.assertEqual(str(component_group[0]), "--component name") |
| |
| def test_parse_and(self) -> None: |
| """Test logical AND parsing and formatting.""" |
| groups = selection._parse_selection_command_line( |
| [ |
| "name", |
| "--and", |
| "--component", |
| "component", |
| "--and", |
| "--package", |
| "package", |
| ] |
| ) |
| self.assertEqual(len(groups), 1) |
| |
| self.assertMatchContents( |
| groups[0], {"name"}, {"package"}, {"component"} |
| ) |
| self.assertEqual( |
| str(groups[0]), |
| "name --and --package package --and --component component", |
| ) |
| |
| def test_parse_or(self) -> None: |
| """Test spreading arguments across multiple MatchGroups.""" |
| groups = selection._parse_selection_command_line( |
| ["name", "--component", "component", "--package", "package"] |
| ) |
| self.assertEqual(len(groups), 3) |
| |
| self.assertMatchContents(groups[0], {"name"}, set(), set()) |
| self.assertMatchContents(groups[1], set(), set(), {"component"}) |
| self.assertMatchContents(groups[2], set(), {"package"}, set()) |
| |
| def test_all_together(self) -> None: |
| """Test combination of values, ANDs, and ORs.""" |
| groups = selection._parse_selection_command_line( |
| [ |
| "name", |
| "--and", |
| "name2", |
| "--component", |
| "component", |
| "--and", |
| "name3", |
| "--package", |
| "package", |
| "--and", |
| "name4", |
| ] |
| ) |
| self.assertEqual(len(groups), 3) |
| |
| self.assertMatchContents(groups[0], {"name", "name2"}, set(), set()) |
| self.assertMatchContents(groups[1], {"name3"}, set(), {"component"}) |
| self.assertMatchContents(groups[2], {"name4"}, {"package"}, set()) |
| |
| def test_parse_errors(self) -> None: |
| """Test various invalid scenarios.""" |
| |
| # Invalid to start an expression with AND |
| self.assertRaises( |
| selection.SelectionError, |
| lambda: selection._parse_selection_command_line(["--and", "value"]), |
| ) |
| |
| # Invalid to use --and after --and |
| self.assertRaises( |
| selection.SelectionError, |
| lambda: selection._parse_selection_command_line( |
| ["value", "--and", "--and"] |
| ), |
| ) |
| |
| # Invalid to use --and at the end of a selection |
| self.assertRaises( |
| selection.SelectionError, |
| lambda: selection._parse_selection_command_line(["value", "--and"]), |
| ) |
| |
| # --package and --component require an argument |
| self.assertRaises( |
| selection.SelectionError, |
| lambda: selection._parse_selection_command_line( |
| ["value", "--component"] |
| ), |
| ) |
| self.assertRaises( |
| selection.SelectionError, |
| lambda: selection._parse_selection_command_line( |
| ["value", "--package"] |
| ), |
| ) |
| |
| |
| class SelectTestsTest(unittest.IsolatedAsyncioTestCase): |
| """Tests related to the selection of test entries to execute.""" |
| |
| @staticmethod |
| def _make_package_test( |
| prefix: str, package: str, component: str |
| ) -> test_list_file.Test: |
| """Utility method to simulate a device Test |
| |
| Args: |
| prefix (str): Prefix path for the label. |
| package (str): Package name. |
| component (str): Component name (without .cm) |
| |
| Returns: |
| Test: Fake Test entry. |
| """ |
| return test_list_file.Test( |
| build=tests_json_file.TestEntry( |
| test=tests_json_file.TestSection( |
| name=f"fuchsia-pkg://fuchsia.com/{package}#meta/{component}.cm", |
| label=f"//{prefix}:{package}($toolchain)", |
| os="fuchsia", |
| package_url=f"fuchsia-pkg://fuchsia.com/{package}#meta/{component}.cm", |
| ) |
| ), |
| ) |
| |
| @staticmethod |
| def _make_host_test(prefix: str, name: str) -> test_list_file.Test: |
| """Utility method to simulate a host Test |
| |
| Args: |
| prefix (str): Prefix path for the label. |
| name (str): Binary name, without host_x64. |
| |
| Returns: |
| Test: Fake Test entry. |
| """ |
| return test_list_file.Test( |
| build=tests_json_file.TestEntry( |
| test=tests_json_file.TestSection( |
| name=f"host_x64/{name}", |
| label=f"//{prefix}:{name}($toolchain)", |
| os="linux", |
| path=f"host_x64/{name}", |
| ) |
| ), |
| ) |
| |
| def _make_exec_env(self) -> environment.ExecutionEnvironment: |
| """Create an execution environment for test.""" |
| |
| exec_env = environment.ExecutionEnvironment( |
| fuchsia_dir="", |
| out_dir="", |
| test_json_file="", |
| disabled_ctf_tests_file="", |
| log_file=None, |
| test_list_file="", |
| ) |
| |
| # Override the return value when retrieving the command line |
| # for the matching script. This will be relative to the test |
| # directory which includes dldist as test data under "bin". |
| # |
| # Note we need to go up two levels because the parent of __file__ |
| # is the .pyz file path itself. |
| |
| cur_path = os.path.dirname(os.path.dirname(__file__)) |
| dldist_path = os.path.join(cur_path, "bin", "dldist") |
| |
| env_patch = mock.patch.object( |
| exec_env, |
| "fx_cmd_line", |
| mock.Mock(return_value=[dldist_path]), |
| ) |
| |
| env_patch.start() |
| self.addCleanup(env_patch.stop) |
| |
| return exec_env |
| |
| async def test_select_all(self) -> None: |
| """Test that empty selection selects all mode-matching tests with perfect scores""" |
| tests = [ |
| self._make_package_test("src/tests", "foo", "bar"), |
| self._make_host_test("src/tests2", "baz"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| selected = await selection.select_tests(tests, [], exec_env) |
| |
| self.assertEqual(len(selected.selected), 2) |
| for score in selected.best_score.values(): |
| self.assertEqual(score, selection.PERFECT_MATCH_DISTANCE) |
| self.assertTrue(selected.has_device_test()) |
| |
| host_selected = await selection.select_tests( |
| tests, [], exec_env, selection.SelectionMode.HOST |
| ) |
| self.assertEqual(len(host_selected.selected), 1) |
| self.assertEqual( |
| host_selected.best_score["host_x64/baz"], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| self.assertEqual( |
| host_selected.best_score[ |
| "fuchsia-pkg://fuchsia.com/foo#meta/bar.cm" |
| ], |
| selection.NO_MATCH_DISTANCE, |
| ) |
| self.assertFalse(host_selected.has_device_test()) |
| |
| device_selected = await selection.select_tests( |
| tests, [], exec_env, selection.SelectionMode.DEVICE |
| ) |
| self.assertEqual(len(device_selected.selected), 1) |
| self.assertEqual( |
| device_selected.best_score[ |
| "fuchsia-pkg://fuchsia.com/foo#meta/bar.cm" |
| ], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| self.assertAlmostEqual( |
| device_selected.best_score["host_x64/baz"], |
| selection.NO_MATCH_DISTANCE, |
| ) |
| self.assertTrue(device_selected.has_device_test()) |
| |
| async def test_select_all_fails_on_exact(self) -> None: |
| """Test that empty selection fails if exact_match is used""" |
| tests = [ |
| self._make_package_test("src/tests", "foo", "bar"), |
| self._make_host_test("src/tests2", "baz"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| try: |
| selections = await selection.select_tests( |
| tests, |
| [], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertTrue(False, f"Expected a SelectionError: {selections}") |
| except selection.SelectionError: |
| pass |
| |
| async def test_prefix_matches(self) -> None: |
| """Test that selecting prefixes of tests results in a perfect match.""" |
| |
| tests = [ |
| self._make_package_test("src/tests", "foo-pkg", "bar-test"), |
| self._make_host_test("src/other-tests", "binary_test"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| select_path = await selection.select_tests( |
| tests, ["//src/tests"], exec_env |
| ) |
| select_name1 = await selection.select_tests( |
| tests, ["foo-pkg"], exec_env |
| ) |
| select_name2 = await selection.select_tests( |
| tests, ["bar-test"], exec_env |
| ) |
| select_pkg = await selection.select_tests( |
| tests, ["--package", "foo-pkg"], exec_env |
| ) |
| select_cm = await selection.select_tests( |
| tests, ["--component", "bar-test"], exec_env |
| ) |
| url_prefix = await selection.select_tests( |
| tests, ["fuchsia-pkg://fuchsia.com/foo-pkg"], exec_env |
| ) |
| |
| self.assertEqual(select_path.selected, select_name1.selected) |
| self.assertEqual(select_path.selected, select_name2.selected) |
| self.assertEqual(select_path.selected, select_pkg.selected) |
| self.assertEqual(select_path.selected, select_cm.selected) |
| self.assertEqual(select_path.selected, url_prefix.selected) |
| |
| for g, matches in select_path.group_matches: |
| self.assertEqual(len(matches), 1, f"Failed in {g}") |
| |
| host_path = await selection.select_tests( |
| tests, ["binary_test"], exec_env |
| ) |
| self.assertEqual( |
| [s.name() for s in host_path.selected], ["host_x64/binary_test"] |
| ) |
| |
| full_path = await selection.select_tests(tests, ["//src"], exec_env) |
| self.assertEqual( |
| [s.name() for s in full_path.selected], [t.name() for t in tests] |
| ) |
| |
| async def test_contains_matches(self) -> None: |
| """Test that selecting substrings of tests results in a perfect match.""" |
| |
| tests = [ |
| self._make_package_test("src/tests", "foo-pkg", "bar-test"), |
| self._make_host_test("src/other-tests", "binary_test"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| select_path = await selection.select_tests(tests, ["rc/te"], exec_env) |
| select_name1 = await selection.select_tests(tests, ["o-pk"], exec_env) |
| select_name2 = await selection.select_tests( |
| tests, ["ar-test"], exec_env |
| ) |
| select_pkg = await selection.select_tests( |
| tests, ["--package", "o-pk"], exec_env |
| ) |
| select_cm = await selection.select_tests( |
| tests, ["--component", "ar-test"], exec_env |
| ) |
| url_contains = await selection.select_tests( |
| tests, ["fuchsia.com/foo"], exec_env |
| ) |
| |
| self.assertEqual(select_path.selected, select_name1.selected) |
| self.assertEqual(select_path.selected, select_name2.selected) |
| self.assertEqual(select_path.selected, select_pkg.selected) |
| self.assertEqual(select_path.selected, select_cm.selected) |
| self.assertEqual(select_path.selected, url_contains.selected) |
| |
| for _, matches in select_path.group_matches: |
| self.assertEqual(len(matches), 1) |
| |
| host_path = await selection.select_tests(tests, ["ary_test"], exec_env) |
| self.assertEqual( |
| [s.name() for s in host_path.selected], ["host_x64/binary_test"] |
| ) |
| |
| full_path = await selection.select_tests(tests, ["src"], exec_env) |
| self.assertEqual( |
| [s.name() for s in full_path.selected], [t.name() for t in tests] |
| ) |
| |
| async def test_approximate_matches(self) -> None: |
| """Test that fuzzy matching catches common issues.""" |
| |
| tests = [ |
| self._make_package_test("src/tests", "foo-pkg", "bar-test"), |
| self._make_host_test("src/other-tests", "binary_test"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| host_fuzzy = await selection.select_tests( |
| tests, ["binaryytest"], exec_env |
| ) |
| self.assertEqual( |
| [s.name() for s in host_fuzzy.selected], ["host_x64/binary_test"] |
| ) |
| self.assertEqual(host_fuzzy.best_score["host_x64/binary_test"], 1) |
| self.assertEqual(host_fuzzy.fuzzy_distance_threshold, 3) |
| |
| async def test_exact_does_not_match(self) -> None: |
| """Test that fuzzy matching catches common issues.""" |
| |
| tests = [ |
| self._make_package_test("src/tests", "foo-pkg", "bar-test"), |
| self._make_host_test("src/other-tests", "binary_test"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| host_exact = await selection.select_tests( |
| tests, |
| ["binaryytest"], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertEqual(0, len(host_exact.selected)) |
| self.assertEqual( |
| host_exact.best_score["host_x64/binary_test"], |
| selection.NO_MATCH_DISTANCE, |
| ) |
| |
| async def test_package_and_component(self) -> None: |
| """Test that --package and/or --component works""" |
| tests = [ |
| self._make_package_test("src/tests", "foo-pkg", "bar-test"), |
| self._make_package_test("src/tests", "foo-pkg", "other-baz-test"), |
| self._make_package_test( |
| "src/tests", "other-bar-pkg", "other-baz-test" |
| ), |
| self._make_host_test("src/other-tests", "binary_test"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| package_selection = await selection.select_tests( |
| tests, |
| ["--package", "foo-pkg"], |
| exec_env, |
| ) |
| self.assertEqual( |
| list(map(lambda x: x.name(), package_selection.selected)), |
| [ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm", |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/other-baz-test.cm", |
| ], |
| ) |
| |
| component_selection = await selection.select_tests( |
| tests, |
| ["--component", "other-baz-test"], |
| exec_env, |
| ) |
| self.assertEqual( |
| list(map(lambda x: x.name(), component_selection.selected)), |
| [ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/other-baz-test.cm", |
| "fuchsia-pkg://fuchsia.com/other-bar-pkg#meta/other-baz-test.cm", |
| ], |
| ) |
| |
| # Try prefix of package name. |
| both_selection = await selection.select_tests( |
| tests, |
| ["--package", "foo", "--and", "--component", "other-baz-test"], |
| exec_env, |
| ) |
| self.assertEqual( |
| list(map(lambda x: x.name(), both_selection.selected)), |
| [ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/other-baz-test.cm", |
| ], |
| ) |
| |
| # Prefix should not match in exact mode |
| exact_selection = await selection.select_tests( |
| tests, |
| [ |
| "--package", |
| "foo", |
| "--and", |
| "--component", |
| "other-baz-test", |
| ], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertEqual( |
| list(map(lambda x: x.name(), exact_selection.selected)), |
| [], |
| ) |
| |
| async def test_exact_matches(self) -> None: |
| """Test that exact_mode matching mode works correctly""" |
| |
| tests = [ |
| self._make_package_test("src/tests", "foo-pkg", "bar-test"), |
| self._make_host_test("src/other-tests", "binary_test"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| # Don't match package or component in exact mode |
| device_exact = await selection.select_tests( |
| tests, |
| ["foo-pkg"], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertEqual(0, len(device_exact.selected)) |
| self.assertEqual( |
| device_exact.best_score[ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm" |
| ], |
| selection.NO_MATCH_DISTANCE, |
| ) |
| device_exact = await selection.select_tests( |
| tests, |
| ["bar-test"], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertEqual(0, len(device_exact.selected)) |
| self.assertEqual( |
| device_exact.best_score[ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm" |
| ], |
| selection.NO_MATCH_DISTANCE, |
| ) |
| |
| # Package matches in fuzzy mode |
| device_fuzzy = await selection.select_tests( |
| tests, ["foo-pkg"], exec_env, mode=selection.SelectionMode.ANY |
| ) |
| self.assertEqual(1, len(device_fuzzy.selected)) |
| self.assertEqual( |
| device_fuzzy.best_score[ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm" |
| ], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| device_fuzzy = await selection.select_tests( |
| tests, ["bar-test"], exec_env, mode=selection.SelectionMode.ANY |
| ) |
| self.assertEqual(1, len(device_fuzzy.selected)) |
| self.assertEqual( |
| device_fuzzy.best_score[ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm" |
| ], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| |
| # Only match full name in exact mode |
| device_exact = await selection.select_tests( |
| tests, |
| ["fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm"], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertEqual(1, len(device_exact.selected)) |
| self.assertEqual( |
| device_exact.best_score[ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm" |
| ], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| |
| # Support exact package and component matching |
| package_exact = await selection.select_tests( |
| tests, |
| ["--package", "foo-pkg"], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertEqual(1, len(package_exact.selected)) |
| self.assertEqual( |
| package_exact.best_score[ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm" |
| ], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| |
| component_exact = await selection.select_tests( |
| tests, ["--component", "bar-test"], exec_env, exact_match=True |
| ) |
| self.assertEqual(1, len(component_exact.selected)) |
| self.assertEqual( |
| component_exact.best_score[ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm" |
| ], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| |
| # Test that selecting for the full path of a host test matches exactly. |
| host_exact = await selection.select_tests( |
| tests, |
| ["host_x64/binary_test"], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertEqual(1, len(host_exact.selected)) |
| self.assertEqual( |
| host_exact.best_score["host_x64/binary_test"], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| |
| # Test that selecting for the final path segment of a host |
| # test matches exactly. |
| host_exact = await selection.select_tests( |
| tests, |
| ["binary_test"], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertEqual(1, len(host_exact.selected)) |
| self.assertEqual( |
| host_exact.best_score["host_x64/binary_test"], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| |
| # Test that selecting by label works in exact mode. |
| label_exact = await selection.select_tests( |
| tests, |
| ["//src/other-tests:binary_test"], |
| exec_env, |
| exact_match=True, |
| ) |
| self.assertEqual(1, len(label_exact.selected)) |
| self.assertEqual( |
| label_exact.best_score["host_x64/binary_test"], |
| selection.PERFECT_MATCH_DISTANCE, |
| ) |
| |
| async def test_perfect_match_omits_approximate_match(self) -> None: |
| """Test that fuzzy matching is not used if there is a perfect match.""" |
| |
| tests = [ |
| self._make_host_test("src/other-tests", "binary_test"), |
| self._make_host_test("src/more-tests", "binaryytest"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| host_fuzzy = await selection.select_tests( |
| tests, ["binaryytest"], exec_env |
| ) |
| self.assertEqual( |
| [s.name() for s in host_fuzzy.selected], ["host_x64/binaryytest"] |
| ) |
| self.assertEqual(host_fuzzy.best_score["host_x64/binaryytest"], 0) |
| self.assertEqual(host_fuzzy.best_score["host_x64/binary_test"], 1) |
| self.assertEqual( |
| [s.name() for s in host_fuzzy.selected_but_not_run], |
| ["host_x64/binary_test"], |
| ) |
| self.assertEqual(host_fuzzy.fuzzy_distance_threshold, 3) |
| |
| async def test_approximate_match_multiple(self) -> None: |
| """Test that fuzzy matching matches multiple imperfect |
| matches if there is no perfect match.""" |
| |
| tests = [ |
| self._make_host_test("src/other-tests", "binary_test"), |
| self._make_host_test("src/more-tests", "binaryytest"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| host_fuzzy = await selection.select_tests( |
| tests, ["binary0test"], exec_env |
| ) |
| self.assertEqual( |
| {s.name() for s in host_fuzzy.selected}, |
| {"host_x64/binary_test", "host_x64/binaryytest"}, |
| ) |
| self.assertEqual(host_fuzzy.best_score["host_x64/binaryytest"], 1) |
| self.assertEqual(host_fuzzy.best_score["host_x64/binary_test"], 1) |
| |
| async def test_flag_mutation(self) -> None: |
| """Test that we can apply command line flag behavior to selections""" |
| |
| tests = [ |
| self._make_package_test("src/tests", "foo-pkg", "bar-test"), |
| self._make_package_test("src/tests", "bar-pkg", "baz-test"), |
| self._make_host_test("src/other-tests", "binary_test"), |
| self._make_host_test("src/other-tests", "script_test"), |
| ] |
| |
| exec_env = self._make_exec_env() |
| |
| # Limit only |
| select_all = await selection.select_tests(tests, [], exec_env) |
| select_all.apply_flags(args.parse_args(["--limit=3"])) |
| self.assertEqual(len(select_all.selected), 3) |
| self.assertEqual(len(select_all.selected_but_not_run), 1) |
| self.assertEqual( |
| [x.name() for x in select_all.selected], |
| [ |
| "fuchsia-pkg://fuchsia.com/foo-pkg#meta/bar-test.cm", |
| "fuchsia-pkg://fuchsia.com/bar-pkg#meta/baz-test.cm", |
| "host_x64/binary_test", |
| ], |
| ) |
| |
| # Offset only |
| select_all = await selection.select_tests(tests, [], exec_env) |
| select_all.apply_flags(args.parse_args(["--offset=3"])) |
| self.assertEqual(len(select_all.selected), 1) |
| self.assertEqual(len(select_all.selected_but_not_run), 3) |
| self.assertEqual( |
| [x.name() for x in select_all.selected], |
| [ |
| "host_x64/script_test", |
| ], |
| ) |
| |
| # Both |
| select_all = await selection.select_tests(tests, [], exec_env) |
| select_all.apply_flags(args.parse_args(["--offset=1", "--limit=2"])) |
| self.assertEqual(len(select_all.selected), 2) |
| self.assertEqual(len(select_all.selected_but_not_run), 2) |
| self.assertEqual( |
| [x.name() for x in select_all.selected], |
| [ |
| "fuchsia-pkg://fuchsia.com/bar-pkg#meta/baz-test.cm", |
| "host_x64/binary_test", |
| ], |
| ) |