mirror of
https://github.com/QuasarApp/Heart.git
synced 2025-05-10 00:19:41 +00:00
fix tests
This commit is contained in:
parent
682feb1ce8
commit
12e11650bb
HeartTests/units
src/public/packages
@ -7,10 +7,13 @@
|
||||
|
||||
#include "multiversiontest.h"
|
||||
|
||||
#define LOCAL_TEST_PORT TEST_PORT + 6
|
||||
|
||||
class MultiVersionPkg {
|
||||
public:
|
||||
int v2;
|
||||
int v1;
|
||||
bool responce = false;
|
||||
int lastSerializedFrom = 0;
|
||||
int lastSerializedto = 0;
|
||||
};
|
||||
@ -21,38 +24,72 @@ class MultiVersionPkg1: public QH::PKG::MultiversionData, public MultiVersionPkg
|
||||
public:
|
||||
MultiVersionPkg1(): QH::PKG::MultiversionData(
|
||||
{
|
||||
{0, // version 0
|
||||
{
|
||||
[this](QDataStream& stream) -> QDataStream&{ // from
|
||||
stream >> v1;
|
||||
return stream;
|
||||
},
|
||||
[this](QDataStream& stream) -> QDataStream&{ // to
|
||||
stream << v1;
|
||||
{0, // version 0
|
||||
{
|
||||
[this](QDataStream& stream) -> QDataStream&{ // from
|
||||
lastSerializedFrom = 0;
|
||||
stream >> v1;
|
||||
stream >> responce;
|
||||
|
||||
return stream;
|
||||
}
|
||||
}
|
||||
},
|
||||
{1, // version 1
|
||||
{
|
||||
[this](QDataStream& stream) -> QDataStream&{ // from
|
||||
stream >> v1;
|
||||
stream >> v2;
|
||||
return stream;
|
||||
},
|
||||
[this](QDataStream& stream) -> QDataStream&{ // to
|
||||
lastSerializedto = 0;
|
||||
|
||||
return stream;
|
||||
},
|
||||
[this](QDataStream& stream) -> QDataStream&{ // to
|
||||
stream << v1;
|
||||
stream << v2;
|
||||
return stream;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
stream << v1;
|
||||
stream << responce;
|
||||
|
||||
return stream;
|
||||
}
|
||||
}
|
||||
},
|
||||
{1, // version 1
|
||||
{
|
||||
[this](QDataStream& stream) -> QDataStream&{ // from
|
||||
lastSerializedFrom = 1;
|
||||
|
||||
stream >> v1;
|
||||
stream >> responce;
|
||||
|
||||
stream >> v2;
|
||||
|
||||
return stream;
|
||||
},
|
||||
[this](QDataStream& stream) -> QDataStream&{ // to
|
||||
lastSerializedto = 1;
|
||||
|
||||
stream << v1;
|
||||
stream << responce;
|
||||
|
||||
stream << v2;
|
||||
return stream;
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
) {};
|
||||
};
|
||||
|
||||
class SingleVersionPkg: public QH::PKG::AbstractData, public MultiVersionPkg {
|
||||
QH_PACKAGE("MultiVersionPkg")
|
||||
|
||||
// StreamBase interface
|
||||
protected:
|
||||
QDataStream &fromStream(QDataStream &stream) override {
|
||||
lastSerializedFrom = 0;
|
||||
stream >> v1;
|
||||
stream >> responce;
|
||||
|
||||
return stream;
|
||||
};
|
||||
QDataStream &toStream(QDataStream &stream) const override {
|
||||
stream << v1;
|
||||
stream << responce;
|
||||
|
||||
return stream;
|
||||
};
|
||||
};
|
||||
|
||||
class MultiVersionPkg2: public QH::PKG::MultiversionData, public MultiVersionPkg {
|
||||
QH_PACKAGE("MultiVersionPkg")
|
||||
|
||||
@ -64,12 +101,15 @@ public:
|
||||
[this](QDataStream& stream) -> QDataStream&{ // from
|
||||
lastSerializedFrom = 0;
|
||||
stream >> v1;
|
||||
stream >> responce;
|
||||
|
||||
return stream;
|
||||
},
|
||||
[this](QDataStream& stream) -> QDataStream&{ // to
|
||||
lastSerializedto = 0;
|
||||
|
||||
stream << v1;
|
||||
stream << responce;
|
||||
|
||||
return stream;
|
||||
}
|
||||
@ -78,9 +118,11 @@ public:
|
||||
{1, // version 1
|
||||
{
|
||||
[this](QDataStream& stream) -> QDataStream&{ // from
|
||||
lastSerializedFrom = 1;
|
||||
lastSerializedFrom = 1;
|
||||
|
||||
stream >> v1;
|
||||
stream >> responce;
|
||||
|
||||
stream >> v2;
|
||||
|
||||
return stream;
|
||||
@ -89,6 +131,8 @@ public:
|
||||
lastSerializedto = 1;
|
||||
|
||||
stream << v1;
|
||||
stream << responce;
|
||||
|
||||
stream << v2;
|
||||
return stream;
|
||||
}
|
||||
@ -100,6 +144,7 @@ public:
|
||||
lastSerializedFrom = 2;
|
||||
|
||||
stream >> v2;
|
||||
stream >> responce;
|
||||
|
||||
return stream;
|
||||
},
|
||||
@ -107,6 +152,8 @@ public:
|
||||
lastSerializedto = 2;
|
||||
|
||||
stream << v2;
|
||||
stream << responce;
|
||||
|
||||
return stream;
|
||||
}
|
||||
}
|
||||
@ -126,11 +173,19 @@ public:
|
||||
public:
|
||||
|
||||
QH::ParserResult parsePackage(const QSharedPointer<QH::PKG::AbstractData> &pkg,
|
||||
const QH::Header &,
|
||||
QH::AbstractNodeInfo *) override {
|
||||
const QH::Header &hdr,
|
||||
QH::AbstractNodeInfo *sender) override {
|
||||
|
||||
if (pkg->cmd() == Base::command()) {
|
||||
data = pkg;
|
||||
|
||||
if (!data.dynamicCast<MultiVersionPkg>()->responce) {
|
||||
data.dynamicCast<MultiVersionPkg>()->responce = true;
|
||||
if (!sendData(pkg.data(), sender, &hdr)) {
|
||||
return QH::ParserResult::Error;
|
||||
}
|
||||
}
|
||||
|
||||
return QH::ParserResult::Processed;
|
||||
}
|
||||
|
||||
@ -143,6 +198,10 @@ public:
|
||||
return data;
|
||||
};
|
||||
|
||||
void dropData() {
|
||||
data = nullptr;
|
||||
};
|
||||
|
||||
private:
|
||||
QSharedPointer<QH::PKG::AbstractData> data = nullptr;
|
||||
|
||||
@ -174,64 +233,128 @@ private:
|
||||
};
|
||||
|
||||
MultiVersionTest::MultiVersionTest() {
|
||||
_nodeV1 = new TestingClient<MultiVersionPkg1>;
|
||||
_nodeV2 = new TestingClient<MultiVersionPkg2>;
|
||||
_nodeOld = new TestingClient<SingleVersionPkg>;
|
||||
|
||||
}
|
||||
|
||||
MultiVersionTest::~MultiVersionTest() {
|
||||
_nodeV1->softDelete();
|
||||
_nodeV2->softDelete();
|
||||
_nodeOld->softDelete();
|
||||
|
||||
}
|
||||
|
||||
void MultiVersionTest::test() {
|
||||
QVERIFY(_nodeV1->run(TEST_LOCAL_HOST, LOCAL_TEST_PORT));
|
||||
|
||||
TestingClient<MultiVersionPkg1> nodeWithV1;
|
||||
TestingClient<MultiVersionPkg2> nodeWithV2;
|
||||
QVERIFY(connectFunc(_nodeV2, TEST_LOCAL_HOST, LOCAL_TEST_PORT));
|
||||
QVERIFY(connectFunc(_nodeOld, TEST_LOCAL_HOST, LOCAL_TEST_PORT));
|
||||
|
||||
int nodev1Port = TEST_PORT + 5;
|
||||
int nodev2Port = TEST_PORT + 6;
|
||||
testMultipacakges();
|
||||
testSinglePackages();
|
||||
}
|
||||
|
||||
QVERIFY(nodeWithV1.run(TEST_LOCAL_HOST, nodev1Port));
|
||||
QVERIFY(nodeWithV2.run(TEST_LOCAL_HOST, nodev2Port));
|
||||
void MultiVersionTest::testMultipacakges() {
|
||||
auto nodeWithV1 = dynamic_cast<TestingClient<MultiVersionPkg1>*>(_nodeV1);
|
||||
auto nodeWithV2 = dynamic_cast<TestingClient<MultiVersionPkg2>*>(_nodeV2);
|
||||
|
||||
// clean old data;
|
||||
nodeWithV1->parser().staticCast<TestAPI<MultiVersionPkg1>>()->dropData();
|
||||
nodeWithV2->parser().staticCast<TestAPI<MultiVersionPkg2>>()->dropData();
|
||||
|
||||
// from new to old
|
||||
{
|
||||
|
||||
// initialize test values.
|
||||
MultiVersionPkg2 pkg;
|
||||
pkg.v1 = 10;
|
||||
pkg.v2 = 20;
|
||||
|
||||
QVERIFY(nodeWithV2.sendRequest(pkg, nodev1Port));
|
||||
// send test values into dist node
|
||||
QVERIFY(nodeWithV2->sendRequest(pkg, LOCAL_TEST_PORT));
|
||||
|
||||
// should use the maximum available serialization. it is 1
|
||||
QVERIFY(pkg.lastSerializedto == 1);
|
||||
|
||||
QVERIFY(wait([&nodeWithV1](){
|
||||
return nodeWithV1.parser().staticCast<TestAPI<MultiVersionPkg1>>()->
|
||||
getData().staticCast<MultiVersionPkg1>()->lastSerializedFrom == 1;
|
||||
// wait for receive packge on distanation node
|
||||
QVERIFY(wait([&nodeWithV1]() {
|
||||
if (auto data = nodeWithV1->parser().staticCast<TestAPI<MultiVersionPkg1>>()->
|
||||
getData().staticCast<MultiVersionPkg1>()) {
|
||||
return data->lastSerializedFrom == 1;
|
||||
}
|
||||
return false;
|
||||
|
||||
}, WAIT_RESPOCE_TIME));
|
||||
|
||||
auto data = nodeWithV1.parser().staticCast<TestAPI<MultiVersionPkg1>>()->
|
||||
getData().staticCast<MultiVersionPkg1>();
|
||||
// wait for package on sender node.
|
||||
QVERIFY(wait([&nodeWithV2]() {
|
||||
if (auto data = nodeWithV2->parser().staticCast<TestAPI<MultiVersionPkg1>>()->
|
||||
getData().staticCast<MultiVersionPkg1>()) {
|
||||
return data->responce == true;
|
||||
}
|
||||
return false;
|
||||
|
||||
QVERIFY(data->v1 == pkg.v1);
|
||||
QVERIFY(data->v2 == pkg.v2);
|
||||
}
|
||||
|
||||
// from old to new
|
||||
|
||||
{
|
||||
MultiVersionPkg1 pkg;
|
||||
pkg.v1 = 10;
|
||||
pkg.v2 = 20;
|
||||
|
||||
QVERIFY(nodeWithV1.sendRequest(pkg, nodev1Port));
|
||||
|
||||
// should use the maximum available serialization. it is 1
|
||||
QVERIFY(pkg.lastSerializedto == 1);
|
||||
|
||||
QVERIFY(wait([&nodeWithV2](){
|
||||
return nodeWithV2.parser().staticCast<TestAPI<MultiVersionPkg2>>()->
|
||||
getData().staticCast<MultiVersionPkg2>()->lastSerializedFrom == 1;
|
||||
}, WAIT_RESPOCE_TIME));
|
||||
|
||||
auto data = nodeWithV2.parser().staticCast<TestAPI<MultiVersionPkg2>>()->
|
||||
// chec data all data should not be changed.
|
||||
auto data = nodeWithV2->parser().staticCast<TestAPI<MultiVersionPkg2>>()->
|
||||
getData().staticCast<MultiVersionPkg2>();
|
||||
|
||||
QVERIFY(data->v1 == pkg.v1);
|
||||
QVERIFY(data->v2 == pkg.v2);
|
||||
}
|
||||
}
|
||||
|
||||
void MultiVersionTest::testSinglePackages() {
|
||||
auto nodeWithSingle = dynamic_cast<TestingClient<SingleVersionPkg>*>(_nodeOld);
|
||||
auto nodeWithV1 = dynamic_cast<TestingClient<MultiVersionPkg1>*>(_nodeV1);
|
||||
|
||||
// clean old data;
|
||||
nodeWithSingle->parser().staticCast<TestAPI<SingleVersionPkg>>()->dropData();
|
||||
nodeWithV1->parser().staticCast<TestAPI<MultiVersionPkg1>>()->dropData();
|
||||
|
||||
// from single package to new
|
||||
|
||||
{
|
||||
// initialize test values.
|
||||
SingleVersionPkg pkg;
|
||||
pkg.v1 = 10;
|
||||
pkg.v2 = 20;
|
||||
|
||||
// send test values into dist node
|
||||
QVERIFY(nodeWithSingle->sendRequest(pkg, LOCAL_TEST_PORT));
|
||||
|
||||
// should use the maximum available serialization. it is 0
|
||||
QVERIFY(pkg.lastSerializedto == 0);
|
||||
|
||||
// wait for receive packge on distanation node
|
||||
QVERIFY(wait([&nodeWithV1]() {
|
||||
if (auto data = nodeWithV1->parser().staticCast<TestAPI<MultiVersionPkg1>>()->
|
||||
getData().staticCast<MultiVersionPkg1>()) {
|
||||
return data->lastSerializedFrom == 0;
|
||||
}
|
||||
return false;
|
||||
|
||||
}, WAIT_RESPOCE_TIME));
|
||||
|
||||
// wait for package on sender node.
|
||||
QVERIFY(wait([&nodeWithSingle]() {
|
||||
if (auto data = nodeWithSingle->parser().staticCast<TestAPI<SingleVersionPkg>>()->
|
||||
getData().staticCast<SingleVersionPkg>()) {
|
||||
return data->responce == true;
|
||||
}
|
||||
return false;
|
||||
|
||||
}, WAIT_RESPOCE_TIME));
|
||||
|
||||
// chec data all data should not be changed.
|
||||
auto data = nodeWithSingle->parser().staticCast<TestAPI<SingleVersionPkg>>()->
|
||||
getData().staticCast<SingleVersionPkg>();
|
||||
|
||||
QVERIFY(data->v1 == pkg.v1);
|
||||
// v2 is not supported on the v0 parser
|
||||
QVERIFY(data->v2 == 0);
|
||||
}
|
||||
}
|
||||
|
@ -22,7 +22,17 @@ class MultiVersionTest: public Test, protected TestUtils
|
||||
{
|
||||
public:
|
||||
MultiVersionTest();
|
||||
~MultiVersionTest();
|
||||
void test();
|
||||
protected:
|
||||
|
||||
void testMultipacakges();
|
||||
void testSinglePackages();
|
||||
|
||||
private:
|
||||
QH::AbstractNode *_nodeV1 = nullptr;
|
||||
QH::AbstractNode *_nodeV2 = nullptr;
|
||||
QH::AbstractNode *_nodeOld = nullptr;
|
||||
|
||||
};
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
namespace QH {
|
||||
namespace PKG {
|
||||
|
||||
#define MAGIC "mver"
|
||||
|
||||
MultiversionData::MultiversionData(const QMap<unsigned short /*version*/, SerializationBox>& serializers):
|
||||
_serializers(serializers) {
|
||||
@ -32,18 +33,16 @@ QDataStream &MultiversionData::fromStream(QDataStream &stream) {
|
||||
return stream;
|
||||
}
|
||||
|
||||
char* buf = new char[sizeof(magic)];
|
||||
stream.readRawData(buf, sizeof(magic)) ;
|
||||
QByteArray magic;
|
||||
stream >> magic;
|
||||
|
||||
unsigned short version = 0;
|
||||
if (buf == magic) {
|
||||
if (magic == MAGIC) {
|
||||
stream >> version;
|
||||
} else {
|
||||
stream.device()->seek(0);
|
||||
}
|
||||
|
||||
delete[] buf;
|
||||
|
||||
return _serializers.value(version).from(stream);
|
||||
}
|
||||
|
||||
@ -56,7 +55,7 @@ QDataStream &MultiversionData::toStream(QDataStream &stream) const {
|
||||
return stream;
|
||||
}
|
||||
|
||||
stream << magic;
|
||||
stream << QByteArray{MAGIC};
|
||||
stream << _serializers.lastKey();
|
||||
|
||||
return _serializers.last().to(stream);
|
||||
@ -76,7 +75,8 @@ QByteArray MultiversionData::toBytesOf(const DistVersion& version) const {
|
||||
|
||||
QDataStream &MultiversionData::toStreamOf(QDataStream &stream, const DistVersion& version) const {
|
||||
|
||||
auto serializer = _serializers.value(_packageVersion.getMaxCompatible(version), {});
|
||||
unsigned short ver = _packageVersion.getMaxCompatible(version);
|
||||
auto serializer = _serializers.value(ver, {});
|
||||
if (!serializer.to) {
|
||||
debug_assert(false,
|
||||
"Your MultiversionData not support the required version serialized functions. "
|
||||
@ -84,8 +84,10 @@ QDataStream &MultiversionData::toStreamOf(QDataStream &stream, const DistVersion
|
||||
return stream;
|
||||
}
|
||||
|
||||
stream << magic;
|
||||
stream << version;
|
||||
if (ver) {
|
||||
stream << QByteArray{MAGIC};
|
||||
stream << ver;
|
||||
}
|
||||
|
||||
return serializer.to(stream);
|
||||
}
|
||||
|
@ -106,7 +106,6 @@ private:
|
||||
DistVersion _packageVersion;
|
||||
QMap<unsigned short /*version*/, SerializationBox> _serializers;
|
||||
|
||||
const char* magic = "mVer";
|
||||
|
||||
};
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user