mirror of
https://github.com/NixOS/nix
synced 2025-07-02 17:41:48 +02:00
For example, instead of doing #include "nix/store-config.hh" #include "nix/derived-path.hh" Now do #include "nix/store/config.hh" #include "nix/store/derived-path.hh" This was originally planned in the issue, and also recent requested by Eelco. Most of the change is purely mechanical. There is just one small additional issue. See how, in the example above, we took this opportunity to also turn `<comp>-config.hh` into `<comp>/config.hh`. Well, there was already a `nix/util/config.{cc,hh}`. Even though there is not a public configuration header for libutil (which also would be called `nix/util/config.{cc,hh}`) that's still confusing, To avoid any such confusion, we renamed that to `nix/util/configuration.{cc,hh}`. Finally, note that the libflake headers already did this, so we didn't need to do anything to them. We wouldn't want to mistakenly get `nix/flake/flake/flake.hh`! Progress on #7876
123 lines
4 KiB
C++
123 lines
4 KiB
C++
#include "nix/store/nar-info-disk-cache.hh"
|
|
|
|
#include <gtest/gtest.h>
|
|
#include <rapidcheck/gtest.h>
|
|
#include "nix/store/sqlite.hh"
|
|
#include <sqlite3.h>
|
|
|
|
|
|
namespace nix {
|
|
|
|
TEST(NarInfoDiskCacheImpl, create_and_read) {
|
|
// This is a large single test to avoid some setup overhead.
|
|
|
|
int prio = 12345;
|
|
bool wantMassQuery = true;
|
|
|
|
Path tmpDir = createTempDir();
|
|
AutoDelete delTmpDir(tmpDir);
|
|
Path dbPath(tmpDir + "/test-narinfo-disk-cache.sqlite");
|
|
|
|
int savedId;
|
|
int barId;
|
|
SQLite db;
|
|
SQLiteStmt getIds;
|
|
|
|
{
|
|
auto cache = getTestNarInfoDiskCache(dbPath);
|
|
|
|
// Set up "background noise" and check that different caches receive different ids
|
|
{
|
|
auto bc1 = cache->createCache("https://bar", "/nix/storedir", wantMassQuery, prio);
|
|
auto bc2 = cache->createCache("https://xyz", "/nix/storedir", false, 12);
|
|
ASSERT_NE(bc1, bc2);
|
|
barId = bc1;
|
|
}
|
|
|
|
// Check that the fields are saved and returned correctly. This does not test
|
|
// the select statement yet, because of in-memory caching.
|
|
savedId = cache->createCache("http://foo", "/nix/storedir", wantMassQuery, prio);;
|
|
{
|
|
auto r = cache->upToDateCacheExists("http://foo");
|
|
ASSERT_TRUE(r);
|
|
ASSERT_EQ(r->priority, prio);
|
|
ASSERT_EQ(r->wantMassQuery, wantMassQuery);
|
|
ASSERT_EQ(savedId, r->id);
|
|
}
|
|
|
|
// We're going to pay special attention to the id field because we had a bug
|
|
// that changed it.
|
|
db = SQLite(dbPath);
|
|
getIds.create(db, "select id from BinaryCaches where url = 'http://foo'");
|
|
|
|
{
|
|
auto q(getIds.use());
|
|
ASSERT_TRUE(q.next());
|
|
ASSERT_EQ(savedId, q.getInt(0));
|
|
ASSERT_FALSE(q.next());
|
|
}
|
|
|
|
// Pretend that the caches are older, but keep one up to date, as "background noise"
|
|
db.exec("update BinaryCaches set timestamp = timestamp - 1 - 7 * 24 * 3600 where url <> 'https://xyz';");
|
|
|
|
// This shows that the in-memory cache works
|
|
{
|
|
auto r = cache->upToDateCacheExists("http://foo");
|
|
ASSERT_TRUE(r);
|
|
ASSERT_EQ(r->priority, prio);
|
|
ASSERT_EQ(r->wantMassQuery, wantMassQuery);
|
|
}
|
|
}
|
|
|
|
{
|
|
// We can't clear the in-memory cache, so we use a new cache object. This is
|
|
// more realistic anyway.
|
|
auto cache2 = getTestNarInfoDiskCache(dbPath);
|
|
|
|
{
|
|
auto r = cache2->upToDateCacheExists("http://foo");
|
|
ASSERT_FALSE(r);
|
|
}
|
|
|
|
// "Update", same data, check that the id number is reused
|
|
cache2->createCache("http://foo", "/nix/storedir", wantMassQuery, prio);
|
|
|
|
{
|
|
auto r = cache2->upToDateCacheExists("http://foo");
|
|
ASSERT_TRUE(r);
|
|
ASSERT_EQ(r->priority, prio);
|
|
ASSERT_EQ(r->wantMassQuery, wantMassQuery);
|
|
ASSERT_EQ(r->id, savedId);
|
|
}
|
|
|
|
{
|
|
auto q(getIds.use());
|
|
ASSERT_TRUE(q.next());
|
|
auto currentId = q.getInt(0);
|
|
ASSERT_FALSE(q.next());
|
|
ASSERT_EQ(currentId, savedId);
|
|
}
|
|
|
|
// Check that the fields can be modified, and the id remains the same
|
|
{
|
|
auto r0 = cache2->upToDateCacheExists("https://bar");
|
|
ASSERT_FALSE(r0);
|
|
|
|
cache2->createCache("https://bar", "/nix/storedir", !wantMassQuery, prio + 10);
|
|
auto r = cache2->upToDateCacheExists("https://bar");
|
|
ASSERT_EQ(r->wantMassQuery, !wantMassQuery);
|
|
ASSERT_EQ(r->priority, prio + 10);
|
|
ASSERT_EQ(r->id, barId);
|
|
}
|
|
|
|
// // Force update (no use case yet; we only retrieve cache metadata when stale based on timestamp)
|
|
// {
|
|
// cache2->createCache("https://bar", "/nix/storedir", wantMassQuery, prio + 20);
|
|
// auto r = cache2->upToDateCacheExists("https://bar");
|
|
// ASSERT_EQ(r->wantMassQuery, wantMassQuery);
|
|
// ASSERT_EQ(r->priority, prio + 20);
|
|
// }
|
|
}
|
|
}
|
|
|
|
}
|