// Copyright (C) 2018 Ford Motor Company // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "rep_MyInterface_replica.h" #include #include #include #include const QUrl registryUrl = QUrl(QStringLiteral("tcp://127.0.0.1:65212")); class tst_Client_Process : public QObject { Q_OBJECT private Q_SLOTS: void initTestCase() { m_repNode.setRegistryUrl(registryUrl); QRemoteObjectNode::RemoteObjectSchemaHandler setupTcp = [this](QUrl url) { QTcpSocket *socket = new QTcpSocket(&this->m_repNode); connect(socket, &QTcpSocket::connected, this, [socket, this]() { this->m_repNode.addClientSideConnection(socket); }); connect(socket, &QTcpSocket::errorOccurred, socket, [socket](QAbstractSocket::SocketError error) { qDebug() << "SocketError" << error; delete socket; }); socket->connectToHost(url.host(), quint16(url.port())); }; m_repNode.registerExternalSchema(QStringLiteral("exttcp"), setupTcp); QVERIFY(m_repNode.waitForRegistry(3000)); m_rep.reset(m_repNode.acquire()); } void testRun() { QVERIFY(m_rep->waitForSource()); auto reply = m_rep->start(); QVERIFY(reply.waitForFinished()); // BEGIN: Testing QSignalSpy advanceSpy(m_rep.data(), &MyInterfaceReplica::advance); QSignalSpy spy(m_rep.data(), &MyInterfaceReplica::enum1Changed); QVERIFY(advanceSpy.wait()); QCOMPARE(spy.size(), 2); // END: Testing reply = m_rep->stop(); QVERIFY(reply.waitForFinished()); } void testEnumDetails() { QHash kvs = {{"First", 0}, {"Second", 1}, {"Third", 2}}; QScopedPointer rep(m_repNode.acquireDynamic("MyInterface")); QVERIFY(rep->waitForSource()); auto mo = rep->metaObject(); int enumIdx = mo->indexOfEnumerator("Enum1"); QVERIFY(enumIdx != -1); auto enumerator = mo->enumerator(enumIdx); QCOMPARE(enumerator.name(), "Enum1"); QCOMPARE(enumerator.keyCount(), 3); for (int i = 0; i < 3; ++i) { auto key = enumerator.key(i); auto val = enumerator.value(i); auto it = kvs.find(key); QVERIFY(it != kvs.end()); QCOMPARE(*it, val); kvs.erase(it); } int propIdx = mo->indexOfProperty("enum1"); QVERIFY(propIdx != -1); auto property = mo->property(propIdx); property.write(rep.data(), 1); QTRY_COMPARE(property.read(rep.data()).toInt(), 1); } void testMethodSignalParamDetails() { QScopedPointer rep(m_repNode.acquireDynamic("MyInterface")); QVERIFY(rep->waitForSource()); auto mo = rep->metaObject(); int signalIdx = mo->indexOfSignal("testEnumParamsInSignals(MyInterfaceReplica::Enum1,bool,QString)"); QVERIFY(signalIdx != -1); auto simm = mo->method(signalIdx); { QCOMPARE(simm.parameterCount(), 3); auto paramNames = simm.parameterNames(); QCOMPARE(paramNames.size(), 3); QCOMPARE(paramNames.at(0), QByteArrayLiteral("enumSignalParam")); QCOMPARE(paramNames.at(1), QByteArrayLiteral("signalParam2")); QCOMPARE(paramNames.at(2), QByteArrayLiteral("__repc_variable_1")); QCOMPARE(simm.parameterMetaType(0), QMetaType::fromType()); QCOMPARE(simm.parameterMetaType(1), QMetaType::fromType()); QCOMPARE(simm.parameterMetaType(2), QMetaType::fromType()); } int slotIdx = mo->indexOfSlot("testEnumParamsInSlots(MyInterfaceReplica::Enum1,bool,int)"); QVERIFY(slotIdx != -1); auto slmm = mo->method(slotIdx); { QCOMPARE(slmm .parameterCount(), 3); auto paramNames = slmm .parameterNames(); QCOMPARE(paramNames.size(), 3); QCOMPARE(paramNames.at(0), QByteArrayLiteral("enumSlotParam")); QCOMPARE(paramNames.at(1), QByteArrayLiteral("slotParam2")); QCOMPARE(paramNames.at(2), QByteArrayLiteral("__repc_variable_1")); } MyInterfaceReplica::Enum1 enumVal = {}; mo->invokeMethod(rep.data(), "testEnumParamsInSlots", Q_ARG(MyInterfaceReplica::Enum1, enumVal), Q_ARG(bool, true), Q_ARG(int, 1234)); int enumIdx = mo->indexOfProperty("enum1"); QVERIFY(enumIdx != -1); QTRY_COMPARE(mo->property(enumIdx).read(rep.data()).toInt(), 0); int startedIdx = mo->indexOfProperty("started"); QVERIFY(startedIdx != -1); QTRY_COMPARE(mo->property(startedIdx).read(rep.data()).toBool(), true); } void testMethodSignal() { QScopedPointer rep(new MyInterfaceReplica()); rep->setNode(&m_repNode); QVERIFY(rep->waitForSource()); rep->testEnumParamsInSlots(MyInterfaceReplica::Second, false, 74); connect(rep.data(), &MyInterfaceReplica::testEnumParamsInSignals, this, [](MyInterfaceReplica::Enum1 enumSignalParam) { QCOMPARE(enumSignalParam, MyInterfaceReplica::Second); }); QTRY_COMPARE(rep->enum1(), MyInterfaceReplica::Second); QTRY_COMPARE(rep->started(), false); } void testDisconnect() { auto reply = m_rep->next(); QSignalSpy stateSpy(m_rep.data(), &MyInterfaceReplica::stateChanged); QVERIFY(reply.waitForFinished()); QTRY_COMPARE(stateSpy.size(), 1); QCOMPARE(m_rep->state(), QRemoteObjectReplica::Suspect); QTRY_COMPARE(stateSpy.size(), 2); QCOMPARE(m_rep->state(), QRemoteObjectReplica::Valid); // Make sure we updated to the correct enum1 value QCOMPARE(m_rep->enum1(), MyInterfaceReplica::First); } void cleanupTestCase() { auto reply = m_rep->quit(); QVERIFY(reply.waitForFinished()); } private: QRemoteObjectNode m_repNode; QScopedPointer m_rep; }; QTEST_MAIN(tst_Client_Process) #include "main.moc"