#include #include "nix/util/memory-source-accessor.hh" #include "nix/util/tests/json-characterization.hh" namespace nix { namespace memory_source_accessor { using namespace std::literals; using File = MemorySourceAccessor::File; ref exampleSimple() { auto sc = make_ref(); sc->root = File{File::Regular{ .executable = false, .contents = "asdf", }}; return sc; } ref exampleComplex() { auto files = make_ref(); files->root = File::Directory{ .entries{ { "foo", File::Regular{ .contents = "hello\n\0\n\tworld!"s, }, }, { "bar", File::Directory{ .entries = { { "baz", File::Regular{ .executable = true, .contents = "good day,\n\0\n\tworld!"s, }, }, { "quux", File::Symlink{ .target = "/over/there", }, }, }, }, }, }, }; return files; } } // namespace memory_source_accessor /* ---------------------------------------------------------------------------- * JSON * --------------------------------------------------------------------------*/ class MemorySourceAccessorTest : public virtual CharacterizationTest { std::filesystem::path unitTestData = getUnitTestData() / "memory-source-accessor"; public: std::filesystem::path goldenMaster(std::string_view testStem) const override { return unitTestData / testStem; } }; using nlohmann::json; struct MemorySourceAccessorJsonTest : MemorySourceAccessorTest, JsonCharacterizationTest, ::testing::WithParamInterface> {}; TEST_P(MemorySourceAccessorJsonTest, from_json) { auto & [name, expected] = GetParam(); /* Cannot use `readJsonTest` because need to compare `root` field of the source accessors for equality. */ readTest(Path{name} + ".json", [&](const auto & encodedRaw) { auto encoded = json::parse(encodedRaw); auto decoded = static_cast(encoded); ASSERT_EQ(decoded.root, expected.root); }); } TEST_P(MemorySourceAccessorJsonTest, to_json) { auto & [name, value] = GetParam(); writeJsonTest(name, value); } INSTANTIATE_TEST_SUITE_P( MemorySourceAccessorJSON, MemorySourceAccessorJsonTest, ::testing::Values( std::pair{ "simple", *memory_source_accessor::exampleSimple(), }, std::pair{ "complex", *memory_source_accessor::exampleComplex(), })); } // namespace nix