aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/vcpkg-test/versionplan.cpp
diff options
context:
space:
mode:
authorras0219 <533828+ras0219@users.noreply.github.com>2020-11-27 19:05:47 -0800
committerGitHub <noreply@github.com>2020-11-27 19:05:47 -0800
commit896498fdbae91d5f97bfffcadef21b066277fcf2 (patch)
tree7baa83b49db5c30f1dee5b0db7b97f1dedf7083d /toolsrc/src/vcpkg-test/versionplan.cpp
parent6c9cda1635859571de5c964bbacdece824045305 (diff)
downloadvcpkg-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.cpp152
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);
+ }
+}