Skip to content

Commit

Permalink
fix and new reproduction test
Browse files Browse the repository at this point in the history
  • Loading branch information
memsharded committed Nov 20, 2024
1 parent f2f39b3 commit d759406
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 129 deletions.
10 changes: 1 addition & 9 deletions conans/model/requires.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import sys
from collections import OrderedDict

from conan.errors import ConanException
Expand Down Expand Up @@ -155,7 +154,7 @@ def serialize(self):
result = {"ref": str(self.ref)}
serializable = ("run", "libs", "skip", "test", "force", "direct", "build",
"transitive_headers", "transitive_libs", "headers",
"package_id_mode", "visible", "is_test")
"package_id_mode", "visible")
for attribute in serializable:
result[attribute] = getattr(self, attribute)
return result
Expand Down Expand Up @@ -255,7 +254,6 @@ def aggregate(self, other):
self.transitive_libs = self.transitive_libs or other.transitive_libs
if not other.test:
self.test = False # it it was previously a test, but also required by non-test
self.is_test = self.is_test or other.is_test
# package_id_mode is not being propagated downstream. So it is enough to check if the
# current require already defined it or not
if self.package_id_mode is None:
Expand Down Expand Up @@ -347,12 +345,6 @@ def transform_downstream(self, pkg_type, require, dep_pkg_type):
if self.test:
downstream_require.test = True

if require.is_test:
from conan.api.output import ConanOutput
ConanOutput().info(f"****** Propagating require {repr(require)}")
ConanOutput().info(f"****** to {repr(self)}")
downstream_require.is_test = require.is_test

# If the current one is resolving conflicts, the downstream one will be too
downstream_require.force = require.force
downstream_require.direct = False
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import pytest

from conan.test.assets.genconanfile import GenConanfile
from conan.test.utils.tools import TestClient


Expand Down Expand Up @@ -181,105 +180,6 @@ def package_info(self):
assert "ERROR: wrong/version: required component package 'other::' not in dependencies" in t.out


def test_wrong_requirement_test_requires():
""" https://github.com/conan-io/conan/issues/17312
"""
c = TestClient()
power_mngr = textwrap.dedent("""
from conan import ConanFile
class Pkg(ConanFile):
name = "power_mngr"
version = "0.1"
requires = ("etas/0.1", "enum/0.1", "hwinfo/0.1", "cppwrapper/0.1",
"sysrepo/0.1", "es_570/0.1", "hw_support/0.1")
def generate(self):
self.output.info("+++++++++++++++++++++++++++++ Generate")
for r, d in self.dependencies.items():
self.output.info(f" Direct: {r.ref.name} {r.direct}")
self.output.info(f" IsTest: {r.ref.name} {r.is_test}")
if r.ref.name == "enum" and r.direct and r.is_test:
raise Exception("Test requires should not be direct")
""")
files = {
"enum/conanfile.py": GenConanfile("enum", "0.1"),
"etas/conanfile.py": GenConanfile("etas", "0.1").with_requirement("enum/0.1"),
"cppwrapper/conanfile.py": GenConanfile("cppwrapper", "0.1").with_requirement("etas/0.1"),
"mtd_info/conanfile.py": GenConanfile("mtd_info", "0.1").with_requirement("enum/0.1"),
"es_570/conanfile.py": GenConanfile("es_570", "0.1").with_requirement("etas/0.1")
.with_requirement("cppwrapper/0.1"),
"hw_support/conanfile.py": GenConanfile("hw_support", "0.1").with_requirement("etas/0.1")
.with_requirement("cppwrapper/0.1"),
"hwinfo/conanfile.py": GenConanfile("hwinfo", "0.1").with_requirement("etas/0.1")
.with_requirement("enum/0.1")
.with_requirement("cppwrapper/0.1"),
"sysrepo/conanfile.py": GenConanfile("sysrepo", "0.1").with_requirement("enum/0.1"),
"power_mngr/conanfile.py": power_mngr,
"plugins/conanfile.py": GenConanfile("plugins", "0.1").with_requirement("etas/0.1")
.with_requirement("enum/0.1")
.with_requirement("hwinfo/0.1")
.with_requirement("cppwrapper/0.1")
.with_requirement("sysrepo/0.1")
.with_requirement("power_mngr/0.1"),
"ip/conanfile.py": GenConanfile("op", "0.1").with_requirement("etas/0.1")
.with_requirement("enum/0.1")
.with_requirement("hwinfo/0.1")
.with_test_requires("plugins/0.1"),
}
c.save(files)
for pkg in files.keys():
pkg = pkg.split("/", 1)[0]
c.run(f"create {pkg} --build=*")
print(c.out)

c.run("graph info --requires=power_mngr/0.1 --format=html", redirect_stdout="file.html")
print(c.current_folder)


def test_wrong_requirement_test_requires_simple():
""" https://github.com/conan-io/conan/issues/17312
app -(requires)-> test2 -(test_requires)-> test1 -(requires)-> enum
\\ \\----------------(requires)---------------/
\\-----------------------------------------(requires)-----------/
consumer --(self)-----> pkg ---(require) ---> dep_pkg
\\-----------------(new)----------------------/
new.is_test = require.is_test
"""
c = TestClient()
power_mngr = textwrap.dedent("""
from conan import ConanFile
class Pkg(ConanFile):
name = "power_mngr"
version = "0.1"
requires = "enum/0.1", "test2/0.1"
#test_requires = "test2/0.1"
def generate(self):
self.output.info("+++++++++++++++++++++++++++++ Generate")
for r, d in self.dependencies.items():
self.output.info(f" Direct: {r.ref.name} {r.direct}")
self.output.info(f" IsTest: {r.ref.name} {r.is_test}")
if r.ref.name == "enum" and r.direct and r.is_test:
raise Exception("Test requires should not be direct")
""")
files = {
"enum/conanfile.py": GenConanfile("enum", "0.1").with_package_type("static-library"),
"test1/conanfile.py": GenConanfile("test1", "0.1").with_requires("enum/0.1")
.with_package_type("static-library"),
"test2/conanfile.py": GenConanfile("test2", "0.1").with_requires("enum/0.1")
.with_test_requires("test1/0.1")
.with_package_type("static-library"),
"power_mngr/conanfile.py": power_mngr,
}
c.save(files)

c.run(f"create enum")
c.run("create test1")
c.run("create test2")
c.run("install power_mngr")
print(c.out)


# TODO: This is CMakeDeps Independent, move it out of here
def test_missing_internal():
consumer = textwrap.dedent("""
Expand Down
56 changes: 36 additions & 20 deletions test/integration/graph/test_test_requires.py
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ def test_requires_transitive_diamond_components_order():
like the above, but in different order
libc --(test-requires)---> liba
|-----> libb -----------/
libc->liba => test=False, direct=True, is_test=True
direct_dependencies (components check) => False
https://github.com/conan-io/conan/issues/17164
"""
c = TestClient(light=True)
Expand Down Expand Up @@ -230,32 +232,46 @@ def package_info(self):
assert "libc/0.1: Created package" in c.out


def test_requires_transitive_diamond_components_transitive():
"""
libc -----> libb -> pkg -(test_requires)-> liba
\\----------(requires)-------------/
def test_wrong_requirement_test_requires():
""" https://github.com/conan-io/conan/issues/17312
app --------> etas --------------> enum
\\-->hwinfo-/---(test_requires)---/
\\-----------------------------/
app->enum => test=False, direct=True, is_test=True
direct_dependencies (components check) => True
"""
c = TestClient(light=True)
libc = textwrap.dedent("""
app = textwrap.dedent("""
from conan import ConanFile
class LibC(ConanFile):
name = "libc"
class Pkg(ConanFile):
name = "app"
version = "0.1"
requires = "libb/1.0", "liba/1.0"
requires = "etas/0.1", "enum/0.1", "hwinfo/0.1"
def generate(self):
for r, d in self.dependencies.items():
assert not (r.direct and r.is_test)
def package_info(self):
self.cpp_info.components["comp"].libs = ["libc"]
self.cpp_info.components["comp"].requires = ["libb::libb", "liba::liba"]
""")
c.save({"liba/conanfile.py": GenConanfile("liba", "1.0"),
"libb/conanfile.py": GenConanfile("libb", "1.0").with_test_requires("liba/1.0"),
"libc/conanfile.py": libc})
c.run("create liba")
c.run("create libb")
c.run("create libc")
print(c.out)
# This used to crash due to component not defined to liba
assert "libc/0.1: Created package" in c.out
self.cpp_info.requires = ["etas::etas", "enum::enum", "hwinfo::hwinfo"]
""")
files = {
"enum/conanfile.py": GenConanfile("enum", "0.1"),
"etas/conanfile.py": GenConanfile("etas", "0.1").with_requirement("enum/0.1"),
"hwinfo/conanfile.py": GenConanfile("hwinfo", "0.1").with_requirement("etas/0.1")
.with_test_requires("enum/0.1"),
"app/conanfile.py": app,
}
c.save(files)
c.run("create enum")
c.run("create etas")
c.run("create hwinfo")
# The assert in generate() doesnt fail
c.run("install app")
# the package_info() doesn't fail
c.run("create app")


def test_test_requires_options():
Expand Down

0 comments on commit d759406

Please sign in to comment.