[M2] add SQLite overlay + add_manual

This commit is contained in:
2026-05-08 12:14:24 +00:00
parent d5715428ea
commit cafa403a58
8 changed files with 524 additions and 49 deletions

View File

@@ -10,15 +10,31 @@ using cargoxx::linkdb::expand_targets;
using cargoxx::linkdb::substitute_components;
using cargoxx::util::ErrorCode;
TEST_CASE("Database::open loads the curated linkdb", "[linkdb]") {
auto r = Database::open();
namespace {
auto fresh_overlay() -> std::filesystem::path {
auto d = std::filesystem::temp_directory_path() /
std::format("cargoxx-linkdb-test-{}", std::random_device{}());
std::filesystem::create_directories(d);
return d / "overlay.sqlite";
}
auto open_db() -> Database {
auto r = Database::open(fresh_overlay());
REQUIRE(r.has_value());
return std::move(*r);
}
} // namespace
TEST_CASE("Database::open loads the curated linkdb", "[linkdb]") {
auto db = open_db();
(void)db;
}
TEST_CASE("resolve returns the curated recipe for fmt 10", "[linkdb]") {
auto db = Database::open();
REQUIRE(db.has_value());
auto rec = db->resolve("fmt", "10.2.0");
auto db = open_db();
auto rec = db.resolve("fmt", "10.2.0");
REQUIRE(rec.has_value());
REQUIRE(rec->nixpkgs_attr == "fmt_10");
REQUIRE(rec->find_package == "fmt CONFIG REQUIRED");
@@ -27,25 +43,22 @@ TEST_CASE("resolve returns the curated recipe for fmt 10", "[linkdb]") {
}
TEST_CASE("resolve returns the older fmt recipe for fmt 8", "[linkdb]") {
auto db = Database::open();
REQUIRE(db.has_value());
auto rec = db->resolve("fmt", "8.1.0");
auto db = open_db();
auto rec = db.resolve("fmt", "8.1.0");
REQUIRE(rec.has_value());
REQUIRE(rec->nixpkgs_attr == "fmt_8");
}
TEST_CASE("resolve fails for an unknown package", "[linkdb]") {
auto db = Database::open();
REQUIRE(db.has_value());
auto rec = db->resolve("obscurelib", "0.0.1");
auto db = open_db();
auto rec = db.resolve("obscurelib", "0.0.1");
REQUIRE_FALSE(rec.has_value());
REQUIRE(rec.error().code == ErrorCode::LinkdbUnknownPackage);
}
TEST_CASE("resolve substitutes boost components", "[linkdb]") {
auto db = Database::open();
REQUIRE(db.has_value());
auto rec = db->resolve("boost", "1.84.0", {"filesystem", "system"});
auto db = open_db();
auto rec = db.resolve("boost", "1.84.0", {"filesystem", "system"});
REQUIRE(rec.has_value());
REQUIRE(rec->find_package == "Boost REQUIRED COMPONENTS filesystem system");
REQUIRE(rec->targets ==
@@ -54,26 +67,23 @@ TEST_CASE("resolve substitutes boost components", "[linkdb]") {
TEST_CASE("resolve fails when a componentized package gets no components",
"[linkdb]") {
auto db = Database::open();
REQUIRE(db.has_value());
auto rec = db->resolve("boost", "1.84.0");
auto db = open_db();
auto rec = db.resolve("boost", "1.84.0");
REQUIRE_FALSE(rec.has_value());
REQUIRE(rec.error().code == ErrorCode::LinkdbComponentNotSupported);
}
TEST_CASE("resolve fails when components are passed to a non-componentized package",
"[linkdb]") {
auto db = Database::open();
REQUIRE(db.has_value());
auto rec = db->resolve("fmt", "10.2.0", {"core"});
auto db = open_db();
auto rec = db.resolve("fmt", "10.2.0", {"core"});
REQUIRE_FALSE(rec.has_value());
REQUIRE(rec.error().code == ErrorCode::LinkdbComponentNotSupported);
}
TEST_CASE("resolve handles wildcard versions", "[linkdb]") {
auto db = Database::open();
REQUIRE(db.has_value());
auto rec = db->resolve("openssl", "3.2.0");
auto db = open_db();
auto rec = db.resolve("openssl", "3.2.0");
REQUIRE(rec.has_value());
REQUIRE(rec->find_package == "OpenSSL REQUIRED");
REQUIRE(rec->targets ==
@@ -81,8 +91,7 @@ TEST_CASE("resolve handles wildcard versions", "[linkdb]") {
}
TEST_CASE("resolve covers all 25 curated packages", "[linkdb]") {
auto db = Database::open();
REQUIRE(db.has_value());
auto db = open_db();
struct Sample {
std::string name;
@@ -118,7 +127,7 @@ TEST_CASE("resolve covers all 25 curated packages", "[linkdb]") {
};
for (const auto& s : samples) {
auto rec = db->resolve(s.name, s.version, s.components);
auto rec = db.resolve(s.name, s.version, s.components);
INFO("resolving " << s.name);
REQUIRE(rec.has_value());
REQUIRE_FALSE(rec->nixpkgs_attr.empty());