mirror of
https://github.com/NixOS/nix.git
synced 2025-12-09 18:41:03 +01:00
`Store::pathInfoToJSON` was a rather baroque functions, being full of parameters to support both parsed derivations and `nix path-info`. The common core of each, a simple `dValidPathInfo::toJSON` function, is factored out, but the rest of the logic is just duplicated and then specialized to its use-case (at which point it is no longer that duplicated). This keeps the human oriented CLI logic (which is currently unstable) and the core domain logic (export reference graphs with structured attrs, which is stable), separate, which I think is better.
79 lines
2.9 KiB
C++
79 lines
2.9 KiB
C++
#include <nlohmann/json.hpp>
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "path-info.hh"
|
|
|
|
#include "tests/characterization.hh"
|
|
#include "tests/libstore.hh"
|
|
|
|
namespace nix {
|
|
|
|
using nlohmann::json;
|
|
|
|
class PathInfoTest : public CharacterizationTest, public LibStoreTest
|
|
{
|
|
Path unitTestData = getUnitTestData() + "/libstore/path-info";
|
|
|
|
Path goldenMaster(PathView testStem) const override {
|
|
return unitTestData + "/" + testStem + ".json";
|
|
}
|
|
};
|
|
|
|
static ValidPathInfo makePathInfo(const Store & store, bool includeImpureInfo) {
|
|
ValidPathInfo info {
|
|
store,
|
|
"foo",
|
|
FixedOutputInfo {
|
|
.method = FileIngestionMethod::Recursive,
|
|
.hash = hashString(HashType::htSHA256, "(...)"),
|
|
|
|
.references = {
|
|
.others = {
|
|
StorePath {
|
|
"g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-bar",
|
|
},
|
|
},
|
|
.self = true,
|
|
},
|
|
},
|
|
Hash::parseSRI("sha256-FePFYIlMuycIXPZbWi7LGEiMmZSX9FMbaQenWBzm1Sc="),
|
|
};
|
|
info.narSize = 34878;
|
|
if (includeImpureInfo) {
|
|
info.deriver = StorePath {
|
|
"g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-bar.drv",
|
|
};
|
|
info.registrationTime = 23423;
|
|
info.ultimate = true;
|
|
info.sigs = { "asdf", "qwer" };
|
|
}
|
|
return info;
|
|
}
|
|
|
|
#define JSON_TEST(STEM, PURE) \
|
|
TEST_F(PathInfoTest, PathInfo_ ## STEM ## _from_json) { \
|
|
readTest(#STEM, [&](const auto & encoded_) { \
|
|
auto encoded = json::parse(encoded_); \
|
|
ValidPathInfo got = ValidPathInfo::fromJSON( \
|
|
*store, \
|
|
encoded); \
|
|
auto expected = makePathInfo(*store, PURE); \
|
|
ASSERT_EQ(got, expected); \
|
|
}); \
|
|
} \
|
|
\
|
|
TEST_F(PathInfoTest, PathInfo_ ## STEM ## _to_json) { \
|
|
writeTest(#STEM, [&]() -> json { \
|
|
return makePathInfo(*store, PURE) \
|
|
.toJSON(*store, PURE, HashFormat::SRI); \
|
|
}, [](const auto & file) { \
|
|
return json::parse(readFile(file)); \
|
|
}, [](const auto & file, const auto & got) { \
|
|
return writeFile(file, got.dump(2) + "\n"); \
|
|
}); \
|
|
}
|
|
|
|
JSON_TEST(pure, false)
|
|
JSON_TEST(impure, true)
|
|
|
|
}
|