initial commit

This commit is contained in:
mikhail "synzr" 2025-12-25 01:37:49 +05:00
commit 9d20827c46
2469 changed files with 470994 additions and 0 deletions

View file

@ -0,0 +1,258 @@
#include "JsonRpcAdaptor.h"
#include "JsonRpc.h"
#include <QtTest/QtTest>
Q_DECLARE_METATYPE(QVariant);
class TestObject : public QObject
{
Q_OBJECT;
Q_CLASSINFO("JsonQt-RPC-name", "TestName");
Q_CLASSINFO("JsonQt-RPC-id", "urn:data:test");
Q_CLASSINFO("JsonQt-RPC-version", "9000.001");
Q_CLASSINFO("JsonQt-RPC-summary", "Ponies");
public:
TestObject(QObject* parent) : QObject(parent) {}
public slots:
void functionOne(const QString& foo)
{
emit functionOneCalled(foo);
}
QString functionTwo()
{
emit functionTwoCalled();
return "Mary had a little lamb.";
}
void functionThree(int one, bool two, QVariantList three, QVariantMap four)
{
emit functionThreeCalled(one, two, three, four);
}
void functionFour(const QString& foo, const QString& bar)
{
emit functionFourCalled(foo, bar);
}
signals:
void functionOneCalled(const QString& foo);
void functionTwoCalled();
void functionThreeCalled(int, bool, QVariantList, QVariantMap);
void functionFourCalled(QString, QString);
};
class JsonRpcAdaptor : public QObject
{
Q_OBJECT
private slots:
void initTestCase()
{
qRegisterMetaType<QVariant>("QVariant");
m_testObject = new TestObject(this);
m_adaptor = new JsonQt::JsonRpcAdaptor(m_testObject, this);
m_rpc = new JsonQt::JsonRpc(this);
connect(
m_rpc, SIGNAL(sendJson(const QString&)),
m_adaptor, SLOT(processJson(const QString&))
);
connect(
m_adaptor, SIGNAL(sendJson(const QString&)),
m_rpc, SLOT(processJson(const QString&))
);
}
void testFunctionOne()
{
QSignalSpy testObjectSpy(m_testObject, SIGNAL(functionOneCalled(const QString&)));
QSignalSpy rpcSpy(m_rpc, SIGNAL(responseReceived(const QVariant&, const QVariant&)));
QVariantMap parameters;
parameters["foo"] = "bar";
m_rpc->sendRequest(42, "functionOne", parameters);
QCOMPARE(testObjectSpy.count(), 1);
QCOMPARE(testObjectSpy.first().first().toString(), QString("bar"));
QCOMPARE(rpcSpy.count(), 1);
QCOMPARE(rpcSpy.first().value(0).value<QVariant>(), QVariant(42));
QCOMPARE(rpcSpy.first().value(1).value<QVariant>(), QVariant());
}
void testFunctionFour()
{
QSignalSpy testObjectSpy(m_testObject, SIGNAL(functionFourCalled(QString, QString)));
QVariantMap parameters;
parameters["foo"] = "bar";
parameters["bar"] = "baz";
m_rpc->sendRequest(123, "functionFour", parameters);
QCOMPARE(testObjectSpy.count(), 1);
QCOMPARE(testObjectSpy.first().value(0).toString(), QString("bar"));
QCOMPARE(testObjectSpy.first().value(1).toString(), QString("baz"));
}
void testFunctionTwo()
{
QSignalSpy testObjectSpy(m_testObject, SIGNAL(functionTwoCalled()));
QSignalSpy rpcSpy(m_rpc, SIGNAL(responseReceived(const QVariant&, const QVariant&)));
m_rpc->sendRequest(1337, "functionTwo");
QCOMPARE(testObjectSpy.count(), 1);
QCOMPARE(rpcSpy.count(), 1);
QCOMPARE(rpcSpy.first().value(0).value<QVariant>(), QVariant(1337));
QCOMPARE(rpcSpy.first().value(1).value<QVariant>().toString(), QString("Mary had a little lamb."));
}
void testFunctionThree()
{
QSignalSpy testObjectSpy(m_testObject, SIGNAL(functionThreeCalled(int, bool, QVariantList, QVariantMap)));
QSignalSpy rpcSpy(m_rpc, SIGNAL(responseReceived(const QVariant&, const QVariant&)));
QVariantList listParameter;
QVariantMap nestedMap;
nestedMap["foo"] = "bar";
listParameter.append(nestedMap);
listParameter.append("baz");
QVariantList parameters;
parameters.append(123);
parameters.append(true);
parameters.append(listParameter);
parameters.append(nestedMap);
m_rpc->sendRequest(42, "functionThree", parameters);
QCOMPARE(testObjectSpy.count(), 1);
QVariantList result = testObjectSpy.first();
QCOMPARE(result.value(0), QVariant(123));
QCOMPARE(result.value(1), QVariant(true));
QCOMPARE(result.value(2), QVariant(listParameter));
QCOMPARE(result.value(3), QVariant(nestedMap));
QCOMPARE(rpcSpy.count(), 1);
QCOMPARE(rpcSpy.first().value(0).value<QVariant>(), QVariant(42));
QCOMPARE(rpcSpy.first().value(1).value<QVariant>(), QVariant());
}
void testInvalidFunction()
{
QSignalSpy rpcSpy(m_rpc, SIGNAL(errorReceived(QVariant, int, QString, QVariant)));
m_rpc->sendRequest("123", "DOES NOT EXIST");
QCOMPARE(rpcSpy.count(), 1);
QCOMPARE(rpcSpy.first().value(0).value<QVariant>(), QVariant("123"));
QCOMPARE(rpcSpy.first().value(1), QVariant(JsonQt::JsonRpc::MethodNotFound));
}
void testBadArgumentCount()
{
QSignalSpy rpcSpy(m_rpc, SIGNAL(errorReceived(QVariant, int, QString, QVariant)));
m_rpc->sendRequest("123", "functionOne");
QCOMPARE(rpcSpy.count(), 1);
QCOMPARE(rpcSpy.first().value(0).value<QVariant>(), QVariant("123"));
QCOMPARE(rpcSpy.first().value(1), QVariant(JsonQt::JsonRpc::BadParameters));
}
void testWrongArgumentTypes()
{
QSignalSpy rpcSpy(m_rpc, SIGNAL(errorReceived(QVariant, int, QString, QVariant)));
QVariantMap parameters;
parameters["foo"] = 123;
m_rpc->sendRequest("123", "functionOne", parameters);
QCOMPARE(rpcSpy.count(), 1);
QCOMPARE(rpcSpy.first().value(0).value<QVariant>(), QVariant("123"));
QCOMPARE(rpcSpy.first().value(1), QVariant(JsonQt::JsonRpc::BadParameters));
}
void testIntropection()
{
QSignalSpy rpcSpy(m_rpc, SIGNAL(responseReceived(const QVariant&, const QVariant&)));
m_rpc->sendRequest(QVariant(), "system.describe");
QCOMPARE(rpcSpy.count(), 1);
QVariantMap introspectionData = rpcSpy.first().value(1).value<QVariant>().toMap();
QVERIFY(!introspectionData.isEmpty());
// Service data
QCOMPARE(introspectionData.value("sdversion").toString(), QString("1.0")); // Service Description version
QCOMPARE(introspectionData.value("name").toString(), QString("TestName"));
QCOMPARE(introspectionData.value("id").toString(), QString("urn:data:test"));
QCOMPARE(introspectionData.value("version").toString(), QString("9000.001"));
QCOMPARE(introspectionData.value("summary").toString(), QString("Ponies"));
QVERIFY(!introspectionData.contains("help"));
QVERIFY(introspectionData.contains("procs"));
// Method data
QVariantList methods = introspectionData.value("procs").toList();
QCOMPARE(methods.count(), 4);
QVariantMap functionOne = methods.takeFirst().toMap();
QVariantMap functionTwo = methods.takeFirst().toMap();
QVariantMap functionThree = methods.takeFirst().toMap();
QVariantMap functionFour = methods.takeFirst().toMap();
QVariantList params;
QVariantMap param;
// functionOne
QCOMPARE(functionOne.value("name").toString(), QString("functionOne"));
QCOMPARE(functionOne.value("return").toString(), QString("nil"));
params = functionOne.value("params").toList();
QCOMPARE(params.count(), 1);
param = params.first().toMap();
QCOMPARE(param.value("name").toString(), QString("foo"));
QCOMPARE(param.value("type").toString(), QString("str"));
// functionTwo
QCOMPARE(functionTwo.value("name").toString(), QString("functionTwo"));
QCOMPARE(functionTwo.value("return").toString(), QString("str"));
params = functionTwo.value("params").toList();
QCOMPARE(params.count(), 0);
// functionThree
QCOMPARE(functionThree.value("name").toString(), QString("functionThree"));
QCOMPARE(functionThree.value("return").toString(), QString("nil"));
params = functionThree.value("params").toList();
QCOMPARE(params.count(), 4);
param = params.takeFirst().toMap();
QCOMPARE(param.value("name").toString(), QString("one"));
QCOMPARE(param.value("type").toString(), QString("num"));
param = params.takeFirst().toMap();
QCOMPARE(param.value("name").toString(), QString("two"));
QCOMPARE(param.value("type").toString(), QString("bit"));
param = params.takeFirst().toMap();
QCOMPARE(param.value("name").toString(), QString("three"));
QCOMPARE(param.value("type").toString(), QString("arr"));
param = params.takeFirst().toMap();
QCOMPARE(param.value("name").toString(), QString("four"));
QCOMPARE(param.value("type").toString(), QString("obj"));
// functionFour
QCOMPARE(functionFour.value("name").toString(), QString("functionFour"));
QCOMPARE(functionFour.value("return").toString(), QString("nil"));
params = functionFour.value("params").toList();
QCOMPARE(params.count(), 2);
param = params.takeFirst().toMap();
QCOMPARE(param.value("name").toString(), QString("foo"));
QCOMPARE(param.value("type").toString(), QString("str"));
param = params.takeFirst().toMap();
QCOMPARE(param.value("name").toString(), QString("bar"));
QCOMPARE(param.value("type").toString(), QString("str"));
}
private:
JsonQt::JsonRpc* m_rpc;
JsonQt::JsonRpcAdaptor* m_adaptor;
TestObject* m_testObject;
};
QTEST_MAIN(JsonRpcAdaptor);
#include "moc_JsonRpcAdaptor.cxx"