diff options
Diffstat (limited to 'third_party/nix/src/tests/references_test.cc')
-rw-r--r-- | third_party/nix/src/tests/references_test.cc | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/third_party/nix/src/tests/references_test.cc b/third_party/nix/src/tests/references_test.cc new file mode 100644 index 000000000000..8dcb3ed37a8b --- /dev/null +++ b/third_party/nix/src/tests/references_test.cc @@ -0,0 +1,74 @@ +#include "libstore/references.hh" + +#include <cstdio> +#include <fstream> +#include <ostream> +#include <unordered_set> + +#include <absl/strings/str_format.h> +#include <gtest/gtest.h> +#include <rapidcheck.h> +#include <rapidcheck/gtest.h> + +#include "libutil/hash.hh" + +class ReferencesTest : public ::testing::Test {}; + +namespace nix { + +TEST(ReferencesTest, ScanForOneReferenceNotFound) { + char path[] = "store_XXXXXXX"; + auto f = mkstemp(path); + + auto hash = hashString(htSHA256, "foo"); + auto ref = absl::StrFormat("/nix/store/%s-foo", hash.ToStorePathHash()); + + HashResult hr; + auto result = scanForReferences(path, {ref}, hr); + + ASSERT_EQ(result.find(ref), result.end()); + + EXPECT_EQ(close(f), 0); +} + +TEST(ReferencesTest, ScanForOneReferenceFound) { + char path[] = "store_XXXXXXX"; + auto f = mkstemp(path); + + auto hash = hashString(htSHA256, "foo"); + auto ref = absl::StrFormat("/nix/store/%s-foo", hash.ToStorePathHash()); + + EXPECT_GT(write(f, ref.c_str(), sizeof(char) * ref.size()), 0); + + HashResult hr; + auto result = scanForReferences(path, {ref}, hr); + + ASSERT_NE(result.find(ref), result.end()); + + ASSERT_EQ(close(f), 0); +} + +RC_GTEST_PROP(ReferencesTest, ScanForReferences, + (std::unordered_set<std::string> strs)) { + char path[] = "store_XXXXXXX"; + auto f = mkstemp(path); + + PathSet refs; + for (const auto& s : strs) { + auto hash = hashString(htSHA256, s); + auto ref = absl::StrFormat("/nix/store/%s-foo", hash.ToStorePathHash()); + refs.insert(ref); + RC_ASSERT(write(f, ref.c_str(), sizeof(char) * ref.size()) > 0); + } + + HashResult hr; + auto result = scanForReferences(path, refs, hr); + + for (const auto& ref : refs) { + RC_ASSERT(result.find(ref) != result.end()); + } + + RC_ASSERT(close(f) == 0); +} + +} // namespace nix |