From 455803190340b911baeea33f12fd2d968fa5bcba Mon Sep 17 00:00:00 2001
From: Sergi Hernandez Juan <shernand@iri.upc.edu>
Date: Thu, 8 Feb 2018 10:38:29 +0100
Subject: [PATCH] Added the necessary changes to add:   * test code with google
 tests   * memory checks with valgrind   * code coverage of test Solved a bug
 in the CMutex class destructor.

---
 CMakeLists.txt            | 14 ++++++++++++--
 src/mutex/mutex.cpp       |  2 ++
 test/CMakeLists.txt       | 16 ++++++++++++++++
 test/gtest/CMakeLists.txt | 28 ++++++++++++++++++++++++++++
 test/mutex/mutex_test.cpp | 21 +++++++++++++++++++++
 5 files changed, 79 insertions(+), 2 deletions(-)
 create mode 100644 test/CMakeLists.txt
 create mode 100644 test/gtest/CMakeLists.txt
 create mode 100644 test/mutex/mutex_test.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 096d463..0096c31 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -24,11 +24,21 @@ IF (NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE "DEBUG") 
 ENDIF (NOT CMAKE_BUILD_TYPE)
 
-SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall")
-SET(CMAKE_CXX_FLAGS_RELEASE "-O3")
+SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -D_REENTRANT")
+SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall -D_REENTRANT -O0 --coverage -fprofile-arcs")
+SET(CMAKE_LINK_FLAGS_DEBUG "--coverage -fprofile-arcs")
+
+#
+# Add ctest
+#
+INCLUDE(CTest)
 
 ADD_SUBDIRECTORY(src)
 
+ADD_SUBDIRECTORY(test/gtest)
+
+ADD_SUBDIRECTORY(test)
+
 FIND_PACKAGE(Doxygen)
 
 FIND_PATH(IRI_DOC_DIR doxygen.conf ${CMAKE_SOURCE_DIR}/doc/iri_doc/)
diff --git a/src/mutex/mutex.cpp b/src/mutex/mutex.cpp
index 88e7f3f..f4dbee4 100644
--- a/src/mutex/mutex.cpp
+++ b/src/mutex/mutex.cpp
@@ -76,6 +76,8 @@ CMutex::~CMutex()
 {
   int error=0;
 
+  this->try_enter();
+  this->exit();
   if((error=pthread_mutex_destroy(&this->access))!=0)
   {
     /* handle exception */
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
new file mode 100644
index 0000000..9147fd5
--- /dev/null
+++ b/test/CMakeLists.txt
@@ -0,0 +1,16 @@
+include_directories(${GTEST_INCLUDE_DIRS})
+include_directories(${GMOCK_INCLUDE_DIRS})
+
+include_directories(${PROJECT_SOURCE_DIR}/src/mutex)
+
+set(CTEST_CUSTOM_COVERAGE_EXCLUDE *)
+
+add_executable(mutex_tests mutex/mutex_test.cpp)
+add_dependencies(mutex_tests googletest)
+
+target_link_libraries(mutex_tests ${PROJECT_SOURCE_DIR}/lib/libiriutils.so)
+target_link_libraries(mutex_tests ${GTEST_LIBS_DIR}/libgtest.a ${GTEST_LIBS_DIR}/libgtest_main.a)
+target_link_libraries(mutex_tests ${GMOCK_LIBS_DIR}/libgmock.a ${GMOCK_LIBS_DIR}/libgmock_main.a)
+target_link_libraries(mutex_tests pthread)
+
+add_test(NAME Mutex_Test COMMAND mutex_tests)
diff --git a/test/gtest/CMakeLists.txt b/test/gtest/CMakeLists.txt
new file mode 100644
index 0000000..3b7d782
--- /dev/null
+++ b/test/gtest/CMakeLists.txt
@@ -0,0 +1,28 @@
+cmake_minimum_required(VERSION 2.8.8)
+project(gtest_builder C CXX)
+include(ExternalProject)
+
+ExternalProject_Add(googletest
+    GIT_REPOSITORY https://github.com/google/googletest.git
+    CMAKE_ARGS -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=DebugLibs
+               -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=ReleaseLibs
+               -DCMAKE_CXX_FLAGS=${MSVC_COMPILER_DEFS}
+               -Dgtest_force_shared_crt=ON
+               -DBUILD_GTEST=ON
+     PREFIX "${CMAKE_CURRENT_BINARY_DIR}"
+# Disable install step
+    INSTALL_COMMAND ""
+)
+
+# Specify include dir
+ExternalProject_Get_Property(googletest source_dir)
+set(GTEST_INCLUDE_DIRS ${source_dir}/googletest/include PARENT_SCOPE)
+set(GMOCK_INCLUDE_DIRS  ${source_dir}/googlemock/include PARENT_SCOPE)
+
+# Specify MainTest's link libraries
+ExternalProject_Get_Property(googletest binary_dir)
+set(GTEST_LIBS_DIR ${binary_dir}/googlemock/gtest PARENT_SCOPE)
+set(GMOCK_LIBS_DIR ${binary_dir}/googlemock PARENT_SCOPE)
+
+
+
diff --git a/test/mutex/mutex_test.cpp b/test/mutex/mutex_test.cpp
new file mode 100644
index 0000000..3398c97
--- /dev/null
+++ b/test/mutex/mutex_test.cpp
@@ -0,0 +1,21 @@
+// tests.cpp
+#include "mutex.h"
+#include <gtest/gtest.h>
+ 
+TEST(mutexTest, try_enterSuccess) { 
+    CMutex mutex;
+    ASSERT_TRUE(mutex.try_enter());
+    mutex.exit();
+    ASSERT_TRUE(mutex.try_enter());
+}
+ 
+TEST(mutexTest, try_enterFailure) { 
+    CMutex mutex;
+    mutex.enter();
+    ASSERT_FALSE(mutex.try_enter());
+}
+ 
+int main(int argc, char **argv) {
+    testing::InitGoogleTest(&argc, argv);
+    return RUN_ALL_TESTS();
+}
-- 
GitLab