Skip to content

Commit

Permalink
more test quality and coverage (#17770)
Browse files Browse the repository at this point in the history
* more test quality and coverage

* fix

* moved to functional

* removed import

* fix qbsprofile tests
  • Loading branch information
memsharded authored Feb 13, 2025
1 parent b6788ad commit 75fcab7
Show file tree
Hide file tree
Showing 10 changed files with 35 additions and 158 deletions.
2 changes: 0 additions & 2 deletions conan/tools/qbs/qbsprofile.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import os
import shlex
import shutil
import platform
import textwrap
Expand Down Expand Up @@ -214,7 +213,6 @@ def _toolchain_properties(self):
toolchain = self._get_qbs_toolchain()
the_os = self._conanfile.settings.get_safe('os')
vcvars_path = None
compiler = None
if the_os == 'Windows' and toolchain == 'msvc':
compiler = _find_msvc(self._conanfile)
elif the_os == 'Windows' and toolchain == 'clang-cl':
Expand Down
36 changes: 5 additions & 31 deletions conans/server/store/disk_adapter.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
import os
from contextlib import contextmanager

import fasteners

from conan.internal.errors import NotFoundException
from conans.util.files import md5sum, rmdir
from conans.util.files import rmdir
from conans.server.utils.files import path_exists, relative_dirs


@contextmanager
def no_op():
yield


class ServerDiskAdapter(object):
class ServerDiskAdapter:
"""Manage access to disk files with common methods required
for conan operations"""
def __init__(self, base_url, base_storage_path):
Expand All @@ -24,48 +18,28 @@ def __init__(self, base_url, base_storage_path):
# URLs are generated removing this base path
self._store_folder = base_storage_path

def _get_paths(self, absolute_path, files_subset):
def get_file_list(self, absolute_path=""):
if not path_exists(absolute_path, self._store_folder):
raise NotFoundException("")
paths = relative_dirs(absolute_path)
if files_subset is not None:
paths = set(paths).intersection(set(files_subset))
abs_paths = [os.path.join(absolute_path, relpath) for relpath in paths]
return abs_paths

def get_snapshot(self, absolute_path="", files_subset=None):
"""returns a dict with the filepaths and md5"""
abs_paths = self._get_paths(absolute_path, files_subset)
return {filepath: md5sum(filepath) for filepath in abs_paths}

def get_file_list(self, absolute_path="", files_subset=None):
abs_paths = self._get_paths(absolute_path, files_subset)
return abs_paths

def delete_folder(self, path):
"""Delete folder from disk. Path already contains base dir"""
if not path_exists(path, self._store_folder):
raise NotFoundException("")
rmdir(path)

def delete_file(self, path):
"""Delete files from bucket. Path already contains base dir"""
if not path_exists(path, self._store_folder):
raise NotFoundException("")
os.remove(path)

def path_exists(self, path):
return os.path.exists(path)

def read_file(self, path, lock_file):
with fasteners.InterProcessLock(lock_file) if lock_file else no_op():
with fasteners.InterProcessLock(lock_file):
with open(path) as f:
return f.read()

def write_file(self, path, contents, lock_file):
with fasteners.InterProcessLock(lock_file) if lock_file else no_op():
with fasteners.InterProcessLock(lock_file):
with open(path, "w") as f:
f.write(contents)

def base_storage_folder(self):
return self._store_folder
69 changes: 1 addition & 68 deletions conans/server/store/server_store.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from os.path import join, normpath, relpath

from conan.internal.errors import RecipeNotFoundException, PackageNotFoundException
from conan.errors import ConanException
from conan.internal.paths import CONAN_MANIFEST
from conan.api.model import PkgReference
from conan.api.model import RecipeReference
Expand Down Expand Up @@ -40,14 +39,6 @@ def conan_revisions_root(self, ref):
def packages(self, ref):
return join(self.base_folder(ref), SERVER_PACKAGES_FOLDER)

def package_revisions_root(self, pref):
assert pref.revision is None, "BUG: server store doesn't need PREV to " \
"package_revisions_root"
assert pref.ref.revision is not None, "BUG: server store needs RREV to " \
"package_revisions_root"
tmp = join(self.packages(pref.ref), pref.package_id)
return tmp

def package(self, pref):
assert pref.revision is not None, "BUG: server store needs PREV for package"
tmp = join(self.packages(pref.ref), pref.package_id)
Expand Down Expand Up @@ -117,21 +108,6 @@ def remove_recipe(self, ref):
self._remove_revision_from_index(ref)
self._delete_empty_dirs(ref)

def remove_packages(self, ref, package_ids_filter):
assert isinstance(ref, RecipeReference)
assert isinstance(package_ids_filter, list)

if not package_ids_filter: # Remove all packages
packages_folder = self.packages(ref)
self._storage_adapter.delete_folder(packages_folder)
else:
for package_id in package_ids_filter:
pref = PkgReference(ref, package_id)
# Remove all package revisions
package_folder = self.package_revisions_root(pref)
self._storage_adapter.delete_folder(package_folder)
self._delete_empty_dirs(ref)

def remove_package(self, pref):
assert isinstance(pref, PkgReference)
assert pref.revision is not None, "BUG: server store needs PREV remove_package"
Expand All @@ -146,48 +122,6 @@ def remove_all_packages(self, ref):
packages_folder = self.packages(ref)
self._storage_adapter.delete_folder(packages_folder)

def remove_package_files(self, pref, files):
subpath = self.package(pref)
for filepath in files:
path = join(subpath, filepath)
self._storage_adapter.delete_file(path)

def get_upload_package_urls(self, pref, filesizes, user):
"""
:param pref: PkgReference
:param filesizes: {filepath: bytes}
:return {filepath: url} """
assert isinstance(pref, PkgReference)
assert isinstance(filesizes, dict)

return self._get_upload_urls(self.package(pref), filesizes, user)

def _get_download_urls(self, relative_path, files_subset=None, user=None):
"""Get the download urls for the whole relative_path or just
for a subset of files. files_subset has to be a list with paths
relative to relative_path"""
relative_snap = self._storage_adapter.get_snapshot(relative_path, files_subset)
urls = self._storage_adapter.get_download_urls(list(relative_snap.keys()), user)
urls = self._relativize_keys(urls, relative_path)
return urls

def _get_upload_urls(self, relative_path, filesizes, user=None):
abs_paths = {}
for path, filesize in filesizes.items():
abs_paths[join(relative_path, path)] = filesize
urls = self._storage_adapter.get_upload_urls(abs_paths, user)
urls = self._relativize_keys(urls, relative_path)
return urls

@staticmethod
def _relativize_keys(the_dict, basepath):
"""Relativize the keys in the dict relative to basepath"""
ret = {}
for old_key, value in the_dict.items():
new_key = relpath(old_key, basepath)
ret[new_key] = value
return ret

# Methods to manage revisions
def get_last_revision(self, ref):
assert(isinstance(ref, RecipeReference))
Expand Down Expand Up @@ -231,8 +165,7 @@ def _update_last_revision(self, rev_file_path, ref):
rev_list = RevisionList.loads(rev_file)
else:
rev_list = RevisionList()
if ref.revision is None:
raise ConanException("Invalid revision for: %s" % repr(ref))
assert ref.revision is not None, "Invalid revision for: %s" % repr(ref)
rev_list.add_revision(ref.revision)
self._storage_adapter.write_file(rev_file_path, rev_list.dumps(),
lock_file=rev_file_path + ".lock")
Expand Down
7 changes: 3 additions & 4 deletions test/functional/command/profile_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,10 +102,9 @@ def test_detect_default_in_mac_os_using_gcc_as_default(self):
# See: https://github.com/conan-io/conan/issues/2231
_, output = detect_runner("gcc --version")

if "clang" not in output:
# Not test scenario gcc should display clang in output
# see: https://stackoverflow.com/questions/19535422/os-x-10-9-gcc-links-to-clang
raise Exception("Apple gcc doesn't point to clang with gcc frontend anymore!")
assert "clang" in output, "Apple gcc doesn't point to clang with gcc frontend anymore!"
# Not test scenario gcc should display clang in output
# see: https://stackoverflow.com/questions/19535422/os-x-10-9-gcc-links-to-clang

output = RedirectedTestOutput() # Initialize each command
with redirect_output(output):
Expand Down
7 changes: 2 additions & 5 deletions test/functional/revisions_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -740,15 +740,12 @@ def test_reupload_older_revision_new_binaries():
rrev2 = c.exported_recipe_revision()
c.run("upload * -r=default -c")

def check_order(inverse=False):
def check_order():
c.run("list pkg/0.1#* -r=default")
out = str(c.out)
assert rrev1 in out
assert rrev2 in out
if inverse:
assert out.find(rrev1) > out.find(rrev2)
else:
assert out.find(rrev1) < out.find(rrev2)
assert out.find(rrev1) < out.find(rrev2)

check_order()

Expand Down
Empty file.
17 changes: 0 additions & 17 deletions test/functional/toolchains/cmake/cmakedeps/test_cmakedeps.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import os
import platform
import textwrap
from conan.test.utils.mocks import ConanFileMock

import pytest

Expand All @@ -10,7 +9,6 @@
from conan.test.assets.pkg_cmake import pkg_cmake
from conan.test.assets.sources import gen_function_cpp, gen_function_h
from conan.test.utils.tools import TestClient, NO_SETTINGS_PACKAGE_ID
from conan.tools.files import replace_in_file


@pytest.fixture
Expand Down Expand Up @@ -40,8 +38,6 @@ def package(self):
@pytest.mark.tool("cmake")
@pytest.mark.skipif(platform.system() != "Windows", reason="Windows only multi-config")
def test_transitive_multi_windows(client):
# TODO: Make a full linking example, with correct header transitivity

# Save conanfile and example
conanfile = textwrap.dedent("""
[requires]
Expand Down Expand Up @@ -83,19 +79,6 @@ def test_transitive_multi_windows(client):
assert "main: Release!" in client.out
assert "MYVARliba: Release" in client.out
assert "MYVARlibb: Release" in client.out
else:
# The CMakePresets IS MESSING WITH THE BUILD TYPE and then ignores the -D so I remove it
replace_in_file(ConanFileMock(), os.path.join(client.current_folder, "CMakePresets.json"),
"CMAKE_BUILD_TYPE", "DONT_MESS_WITH_BUILD_TYPE")
for bt in ("Debug", "Release"):
client.run_command('cmake .. -DCMAKE_BUILD_TYPE={} '
'-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmake'.format(bt))
client.run_command('cmake --build . --clean-first')

client.run_command('./example')
assert "main: {}!".format(bt) in client.out
assert "MYVARliba: {}".format(bt) in client.out
assert "MYVARlibb: {}".format(bt) in client.out


@pytest.mark.tool("cmake")
Expand Down
4 changes: 0 additions & 4 deletions test/functional/toolchains/cmake/test_cmake.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,10 +250,6 @@ def _verify_out(marker=">>"):

opposite_build_type = "Release" if build_type == "Debug" else "Debug"
settings["build_type"] = opposite_build_type
if runtime == "MTd":
settings["compiler.runtime"] = "MT"
if runtime == "MD":
settings["compiler.runtime"] = "MDd"
self._run_build(settings, options)

self._run_app("Release", bin_folder=True)
Expand Down
Loading

0 comments on commit 75fcab7

Please sign in to comment.