Add loops in stress tests to test adaptor/proxy initialization/deinitialization

This commit is contained in:
sangelovic
2019-04-13 21:28:43 +02:00
parent e3a74a3ff2
commit 1d44d8b37f
2 changed files with 144 additions and 105 deletions

View File

@@ -54,7 +54,6 @@ protected:
virtual void sendDataSignals(const uint32_t& numberOfSignals, const uint32_t& signalMsgSize) override virtual void sendDataSignals(const uint32_t& numberOfSignals, const uint32_t& signalMsgSize) override
{ {
auto data = createRandomString(signalMsgSize); auto data = createRandomString(signalMsgSize);
char digits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
auto start_time = std::chrono::steady_clock::now(); auto start_time = std::chrono::steady_clock::now();
for (uint32_t i = 0; i < numberOfSignals; ++i) for (uint32_t i = 0; i < numberOfSignals; ++i)

View File

@@ -37,6 +37,7 @@
#include <thread> #include <thread>
#include <chrono> #include <chrono>
#include <cassert> #include <cassert>
#include <cstdlib>
#include <atomic> #include <atomic>
#include <sstream> #include <sstream>
#include <mutex> #include <mutex>
@@ -319,7 +320,7 @@ private:
uint32_t aNumber; uint32_t aNumber;
str >> aNumber; str >> aNumber;
assert(aNumber >= 0); assert(aNumber > 0);
++repliesReceived_; ++repliesReceived_;
} }
@@ -333,7 +334,7 @@ private:
uint32_t aNumber; uint32_t aNumber;
str >> aNumber; str >> aNumber;
assert(aNumber >= 0); assert(aNumber > 0);
++signalsReceived_; ++signalsReceived_;
} }
@@ -344,8 +345,47 @@ public:
}; };
//----------------------------------------- //-----------------------------------------
int main(int /*argc*/, char */*argv*/[]) int main(int argc, char *argv[])
{ {
long loops;
long loopDuration;
if (argc == 1)
{
loops = 1;
loopDuration = 30000;
}
else if (argc == 3)
{
loops = std::atol(argv[1]);
loopDuration = std::atol(argv[2]);
}
else
throw std::runtime_error("Wrong program options");
std::cout << "Going on with " << loops << " loops and " << loopDuration << "ms loop duration" << std::endl;
std::atomic<uint32_t> concatenationCallsMade{0};
std::atomic<uint32_t> concatenationRepliesReceived{0};
std::atomic<uint32_t> concatenationSignalsReceived{0};
std::atomic<uint32_t> thermometerCallsMade{0};
std::atomic<bool> exitLogger{};
std::thread loggerThread([&]()
{
while (!exitLogger)
{
std::this_thread::sleep_for(1s);
std::cout << "Made " << concatenationCallsMade << " concatenation calls, received " << concatenationRepliesReceived << " replies and " << concatenationSignalsReceived << " signals so far." << std::endl;
std::cout << "Made " << thermometerCallsMade << " thermometer calls so far." << std::endl << std::endl;
}
});
for (long loop = 0; loop < loops; ++loop)
{
std::cout << "Entering loop " << loop+1 << std::endl;
auto service2Connection = sdbus::createSystemBusConnection(SERVICE_2_BUS_NAME); auto service2Connection = sdbus::createSystemBusConnection(SERVICE_2_BUS_NAME);
std::atomic<bool> service2ThreadReady{}; std::atomic<bool> service2ThreadReady{};
std::thread service2Thread([&con = *service2Connection, &service2ThreadReady]() std::thread service2Thread([&con = *service2Connection, &service2ThreadReady]()
@@ -369,12 +409,10 @@ int main(int /*argc*/, char */*argv*/[])
while (!service2ThreadReady || !service1ThreadReady) while (!service2ThreadReady || !service1ThreadReady)
std::this_thread::sleep_for(1ms); std::this_thread::sleep_for(1ms);
std::atomic<uint32_t> concatenationCallsMade{0};
std::atomic<uint32_t> concatenationRepliesReceived{0};
std::atomic<uint32_t> concatenationSignalsReceived{0};
std::atomic<uint32_t> thermometerCallsMade{0};
auto clientConnection = sdbus::createSystemBusConnection(); auto clientConnection = sdbus::createSystemBusConnection();
std::mutex clientThreadExitMutex;
std::condition_variable clientThreadExitCond;
bool clientThreadExit{};
std::thread clientThread([&, &con = *clientConnection]() std::thread clientThread([&, &con = *clientConnection]()
{ {
std::atomic<bool> stopClients{false}; std::atomic<bool> stopClients{false};
@@ -390,7 +428,7 @@ int main(int /*argc*/, char */*argv*/[])
{ {
std::map<std::string, sdbus::Variant> param; std::map<std::string, sdbus::Variant> param;
param["key1"] = "sdbus-c++-stress-tests"; param["key1"] = "sdbus-c++-stress-tests";
param["key2"] = localCounter++; param["key2"] = ++localCounter;
concatenator.concatenate(param); concatenator.concatenate(param);
@@ -440,35 +478,37 @@ int main(int /*argc*/, char */*argv*/[])
} }
}); });
con.enterProcessingLoop(); // We could run the loop in a sync way, but we want it to run also when proxies are destroyed for better
// coverage of multi-threaded scenarios, so we run it async and use condition variable for exit notification
//con.enterProcessingLoop();
con.enterProcessingLoopAsync();
std::unique_lock<std::mutex> lock(clientThreadExitMutex);
clientThreadExitCond.wait(lock, [&]{return clientThreadExit;});
stopClients = true; stopClients = true;
concatenatorThread.join();
thermometerThread.join(); thermometerThread.join();
concatenatorThread.join();
}); });
std::atomic<bool> exitLogger{}; std::this_thread::sleep_for(std::chrono::milliseconds(loopDuration));
std::thread loggerThread([&]()
{
while (!exitLogger)
{
std::this_thread::sleep_for(1s);
std::cout << "Made " << concatenationCallsMade << " concatenation calls, received " << concatenationRepliesReceived << " replies and " << concatenationSignalsReceived << " signals so far." << std::endl; //clientConnection->leaveProcessingLoop();
std::cout << "Made " << thermometerCallsMade << " thermometer calls so far." << std::endl << std::endl; std::unique_lock<std::mutex> lock(clientThreadExitMutex);
clientThreadExit = true;
lock.unlock();
clientThreadExitCond.notify_one();
clientThread.join();
service1Connection->leaveProcessingLoop();
service1Thread.join();
service2Connection->leaveProcessingLoop();
service2Thread.join();
} }
});
getchar();
exitLogger = true; exitLogger = true;
loggerThread.join(); loggerThread.join();
clientConnection->leaveProcessingLoop();
clientThread.join();
service1Connection->leaveProcessingLoop();
service1Thread.join();
service2Connection->leaveProcessingLoop();
service2Thread.join();
return 0; return 0;
} }