From e4b7d6d5925208214927a9e8c8fd72c246bc70ff Mon Sep 17 00:00:00 2001 From: Andreas Rammhold Date: Mon, 25 May 2020 21:24:39 +0200 Subject: test(3p/nix/libexpr): add json/xml tests Backported from: https://github.com/andir/nix/commit/c1371b6fbb91caf53ebc94d3ae0250dbe7eb7eae Change-Id: Ida326cf1567081a56d747c4a72f036f55cfdea37 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1239 Tested-by: BuildkiteCI Reviewed-by: Kane York --- third_party/nix/src/tests/value-to-json.cc | 287 +++++++++++++++++++++++++++++ 1 file changed, 287 insertions(+) create mode 100644 third_party/nix/src/tests/value-to-json.cc (limited to 'third_party/nix/src/tests/value-to-json.cc') diff --git a/third_party/nix/src/tests/value-to-json.cc b/third_party/nix/src/tests/value-to-json.cc new file mode 100644 index 0000000000..462d2fda01 --- /dev/null +++ b/third_party/nix/src/tests/value-to-json.cc @@ -0,0 +1,287 @@ +#include "value-to-json.hh" + +#include + +#include + +#include "store-api.hh" +#include "value-to-xml.hh" +#include "value.hh" + +class ValueTest : public ::testing::Test { + protected: + static void SetUpTestCase() { nix::initGC(); } + + static void TearDownTestCase() {} +}; + +class JSONValueTest : public ValueTest {}; +class XMLValueTest : public ValueTest {}; + +namespace nix { + +class DummyStore : public Store { + public: + explicit DummyStore() : Store(Store::Params{}) {} + + std::string getUri() { return ""; } + virtual void queryPathInfoUncached(const StorePath&) {} + virtual void queryPathInfoUncached( + const StorePath&, + nix::Callback>) noexcept {} + std::optional queryPathFromHashPart(const std::string& hashPart) { + return {}; + } + StorePath addToStore(const std::string&, const std::string&, + const StorePathSet&, nix::RepairFlag) { + return StorePath::dummy.clone(); + } + StorePath addToStore(const std::string&, const Path&, bool, nix::HashType, + nix::PathFilter&, nix::RepairFlag) { + return StorePath::dummy.clone(); + } + StorePath addTextToStore(const std::string&, const std::string&, + const StorePathSet&, nix::RepairFlag) { + return StorePath::dummy.clone(); + } + + void narFromPath(const StorePath&, Sink&) {} + void ensurePath(const StorePath&) {} + + BuildResult buildDerivation(const StorePath&, const BasicDerivation&, + BuildMode) { + return BuildResult{}; + } +}; + +TEST_F(JSONValueTest, null) { + std::stringstream ss; + Value v; + PathSet ps; + auto store = std::make_shared(); + EvalState s({}, ref(store), false); + + mkNull(v); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "null"); +} + +TEST_F(JSONValueTest, BoolFalse) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkBool(v, false); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "false"); +} + +TEST_F(JSONValueTest, BoolTrue) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkBool(v, true); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "true"); +} + +TEST_F(JSONValueTest, IntPositive) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkInt(v, 100); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "100"); +} + +TEST_F(JSONValueTest, IntNegative) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkInt(v, -100); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "-100"); +} + +TEST_F(JSONValueTest, String) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkString(v, "test"); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "\"test\""); +} + +TEST_F(JSONValueTest, StringQuotes) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkString(v, "test\""); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "\"test\\\"\""); +} + +TEST_F(JSONValueTest, Path) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkPath(v, "test"); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "\"/nix/store/g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-x\""); +} + +TEST_F(JSONValueTest, PathNoCopy) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkPathNoCopy(v, "test"); + printValueAsJSON(s, true, v, ss, ps); + ASSERT_EQ(ss.str(), "\"/nix/store/g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-x\""); +} + +/* + * Value to XMl tests + */ + +#define XML(v) \ + ("\n\n" v "\n\n") + +TEST_F(XMLValueTest, null) { + std::stringstream ss; + Value v; + PathSet ps; + auto store = std::make_shared(); + EvalState s({}, ref(store), false); + + mkNull(v); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" ")); +} + +TEST_F(XMLValueTest, BoolFalse) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkBool(v, false); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" ")); +} + +TEST_F(XMLValueTest, BoolTrue) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkBool(v, true); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" ")); +} + +TEST_F(XMLValueTest, IntPositive) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkInt(v, 100); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" ")); +} + +TEST_F(XMLValueTest, IntNegative) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkInt(v, -100); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" ")); +} + +TEST_F(XMLValueTest, String) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkString(v, "test-value"); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" ")); +} + +TEST_F(XMLValueTest, StringQuotes) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkString(v, "test-value\""); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" ")); +} + +/* + * FIXME: This function returns the original input path while the JSON version + * of the same actually touches the store to create a /nix/store path. + */ +TEST_F(XMLValueTest, Path) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkPath(v, "some-path"); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" ")); +} + +/* + * FIXME: This function returns the original input path while the JSON version + * of the same actually touches the store to create a /nix/store path. + */ +TEST_F(XMLValueTest, PathNoCopy) { + std::stringstream ss; + auto store = std::make_shared(); + EvalState s({"."}, ref(store), false); + Value v; + PathSet ps; + + mkPathNoCopy(v, "some-other-path"); + printValueAsXML(s, true, true, v, ss, ps); + ASSERT_EQ(ss.str(), XML(" ")); +} +} // namespace nix -- cgit 1.4.1