blob: a4a2f5bf3d30156ca193d19fd99152f4721d3cc5 [file] [log] [blame]
# 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 argparse import Namespace
from typing import Dict, List, Optional
from common import read_package_paths
class TestRunner(ABC):
"""Base class that handles running a test."""
def __init__(self,
out_dir: str,
test_args: Namespace,
packages: List[str],
target_id: Optional[str] = None) -> None:
self._target_id = target_id
self._out_dir = out_dir
self._test_args = test_args
self._packages = packages
self._package_deps = None
# TODO(crbug.com/1256503): Remove when all tests are converted to CFv2.
@staticmethod
def is_cfv2() -> bool:
"""
Returns True if packages are CFv2, False otherwise. Subclasses can
override this and return False if needed.
"""
return True
@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.
"""
if not self._package_deps:
self._populate_package_deps()
return self._package_deps
def _populate_package_deps(self) -> None:
"""Retrieve information for all packages |self._packages| depend on.
"""
package_deps = {}
package_paths = []
for package in self._packages:
package_paths.extend(read_package_paths(self._out_dir, package))
for path in package_paths:
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
self._package_deps = package_deps
@abstractmethod
def run_test(self) -> subprocess.Popen:
"""
Returns:
A subprocess.Popen object that ran the test command.
"""