Solve legacy problem with clear operation (coredump with running threads)
[anna.git] / source / testing / TestManager.cpp
index a74ab6d..280a198 100644 (file)
@@ -295,10 +295,38 @@ TestCase *TestManager::getTestCase(unsigned int id, const std::string &descripti
   return result;
 }
 
-bool TestManager::clearPool() throw() {
-  if (!tests()) return false;
-  for (test_pool_it it = a_testPool.begin(); it != a_testPool.end(); it++) delete it->second;
-  // TODO: stop the possible command threads or there will be a core dump
+bool TestManager::clearPool(std::string &result) throw() {
+
+  result = "";
+
+  if (!tests()) {
+    result = "there are not programmed test cases to be removed";
+    return false;
+  }
+
+  int total = a_testPool.size();
+  int unsafe = 0;
+
+  test_pool_it it;
+  for (it = a_testPool.begin(); it != a_testPool.end(); it++) {
+    if (!it->second->safeToClear()) { // Check that non pending threads are running (command steps):
+      unsafe++;
+    }
+  }
+
+  if (unsafe > 0) {
+    result = "some test cases cannot be removed (";
+    result += anna::functions::asString(unsafe);
+    result += "/";
+    result += anna::functions::asString(total);
+    result += "), mainly those having running-thread steps. Check for stuck external procedures or try later.";
+    return false;
+  }
+
+  // Here is safe to clear:
+  for (it = a_testPool.begin(); it != a_testPool.end(); it++) {
+    delete it->second;
+  }
 
   a_testPool.clear();
   a_key1TestCaseMap.clear();
@@ -307,6 +335,7 @@ bool TestManager::clearPool() throw() {
   a_poolCycle = 1;
   configureTTPS(0); // stop
   a_statSummary.clear();
+
   return true;
 }
 
@@ -537,7 +566,7 @@ throw() {
   if (a_clock) {
     result->createAttribute("AsynchronousSendings", a_synchronousAmount);
     int ticksPerSecond = (a_synchronousAmount * 1000) / a_clock->getTimeout();
-    result->createAttribute("TicksPerSecond", ticksPerSecond);
+    result->createAttribute("TicksPerSecond", a_clock->isActive() ? ticksPerSecond : 0);
   }
   if (a_currentTestIt != a_testPool.end()) {
     result->createAttribute("CurrentTestCaseId", (*a_currentTestIt).first);