Skip to content

Commit dfc241e

Browse files
committed
intermediate version
1 parent af5420b commit dfc241e

7 files changed

Lines changed: 124 additions & 36 deletions

File tree

src/tests/cpp_dev/conan/__init__.py

Whitespace-only changes.

src/tests/cpp_dev/dependency/conan/test_command_wrapper.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from cpp_dev.dependency.conan.utils import conan_env
2323

2424
from .utils.env import ConanTestEnv, create_conan_env
25-
from .utils.server import ConanServer, launch_conan_server
25+
from .utils.server import ConanServer, launch_conan_test_server
2626

2727
MockType = MagicMock | AsyncMock
2828

@@ -69,7 +69,7 @@ class ConanTestEnvironment:
6969

7070
@pytest.fixture
7171
def conan_test_environment(tmp_path: Path, unused_http_port: int) -> Generator[ConanTestEnvironment]:
72-
with launch_conan_server(tmp_path / "server", unused_http_port) as server:
72+
with launch_conan_test_server(tmp_path / "server", unused_http_port) as server:
7373
with create_conan_env(tmp_path / "conan", server.http_port) as conan:
7474
conan.create_and_upload_package(ConanPackageReference("dep/1.0.0@official/cppdev"), [])
7575
conan.create_and_upload_package(ConanPackageReference("cpd1/1.0.0@official/cppdev"), [])
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Copyright (c) 2024 Andi Hellmund. All rights reserved.
2+
3+
# This work is licensed under the terms of the BSD-3-Clause license.
4+
# For a copy, see <https://opensource.org/license/bsd-3-clause>.
5+
6+
from collections.abc import Generator
7+
from dataclasses import dataclass
8+
from pathlib import Path
9+
10+
import pytest
11+
12+
from cpp_dev.common.version import SemanticVersion
13+
from cpp_dev.dependency.conan.provider import ConanDependencyProvider
14+
from cpp_dev.dependency.conan.types import ConanPackageReference
15+
from tests.cpp_dev.dependency.conan.utils.env import (ConanTestEnv,
16+
create_conan_env)
17+
from tests.cpp_dev.dependency.conan.utils.server import (
18+
ConanServer, launch_conan_test_server)
19+
20+
21+
@dataclass
22+
class ConanTestEnvironment:
23+
server: ConanServer
24+
conan: ConanTestEnv
25+
26+
27+
@pytest.fixture
28+
def conan_test_environment(tmp_path: Path, unused_http_port: int) -> Generator[ConanTestEnvironment]:
29+
with launch_conan_test_server(tmp_path / "server", unused_http_port) as conan_server:
30+
with create_conan_env(tmp_path / "conan", conan_server.http_port) as conan_env:
31+
conan_env.create_and_upload_package(ConanPackageReference("cpd/1.0.0@official/cppdev"), [])
32+
conan_env.create_and_upload_package(ConanPackageReference("cpd/2.0.0@custom/cppdev"), [])
33+
conan_env.create_and_upload_package(ConanPackageReference("cpd/3.0.0@official/cppdev"), [])
34+
yield ConanTestEnvironment(
35+
server=conan_server,
36+
conan=conan_env
37+
)
38+
39+
40+
def test_get_available_versions(conan_test_environment: ConanTestEnvironment) -> None:
41+
provider = ConanDependencyProvider(conan_test_environment.conan.conan_dir)
42+
assert provider.fetch_versions("official", "cpd") == [
43+
SemanticVersion("3.0.0"),
44+
SemanticVersion("1.0.0"),
45+
]

src/tests/cpp_dev/dependency/conan/utils/env.py

Lines changed: 55 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,53 +4,86 @@
44
# For a copy, see <https://opensource.org/license/bsd-3-clause>.
55

66
import json
7-
from collections.abc import Generator
7+
from collections.abc import Generator, Mapping
88
from contextlib import contextmanager
9+
from dataclasses import dataclass
910
from pathlib import Path
1011
from textwrap import dedent
1112

13+
from cpp_dev.common.types import CppStandard
1214
from cpp_dev.common.utils import ensure_dir_exists
1315
from cpp_dev.dependency.conan.command_wrapper import conan_create, conan_upload
1416
from cpp_dev.dependency.conan.setup import CONAN_REMOTE, initialize_conan
1517
from cpp_dev.dependency.conan.types import ConanPackageReference
1618
from cpp_dev.dependency.conan.utils import conan_env
19+
from tests.cpp_dev.dependency.conan.utils.server import (
20+
ConanServer, launch_conan_test_server)
1721

1822
###############################################################################
1923
# Public API ###
2024
###############################################################################
2125

26+
FileSpec = Mapping[Path, str]
27+
28+
@dataclass
29+
class ConanTestPackage:
30+
ref: ConanPackageReference
31+
dependencies: list[ConanPackageReference]
32+
cpp_standard: CppStandard
33+
bin_files: FileSpec | None = None
34+
lib_files: FileSpec | None = None
35+
include_files: FileSpec | None = None
36+
37+
2238
class ConanTestEnv:
2339
"""A Conan environment for testing."""
2440

25-
def __init__(self, conan_dir: Path, profile: str) -> None:
26-
self._conan_dir = conan_dir
27-
self._package_dir = conan_dir / ".conan_test_env"
41+
def __init__(self, conan_home_dir: Path, profile: str, server: ConanServer) -> None:
42+
self._conan_home_dir = conan_home_dir
43+
self._package_dir = conan_home_dir / ".conan_package_creation"
2844
ensure_dir_exists(self._package_dir)
2945
self._profile = profile
46+
self._server = server
3047

31-
def create_and_upload_package(self, ref: ConanPackageReference, dependencies: list[ConanPackageReference]) -> None:
48+
def create_and_upload_packages(self, packages: list[ConanTestPackage]) -> None:
3249
"""Create and upload a Conan package for testing."""
33-
_create_and_upload_conan_package(self._package_dir, ref, dependencies, self._profile)
50+
for package in packages:
51+
_create_and_upload_conan_package(self._package_dir, package, self._profile)
3452

3553
@property
36-
def conan_dir(self) -> Path:
54+
def conan_home_dir(self) -> Path:
3755
"""Return the base directory of the Conan environment."""
38-
return self._conan_dir
56+
return self._conan_home_dir
3957

4058
@property
4159
def profile(self) -> str:
4260
"""Return the profile used for testing."""
4361
return self._profile
62+
63+
@property
64+
def server(self) -> ConanServer:
65+
"""Return the server used for testing."""
66+
return self._server
4467

4568

4669
@contextmanager
47-
def create_conan_env(conan_dir: Path, server_http_port: int) -> Generator[ConanTestEnv]:
70+
def create_conan_test_env(base_dir: Path, server_http_port: int, packages: list[ConanTestPackage]) -> Generator[ConanTestEnv]:
4871
"""Create a Conan environment for testing."""
49-
ensure_dir_exists(conan_dir)
50-
source_config_path, profile = _create_conan_source_config(conan_dir, server_http_port)
51-
initialize_conan(conan_dir, source_config_path)
52-
with conan_env(conan_dir):
53-
yield ConanTestEnv(conan_dir, profile)
72+
73+
# create the home for the conan server
74+
conan_server_dir = base_dir / "server"
75+
ensure_dir_exists(conan_server_dir)
76+
with launch_conan_test_server(conan_server_dir, server_http_port) as server:
77+
# create the home for the conan client
78+
conan_home_dir = base_dir / "conan_home"
79+
ensure_dir_exists(conan_home_dir)
80+
source_config_path, profile = _create_conan_source_config(conan_home_dir, server_http_port)
81+
initialize_conan(conan_home_dir, source_config_path)
82+
83+
with conan_env(conan_home_dir):
84+
conan_test_env = ConanTestEnv(conan_home_dir, profile, server)
85+
conan_test_env.create_and_upload_packages(packages)
86+
yield conan_test_env
5487

5588

5689
###############################################################################
@@ -101,13 +134,13 @@ def _create_conan_source_config(conan_dir: Path, server_http_port: int) -> tuple
101134
return source_config_path, PROFILE_NAME
102135

103136

104-
def _create_and_upload_conan_package(base_dir: Path, ref: ConanPackageReference, dependencies: list[ConanPackageReference], profile: str) -> None:
105-
package_dir = base_dir / f"{ref.name}_{ref.version}"
137+
def _create_and_upload_conan_package(base_dir: Path, package: ConanTestPackage, profile: str) -> None:
138+
package_dir = base_dir / f"{package.ref.name}_{package.ref.version}"
106139
ensure_dir_exists(package_dir)
107140

108141
conanfile_path = package_dir / "conanfile.py"
109142

110-
requirements = ",".join([f"\"{dep}\"" for dep in dependencies])
143+
requirements = ",".join([f"\"{dep}\"" for dep in package.dependencies])
111144
conanfile_path.write_text(dedent(
112145
"""
113146
from conan import ConanFile
@@ -120,11 +153,11 @@ class TestConan(ConanFile):
120153
121154
{requirements}
122155
""".format(
123-
name=ref.name,
124-
user=ref.user,
125-
version=ref.version,
126-
requirements=f"requires = {requirements}" if dependencies else ""
156+
name=package.ref.name,
157+
user=package.ref.user,
158+
version=package.ref.version,
159+
requirements=f"requires = {requirements}" if package.dependencies else ""
127160
)
128161
))
129162
conan_create(package_dir, profile)
130-
conan_upload(ref, CONAN_REMOTE)
163+
conan_upload(package.ref, CONAN_REMOTE)

src/tests/cpp_dev/dependency/conan/utils/server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ def compose_url(self) -> str:
3232
return f"http://{self.hostname}:{self.http_port}"
3333

3434
@contextmanager
35-
def launch_conan_server(server_dir: Path, http_port: int) -> Generator[ConanServer]:
36-
"""Launch a Conan server."""
35+
def launch_conan_test_server(server_dir: Path, http_port: int) -> Generator[ConanServer]:
36+
"""Launch a Conan server for testing."""
3737
connection_params = _create_conan_server_config(server_dir, http_port)
3838
process = _launch_conan_server(server_dir)
3939
_wait_for_server_start(connection_params)

src/tests/cpp_dev/dependency/conan/utils/test_env.py

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,25 @@
88
from cpp_dev.dependency.conan.command_wrapper import conan_list
99
from cpp_dev.dependency.conan.setup import CONAN_REMOTE
1010
from cpp_dev.dependency.conan.types import ConanPackageReference
11+
from tests.cpp_dev.dependency.conan.utils.server import \
12+
launch_conan_test_server
1113

12-
from .env import create_conan_env
13-
from .server import launch_conan_server
14+
from .env import ConanTestPackage, create_conan_test_env
1415

16+
TEST_PACKAGES = [
17+
ConanTestPackage(
18+
ref=ConanPackageReference("dep/1.0.0@official/cppdev"),
19+
dependencies=[],
20+
cpp_standard="c++17",
21+
),
22+
ConanTestPackage(
23+
ref=ConanPackageReference("test/1.0.0@official/cppdev"),
24+
dependencies=[ConanPackageReference("dep/1.0.0@official/cppdev")],
25+
cpp_standard="c++17",
26+
),
27+
]
1528

1629
def test_create_conan_env(tmp_path: Path, unused_http_port: int) -> None:
17-
with launch_conan_server(tmp_path / "server", unused_http_port) as conan_server:
18-
with create_conan_env(tmp_path / "conan", conan_server.http_port) as conan_env:
19-
conan_env.create_and_upload_package(ConanPackageReference("dep/1.0.0@official/cppdev"), [])
20-
conan_env.create_and_upload_package(ConanPackageReference("test/1.0.0@official/cppdev"), [ConanPackageReference("dep/1.0.0@official/cppdev")])
21-
result = conan_list(CONAN_REMOTE, "test")
22-
assert "test/1.0.0@official/cppdev" in result
30+
with create_conan_test_env(tmp_path, unused_http_port, TEST_PACKAGES) as conan_env:
31+
result = conan_list(CONAN_REMOTE, "test")
32+
assert ConanPackageReference("test/1.0.0@official/cppdev") in result

src/tests/cpp_dev/dependency/conan/utils/test_server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77

88
import requests
99

10-
from .server import launch_conan_server
10+
from .server import launch_conan_test_server
1111

1212

1313
def test_launch_conan_server(tmp_path: Path, unused_http_port: int) -> None:
14-
with launch_conan_server(tmp_path / "server", unused_http_port) as conan_server:
14+
with launch_conan_test_server(tmp_path / "server", unused_http_port) as conan_server:
1515
response = requests.get(conan_server.compose_url() + "/v1/ping", timeout=2)
1616
assert response.status_code == 200

0 commit comments

Comments
 (0)