diff options
| author | ras0219 <533828+ras0219@users.noreply.github.com> | 2020-11-27 19:05:47 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-11-27 19:05:47 -0800 |
| commit | 896498fdbae91d5f97bfffcadef21b066277fcf2 (patch) | |
| tree | 7baa83b49db5c30f1dee5b0db7b97f1dedf7083d /toolsrc/src/vcpkg-test/versionplan.cpp | |
| parent | 6c9cda1635859571de5c964bbacdece824045305 (diff) | |
| download | vcpkg-896498fdbae91d5f97bfffcadef21b066277fcf2.tar.gz vcpkg-896498fdbae91d5f97bfffcadef21b066277fcf2.zip | |
[vcpkg] Introduce `create_versioned_install_plan()` (#14633)
* [vcpkg] Implement constraints in manifests
* [vcpkg] Add SourceControlFile::check_against_feature_flags to prevent accidentally ignoring versioning fields
* [vcpkg] Switch check_against_feature_flags to accept fs::path
* [vcpkg] Implement overrides parsing in manifests
* [vcpkg] Address CR comments
* [vcpkg] Initial implementation of create_versioned_install_plan()
* [vcpkg] Implement port-version minimums
* [vcpkg] Implement relaxation phase
* [vcpkg] Refactor tests to use check_name_and_version
* [vcpkg] Implemented simple relaxed scheme
* [vcpkg] More relaxed scheme tests
* [vcpkg] Mixed scheme testing
* [vcpkg] Support versions and features without defaults
* [vcpkg] Support versions and features without defaults 2
* [vcpkg] Only consider greater of toplevel and baseilne
* [vcpkg] Implement overrides
* [vcpkg] Install defaults
* [vcpkg] Handle defaults of transitive packages
* [vcpkg] Fix warnings for Span of initializer_list
* [vcpkg] Use CMakeVarProvider during versioned install
* [vcpkg] Handle inter-feature dependencies
* [vcpkg] Correctly handle qualified Dependencies at toplevel
* [vcpkg] Address CR comments
Co-authored-by: Robert Schumacher <roschuma@microsoft.com>
Diffstat (limited to 'toolsrc/src/vcpkg-test/versionplan.cpp')
| -rw-r--r-- | toolsrc/src/vcpkg-test/versionplan.cpp | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/toolsrc/src/vcpkg-test/versionplan.cpp b/toolsrc/src/vcpkg-test/versionplan.cpp new file mode 100644 index 000000000..2f82d21b4 --- /dev/null +++ b/toolsrc/src/vcpkg-test/versionplan.cpp @@ -0,0 +1,152 @@ +#include <catch2/catch.hpp> + +#include <vcpkg/dependencies.h> +#include <vcpkg/paragraphparser.h> +#include <vcpkg/portfileprovider.h> +#include <vcpkg/sourceparagraph.h> + +#include <vcpkg-test/mockcmakevarprovider.h> +#include <vcpkg-test/util.h> + +using namespace vcpkg; +using namespace vcpkg::Parse; + +TEST_CASE ("parse depends", "[dependencies]") +{ + auto w = parse_dependencies_list("liba (windows)"); + REQUIRE(w); + auto& v = *w.get(); + REQUIRE(v.size() == 1); + REQUIRE(v.at(0).name == "liba"); + REQUIRE(v.at(0).platform.evaluate({{"VCPKG_CMAKE_SYSTEM_NAME", ""}})); + REQUIRE(v.at(0).platform.evaluate({{"VCPKG_CMAKE_SYSTEM_NAME", "WindowsStore"}})); + REQUIRE(!v.at(0).platform.evaluate({{"VCPKG_CMAKE_SYSTEM_NAME", "Darwin"}})); +} + +TEST_CASE ("filter depends", "[dependencies]") +{ + const std::unordered_map<std::string, std::string> x64_win_cmake_vars{{"VCPKG_TARGET_ARCHITECTURE", "x64"}, + {"VCPKG_CMAKE_SYSTEM_NAME", ""}}; + + const std::unordered_map<std::string, std::string> arm_uwp_cmake_vars{{"VCPKG_TARGET_ARCHITECTURE", "arm"}, + {"VCPKG_CMAKE_SYSTEM_NAME", "WindowsStore"}}; + + auto deps_ = parse_dependencies_list("liba (!uwp), libb, libc (uwp)"); + REQUIRE(deps_); + auto& deps = *deps_.get(); + auto v = filter_dependencies(deps, Test::X64_WINDOWS, x64_win_cmake_vars); + REQUIRE(v.size() == 2); + REQUIRE(v.at(0).package_spec.name() == "liba"); + REQUIRE(v.at(1).package_spec.name() == "libb"); + + auto v2 = filter_dependencies(deps, Test::ARM_UWP, arm_uwp_cmake_vars); + REQUIRE(v.size() == 2); + REQUIRE(v2.at(0).package_spec.name() == "libb"); + REQUIRE(v2.at(1).package_spec.name() == "libc"); +} + +TEST_CASE ("parse feature depends", "[dependencies]") +{ + auto u_ = parse_dependencies_list("libwebp[anim, gif2webp, img2webp, info, mux, nearlossless, " + "simd, cwebp, dwebp], libwebp[vwebp-sdl, extras] (!osx)"); + REQUIRE(u_); + auto& v = *u_.get(); + REQUIRE(v.size() == 2); + auto&& a0 = v.at(0); + REQUIRE(a0.name == "libwebp"); + REQUIRE(a0.features.size() == 9); + REQUIRE(a0.platform.is_empty()); + + auto&& a1 = v.at(1); + REQUIRE(a1.name == "libwebp"); + REQUIRE(a1.features.size() == 2); + REQUIRE(!a1.platform.is_empty()); + REQUIRE(a1.platform.evaluate({{"VCPKG_CMAKE_SYSTEM_NAME", ""}})); + REQUIRE(a1.platform.evaluate({{"VCPKG_CMAKE_SYSTEM_NAME", "Linux"}})); + REQUIRE_FALSE(a1.platform.evaluate({{"VCPKG_CMAKE_SYSTEM_NAME", "Darwin"}})); +} + +TEST_CASE ("qualified dependency", "[dependencies]") +{ + using namespace Test; + PackageSpecMap spec_map; + auto spec_a = FullPackageSpec{spec_map.emplace("a", "b, b[b1] (linux)"), {}}; + auto spec_b = FullPackageSpec{spec_map.emplace("b", "", {{"b1", ""}}), {}}; + + PortFileProvider::MapPortFileProvider map_port{spec_map.map}; + MockCMakeVarProvider var_provider; + + auto plan = vcpkg::Dependencies::create_feature_install_plan(map_port, var_provider, {spec_a}, {}); + REQUIRE(plan.install_actions.size() == 2); + REQUIRE(plan.install_actions.at(0).feature_list == std::vector<std::string>{"core"}); + + FullPackageSpec linspec_a{{"a", Triplet::from_canonical_name("x64-linux")}, {}}; + var_provider.dep_info_vars[linspec_a.package_spec].emplace("VCPKG_CMAKE_SYSTEM_NAME", "Linux"); + auto plan2 = vcpkg::Dependencies::create_feature_install_plan(map_port, var_provider, {linspec_a}, {}); + REQUIRE(plan2.install_actions.size() == 2); + REQUIRE(plan2.install_actions.at(0).feature_list == std::vector<std::string>{"b1", "core"}); +} + +TEST_CASE ("resolve_deps_as_top_level", "[dependencies]") +{ + using namespace Test; + PackageSpecMap spec_map; + FullPackageSpec spec_a{spec_map.emplace("a", "b, b[b1] (linux)"), {}}; + FullPackageSpec spec_b{spec_map.emplace("b", "", {{"b1", ""}}), {}}; + FullPackageSpec spec_c{spec_map.emplace("c", "b", {{"c1", "b[b1]"}, {"c2", "c[c1], a"}}, {"c1"}), {"core"}}; + FullPackageSpec spec_d{spec_map.emplace("d", "c[core]"), {}}; + + PortFileProvider::MapPortFileProvider map_port{spec_map.map}; + MockCMakeVarProvider var_provider; + Triplet t_linux = Triplet::from_canonical_name("x64-linux"); + var_provider.dep_info_vars[{"a", t_linux}].emplace("VCPKG_CMAKE_SYSTEM_NAME", "Linux"); + { + auto deps = vcpkg::Dependencies::resolve_deps_as_top_level( + *spec_map.map.at("a").source_control_file, Test::X86_WINDOWS, {}, var_provider); + REQUIRE(deps.size() == 1); + REQUIRE(deps.at(0) == spec_b); + } + { + auto deps = vcpkg::Dependencies::resolve_deps_as_top_level( + *spec_map.map.at("a").source_control_file, t_linux, {}, var_provider); + REQUIRE(deps.size() == 1); + REQUIRE(deps.at(0) == FullPackageSpec({"b", t_linux}, {"b1"})); + } + { + // without defaults + auto deps = vcpkg::Dependencies::resolve_deps_as_top_level( + *spec_map.map.at("c").source_control_file, Test::X86_WINDOWS, {}, var_provider); + REQUIRE(deps.size() == 1); + REQUIRE(deps.at(0) == spec_b); + } + FullPackageSpec spec_b_with_b1{spec_b.package_spec, {"b1"}}; + { + // with defaults of c (c1) + auto deps = vcpkg::Dependencies::resolve_deps_as_top_level( + *spec_map.map.at("c").source_control_file, Test::X86_WINDOWS, {"default"}, var_provider); + REQUIRE(deps.size() == 1); + REQUIRE(deps.at(0) == spec_b_with_b1); + } + { + // with c1 + auto deps = vcpkg::Dependencies::resolve_deps_as_top_level( + *spec_map.map.at("c").source_control_file, Test::X86_WINDOWS, {"c1"}, var_provider); + REQUIRE(deps.size() == 1); + REQUIRE(deps.at(0) == spec_b_with_b1); + } + { + // with c2 implying c1 + auto deps = vcpkg::Dependencies::resolve_deps_as_top_level( + *spec_map.map.at("c").source_control_file, Test::X86_WINDOWS, {"c2"}, var_provider); + REQUIRE(deps.size() == 2); + REQUIRE(deps.at(0) == spec_a); + REQUIRE(deps.at(1) == spec_b_with_b1); + } + { + // d -> c[core] + auto deps = vcpkg::Dependencies::resolve_deps_as_top_level( + *spec_map.map.at("d").source_control_file, Test::X86_WINDOWS, {}, var_provider); + REQUIRE(deps.size() == 1); + REQUIRE(deps.at(0) == spec_c); + } +} |
