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"