blob: f6f67707bc469a008944fb0e594352c5aaff9c09 [file] [log] [blame]
import glob
import os
import subprocess
import sys
import pytest
# An ExternalPluginRepo represents a git repository containing a plugin
# with tests that we wish to use as part of our test suite.
#
# Args:
# name (str): The name of the repository. This is used for impormational purposes
# url (str): The location from which therepository can be cloned
# ref (str): A known git ref that we wish to test against
# test_match_patterns (list[str]): A list of shell style globs which may be
# used to specify a subset of test files from the repository to run.
# These must be specified relative to the root of the repository.
class ExternalPluginRepo():
def __init__(self, name, url, ref, test_match_patterns=None):
self.name = name
self.url = url
self.ref = ref
if test_match_patterns is None:
test_match_patterns = ["tests"]
self._test_match_patterns = test_match_patterns
self._clone_location = None
def clone(self, location):
self._clone_location = os.path.join(location, self.name)
subprocess.run(['git', 'clone',
'--single-branch',
'--branch', self.ref,
'--depth', '1',
self.url,
self._clone_location,
])
return self._clone_location
def install(self):
subprocess.run(['pip3', 'install', self._clone_location])
def test(self, args):
test_files = self._match_test_patterns()
return pytest.main(args + test_files)
def _match_test_patterns(self):
match_list = []
for pattern in self._test_match_patterns:
abs_pattern = os.path.join(self._clone_location, pattern)
print("matching pattern: ", abs_pattern)
matches = glob.glob(abs_pattern)
match_list.extend(matches)
if not match_list:
raise ValueError("No matches found for patterns {}".format(self._test_match_patterns))
return match_list
def run_repo_tests(repo, tempdir, args):
print("Cloning repo {} to {}...".format(repo.name, tempdir))
repo.clone(tempdir)
print("Installing {}...".format(repo.name))
repo.install()
print("Testing {}...".format(repo.name))
return repo.test(args)
if __name__ == "__main__":
# Args:
# tmpdir: The directory in which this script will clone external
# repositories and use pytest's tmpdir.
# pytest_args: any remaining arguments to this script will be passed
# directly to it's pytest invocations
_, tmpdir, *pytest_args = sys.argv
ALL_EXTERNAL_PLUGINS = []
exit_code = 0
for plugin in ALL_EXTERNAL_PLUGINS:
exit_code = run_repo_tests(plugin, tmpdir, pytest_args)
if exit_code != 0:
sys.exit(exit_code)