You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by no...@apache.org on 2020/12/29 12:54:48 UTC

[buildstream] 06/08: Add tox env for external standard plugin tests

This is an automated email from the ASF dual-hosted git repository.

not-in-ldap pushed a commit to branch coldtom/external-plugins
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 7ed843dabe76f038001a53b8e8e90a5955f82359
Author: Thomas Coldrick <th...@codethink.co.uk>
AuthorDate: Tue Sep 17 13:35:30 2019 +0100

    Add tox env for external standard plugin tests
    
    Adds tooling to define a list of external plugin repos in
    `requirements/external-requirements.yml` in a nice yaml format, which
    seemed the easiest way to sort out the potential config issues. The main
    thing is the addition of the `requirements/parse-external.py` script,
    which generates a list of package names and two requirements.txt files,
    one for fixed versions, one for master.
    
    It is assumed that `master` more means "test against a branch" and
    `fixed` means "test against a tag".
    
    Also adds tox environments to run these tests.
---
 requirements/external-fixed.txt        |  1 +
 requirements/external-master.txt       |  1 +
 requirements/external-requirements.yml |  6 +++++
 requirements/parse-external.py         | 49 ++++++++++++++++++++++++++++++++++
 tests/conftest.py                      | 22 +++++++++++----
 tox.ini                                | 24 ++++++-----------
 6 files changed, 82 insertions(+), 21 deletions(-)

diff --git a/requirements/external-fixed.txt b/requirements/external-fixed.txt
new file mode 100644
index 0000000..8160738
--- /dev/null
+++ b/requirements/external-fixed.txt
@@ -0,0 +1 @@
+git+https://gitlab.com/buildstream/bst-plugins-experimental.git@0.12.0#egg=bst_plugins_experimental[ostree]
diff --git a/requirements/external-master.txt b/requirements/external-master.txt
new file mode 100644
index 0000000..2d84de2
--- /dev/null
+++ b/requirements/external-master.txt
@@ -0,0 +1 @@
+git+https://gitlab.com/buildstream/bst-plugins-experimental.git@master#egg=bst_plugins_experimental[ostree]
diff --git a/requirements/external-requirements.yml b/requirements/external-requirements.yml
new file mode 100644
index 0000000..cf75357
--- /dev/null
+++ b/requirements/external-requirements.yml
@@ -0,0 +1,6 @@
+- package_name: bst_plugins_experimental
+  url: https://gitlab.com/buildstream/bst-plugins-experimental.git
+  branch: master
+  tag: 0.12.0
+  extras:
+  - ostree
diff --git a/requirements/parse-external.py b/requirements/parse-external.py
new file mode 100755
index 0000000..9df95a2
--- /dev/null
+++ b/requirements/parse-external.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+
+from enum import Enum
+from ruamel import yaml
+
+
+class PluginVersion(Enum):
+    MASTER = 0
+    FIXED = 1
+
+
+def load_file(filename):
+    with open(filename, 'r') as stream:
+        try:
+            return yaml.safe_load(stream)
+        except yaml.YAMLError as exc:
+            print(exc)
+
+
+def format_single_req(dep, version):
+    extras = ''
+    if 'extras' in dep.keys():
+        extras = ','.join(dep['extras'])
+
+    if version == PluginVersion.MASTER:
+        ref = 'master'
+        if 'branch' in dep.keys():
+            ref = dep['branch']
+    else:
+        ref = dep['tag']
+
+    return "git+{}@{}#egg={}[{}]\n".format(
+        dep['url'],
+        ref,
+        dep['package_name'],
+        extras)
+
+
+def write_requirements_file(filename, deps, version):
+    with open(filename, 'w') as f:
+        for dep in deps:
+            f.write(format_single_req(dep, version))
+
+
+if __name__ == '__main__':
+    deps = load_file('requirements/external-requirements.yml')
+
+    write_requirements_file('requirements/external-master.txt', deps, PluginVersion.MASTER)
+    write_requirements_file('requirements/external-fixed.txt', deps, PluginVersion.FIXED)
diff --git a/tests/conftest.py b/tests/conftest.py
index a1ca97f..079a763 100755
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -20,6 +20,7 @@
 #        Tristan Maat <tr...@codethink.co.uk>
 #
 import os
+import pkg_resources
 import pytest
 
 from buildstream.testing import register_repo_kind, sourcetests_collection_hook
@@ -51,8 +52,16 @@ def pytest_addoption(parser):
     parser.addoption('--remote-execution', action='store_true', default=False,
                      help='Run remote-execution tests only')
 
+    # This doesn't actually do anything at the moment, as we don't have standardised
+    # element tests
+    parser.addoption('--external-elements', action='store_true', default=False,
+                     help="Run standardised tests for external elements")
+
+    parser.addoption('--external-sources', action='store_true', default=False,
+                     help="Run standardised tests for external elements")
+
     parser.addoption('--external-plugins', action='store_true', default=False,
-                     help="Run standardised tests for external plugins")
+                     help="Run standardised tests for external elements and sources")
 
 
 def pytest_runtest_setup(item):
@@ -139,11 +148,14 @@ register_repo_kind('zip', Zip, None)
 # This hook enables pytest to collect the templated source tests from
 # buildstream.testing
 def pytest_sessionstart(session):
-    sourcetests_collection_hook(session)
+    # Register sources from external plugins, if option passed
+    if session.config.getvalue('external_plugins') or session.config.getvalue('external_sources'):
+        packages = {entrypoint.module_name.split('.')[0]
+                    for entrypoint in pkg_resources.iter_entry_points('buildstream.plugins')}
+        for package in packages:
+            __import__(package).testutils.register_sources()
 
-    if session.config.getvalue('external_plugins'):
-        import bst_plugins_experimental
-        bst_plugins_experimental.testutils.register_sources()
+    sourcetests_collection_hook(session)
 
 
 #################################################
diff --git a/tox.ini b/tox.ini
index ce36da9..2acf118 100644
--- a/tox.ini
+++ b/tox.ini
@@ -15,30 +15,26 @@ isolated_build = true
 usedevelop =
     # This is required by Cython in order to get coverage for cython files.
     py{35,36,37}-!nocover: True
-    plugins: True
 
 commands =
+    py{35,36,37}-plugins: python3 {toxinidir}/requirements/parse-external.py
+    py{35,36,37}-plugins-master: pip3 install -r {toxinidir}/requirements/external-master.txt
+    py{35,36,37}-plugins-fixed: pip3 install -r {toxinidir}/requirements/external-fixed.txt
+    py{35,36,37}-plugins: pytest --basetemp {envtmpdir} --external-plugins {posargs}
+
     # Running with coverage reporting enabled
-    py{35,36,37}-!nocover: pytest --basetemp {envtmpdir} --cov=buildstream --cov-config .coveragerc {posargs}
-    py{35,36,37}-!nocover: mkdir -p .coverage-reports
-    py{35,36,37}-!nocover: mv {envtmpdir}/.coverage {toxinidir}/.coverage-reports/.coverage.{env:COVERAGE_PREFIX:}{envname}
+    py{35,36,37}-!nocover-!plugins: pytest --basetemp {envtmpdir} --cov=buildstream --cov-config .coveragerc {posargs}
+    py{35,36,37}-!nocover-!plugins: mkdir -p .coverage-reports
+    py{35,36,37}-!nocover-!plugins: mv {envtmpdir}/.coverage {toxinidir}/.coverage-reports/.coverage.{env:COVERAGE_PREFIX:}{envname}
     # Running with coverage reporting disabled
     py{35,36,37}-nocover: pytest --basetemp {envtmpdir} {posargs}
 
-    plugins: pytest --basetemp {envtmpdir} --external-plugins {posargs}
-
    
 deps =
     py{35,36,37}: -rrequirements/requirements.txt
     py{35,36,37}: -rrequirements/dev-requirements.txt
     py{35,36,37}: -rrequirements/plugin-requirements.txt
     
-    plugins: -rrequirements/requirements.txt
-    plugins: -rrequirements/dev-requirements.txt
-    plugins: -rrequirements/plugin-requirements.txt
-    plugins: git+https://gitlab.com/buildstream/bst-plugins-experimental@coldtom/setup-py-improvements
-
-
     # Only require coverage and pytest-cov when using it
     py{35,36,37}-!nocover: -rrequirements/cov-requirements.txt
 passenv =
@@ -73,10 +69,6 @@ whitelist_externals =
     py{35,36,37}:
         mv
         mkdir
-    plugins:
-        rm
-        mv
-        git
 #
 # Coverage reporting
 #