75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
# 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.
|
|
"""
|