| # Copyright 2022 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| """Provides a base class for test running.""" |
| |
| import os |
| import subprocess |
| |
| from abc import ABC, abstractmethod |
| from typing import Dict, List, Optional, Union |
| |
| from common import read_package_paths |
| |
| |
| class TestRunner(ABC): |
| """Base class that handles running a test.""" |
| |
| def __init__(self, |
| out_dir: str, |
| test_args: List[str], |
| packages: List[str], |
| target_id: Optional[str], |
| package_deps: Union[Dict[str, str], List[str]] = None): |
| self._out_dir = out_dir |
| self._test_args = test_args |
| self._packages = packages |
| self._target_id = target_id |
| if package_deps: |
| if isinstance(package_deps, list): |
| self._package_deps = self._build_package_deps(package_deps) |
| elif isinstance(package_deps, dict): |
| self._package_deps = package_deps |
| else: |
| assert False, 'Unsupported package_deps ' + package_deps |
| else: |
| self._package_deps = self._populate_package_deps() |
| |
| @property |
| def package_deps(self) -> Dict[str, str]: |
| """ |
| Returns: |
| A dictionary of packages that |self._packages| depend on, with |
| mapping from the package name to the local path to its far file. |
| """ |
| |
| return self._package_deps |
| |
| def _build_package_deps(self, package_paths: List[str]) -> Dict[str, str]: |
| """Retrieve information for all packages listed in |package_paths|.""" |
| package_deps = {} |
| for path in package_paths: |
| path = os.path.join(self._out_dir, path) |
| package_name = os.path.basename(path).replace('.far', '') |
| if package_name in package_deps: |
| assert path == package_deps[package_name] |
| package_deps[package_name] = path |
| return package_deps |
| |
| def _populate_package_deps(self) -> None: |
| """Retrieve information for all packages |self._packages| depend on. |
| Note, this function expects the packages to be built with chromium |
| specified build rules and placed in certain locations. |
| """ |
| |
| package_paths = [] |
| for package in self._packages: |
| package_paths.extend(read_package_paths(self._out_dir, package)) |
| |
| return self._build_package_deps(package_paths) |
| |
| @abstractmethod |
| def run_test(self) -> subprocess.Popen: |
| """ |
| Returns: |
| A subprocess.Popen object that ran the test command. |
| """ |