Skip to content

Commit 50176ab

Browse files
authored
new tests for options and settings negation (#18306)
1 parent f98379c commit 50176ab

4 files changed

Lines changed: 150 additions & 87 deletions

File tree

test/integration/options/options_in_requirements_test.py

Lines changed: 0 additions & 48 deletions
This file was deleted.

test/integration/options/options_test.py

Lines changed: 64 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
import textwrap
2-
import unittest
3-
42

53
import pytest
64

75
from conan.test.utils.tools import TestClient, GenConanfile
86

97

10-
class OptionsTest(unittest.TestCase):
8+
class TestOptions:
119

1210
def test_general_scope_options_test_package(self):
1311
client = TestClient()
@@ -21,34 +19,34 @@ def configure(self):
2119
test = GenConanfile().with_test("pass")
2220
client.save({"conanfile.py": conanfile})
2321
client.run("create . --name=pkg --version=0.1 --user=user --channel=testing -o *:shared=1")
24-
self.assertIn("pkg/0.1@user/testing: BUILD SHARED: 1", client.out)
22+
assert "pkg/0.1@user/testing: BUILD SHARED: 1" in client.out
2523
client.run("create . --name=pkg --version=0.1 --user=user --channel=testing -o shared=2")
2624
assert 'legacy: Unscoped option definition is ambiguous' in client.out
27-
self.assertIn("pkg/0.1@user/testing: BUILD SHARED: 2", client.out)
25+
assert "pkg/0.1@user/testing: BUILD SHARED: 2" in client.out
2826
# With test_package
2927
client.save({"conanfile.py": conanfile,
3028
"test_package/conanfile.py": test})
3129
client.run("create . --name=pkg --version=0.1 --user=user --channel=testing -o *:shared=1")
32-
self.assertIn("pkg/0.1@user/testing: BUILD SHARED: 1", client.out)
30+
assert "pkg/0.1@user/testing: BUILD SHARED: 1" in client.out
3331
client.run("create . --name=pkg --version=0.1 --user=user --channel=testing -o pkg*:shared=2")
34-
self.assertIn("pkg/0.1@user/testing: BUILD SHARED: 2", client.out)
32+
assert "pkg/0.1@user/testing: BUILD SHARED: 2" in client.out
3533
client.run("create . --name=pkg --version=0.1 --user=user --channel=testing -o shared=1")
36-
self.assertIn("pkg/0.1@user/testing: BUILD SHARED: 1", client.out)
34+
assert "pkg/0.1@user/testing: BUILD SHARED: 1" in client.out
3735

3836
def test_general_scope_options_test_package_notdefined(self):
3937
client = TestClient()
4038
conanfile = GenConanfile()
4139
client.save({"conanfile.py": conanfile})
4240
client.run("create . --name=pkg --version=0.1 --user=user --channel=testing -o *:shared=True")
43-
self.assertIn("pkg/0.1@user/testing: Forced build from source", client.out)
41+
assert "pkg/0.1@user/testing: Forced build from source" in client.out
4442
client.run("create . --name=pkg --version=0.1 --user=user --channel=testing -o shared=False", assert_error=True)
45-
self.assertIn("option 'shared' doesn't exist", client.out)
43+
assert "option 'shared' doesn't exist" in client.out
4644
# With test_package
4745
client.save({"conanfile.py": conanfile,
4846
"test_package/conanfile.py": GenConanfile().with_test("pass")})
4947
client.run("create . --name=pkg --version=0.1 --user=user --channel=testing -o *:shared=True")
50-
self.assertIn("pkg/0.1@user/testing: Forced build from source", client.out)
51-
self.assertIn("Testing the package: Building", client.out)
48+
assert "pkg/0.1@user/testing: Forced build from source" in client.out
49+
assert "Testing the package: Building" in client.out
5250

5351
def test_general_scope_priorities(self):
5452
client = TestClient()
@@ -63,23 +61,23 @@ def configure(self):
6361
client.save({"conanfile.py": conanfile})
6462
# Consumer has priority
6563
client.run("create . --name=pkg --version=0.1 -o *:shared=1 -o shared=2 -o p*:other=4")
66-
self.assertIn("pkg/0.1: BUILD SHARED: 2 OTHER: 4", client.out)
64+
assert "pkg/0.1: BUILD SHARED: 2 OTHER: 4" in client.out
6765
# Consumer has priority over pattern, even if the pattern specifies the package name
6866
client.run("create . --name=pkg --version=0.1 -o *:shared=1 -o pkg/*:shared=2 -o shared=3 -o p*:other=4")
69-
self.assertIn("pkg/0.1: BUILD SHARED: 3 OTHER: 4", client.out)
67+
assert "pkg/0.1: BUILD SHARED: 3 OTHER: 4" in client.out
7068
client.run("create . --name=pkg --version=0.1 -o pkg/0.1:shared=2 -o p*:other=4 -o pk*:other=5")
71-
self.assertIn("pkg/0.1: BUILD SHARED: 2 OTHER: 5", client.out)
69+
assert "pkg/0.1: BUILD SHARED: 2 OTHER: 5" in client.out
7270

7371
# With test_package
7472
client.save({"conanfile.py": conanfile,
7573
"test_package/conanfile.py": GenConanfile().with_test("pass")})
7674
# Sorted (longest, alphabetical) patterns, have priority
7775
client.run("create . --name=pkg --version=0.1 -o *:shared=1 -o pkg/0.1:shared=2 -o other=4")
78-
self.assertIn("pkg/0.1: BUILD SHARED: 2 OTHER: 4", client.out)
76+
assert "pkg/0.1: BUILD SHARED: 2 OTHER: 4" in client.out
7977
client.run("create . --name=pkg --version=0.1 -o pk*:shared=2 -o p*:shared=1 -o pkg/0.1:other=5")
80-
self.assertIn("pkg/0.1: BUILD SHARED: 1 OTHER: 5", client.out)
78+
assert "pkg/0.1: BUILD SHARED: 1 OTHER: 5" in client.out
8179
client.run("create . --name=pkg --version=0.1 -o pk*:shared=2 -o p*:shared=1 -o pkg/0.1:other=5 -o *g*:other=6")
82-
self.assertIn("pkg/0.1: BUILD SHARED: 1 OTHER: 6", client.out)
80+
assert "pkg/0.1: BUILD SHARED: 1 OTHER: 6" in client.out
8381

8482
def test_parsing(self):
8583
client = TestClient()
@@ -104,7 +102,7 @@ def build(self):
104102
'''
105103
client.save({"conanfile.txt": conanfile}, clean_first=True)
106104
client.run("install . --build=missing")
107-
self.assertIn("OPTION a=b", client.out)
105+
assert "OPTION a=b" in client.out
108106

109107
def test_general_scope_options(self):
110108
# https://github.com/conan-io/conan/issues/2538
@@ -119,7 +117,7 @@ def configure(self):
119117
""")
120118
client.save({"conanfile.py": conanfile_liba})
121119
client.run("create . --name=liba --version=0.1 --user=danimtb --channel=testing -o *:shared=True")
122-
self.assertIn("liba/0.1@danimtb/testing: shared=True", client.out)
120+
assert "liba/0.1@danimtb/testing: shared=True" in client.out
123121

124122
conanfile_libb = textwrap.dedent("""
125123
from conan import ConanFile
@@ -141,16 +139,16 @@ def configure(self):
141139

142140
# Test info
143141
client.run("graph info . -o *:shared=True")
144-
self.assertIn("conanfile.py: shared=True", client.out)
145-
self.assertIn("liba/0.1@danimtb/testing: shared=True", client.out)
142+
assert "conanfile.py: shared=True" in client.out
143+
assert "liba/0.1@danimtb/testing: shared=True" in client.out
146144
# Test create
147145
client.run("create . --name=libb --version=0.1 --user=danimtb --channel=testing -o *:shared=True")
148-
self.assertIn("libb/0.1@danimtb/testing: shared=True", client.out)
149-
self.assertIn("liba/0.1@danimtb/testing: shared=True", client.out)
146+
assert "libb/0.1@danimtb/testing: shared=True" in client.out
147+
assert "liba/0.1@danimtb/testing: shared=True" in client.out
150148
# Test install
151149
client.run("install . -o *:shared=True")
152-
self.assertIn("conanfile.py: shared=True", client.out)
153-
self.assertIn("liba/0.1@danimtb/testing: shared=True", client.out)
150+
assert "conanfile.py: shared=True" in client.out
151+
assert "liba/0.1@danimtb/testing: shared=True" in client.out
154152

155153
def test_define_nested_option_not_freeze(self):
156154
c = TestClient()
@@ -611,6 +609,46 @@ def configure(self):
611609
assert "dep3/0.1@user/channel: MYOPTION: 1" in c.out
612610

613611

612+
def test_package_options_negate_patterns():
613+
c = TestClient()
614+
conanfile = textwrap.dedent("""
615+
from conan import ConanFile
616+
class Dep(ConanFile):
617+
version = "0.1"
618+
options = {"myoption": [1, 2, 3]}
619+
def build(self):
620+
self.output.info(f"MYOPTION={self.options.myoption}!!!")
621+
""")
622+
c.save({"dep/conanfile.py": conanfile,
623+
"pkg/conanfile.py": GenConanfile().with_requires("dep1/0.1", "dep2/0.1", "dep3/0.1")})
624+
c.run("export dep --name=dep1")
625+
c.run("export dep --name=dep2")
626+
c.run("export dep --name=dep3")
627+
628+
c.run("install pkg --build=* -o *:myoption=1 -o ~dep1/*:myoption=2")
629+
assert "dep1/0.1: MYOPTION=1!!!" in c.out
630+
assert "dep2/0.1: MYOPTION=2!!!" in c.out
631+
assert "dep3/0.1: MYOPTION=2!!!" in c.out
632+
633+
# Order does matter for options with *:myoption patter, evaluates last
634+
c.run("install pkg --build=* -o ~dep1/*:myoption=2 -o *:myoption=1")
635+
assert "dep1/0.1: MYOPTION=1!!!" in c.out
636+
assert "dep2/0.1: MYOPTION=1!!!" in c.out
637+
assert "dep3/0.1: MYOPTION=1!!!" in c.out
638+
639+
# dep3 comes later, works
640+
c.run("install pkg --build=* -o *:myoption=1 -o ~dep1/*:myoption=2 -o dep3/*:myoption=3")
641+
assert "dep1/0.1: MYOPTION=1!!!" in c.out
642+
assert "dep2/0.1: MYOPTION=2!!!" in c.out
643+
assert "dep3/0.1: MYOPTION=3!!!" in c.out
644+
645+
# dep3 comes first, then last !dep1 pattern prevails
646+
c.run("install pkg --build=* -o *:myoption=1 -o dep3/*:myoption=3 -o ~dep1/*:myoption=2")
647+
assert "dep1/0.1: MYOPTION=1!!!" in c.out
648+
assert "dep2/0.1: MYOPTION=2!!!" in c.out
649+
assert "dep3/0.1: MYOPTION=2!!!" in c.out
650+
651+
614652
class TestTransitiveOptionsSharedInvisible:
615653
"""
616654
https://github.com/conan-io/conan/issues/13854

test/integration/options/test_configure_options.py

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1+
import os
12
import textwrap
2-
import unittest
33

44
from parameterized import parameterized
55

6+
from conan.test.assets.genconanfile import GenConanfile
67
from conan.test.utils.tools import TestClient
78

89

9-
class ConfigureOptionsTest(unittest.TestCase):
10+
class TestConfigureOptions:
1011
"""
1112
Test config_options(), configure() and package_id() methods can manage shared, fPIC and
1213
header_only options automatically.
@@ -50,9 +51,9 @@ def build(self):
5051
client.save({"conanfile.py": conanfile})
5152
client.run(f"create . --name=pkg --version=0.1 -s os={settings_os}")
5253
result = f"shared: {result[0]}, fPIC: {result[1]}, header only: {result[2]}"
53-
self.assertIn(result, client.out)
54+
assert result in client.out
5455
if header_only:
55-
self.assertIn("Package 'da39a3ee5e6b4b0d3255bfef95601890afd80709' created", client.out)
56+
assert "Package 'da39a3ee5e6b4b0d3255bfef95601890afd80709' created"in client.out
5657

5758
@parameterized.expand([
5859
["Linux", False, False, False, [False, False, False]],
@@ -102,9 +103,9 @@ def build(self):
102103
client.save({"conanfile.py": conanfile})
103104
client.run(f"create . --name=pkg --version=0.1 -s os={settings_os}")
104105
result = f"shared: {result[0]}, fPIC: {result[1]}, header only: {result[2]}"
105-
self.assertIn(result, client.out)
106+
assert result in client.out
106107
if header_only:
107-
self.assertIn("Package 'da39a3ee5e6b4b0d3255bfef95601890afd80709' created", client.out)
108+
assert "Package 'da39a3ee5e6b4b0d3255bfef95601890afd80709' created"in client.out
108109

109110
def test_header_package_type_pid(self):
110111
"""
@@ -122,7 +123,7 @@ class Pkg(ConanFile):
122123
""")
123124
client.save({"conanfile.py": conanfile})
124125
client.run(f"create . --name=pkg --version=0.1")
125-
self.assertIn("Package 'da39a3ee5e6b4b0d3255bfef95601890afd80709' created", client.out)
126+
assert "Package 'da39a3ee5e6b4b0d3255bfef95601890afd80709' created" in client.out
126127

127128

128129
def test_config_options_override_behaviour():
@@ -149,3 +150,30 @@ def build(self):
149150

150151
tc.run("create . -o=&:foo=3")
151152
assert "Foo: 3" in tc.out
153+
154+
155+
def test_configure_transitive_option():
156+
c = TestClient(light=True)
157+
c.save({"conanfile.py": GenConanfile("zlib", "0.1").with_shared_option(False)})
158+
c.run("create . -o *:shared=True")
159+
160+
boost = textwrap.dedent("""
161+
from conan import ConanFile
162+
163+
class BoostConan(ConanFile):
164+
name = "boostdbg"
165+
version = "1.0"
166+
options = {"shared": [True, False]}
167+
default_options ={"shared": False}
168+
requires = "zlib/0.1"
169+
170+
def configure(self):
171+
self.options["zlib/*"].shared = self.options.shared
172+
""")
173+
174+
c.save({"conanfile.py": boost}, clean_first=True)
175+
c.run("create . -o boostdbg/*:shared=True")
176+
# It doesn't fail due to missing binary, as it assigned dependency shared=True
177+
pkg_folder = c.created_layout().package()
178+
conaninfo = c.load(os.path.join(pkg_folder, "conaninfo.txt"))
179+
assert "shared=True" in conaninfo

0 commit comments

Comments
 (0)