From 086d6a5569ca550fc9d6dfffa29901dc7d7e3aa1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joan=20Vallv=C3=A9=20Navarro?= <jvallve@iri.upc.edu>
Date: Tue, 6 Oct 2020 13:01:26 +0200
Subject: [PATCH] multithreading tests in different gtest

---
 test/CMakeLists.txt                       | 14 +++-
 test/gtest_solver_ceres.cpp               | 43 ------------
 test/gtest_solver_ceres_multithread.cpp   | 81 +++++++++++++++++++++++
 test/gtest_solver_manager.cpp             | 43 ------------
 test/gtest_solver_manager_multithread.cpp | 75 +++++++++++++++++++++
 5 files changed, 167 insertions(+), 89 deletions(-)
 create mode 100644 test/gtest_solver_ceres_multithread.cpp
 create mode 100644 test/gtest_solver_manager_multithread.cpp

diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 88bcfc88a..b05f5636d 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -139,6 +139,10 @@ target_link_libraries(gtest_shared_from_this ${PLUGIN_NAME})
 wolf_add_gtest(gtest_solver_manager gtest_solver_manager.cpp)
 target_link_libraries(gtest_solver_manager ${PLUGIN_NAME})
 
+# SolverManagerMultithread test
+wolf_add_gtest(gtest_solver_manager_multithread gtest_solver_manager_multithread.cpp)
+target_link_libraries(gtest_solver_manager_multithread ${PLUGIN_NAME})
+
 # StateBlock class test
 wolf_add_gtest(gtest_state_block gtest_state_block.cpp)
 target_link_libraries(gtest_state_block ${PLUGIN_NAME})
@@ -250,9 +254,13 @@ wolf_add_gtest(gtest_sensor_diff_drive gtest_sensor_diff_drive.cpp)
 target_link_libraries(gtest_sensor_diff_drive ${PLUGIN_NAME})
 
 IF (Ceres_FOUND)
-# SolverCeres test
-wolf_add_gtest(gtest_solver_ceres gtest_solver_ceres.cpp)
-target_link_libraries(gtest_solver_ceres ${PLUGIN_NAME})
+	# SolverCeres test
+	wolf_add_gtest(gtest_solver_ceres gtest_solver_ceres.cpp)
+	target_link_libraries(gtest_solver_ceres ${PLUGIN_NAME})
+	
+	# SolverCeresMultithread test
+	wolf_add_gtest(gtest_solver_ceres_multithread gtest_solver_ceres_multithread.cpp)
+	target_link_libraries(gtest_solver_ceres_multithread ${PLUGIN_NAME})
 ENDIF(Ceres_FOUND)
 
 # TreeManagerSlidingWindow class test
diff --git a/test/gtest_solver_ceres.cpp b/test/gtest_solver_ceres.cpp
index 9fe0e4306..e5efa2dff 100644
--- a/test/gtest_solver_ceres.cpp
+++ b/test/gtest_solver_ceres.cpp
@@ -1514,49 +1514,6 @@ TEST(SolverCeres, OnlyFactor_AddRemove)
     EXPECT_TRUE(solver_ptr->check());
 }
 
-////////////////////////////////////////////////////////
-// MULTITHREADING
-
-TEST(SolverCeres, MultiThreadingTruncatedNotifications)
-{
-    double Dt = 5.0;
-    ProblemPtr P = Problem::create("PO", 2);
-    auto solver_ptr = std::make_shared<SolverCeres>(P);
-
-    // loop updating (without sleep)
-    std::thread t([&](){
-        auto start_t = std::chrono::high_resolution_clock::now();
-        while (true)
-        {
-            solver_ptr->update();
-            ASSERT_TRUE(solver_ptr->check());
-            if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start_t).count() > Dt)
-                break;
-        }});
-
-    // loop emplacing and removing frames (window of 10 KF)
-    auto start = std::chrono::high_resolution_clock::now();
-    TimeStamp ts(0);
-    while (true)
-    {
-        // Emplace Frame, Capture, feature and factor pose 2d
-        FrameBasePtr        F = P->emplaceKeyFrame(ts, P->stateZero());
-        auto C = CaptureBase::emplace<CaptureVoid>(F, ts, nullptr);
-        auto f = FeatureBase::emplace<FeatureBase>(C, "FeaturePose2d", Vector3d::Zero(), Matrix3d::Identity());
-        auto c = FactorBase::emplace<FactorPose2d>(f, f, nullptr, false);
-
-        ts += 1.0;
-
-        if (P->getTrajectory()->getFrameMap().size() > 10)
-            (*P->getTrajectory()->begin())->remove();
-
-        if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt)
-            break;
-    }
-
-    t.join();
-}
-
 int main(int argc, char **argv)
 {
   testing::InitGoogleTest(&argc, argv);
diff --git a/test/gtest_solver_ceres_multithread.cpp b/test/gtest_solver_ceres_multithread.cpp
new file mode 100644
index 000000000..91fa716cb
--- /dev/null
+++ b/test/gtest_solver_ceres_multithread.cpp
@@ -0,0 +1,81 @@
+/*
+ * gtest_solver_ptr.cpp
+ *
+ *  Created on: Jun, 2018
+ *      Author: jvallve
+ */
+
+#include "core/utils/utils_gtest.h"
+
+#include "core/problem/problem.h"
+#include "core/sensor/sensor_base.h"
+#include "core/state_block/state_block.h"
+#include "core/capture/capture_void.h"
+#include "core/factor/factor_pose_2d.h"
+#include "core/factor/factor_quaternion_absolute.h"
+#include "core/factor/factor_block_absolute.h"
+#include "core/state_block/local_parametrization_angle.h"
+#include "core/state_block/local_parametrization_quaternion.h"
+
+#include "core/solver/solver_manager.h"
+#include "core/ceres_wrapper/solver_ceres.h"
+#include "core/ceres_wrapper/local_parametrization_wrapper.h"
+
+#include "ceres/ceres.h"
+
+#include <iostream>
+
+using namespace wolf;
+using namespace Eigen;
+
+/*
+ * Following tests are the same as in gtest_solver_manager_multithread.cpp
+ * (modifications should be applied to both tests)
+ */
+
+TEST(SolverCeresMultithread, MultiThreadingTruncatedNotifications)
+{
+    double Dt = 5.0;
+    ProblemPtr P = Problem::create("PO", 2);
+    auto solver_ptr = std::make_shared<SolverCeres>(P);
+
+    // loop updating (without sleep)
+    std::thread t([&](){
+        auto start_t = std::chrono::high_resolution_clock::now();
+        while (true)
+        {
+            solver_ptr->update();
+            ASSERT_TRUE(solver_ptr->check());
+            if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start_t).count() > Dt)
+                break;
+        }});
+
+    // loop emplacing and removing frames (window of 10 KF)
+    auto start = std::chrono::high_resolution_clock::now();
+    TimeStamp ts(0);
+    while (true)
+    {
+        // Emplace Frame, Capture, feature and factor pose 2d
+        FrameBasePtr        F = P->emplaceKeyFrame(ts, P->stateZero());
+        auto C = CaptureBase::emplace<CaptureVoid>(F, ts, nullptr);
+        auto f = FeatureBase::emplace<FeatureBase>(C, "FeaturePose2d", Vector3d::Zero(), Matrix3d::Identity());
+        auto c = FactorBase::emplace<FactorPose2d>(f, f, nullptr, false);
+
+        ts += 1.0;
+
+        if (P->getTrajectory()->getFrameMap().size() > 10)
+            (*P->getTrajectory()->begin())->remove();
+
+        if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt)
+            break;
+    }
+
+    t.join();
+}
+
+int main(int argc, char **argv)
+{
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
+
diff --git a/test/gtest_solver_manager.cpp b/test/gtest_solver_manager.cpp
index 5226e125d..2eb3f46e9 100644
--- a/test/gtest_solver_manager.cpp
+++ b/test/gtest_solver_manager.cpp
@@ -1509,49 +1509,6 @@ TEST(SolverManager, OnlyFactor_AddRemove)
     EXPECT_TRUE(solver_ptr->check());
 }
 
-////////////////////////////////////////////////////////
-// MULTITHREADING
-
-TEST(SolverManager, MultiThreadingTruncatedNotifications)
-{
-    double Dt = 5.0;
-    ProblemPtr P = Problem::create("PO", 2);
-    auto solver_ptr = std::make_shared<SolverManagerDummy>(P);
-
-    // loop updating (without sleep)
-    std::thread t([&](){
-        auto start_t = std::chrono::high_resolution_clock::now();
-        while (true)
-        {
-            solver_ptr->update();
-            ASSERT_TRUE(solver_ptr->check());
-            if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start_t).count() > Dt)
-                break;
-        }});
-
-    // loop emplacing and removing frames (window of 10 KF)
-    auto start = std::chrono::high_resolution_clock::now();
-    TimeStamp ts(0);
-    while (true)
-    {
-        // Emplace Frame, Capture, feature and factor pose 2d
-        FrameBasePtr        F = P->emplaceKeyFrame(ts, P->stateZero());
-        auto C = CaptureBase::emplace<CaptureVoid>(F, ts, nullptr);
-        auto f = FeatureBase::emplace<FeatureBase>(C, "FeaturePose2d", Vector3d::Zero(), Matrix3d::Identity());
-        auto c = FactorBase::emplace<FactorPose2d>(f, f, nullptr, false);
-
-        ts += 1.0;
-
-        if (P->getTrajectory()->getFrameMap().size() > 10)
-            (*P->getTrajectory()->begin())->remove();
-
-        if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt)
-            break;
-    }
-
-    t.join();
-}
-
 int main(int argc, char **argv)
 {
   testing::InitGoogleTest(&argc, argv);
diff --git a/test/gtest_solver_manager_multithread.cpp b/test/gtest_solver_manager_multithread.cpp
new file mode 100644
index 000000000..0770b33ae
--- /dev/null
+++ b/test/gtest_solver_manager_multithread.cpp
@@ -0,0 +1,75 @@
+/*
+ * gtest_solver_manager.cpp
+ *
+ *  Created on: Jun, 2018
+ *      Author: jvallve
+ */
+
+#include "core/utils/utils_gtest.h"
+
+
+#include "core/problem/problem.h"
+#include "core/sensor/sensor_base.h"
+#include "core/state_block/state_block.h"
+#include "core/capture/capture_void.h"
+#include "core/factor/factor_pose_2d.h"
+#include "core/factor/factor_block_absolute.h"
+#include "core/state_block/local_parametrization_quaternion.h"
+#include "dummy/solver_manager_dummy.h"
+
+#include <iostream>
+#include <thread>
+
+using namespace wolf;
+using namespace Eigen;
+
+/*
+ * Following tests are the same as in gtest_solver_ceres_multithread.cpp
+ * (modifications should be applied to both tests)
+ */
+
+TEST(SolverManagerMultithread, MultiThreadingTruncatedNotifications)
+{
+    double Dt = 5.0;
+    ProblemPtr P = Problem::create("PO", 2);
+    auto solver_ptr = std::make_shared<SolverManagerDummy>(P);
+
+    // loop updating (without sleep)
+    std::thread t([&](){
+        auto start_t = std::chrono::high_resolution_clock::now();
+        while (true)
+        {
+            solver_ptr->update();
+            ASSERT_TRUE(solver_ptr->check());
+            if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start_t).count() > Dt)
+                break;
+        }});
+
+    // loop emplacing and removing frames (window of 10 KF)
+    auto start = std::chrono::high_resolution_clock::now();
+    TimeStamp ts(0);
+    while (true)
+    {
+        // Emplace Frame, Capture, feature and factor pose 2d
+        FrameBasePtr        F = P->emplaceKeyFrame(ts, P->stateZero());
+        auto C = CaptureBase::emplace<CaptureVoid>(F, ts, nullptr);
+        auto f = FeatureBase::emplace<FeatureBase>(C, "FeaturePose2d", Vector3d::Zero(), Matrix3d::Identity());
+        auto c = FactorBase::emplace<FactorPose2d>(f, f, nullptr, false);
+
+        ts += 1.0;
+
+        if (P->getTrajectory()->getFrameMap().size() > 10)
+            (*P->getTrajectory()->begin())->remove();
+
+        if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt)
+            break;
+    }
+
+    t.join();
+}
+
+int main(int argc, char **argv)
+{
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
-- 
GitLab