pyodide/pyodide_build/tests/test_buildall.py

92 lines
2.9 KiB
Python

from collections import namedtuple
from time import sleep
from pathlib import Path
from pyodide_build import buildall
import pytest
PACKAGES_DIR = (Path(__file__) / ".." / ".." / ".." / "packages").resolve()
def test_generate_dependency_graph():
pkg_map = buildall.generate_dependency_graph(PACKAGES_DIR, "beautifulsoup4")
assert set(pkg_map.keys()) == {"distlib", "soupsieve", "beautifulsoup4", "micropip"}
assert pkg_map["soupsieve"].dependencies == []
assert pkg_map["soupsieve"].dependents == {"beautifulsoup4"}
assert pkg_map["beautifulsoup4"].dependencies == ["soupsieve"]
assert pkg_map["beautifulsoup4"].dependents == set()
@pytest.mark.parametrize("n_jobs", [1, 4])
def test_build_dependencies(n_jobs, monkeypatch):
build_list = []
class MockPackage(buildall.Package):
def build(self, outputdir: Path, args) -> None:
build_list.append(self.name)
monkeypatch.setattr(buildall, "Package", MockPackage)
pkg_map = buildall.generate_dependency_graph(PACKAGES_DIR, "lxml")
Args = namedtuple("args", ["n_jobs"])
buildall.build_from_graph(pkg_map, Path("."), Args(n_jobs=n_jobs))
assert set(build_list) == {
"distlib",
"soupsieve",
"beautifulsoup4",
"micropip",
"webencodings",
"html5lib",
"cssselect",
"lxml",
"libxslt",
"libxml",
"zlib",
"libiconv",
"six",
}
assert build_list.index("distlib") < build_list.index("micropip")
assert build_list.index("soupsieve") < build_list.index("beautifulsoup4")
@pytest.mark.parametrize("n_jobs", [1, 4])
def test_build_all_dependencies(n_jobs, monkeypatch):
"""Try building all the dependency graph, without the actual build operations"""
class MockPackage(buildall.Package):
n_builds = 0
def build(self, outputdir: Path, args) -> None:
sleep(0.005)
self.n_builds += 1
# check that each build is only run once
assert self.n_builds == 1
monkeypatch.setattr(buildall, "Package", MockPackage)
pkg_map = buildall.generate_dependency_graph(PACKAGES_DIR, package_list=None)
Args = namedtuple("args", ["n_jobs"])
buildall.build_from_graph(pkg_map, Path("."), Args(n_jobs=n_jobs))
@pytest.mark.parametrize("n_jobs", [1, 4])
def test_build_error(n_jobs, monkeypatch):
"""Try building all the dependency graph, without the actual build operations"""
class MockPackage(buildall.Package):
def build(self, outputdir: Path, args) -> None:
raise ValueError("Failed build")
monkeypatch.setattr(buildall, "Package", MockPackage)
pkg_map = buildall.generate_dependency_graph(PACKAGES_DIR, "lxml")
with pytest.raises(ValueError, match="Failed build"):
Args = namedtuple("args", ["n_jobs"])
buildall.build_from_graph(pkg_map, Path("."), Args(n_jobs=n_jobs))