Files
llvm-project/llvm/unittests/CAS/OnDiskKeyValueDBTest.cpp
Ben Langmuir 59bcec2685 [llvm][cas] Validate OnDiskKeyValueDB against the corresponding OnDiskGraphDB (#180852)
We were previously using the primary OnDiskGraphDB when validating the
upstream OnDiskKeyValueDB, which is incorrect since the values being
stored are direct offsets and therefore cannot be used across DBs
without translating to a hash value first.

rdar://170067863
2026-02-10 15:38:31 -08:00

72 lines
2.4 KiB
C++

//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "llvm/CAS/OnDiskKeyValueDB.h"
#include "CASTestConfig.h"
#include "OnDiskCommonUtils.h"
#include "llvm/Testing/Support/Error.h"
#include "llvm/Testing/Support/SupportHelpers.h"
#include "gtest/gtest.h"
using namespace llvm;
using namespace llvm::cas;
using namespace llvm::cas::ondisk;
using namespace llvm::unittest::cas;
TEST_F(OnDiskCASTest, OnDiskKeyValueDBTest) {
unittest::TempDir Temp("ondiskkv", /*Unique=*/true);
std::unique_ptr<OnDiskKeyValueDB> DB;
ASSERT_THAT_ERROR(OnDiskKeyValueDB::open(Temp.path(), "blake3",
sizeof(HashType), "test",
sizeof(ValueType))
.moveInto(DB),
Succeeded());
{
std::optional<ArrayRef<char>> Val;
ASSERT_THAT_ERROR(DB->get(digest("hello")).moveInto(Val), Succeeded());
EXPECT_FALSE(Val.has_value());
}
ValueType ValW = valueFromString("world");
std::optional<ArrayRef<char>> Val;
ASSERT_THAT_ERROR(DB->put(digest("hello"), ValW).moveInto(Val), Succeeded());
EXPECT_EQ(*Val, ArrayRef(ValW));
ASSERT_THAT_ERROR(
DB->put(digest("hello"), valueFromString("other")).moveInto(Val),
Succeeded());
EXPECT_EQ(*Val, ArrayRef(ValW));
{
std::optional<ArrayRef<char>> Val;
ASSERT_THAT_ERROR(DB->get(digest("hello")).moveInto(Val), Succeeded());
EXPECT_TRUE(Val.has_value());
EXPECT_EQ(*Val, ArrayRef(ValW));
}
// Validate
ASSERT_THAT_ERROR(DB->validate(), Succeeded());
// Size
{
size_t InitSize = DB->getStorageSize();
unsigned InitPrecent = DB->getHardStorageLimitUtilization();
// Insert a lot of entries.
for (unsigned I = 0; I < 1024 * 100; ++I) {
std::string Index = Twine(I).str();
std::optional<ArrayRef<char>> Val;
ASSERT_THAT_ERROR(
DB->put(digest(Index), valueFromString(Index)).moveInto(Val),
Succeeded());
}
EXPECT_GT(DB->getStorageSize(), InitSize);
EXPECT_GT(DB->getHardStorageLimitUtilization(), InitPrecent);
}
}