-
Notifications
You must be signed in to change notification settings - Fork 993
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
cab4f18
commit bdafa80
Showing
6 changed files
with
269 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,243 @@ | ||
import json | ||
|
||
from conans.model.recipe_ref import RecipeReference | ||
from conans.test.assets.genconanfile import GenConanfile | ||
from conans.test.utils.tools import TestClient | ||
|
||
|
||
def test_graph_build_order_override_error(): | ||
""" | ||
libc -> libb -> liba -> zlib/1.2 | ||
|--------------/ | ||
|-----override------> zlib/1.3 | ||
""" | ||
c = TestClient() | ||
c.save({"zlib/conanfile.py": GenConanfile("zlib"), | ||
"liba/conanfile.py": GenConanfile("liba", "0.1").with_requires("zlib/1.0"), | ||
"libb/conanfile.py": GenConanfile("libb", "0.1").with_requires("liba/0.1", "zlib/2.0"), | ||
"libc/conanfile.py": GenConanfile("libc", "0.1").with_requirement("libb/0.1") | ||
.with_requirement("zlib/3.0", | ||
override=True) | ||
}) | ||
c.run("export zlib --version=2.0") | ||
c.run("export zlib --version=3.0") | ||
c.run("export liba") | ||
c.run("export libb") | ||
c.run("export libc") | ||
c.run("graph info --requires=libc/0.1 --lockfile-out=output.lock") | ||
|
||
c.run("graph build-order --requires=libc/0.1 --lockfile=output.lock --order-by=configuration " | ||
"--build=missing --format=json") | ||
|
||
to_build = json.loads(c.stdout) | ||
for level in to_build["order"]: | ||
for package in level: | ||
binary = package["binary"] | ||
if binary != "Build": | ||
continue | ||
build_args = package["build_args"] | ||
c.run(f"install {build_args} --lockfile=output.lock") | ||
ref = RecipeReference.loads(package["ref"]) | ||
assert f"{ref}: Building from source" | ||
|
||
c.run("install --requires=libc/0.1 --lockfile=output.lock") | ||
# All works, all binaries exist now | ||
assert "zlib/3.0: Already installed!" in c.out | ||
assert "liba/0.1: Already installed!" in c.out | ||
assert "libb/0.1: Already installed!" in c.out | ||
assert "libc/0.1: Already installed!" in c.out | ||
|
||
|
||
def test_single_config_decentralized_overrides(): | ||
r""" same scenario as "test_single_config_centralized()", but distributing the build in | ||
different build servers, using the "build-order" | ||
Now with overrides | ||
pkga -> toola/1.0 -> toolb/1.0 -> toolc/1.0 | ||
\------override-----> toolc/2.0 | ||
pkgb -> toola/2.0 -> toolb/1.0 -> toolc/1.0 | ||
\------override-----> toolc/3.0 | ||
pkgc -> toola/3.0 -> toolb/1.0 -> toolc/1.0 | ||
""" | ||
c = TestClient() | ||
c.save({"toolc/conanfile.py": GenConanfile("toolc"), | ||
"toolb/conanfile.py": GenConanfile("toolb").with_requires("toolc/1.0"), | ||
"toola/conanfile.py": GenConanfile("toola", "1.0").with_requirement("toolb/1.0") | ||
.with_requirement("toolc/2.0", | ||
override=True), | ||
"toola2/conanfile.py": GenConanfile("toola", "2.0").with_requirement("toolb/1.0") | ||
.with_requirement("toolc/3.0", | ||
override=True), | ||
"toola3/conanfile.py": GenConanfile("toola", "3.0").with_requirement("toolb/1.0"), | ||
"pkga/conanfile.py": GenConanfile("pkga", "1.0").with_tool_requires("toola/1.0"), | ||
"pkgb/conanfile.py": GenConanfile("pkgb", "1.0").with_requires("pkga/1.0") | ||
.with_tool_requires("toola/2.0"), | ||
"pkgc/conanfile.py": GenConanfile("pkgc", "1.0").with_requires("pkgb/1.0") | ||
.with_tool_requires("toola/3.0"), | ||
}) | ||
c.run("export toolc --version=1.0") | ||
c.run("export toolc --version=2.0") | ||
c.run("export toolc --version=3.0") | ||
|
||
c.run("export toolb --version=1.0") | ||
|
||
c.run("export toola") | ||
c.run("export toola2") | ||
c.run("export toola3") | ||
|
||
c.run("export pkga") | ||
c.run("export pkgb") | ||
c.run("lock create pkgc") | ||
lock = json.loads(c.load("pkgc/conan.lock")) | ||
requires = "\n".join(lock["build_requires"]) | ||
assert "toolc/3.0" in requires | ||
assert "toolc/2.0" in requires | ||
assert "toolc/1.0" in requires | ||
assert len(lock["overrides"]) == 1 | ||
assert set(lock["overrides"]["toolc/1.0"]) == {"toolc/3.0", "toolc/2.0", None} | ||
|
||
c.run("graph build-order pkgc --lockfile=pkgc/conan.lock --format=json --build=missing") | ||
to_build = json.loads(c.stdout) | ||
for level in to_build: | ||
for elem in level: | ||
for package in elem["packages"][0]: # assumes no dependencies between packages | ||
binary = package["binary"] | ||
if binary != "Build": | ||
continue | ||
build_args = package["build_args"] | ||
c.run(f"install {build_args} --lockfile=pkgc/conan.lock") | ||
|
||
c.run("install pkgc --lockfile=pkgc/conan.lock") | ||
# All works, all binaries exist now | ||
assert "pkga/1.0: Already installed!" in c.out | ||
assert "pkgb/1.0: Already installed!" in c.out | ||
|
||
|
||
def test_single_config_decentralized_overrides_nested(): | ||
r""" same scenario as "test_single_config_centralized()", but distributing the build in | ||
different build servers, using the "build-order" | ||
Now with overrides | ||
pkga -> toola/1.0 -> libb/1.0 -> libc/1.0 -> libd/1.0 -> libe/1.0 -> libf/1.0 | ||
\ \-----------override---------> libf/2.0 | ||
\--------------------override--------------------------> libf/3.0 | ||
""" | ||
c = TestClient() | ||
c.save({"libf/conanfile.py": GenConanfile("libf"), | ||
"libe/conanfile.py": GenConanfile("libe", "1.0").with_requires("libf/1.0"), | ||
"libd/conanfile.py": GenConanfile("libd", "1.0").with_requires("libe/1.0"), | ||
"libc/conanfile.py": GenConanfile("libc", "1.0").with_requirement("libd/1.0") | ||
.with_requirement("libf/2.0", | ||
override=True), | ||
"libb/conanfile.py": GenConanfile("libb", "1.0").with_requires("libc/1.0"), | ||
"toola/conanfile.py": GenConanfile("toola", "1.0").with_requirement("libb/1.0") | ||
.with_requirement("libf/3.0", | ||
override=True), | ||
"pkga/conanfile.py": GenConanfile("pkga", "1.0").with_tool_requires("toola/1.0"), | ||
}) | ||
|
||
c.run("export libf --version=3.0") | ||
c.run("export libe") | ||
c.run("export libd") | ||
c.run("export libc") | ||
c.run("export libb") | ||
c.run("export toola") | ||
|
||
c.run("lock create pkga") | ||
lock = json.loads(c.load("pkga/conan.lock")) | ||
assert lock["overrides"] == {"libf/1.0": ["libf/3.0"], | ||
"libf/2.0": ["libf/3.0"]} | ||
|
||
c.run("graph build-order pkga --lockfile=pkga/conan.lock --format=json --build=missing") | ||
to_build = json.loads(c.stdout) | ||
for level in to_build: | ||
for elem in level: | ||
ref = elem["ref"] | ||
if "libc" in ref: | ||
pass | ||
for package in elem["packages"][0]: # assumes no dependencies between packages | ||
binary = package["binary"] | ||
if binary != "Build": | ||
continue | ||
build_args = package["build_args"] | ||
c.run(f"install {build_args} --lockfile=pkga/conan.lock") | ||
|
||
c.run("install pkga --lockfile=pkga/conan.lock") | ||
# All works, all binaries exist now | ||
assert "Install finished successfully" in c.out | ||
|
||
|
||
def test_single_config_decentralized_overrides_multi(): | ||
r""" same scenario as "test_single_config_centralized()", but distributing the build in | ||
different build servers, using the "build-order" | ||
Now with overrides | ||
pkga -> toola/1.0 -> libb/1.0 -> libc/1.0 -> libd/1.0 -> libe/1.0 -> libf/1.0 | ||
| \ \-----------override--------> libf/2.0 | ||
| \--------------------override-------------------------> libf/3.0 | ||
pkgb -> toola/1.1 -> libb/1.0 -> libc/1.0 -> libd/1.0 -> libe/1.0 -> libf/1.0 | ||
| \ \-----------override--------> libf/2.0 | ||
| \--------------------override-------------------------> libf/4.0 | ||
pkgc -> toola/1.2 -> libb/1.0 -> libc/1.0 -> libd/1.0 -> libe/1.0 -> libf/1.0 | ||
\-----------override--------> libf/2.0 | ||
""" | ||
c = TestClient() | ||
c.save({"libf/conanfile.py": GenConanfile("libf"), | ||
"libe/conanfile.py": GenConanfile("libe", "1.0").with_requires("libf/1.0"), | ||
"libd/conanfile.py": GenConanfile("libd", "1.0").with_requires("libe/1.0"), | ||
"libc/conanfile.py": GenConanfile("libc", "1.0").with_requirement("libd/1.0") | ||
.with_requirement("libf/2.0", | ||
override=True), | ||
"libb/conanfile.py": GenConanfile("libb", "1.0").with_requires("libc/1.0"), | ||
"toola/conanfile.py": GenConanfile("toola", "1.0").with_requirement("libb/1.0") | ||
.with_requirement("libf/3.0", | ||
override=True), | ||
"toola1/conanfile.py": GenConanfile("toola", "1.1").with_requirement("libb/1.0") | ||
.with_requirement("libf/4.0", | ||
override=True), | ||
"toola2/conanfile.py": GenConanfile("toola", "1.2").with_requirement("libb/1.0"), | ||
"pkga/conanfile.py": GenConanfile("pkga", "1.0").with_tool_requires("toola/1.0"), | ||
"pkgb/conanfile.py": GenConanfile("pkgb", "1.0").with_requires("pkga/1.0") | ||
.with_tool_requires("toola/1.1"), | ||
"pkgc/conanfile.py": GenConanfile("pkgc", "1.0").with_requires("pkgb/1.0") | ||
.with_tool_requires("toola/1.2"), | ||
}) | ||
|
||
c.run("export libf --version=2.0") | ||
c.run("export libf --version=3.0") | ||
c.run("export libf --version=4.0") | ||
c.run("export libe") | ||
c.run("export libd") | ||
c.run("export libc") | ||
c.run("export libb") | ||
|
||
c.run("export toola") | ||
c.run("export toola1") | ||
c.run("export toola2") | ||
|
||
c.run("export pkga") | ||
c.run("export pkgb") | ||
c.run("lock create pkgc") | ||
lock = json.loads(c.load("pkgc/conan.lock")) | ||
assert len(lock["overrides"]) == 2 | ||
assert set(lock["overrides"]["libf/1.0"]) == {"libf/4.0", "libf/2.0", "libf/3.0"} | ||
assert set(lock["overrides"]["libf/2.0"]) == {"libf/4.0", "libf/3.0", None} | ||
|
||
c.run("graph build-order pkgc --lockfile=pkgc/conan.lock --format=json --build=missing") | ||
to_build = json.loads(c.stdout) | ||
for level in to_build: | ||
for elem in level: | ||
ref = elem["ref"] | ||
if "libc" in ref: | ||
pass | ||
for package in elem["packages"][0]: # assumes no dependencies between packages | ||
binary = package["binary"] | ||
if binary != "Build": | ||
continue | ||
build_args = package["build_args"] | ||
c.run(f"install {build_args} --lockfile=pkgc/conan.lock") | ||
|
||
c.run("install pkgc --lockfile=pkgc/conan.lock") | ||
# All works, all binaries exist now | ||
assert "pkga/1.0: Already installed!" in c.out | ||
assert "pkgb/1.0: Already installed!" in c.out |