File indexing completed on 2024-05-12 05:26:26
0001 #include <QTest> 0002 #include <QSignalSpy> 0003 0004 #include "resourceaccess.h" 0005 #include "listener.h" 0006 #include "commands.h" 0007 #include "test.h" 0008 #include "handshake_generated.h" 0009 0010 /** 0011 * Test that resourceaccess and listener work together. 0012 */ 0013 class ResourceCommunicationTest : public QObject 0014 { 0015 Q_OBJECT 0016 private slots: 0017 void testConnect() 0018 { 0019 const QByteArray resourceIdentifier("test"); 0020 Listener listener(resourceIdentifier, ""); 0021 Sink::ResourceAccess resourceAccess(resourceIdentifier, ""); 0022 0023 QSignalSpy spy(&resourceAccess, &Sink::ResourceAccess::ready); 0024 resourceAccess.open(); 0025 QTRY_COMPARE(spy.size(), 1); 0026 } 0027 0028 void testHandshake() 0029 { 0030 const QByteArray resourceIdentifier("test"); 0031 Listener listener(resourceIdentifier, ""); 0032 Sink::ResourceAccess resourceAccess(resourceIdentifier, ""); 0033 resourceAccess.open(); 0034 0035 flatbuffers::FlatBufferBuilder fbb; 0036 auto name = fbb.CreateString("test"); 0037 auto command = Sink::Commands::CreateHandshake(fbb, name); 0038 Sink::Commands::FinishHandshakeBuffer(fbb, command); 0039 VERIFYEXEC(resourceAccess.sendCommand(Sink::Commands::HandshakeCommand, fbb)); 0040 } 0041 0042 void testCommandLoop() 0043 { 0044 const QByteArray resourceIdentifier("test"); 0045 Listener listener(resourceIdentifier, ""); 0046 Sink::ResourceAccess resourceAccess(resourceIdentifier, ""); 0047 resourceAccess.open(); 0048 0049 const int count = 500; 0050 int complete = 0; 0051 int errors = 0; 0052 for (int i = 0; i < count; i++) { 0053 auto result = resourceAccess.sendCommand(Sink::Commands::PingCommand) 0054 .then([&resourceAccess, &errors, &complete](const KAsync::Error &error) { 0055 complete++; 0056 if (error) { 0057 qWarning() << error.errorMessage; 0058 errors++; 0059 } 0060 }) 0061 .exec(); 0062 } 0063 QTRY_COMPARE(complete, count); 0064 QVERIFY(!errors); 0065 } 0066 0067 void testResourceAccessReuse() 0068 { 0069 const QByteArray resourceIdentifier("test"); 0070 Listener listener(resourceIdentifier, ""); 0071 Sink::ResourceAccess resourceAccess(resourceIdentifier, ""); 0072 resourceAccess.open(); 0073 0074 const int count = 10; 0075 int complete = 0; 0076 int errors = 0; 0077 for (int i = 0; i < count; i++) { 0078 VERIFYEXEC(resourceAccess.sendCommand(Sink::Commands::PingCommand) 0079 .then([&resourceAccess, &errors, &complete](const KAsync::Error &error) { 0080 complete++; 0081 if (error) { 0082 qWarning() << error.errorMessage; 0083 errors++; 0084 } 0085 resourceAccess.close(); 0086 resourceAccess.open(); 0087 })); 0088 } 0089 QTRY_COMPARE(complete, count); 0090 QVERIFY(!errors); 0091 } 0092 0093 void testAccessFactory() 0094 { 0095 const QByteArray resourceIdentifier("test"); 0096 Listener listener(resourceIdentifier, ""); 0097 QWeakPointer<Sink::ResourceAccess> weakRef; 0098 QTime time; 0099 time.start(); 0100 { 0101 auto resourceAccess = Sink::ResourceAccessFactory::instance().getAccess(resourceIdentifier, ""); 0102 weakRef = resourceAccess.toWeakRef(); 0103 resourceAccess->open(); 0104 resourceAccess->sendCommand(Sink::Commands::PingCommand).then([resourceAccess]() { qDebug() << "Ping complete"; }).exec(); 0105 } 0106 QVERIFY(weakRef.toStrongRef()); 0107 QTRY_VERIFY(!weakRef.toStrongRef()); 0108 qDebug() << "time.elapsed " << time.elapsed(); 0109 QVERIFY(time.elapsed() < 3500); 0110 QVERIFY(time.elapsed() > 2500); 0111 } 0112 0113 void testResourceAccessShutdown() 0114 { 0115 const QByteArray resourceIdentifier("test"); 0116 Listener listener(resourceIdentifier, ""); 0117 Sink::ResourceAccess resourceAccess(resourceIdentifier, ""); 0118 resourceAccess.open(); 0119 QTRY_VERIFY(resourceAccess.isReady()); 0120 VERIFYEXEC(resourceAccess.shutdown()); 0121 QTRY_VERIFY(!resourceAccess.isReady()); 0122 } 0123 0124 void testResourceAccessShutdownWithCommand() 0125 { 0126 const QByteArray resourceIdentifier("test"); 0127 for (int i = 0; i < 10; i++) { 0128 Listener listener(resourceIdentifier, ""); 0129 auto resourceAccess = Sink::ResourceAccessFactory::instance().getAccess(resourceIdentifier, ""); 0130 //This automatically connects 0131 VERIFYEXEC(resourceAccess->sendCommand(Sink::Commands::PingCommand)); 0132 QVERIFY(resourceAccess->isReady()); 0133 VERIFYEXEC(resourceAccess->shutdown()); 0134 } 0135 } 0136 0137 /** 0138 * Make sure we handle a shutdown while commands being written to the resource. 0139 */ 0140 void testResourceAccessShutdownWithCommand2() 0141 { 0142 const QByteArray resourceIdentifier("test"); 0143 Listener listener(resourceIdentifier, ""); 0144 auto resourceAccess = Sink::ResourceAccessFactory::instance().getAccess(resourceIdentifier, ""); 0145 for (int i = 0; i < 10; i++) { 0146 resourceAccess->sendCommand(Sink::Commands::PingCommand).exec(); 0147 } 0148 resourceAccess->shutdown().exec(); 0149 for (int i = 0; i < 10; i++) { 0150 resourceAccess->sendCommand(Sink::Commands::PingCommand).exec(); 0151 } 0152 } 0153 }; 0154 0155 QTEST_MAIN(ResourceCommunicationTest) 0156 #include "resourcecommunicationtest.moc"