mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
Convert fast manual unit tests to automatic
This commit is contained in:
committed by
Nik Bougalis
parent
7315d9c300
commit
9063953ee7
@@ -3584,10 +3584,6 @@
|
|||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\test\mao\impl\Net_test.cpp">
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
|
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\test\mao\Net.h">
|
<ClInclude Include="..\..\src\ripple\test\mao\Net.h">
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClCompile Include="..\..\src\ripple\unity\app_ledger.cpp">
|
<ClCompile Include="..\..\src\ripple\unity\app_ledger.cpp">
|
||||||
|
|||||||
@@ -4167,9 +4167,6 @@
|
|||||||
<ClCompile Include="..\..\src\ripple\test\mao\impl\Net.cpp">
|
<ClCompile Include="..\..\src\ripple\test\mao\impl\Net.cpp">
|
||||||
<Filter>ripple\test\mao\impl</Filter>
|
<Filter>ripple\test\mao\impl</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\src\ripple\test\mao\impl\Net_test.cpp">
|
|
||||||
<Filter>ripple\test\mao\impl</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClInclude Include="..\..\src\ripple\test\mao\Net.h">
|
<ClInclude Include="..\..\src\ripple\test\mao\Net.h">
|
||||||
<Filter>ripple\test\mao</Filter>
|
<Filter>ripple\test\mao</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|||||||
@@ -95,6 +95,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
BEAST_DEFINE_TESTSUITE_MANUAL(Journal,utility,beast);
|
BEAST_DEFINE_TESTSUITE(Journal,utility,beast);
|
||||||
|
|
||||||
} // beast
|
} // beast
|
||||||
|
|||||||
@@ -39,6 +39,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
BEAST_DEFINE_TESTSUITE_MANUAL(OfferStream,tx,ripple);
|
BEAST_DEFINE_TESTSUITE(OfferStream,tx,ripple);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -562,7 +562,7 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
BEAST_DEFINE_TESTSUITE_MANUAL(import,NodeStore,ripple);
|
BEAST_DEFINE_TESTSUITE(import,NodeStore,ripple);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -748,255 +748,7 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
BEAST_DEFINE_TESTSUITE_MANUAL(rekey,NodeStore,ripple);
|
BEAST_DEFINE_TESTSUITE(rekey,NodeStore,ripple);
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
namespace legacy {
|
|
||||||
|
|
||||||
using namespace beast::nudb;
|
|
||||||
using namespace beast::nudb::detail;
|
|
||||||
|
|
||||||
struct dat_file_header
|
|
||||||
{
|
|
||||||
static std::size_t BEAST_CONSTEXPR size =
|
|
||||||
8 + // Type
|
|
||||||
2 + // Version
|
|
||||||
8 + // Appnum
|
|
||||||
8 + // Salt
|
|
||||||
2 + // KeySize
|
|
||||||
64; // (Reserved)
|
|
||||||
|
|
||||||
char type[8];
|
|
||||||
std::size_t version;
|
|
||||||
std::uint64_t appnum;
|
|
||||||
std::uint64_t salt;
|
|
||||||
std::size_t key_size;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct key_file_header
|
|
||||||
{
|
|
||||||
static std::size_t BEAST_CONSTEXPR size =
|
|
||||||
8 + // Type
|
|
||||||
2 + // Version
|
|
||||||
8 + // Appnum
|
|
||||||
8 + // Salt
|
|
||||||
8 + // Pepper
|
|
||||||
2 + // KeySize
|
|
||||||
2 + // BlockSize
|
|
||||||
2 + // LoadFactor
|
|
||||||
64; // (Reserved)
|
|
||||||
|
|
||||||
char type[8];
|
|
||||||
std::size_t version;
|
|
||||||
std::uint64_t appnum;
|
|
||||||
std::uint64_t salt;
|
|
||||||
std::uint64_t pepper;
|
|
||||||
std::size_t key_size;
|
|
||||||
std::size_t block_size;
|
|
||||||
std::size_t load_factor;
|
|
||||||
|
|
||||||
// Computed values
|
|
||||||
std::size_t capacity;
|
|
||||||
std::size_t bucket_size;
|
|
||||||
std::size_t buckets;
|
|
||||||
std::size_t modulus;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Read data file header from stream
|
|
||||||
template <class = void>
|
|
||||||
void
|
|
||||||
read (istream& is, dat_file_header& dh)
|
|
||||||
{
|
|
||||||
read (is, dh.type, sizeof(dh.type));
|
|
||||||
read<std::uint16_t>(is, dh.version);
|
|
||||||
read<std::uint64_t>(is, dh.appnum);
|
|
||||||
read<std::uint64_t>(is, dh.salt);
|
|
||||||
read<std::uint16_t>(is, dh.key_size);
|
|
||||||
std::array <std::uint8_t, 64> zero;
|
|
||||||
read (is, zero.data(), zero.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read data file header from file
|
|
||||||
template <class File>
|
|
||||||
void
|
|
||||||
read (File& f, dat_file_header& dh)
|
|
||||||
{
|
|
||||||
std::array<std::uint8_t,
|
|
||||||
dat_file_header::size> buf;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
f.read(0, buf.data(), buf.size());
|
|
||||||
}
|
|
||||||
catch (file_short_read_error const&)
|
|
||||||
{
|
|
||||||
Throw<store_corrupt_error> (
|
|
||||||
"short data file header");
|
|
||||||
}
|
|
||||||
istream is(buf);
|
|
||||||
read (is, dh);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read key file header from stream
|
|
||||||
template <class = void>
|
|
||||||
void
|
|
||||||
read (istream& is, std::size_t file_size,
|
|
||||||
key_file_header& kh)
|
|
||||||
{
|
|
||||||
read(is, kh.type, sizeof(kh.type));
|
|
||||||
read<std::uint16_t>(is, kh.version);
|
|
||||||
read<std::uint64_t>(is, kh.appnum);
|
|
||||||
read<std::uint64_t>(is, kh.salt);
|
|
||||||
read<std::uint64_t>(is, kh.pepper);
|
|
||||||
read<std::uint16_t>(is, kh.key_size);
|
|
||||||
read<std::uint16_t>(is, kh.block_size);
|
|
||||||
read<std::uint16_t>(is, kh.load_factor);
|
|
||||||
std::array <std::uint8_t, 64> zero;
|
|
||||||
read (is, zero.data(), zero.size());
|
|
||||||
|
|
||||||
// VFALCO These need to be checked to handle
|
|
||||||
// when the file size is too small
|
|
||||||
kh.capacity = bucket_capacity(kh.block_size);
|
|
||||||
kh.bucket_size = bucket_size(kh.capacity);
|
|
||||||
if (file_size > kh.block_size)
|
|
||||||
{
|
|
||||||
// VFALCO This should be handled elsewhere.
|
|
||||||
// we shouldn't put the computed fields in this header.
|
|
||||||
if (kh.block_size > 0)
|
|
||||||
kh.buckets = (file_size - kh.bucket_size)
|
|
||||||
/ kh.block_size;
|
|
||||||
else
|
|
||||||
// VFALCO Corruption or logic error
|
|
||||||
kh.buckets = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
kh.buckets = 0;
|
|
||||||
}
|
|
||||||
kh.modulus = ceil_pow2(kh.buckets);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read key file header from file
|
|
||||||
template <class File>
|
|
||||||
void
|
|
||||||
read (File& f, key_file_header& kh)
|
|
||||||
{
|
|
||||||
std::array <std::uint8_t,
|
|
||||||
key_file_header::size> buf;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
f.read(0, buf.data(), buf.size());
|
|
||||||
}
|
|
||||||
catch (file_short_read_error const&)
|
|
||||||
{
|
|
||||||
Throw<store_corrupt_error> (
|
|
||||||
"short key file header");
|
|
||||||
}
|
|
||||||
istream is(buf);
|
|
||||||
read (is, f.actual_size(), kh);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // detail
|
|
||||||
|
|
||||||
class update_test : public beast::unit_test::suite
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void
|
|
||||||
run() override
|
|
||||||
{
|
|
||||||
testcase(abort_on_fail) << arg();
|
|
||||||
|
|
||||||
using namespace beast::nudb;
|
|
||||||
using namespace beast::nudb::detail;
|
|
||||||
|
|
||||||
pass();
|
|
||||||
auto const args = parse_args(arg());
|
|
||||||
bool usage = args.empty();
|
|
||||||
|
|
||||||
if (! usage &&
|
|
||||||
args.find("path") == args.end())
|
|
||||||
{
|
|
||||||
log <<
|
|
||||||
"Missing parameter: path";
|
|
||||||
usage = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (usage)
|
|
||||||
{
|
|
||||||
log <<
|
|
||||||
"Usage:\n" <<
|
|
||||||
"--unittest-arg=path=<dat>\n" <<
|
|
||||||
"path: NuDB path to update (without extensions)";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto const path = args.at("path");
|
|
||||||
|
|
||||||
using hash_type = beast::xxhasher;
|
|
||||||
|
|
||||||
auto const dp = path + ".dat";
|
|
||||||
auto const kp = path + ".key";
|
|
||||||
|
|
||||||
log <<
|
|
||||||
"path: " << path;
|
|
||||||
|
|
||||||
native_file df;
|
|
||||||
native_file kf;
|
|
||||||
df.open(file_mode::write, dp);
|
|
||||||
kf.open(file_mode::write, kp);
|
|
||||||
legacy::dat_file_header dh0;
|
|
||||||
legacy::key_file_header kh0;
|
|
||||||
read(df, dh0);
|
|
||||||
read(kf, kh0);
|
|
||||||
|
|
||||||
dat_file_header dh;
|
|
||||||
std::memcpy(dh.type, "nudb.dat", 8);
|
|
||||||
dh.version = dh0.version;;
|
|
||||||
dh.uid = make_uid();
|
|
||||||
dh.appnum = dh0.appnum;
|
|
||||||
dh.key_size = dh0.key_size;
|
|
||||||
|
|
||||||
key_file_header kh;
|
|
||||||
std::memcpy(kh.type, "nudb.key", 8);
|
|
||||||
kh.version = dh.version;
|
|
||||||
kh.uid = dh.uid;
|
|
||||||
kh.appnum = dh.appnum;
|
|
||||||
kh.key_size = dh.key_size;
|
|
||||||
kh.salt = kh0.salt;
|
|
||||||
kh.pepper = kh0.pepper;
|
|
||||||
kh.block_size = kh0.block_size;
|
|
||||||
kh.load_factor = kh0.load_factor;
|
|
||||||
|
|
||||||
// VFALCO These need to be checked to handle
|
|
||||||
// when the file size is too small
|
|
||||||
kh.capacity = bucket_capacity(kh.block_size);
|
|
||||||
kh.bucket_size = bucket_size(kh.capacity);
|
|
||||||
auto const kf_size = kf.actual_size();
|
|
||||||
if (kf_size > kh.block_size)
|
|
||||||
{
|
|
||||||
// VFALCO This should be handled elsewhere.
|
|
||||||
// we shouldn't put the computed fields
|
|
||||||
// in this header.
|
|
||||||
if (kh.block_size > 0)
|
|
||||||
kh.buckets = (kf_size - kh.bucket_size)
|
|
||||||
/ kh.block_size;
|
|
||||||
else
|
|
||||||
// VFALCO Corruption or logic error
|
|
||||||
kh.buckets = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
kh.buckets = 0;
|
|
||||||
}
|
|
||||||
kh.modulus = ceil_pow2(kh.buckets);
|
|
||||||
beast::nudb::detail::verify(dh);
|
|
||||||
beast::nudb::detail::verify<hash_type>(dh, kh);
|
|
||||||
write(df, dh);
|
|
||||||
write(kf, kh);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
BEAST_DEFINE_TESTSUITE_MANUAL(update,NodeStore,ripple);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -559,6 +559,6 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
BEAST_DEFINE_TESTSUITE_MANUAL(short_read,overlay,ripple);
|
BEAST_DEFINE_TESTSUITE(short_read,overlay,ripple);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,140 +0,0 @@
|
|||||||
//------------------------------------------------------------------------------
|
|
||||||
/*
|
|
||||||
This file is part of rippled: https://github.com/ripple/rippled
|
|
||||||
Copyright (c) 2012, 2013 Ripple Labs Inc.
|
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any
|
|
||||||
purpose with or without fee is hereby granted, provided that the above
|
|
||||||
copyright notice and this permission notice appear in all copies.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
*/
|
|
||||||
//==============================================================================
|
|
||||||
|
|
||||||
#include <BeastConfig.h>
|
|
||||||
#include <ripple/basics/Log.h>
|
|
||||||
#include <ripple/test/mao/Net.h>
|
|
||||||
#include <ripple/test/jtx.h>
|
|
||||||
#include <ripple/test/ManualTimeKeeper.h>
|
|
||||||
#include <ripple/net/HTTPClient.h>
|
|
||||||
#include <ripple/net/RPCCall.h>
|
|
||||||
#include <beast/unit_test/suite.h>
|
|
||||||
#include <memory>
|
|
||||||
#include <mutex>
|
|
||||||
#include <thread>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
namespace ripple {
|
|
||||||
namespace test {
|
|
||||||
namespace mao {
|
|
||||||
|
|
||||||
struct TestApp
|
|
||||||
{
|
|
||||||
TestApp()
|
|
||||||
{
|
|
||||||
auto config = std::make_unique<Config>();
|
|
||||||
setupConfigForUnitTests(*config);
|
|
||||||
// Hack so we dont have to call Config::setup
|
|
||||||
HTTPClient::initializeSSLContext(*config);
|
|
||||||
auto logs = std::make_unique<Logs>();
|
|
||||||
auto timeKeeper = std::make_unique<ManualTimeKeeper>();
|
|
||||||
timeKeeper_ = timeKeeper.get();
|
|
||||||
instance = make_Application(std::move(config),
|
|
||||||
std::move(logs), std::move(timeKeeper));
|
|
||||||
instance->setup();
|
|
||||||
thread_ = std::thread(
|
|
||||||
[&]() { instance->run(); });
|
|
||||||
}
|
|
||||||
|
|
||||||
~TestApp()
|
|
||||||
{
|
|
||||||
if (thread_.joinable())
|
|
||||||
{
|
|
||||||
instance->signalStop();
|
|
||||||
thread_.join();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
join()
|
|
||||||
{
|
|
||||||
thread_.join();
|
|
||||||
}
|
|
||||||
|
|
||||||
Application*
|
|
||||||
operator->()
|
|
||||||
{
|
|
||||||
return instance.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T, class... Args>
|
|
||||||
void
|
|
||||||
rpc (T const& t, Args const&... args)
|
|
||||||
{
|
|
||||||
std::vector<std::string> v;
|
|
||||||
collect(v, t, args...);
|
|
||||||
RPCCall::fromCommandLine(
|
|
||||||
instance->config(), v,
|
|
||||||
instance->logs());
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
inline
|
|
||||||
void
|
|
||||||
collect (std::vector<std::string>& v)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class T, class... Args>
|
|
||||||
void
|
|
||||||
collect (std::vector<std::string>& v,
|
|
||||||
T const& t, Args const&... args)
|
|
||||||
{
|
|
||||||
v.emplace_back(t);
|
|
||||||
collect(v, args...);
|
|
||||||
}
|
|
||||||
|
|
||||||
ManualTimeKeeper* timeKeeper_;
|
|
||||||
std::unique_ptr<Application> instance;
|
|
||||||
std::thread thread_;
|
|
||||||
std::mutex mutex_;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Net_test : public beast::unit_test::suite
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void
|
|
||||||
testStartStop()
|
|
||||||
{
|
|
||||||
TestApp app;
|
|
||||||
pass();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
testRPC()
|
|
||||||
{
|
|
||||||
TestApp app;
|
|
||||||
app.rpc("stop");
|
|
||||||
app.join();
|
|
||||||
pass();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
run() override
|
|
||||||
{
|
|
||||||
testStartStop();
|
|
||||||
testRPC();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
BEAST_DEFINE_TESTSUITE_MANUAL(Net,mao,ripple)
|
|
||||||
|
|
||||||
} // mao
|
|
||||||
} // test
|
|
||||||
} // ripple
|
|
||||||
@@ -46,7 +46,6 @@
|
|||||||
#include <ripple/test/jtx/impl/utility.cpp>
|
#include <ripple/test/jtx/impl/utility.cpp>
|
||||||
|
|
||||||
#include <ripple/test/mao/impl/Net.cpp>
|
#include <ripple/test/mao/impl/Net.cpp>
|
||||||
#include <ripple/test/mao/impl/Net_test.cpp>
|
|
||||||
|
|
||||||
#include <ripple/test/impl/BasicNetwork_test.cpp>
|
#include <ripple/test/impl/BasicNetwork_test.cpp>
|
||||||
#include <ripple/test/impl/ManualTimeKeeper.cpp>
|
#include <ripple/test/impl/ManualTimeKeeper.cpp>
|
||||||
|
|||||||
Reference in New Issue
Block a user