//===----------------------------------------------------------------------===// // // 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 DB; ASSERT_THAT_ERROR(OnDiskKeyValueDB::open(Temp.path(), "blake3", sizeof(HashType), "test", sizeof(ValueType)) .moveInto(DB), Succeeded()); { std::optional> Val; ASSERT_THAT_ERROR(DB->get(digest("hello")).moveInto(Val), Succeeded()); EXPECT_FALSE(Val.has_value()); } ValueType ValW = valueFromString("world"); std::optional> 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> Val; ASSERT_THAT_ERROR(DB->get(digest("hello")).moveInto(Val), Succeeded()); EXPECT_TRUE(Val.has_value()); EXPECT_EQ(*Val, ArrayRef(ValW)); } // Validate { auto ValidateFunc = [](FileOffset Offset, ArrayRef Data) -> Error { EXPECT_EQ(Data.size(), sizeof(ValueType)); return Error::success(); }; ASSERT_THAT_ERROR(DB->validate(ValidateFunc), 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> Val; ASSERT_THAT_ERROR( DB->put(digest(Index), valueFromString(Index)).moveInto(Val), Succeeded()); } EXPECT_GT(DB->getStorageSize(), InitSize); EXPECT_GT(DB->getHardStorageLimitUtilization(), InitPrecent); } }