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

tvb pushed a commit to branch tristan/junction-source-mirrors
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 520b99831c974737a4fa48f7f9c8dcaa7391aea8
Author: Tristan van Berkom <[email protected]>
AuthorDate: Sat Jul 6 19:02:09 2024 +0900

    Test pip and junction origins for SourceMirror plugins.
    
    This patch:
    
      * Extends the tests/frontend/mirror.py::test_source_mirror_plugin
        test to be parameterized and run the same test for each load origin.
    
        This was just easier to do than extending tests/plugins/loading.py
    
      * Adds the same sample mirror plugin from tests/frontend local project
        directory to the sample_plugins project so we can use that to test
        the other origins.
---
 tests/frontend/mirror.py                           | 33 ++++++++++++++++++--
 tests/plugins/sample-plugins/project.conf          |  5 +++
 tests/plugins/sample-plugins/setup.py              |  3 ++
 .../src/sample_plugins/sourcemirrors/__init__.py   |  0
 .../src/sample_plugins/sourcemirrors/mirror.py     | 36 ++++++++++++++++++++++
 5 files changed, 75 insertions(+), 2 deletions(-)

diff --git a/tests/frontend/mirror.py b/tests/frontend/mirror.py
index 7701b6616..698522304 100644
--- a/tests/frontend/mirror.py
+++ b/tests/frontend/mirror.py
@@ -817,7 +817,8 @@ def test_mirror_expand_project_and_toplevel_root(cli, 
tmpdir):
 #
 @pytest.mark.datafiles(DATA_DIR)
 @pytest.mark.usefixtures("datafiles")
-def test_source_mirror_plugin(cli, tmpdir):
[email protected]("origin", [("local"), ("junction"), ("pip")])
+def test_source_mirror_plugin(cli, tmpdir, origin):
     output_file = os.path.join(str(tmpdir), "output.txt")
     project_dir = str(tmpdir)
     element_dir = os.path.join(project_dir, "elements")
@@ -827,6 +828,34 @@ def test_source_mirror_plugin(cli, tmpdir):
     element = generate_element(output_file)
     _yaml.roundtrip_dump(element, element_path)
 
+    def source_mirror_plugin_origin():
+        if origin == "local":
+            return {"origin": "local", "path": "sourcemirrors", 
"source-mirrors": ["mirror"]}
+        elif origin == "pip":
+            return {
+                "origin": "pip",
+                "package-name": "sample-plugins>=1.2",
+                "source-mirrors": ["mirror"],
+            }
+        elif origin == "junction":
+            # For junction loading, just copy in the sample-plugins into a 
subdir and
+            # create a local junction
+            sample_plugins_dir = os.path.join(TOP_DIR, "..", "plugins", 
"sample-plugins")
+            sample_plugins_copy_dir = os.path.join(project_dir, 
"sample-plugins-copy")
+            junction_file = os.path.join(element_dir, "sample-plugins.bst")
+
+            shutil.copytree(sample_plugins_dir, sample_plugins_copy_dir)
+
+            _yaml.roundtrip_dump(
+                {"kind": "junction", "sources": [{"kind": "local", "path": 
"sample-plugins-copy"}]}, junction_file
+            )
+
+            return {
+                "origin": "junction",
+                "junction": "sample-plugins.bst",
+                "source-mirrors": ["mirror"],
+            }
+
     project_file = os.path.join(project_dir, "project.conf")
     project = {
         "name": "test",
@@ -870,7 +899,7 @@ def test_source_mirror_plugin(cli, tmpdir):
         ],
         "plugins": [
             {"origin": "local", "path": "sources", "sources": 
["fetch_source"]},
-            {"origin": "local", "path": "sourcemirrors", "source-mirrors": 
["mirror"]},
+            source_mirror_plugin_origin(),
         ],
     }
 
diff --git a/tests/plugins/sample-plugins/project.conf 
b/tests/plugins/sample-plugins/project.conf
index 60fd37224..d111eae6d 100644
--- a/tests/plugins/sample-plugins/project.conf
+++ b/tests/plugins/sample-plugins/project.conf
@@ -13,3 +13,8 @@ plugins:
   sources:
   - git
   - sample
+
+- origin: local
+  path: src/sample_plugins/sourcemirrors
+  source-mirrors:
+  - mirror
diff --git a/tests/plugins/sample-plugins/setup.py 
b/tests/plugins/sample-plugins/setup.py
index 14fe1cf5b..04c8361cc 100755
--- a/tests/plugins/sample-plugins/setup.py
+++ b/tests/plugins/sample-plugins/setup.py
@@ -33,6 +33,9 @@ setup(
             "sample = sample_plugins.sources.sample",
             "git = sample_plugins.sources.git",
         ],
+        "buildstream.plugins.sourcemirrors": [
+            "mirror = sample_plugins.sourcemirrors.mirror",
+        ],
     },
     zip_safe=False,
 )
diff --git 
a/tests/plugins/sample-plugins/src/sample_plugins/sourcemirrors/__init__.py 
b/tests/plugins/sample-plugins/src/sample_plugins/sourcemirrors/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git 
a/tests/plugins/sample-plugins/src/sample_plugins/sourcemirrors/mirror.py 
b/tests/plugins/sample-plugins/src/sample_plugins/sourcemirrors/mirror.py
new file mode 100644
index 000000000..fc737031a
--- /dev/null
+++ b/tests/plugins/sample-plugins/src/sample_plugins/sourcemirrors/mirror.py
@@ -0,0 +1,36 @@
+from typing import Optional, Dict, Any
+
+from buildstream import SourceMirror, MappingNode
+
+
+# This mirror plugin basically implements the default behavior
+# by loading the alias definitions as custom "config" configuration
+# instead, and implementing the translate_url method.
+#
+class Sample(SourceMirror):
+    def configure(self, node):
+        node.validate_keys(["aliases"])
+
+        self.aliases = {}
+
+        aliases = node.get_mapping("aliases")
+        for alias_name, url_list in aliases.items():
+            self.aliases[alias_name] = url_list.as_str_list()
+
+        self.set_supported_aliases(self.aliases.keys())
+
+    def translate_url(
+        self,
+        *,
+        alias: str,
+        alias_url: str,
+        source_url: str,
+        extra_data: Optional[Dict[str, Any]],
+    ) -> str:
+        return self.aliases[alias][0] + source_url
+
+
+# Plugin entry point
+def setup():
+
+    return Sample

Reply via email to