mirror of
https://github.com/NixOS/nix.git
synced 2025-12-07 17:41:00 +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.
108 lines
2.4 KiB
C++
108 lines
2.4 KiB
C++
#pragma once
|
|
///@file
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "types.hh"
|
|
#include "environment-variables.hh"
|
|
|
|
namespace nix {
|
|
|
|
/**
|
|
* The path to the `unit-test-data` directory. See the contributing
|
|
* guide in the manual for further details.
|
|
*/
|
|
static Path getUnitTestData() {
|
|
return getEnv("_NIX_TEST_UNIT_DATA").value();
|
|
}
|
|
|
|
/**
|
|
* Whether we should update "golden masters" instead of running tests
|
|
* against them. See the contributing guide in the manual for further
|
|
* details.
|
|
*/
|
|
static bool testAccept() {
|
|
return getEnv("_NIX_TEST_ACCEPT") == "1";
|
|
}
|
|
|
|
/**
|
|
* Mixin class for writing characterization tests
|
|
*/
|
|
class CharacterizationTest : public virtual ::testing::Test
|
|
{
|
|
protected:
|
|
/**
|
|
* While the "golden master" for this characterization test is
|
|
* located. It should not be shared with any other test.
|
|
*/
|
|
virtual Path goldenMaster(PathView testStem) const = 0;
|
|
|
|
public:
|
|
/**
|
|
* Golden test for reading
|
|
*
|
|
* @param test hook that takes the contents of the file and does the
|
|
* actual work
|
|
*/
|
|
void readTest(PathView testStem, auto && test)
|
|
{
|
|
auto file = goldenMaster(testStem);
|
|
|
|
if (testAccept())
|
|
{
|
|
GTEST_SKIP()
|
|
<< "Cannot read golden master "
|
|
<< file
|
|
<< "because another test is also updating it";
|
|
}
|
|
else
|
|
{
|
|
test(readFile(file));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Golden test for writing
|
|
*
|
|
* @param test hook that produces contents of the file and does the
|
|
* actual work
|
|
*/
|
|
void writeTest(
|
|
PathView testStem, auto && test, auto && readFile2, auto && writeFile2)
|
|
{
|
|
auto file = goldenMaster(testStem);
|
|
|
|
auto got = test();
|
|
|
|
if (testAccept())
|
|
{
|
|
createDirs(dirOf(file));
|
|
writeFile2(file, got);
|
|
GTEST_SKIP()
|
|
<< "Updating golden master "
|
|
<< file;
|
|
}
|
|
else
|
|
{
|
|
decltype(got) expected = readFile2(file);
|
|
ASSERT_EQ(got, expected);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Specialize to `std::string`
|
|
*/
|
|
void writeTest(PathView testStem, auto && test)
|
|
{
|
|
writeTest(
|
|
testStem, test,
|
|
[](const Path & f) -> std::string {
|
|
return readFile(f);
|
|
},
|
|
[](const Path & f, const std::string & c) {
|
|
return writeFile(f, c);
|
|
});
|
|
}
|
|
};
|
|
|
|
}
|