From 7c32430742a01f263bf8a989f79d8b0faac0ccbd Mon Sep 17 00:00:00 2001
From: Haocheng Liu <haocheng.liu@kitware.com>
Date: Mon, 11 Sep 2017 15:34:29 -0400
Subject: [PATCH] TESTING: Make binding tests able to run in parallel

Redesign the logic for C binding test with google framework.
In the future we should also add validation for binding tests.
---
 cmake/ADIOSFunctions.cmake                    | 16 +++-
 testing/adios2/bindings/C/CMakeLists.txt      | 13 +--
 ...estBPWriteTypes.c => TestBPWriteTypes.cpp} | 45 +++++++--
 .../bindings/C/TestBPWriteTypes_nompi.c       | 92 -------------------
 testing/adios2/bindings/CMakeLists.txt        |  2 +-
 .../adios2/bindings/fortran/CMakeLists.txt    |  8 +-
 testing/adios2/bindings/python/CMakeLists.txt |  9 +-
 7 files changed, 68 insertions(+), 117 deletions(-)
 rename testing/adios2/bindings/C/{TestBPWriteTypes.c => TestBPWriteTypes.cpp} (83%)
 delete mode 100644 testing/adios2/bindings/C/TestBPWriteTypes_nompi.c

diff --git a/cmake/ADIOSFunctions.cmake b/cmake/ADIOSFunctions.cmake
index 9fcc856cb..c6ad25a2a 100644
--- a/cmake/ADIOSFunctions.cmake
+++ b/cmake/ADIOSFunctions.cmake
@@ -22,11 +22,19 @@ function(message_pad msg out_len out_msg)
   endif()
 endfunction()
 
-function(python_add_test name script)
-  add_test(NAME ${name}
-    COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${script} ${ARGN}
+function(python_add_test)
+  set(options)
+  set(oneValueArgs
+      NAME
   )
-  set_property(TEST ${name} PROPERTY
+  # EXEC_WRAPPER: Any extra arguments to pass on the command line before test case
+  # SCRIPT: Script name and corresponding comand line inputs
+  set(multiValueArgs EXEC_WRAPPER SCRIPT)
+  cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" "${ARGN}")
+  add_test(NAME ${ARGS_NAME}
+    COMMAND ${ARGS_EXEC_WRAPPER} ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${ARGS_SCRIPT}
+  )
+  set_property(TEST ${ARGS_NAME} PROPERTY
     ENVIRONMENT "PYTHONPATH=${ADIOS2_BINARY_DIR}/${CMAKE_INSTALL_PYTHONDIR}:$ENV{PYTHONPATH}"
   )
 endfunction()
diff --git a/testing/adios2/bindings/C/CMakeLists.txt b/testing/adios2/bindings/C/CMakeLists.txt
index 9897e1b03..57f251f96 100644
--- a/testing/adios2/bindings/C/CMakeLists.txt
+++ b/testing/adios2/bindings/C/CMakeLists.txt
@@ -3,14 +3,15 @@
 # accompanying file Copyright.txt for details.
 #------------------------------------------------------------------------------#
 
+add_executable(TestBPWriteTypes_c TestBPWriteTypes.cpp)
+target_link_libraries(TestBPWriteTypes_c adios2 gtest)
+
 if(ADIOS2_HAVE_MPI)
-  add_executable(TestBPWriteTypes_c TestBPWriteTypes.c)
   target_include_directories(TestBPWriteTypes_c PRIVATE ${MPI_C_INCLUDE_PATH})
   target_link_libraries(TestBPWriteTypes_c ${MPI_C_LIBRARIES})
-else()
-  add_executable(TestBPWriteTypes_c TestBPWriteTypes_nompi.c)
+  set(extra_test_args
+    EXEC_WRAPPER
+    ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS})
 endif()
 
-target_link_libraries(TestBPWriteTypes_c adios2)
-
-add_test(NAME BPWrite_c COMMAND TestBPWriteTypes_c)
+gtest_add_tests(TARGET TestBPWriteTypes_c ${extra_test_args})
diff --git a/testing/adios2/bindings/C/TestBPWriteTypes.c b/testing/adios2/bindings/C/TestBPWriteTypes.cpp
similarity index 83%
rename from testing/adios2/bindings/C/TestBPWriteTypes.c
rename to testing/adios2/bindings/C/TestBPWriteTypes.cpp
index 55917aad8..c05c63001 100644
--- a/testing/adios2/bindings/C/TestBPWriteTypes.c
+++ b/testing/adios2/bindings/C/TestBPWriteTypes.cpp
@@ -5,23 +5,35 @@
  * TestBPWriteTypes.c
  *
  *  Created on: Aug 9, 2017
- *      Author: wgodoy
+ *      Author: Haocheng
  */
 
+#include <adios2_c.h>
+
+#ifdef ADIOS2_HAVE_MPI
 #include <mpi.h>
+#endif
 
-#include <adios2_c.h>
+#include <gtest/gtest.h>
 
 #include "SmallTestData_c.h"
 
-int main(int argc, char *argv[])
+class BPWriteTypes : public ::testing::Test
 {
-    MPI_Init(&argc, &argv);
-    int rank, size;
-    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
-    MPI_Comm_size(MPI_COMM_WORLD, &size);
+public:
+    BPWriteTypes() = default;
+};
 
+TEST_F(BPWriteTypes, ADIOS2BPWriteTypes)
+{
+    int rank(0), size(0);
+#ifdef ADIOS2_HAVE_MPI
     adios2_ADIOS *adiosH = adios2_init(MPI_COMM_WORLD, adios2_debug_mode_on);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+#else
+    adios2_ADIOS *adiosH = adios2_init_nompi(adios2_debug_mode_on);
+#endif
 
     // IO
     adios2_IO *ioH = adios2_declare_io(adiosH, "CArrayTypes");
@@ -96,7 +108,24 @@ int main(int argc, char *argv[])
 
     // deallocate adiosH
     adios2_finalize(adiosH);
+}
 
+//******************************************************************************
+// main
+//******************************************************************************
+
+int main(int argc, char **argv)
+{
+#ifdef ADIOS2_HAVE_MPI
+    MPI_Init(nullptr, nullptr);
+#endif
+
+    ::testing::InitGoogleTest(&argc, argv);
+    int result = RUN_ALL_TESTS();
+
+#ifdef ADIOS2_HAVE_MPI
     MPI_Finalize();
-    return 0;
+#endif
+
+    return result;
 }
diff --git a/testing/adios2/bindings/C/TestBPWriteTypes_nompi.c b/testing/adios2/bindings/C/TestBPWriteTypes_nompi.c
deleted file mode 100644
index 247e5b4bd..000000000
--- a/testing/adios2/bindings/C/TestBPWriteTypes_nompi.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Distributed under the OSI-approved Apache License, Version 2.0.  See
- * accompanying file Copyright.txt for details.
- *
- * TestBPWriteTypes.c
- *
- *  Created on: Aug 9, 2017
- *      Author: wgodoy
- */
-
-#include <adios2_c.h>
-
-#include "SmallTestData_c.h"
-
-int main(int argc, char *argv[])
-{
-    adios2_ADIOS *adiosH = adios2_init_nompi(adios2_debug_mode_on);
-
-    // IO
-    adios2_IO *ioH = adios2_declare_io(adiosH, "CArrayTypes");
-    // Set engine parameters
-    adios2_set_engine(ioH, "BPFileWriter");
-    adios2_set_param(ioH, "ProfileUnits", "Microseconds");
-    adios2_set_param(ioH, "Threads", "1");
-
-    // Set transport and parameters
-    const unsigned int transportID = adios2_add_transport(ioH, "File");
-    adios2_set_transport_param(ioH, transportID, "library", "fstream");
-
-    // count dims are allocated in stack
-    size_t count[1];
-    count[0] = data_Nx;
-
-    // Define variables in ioH
-    {
-        adios2_define_variable(ioH, "varI8", adios2_type_char, 1, NULL, NULL,
-                               count, adios2_constant_dims_true);
-        adios2_define_variable(ioH, "varI16", adios2_type_short, 1, NULL, NULL,
-                               count, adios2_constant_dims_true);
-        adios2_define_variable(ioH, "varI32", adios2_type_int, 1, NULL, NULL,
-                               count, adios2_constant_dims_true);
-        adios2_define_variable(ioH, "varI64", adios2_type_long_int, 1, NULL,
-                               NULL, count, adios2_constant_dims_true);
-
-        adios2_define_variable(ioH, "varU8", adios2_type_unsigned_char, 1, NULL,
-                               NULL, count, adios2_constant_dims_true);
-        adios2_define_variable(ioH, "varU16", adios2_type_unsigned_short, 1,
-                               NULL, NULL, count, adios2_constant_dims_true);
-        adios2_define_variable(ioH, "varU32", adios2_type_unsigned_int, 1, NULL,
-                               NULL, count, adios2_constant_dims_true);
-        adios2_define_variable(ioH, "varU64", adios2_type_unsigned_long_int, 1,
-                               NULL, NULL, count, adios2_constant_dims_true);
-        adios2_define_variable(ioH, "varR32", adios2_type_float, 1, NULL, NULL,
-                               count, adios2_constant_dims_true);
-        adios2_define_variable(ioH, "varR64", adios2_type_double, 1, NULL, NULL,
-                               count, adios2_constant_dims_true);
-    }
-    // get variables
-    adios2_Variable *varI8 = adios2_get_variable(ioH, "varI8");
-    adios2_Variable *varI16 = adios2_get_variable(ioH, "varI16");
-    adios2_Variable *varI32 = adios2_get_variable(ioH, "varI32");
-    adios2_Variable *varI64 = adios2_get_variable(ioH, "varI64");
-    adios2_Variable *varU8 = adios2_get_variable(ioH, "varU8");
-    adios2_Variable *varU16 = adios2_get_variable(ioH, "varU16");
-    adios2_Variable *varU32 = adios2_get_variable(ioH, "varU32");
-    adios2_Variable *varU64 = adios2_get_variable(ioH, "varU64");
-    adios2_Variable *varR32 = adios2_get_variable(ioH, "varR32");
-    adios2_Variable *varR64 = adios2_get_variable(ioH, "varR64");
-
-    // Open Engine handler, Write and Close
-    adios2_Engine *engineH =
-        adios2_open(ioH, "ctypes.bp", adios2_open_mode_write);
-
-    adios2_write(engineH, varI8, data_I8);
-    adios2_write(engineH, varI16, data_I16);
-    adios2_write(engineH, varI32, data_I32);
-    adios2_write(engineH, varI64, data_I64);
-
-    adios2_write(engineH, varU8, data_U8);
-    adios2_write(engineH, varU16, data_U16);
-    adios2_write(engineH, varU32, data_U32);
-    adios2_write(engineH, varU64, data_U64);
-
-    adios2_write(engineH, varR32, data_R32);
-    adios2_write(engineH, varR64, data_R64);
-
-    adios2_close(engineH);
-
-    // deallocate adiosH
-    adios2_finalize(adiosH);
-    return 0;
-}
diff --git a/testing/adios2/bindings/CMakeLists.txt b/testing/adios2/bindings/CMakeLists.txt
index e82e71049..c775e4e0c 100644
--- a/testing/adios2/bindings/CMakeLists.txt
+++ b/testing/adios2/bindings/CMakeLists.txt
@@ -11,4 +11,4 @@ if(ADIOS2_HAVE_Fortran)
   add_subdirectory(fortran)
 endif()
 
-add_subdirectory(C)
\ No newline at end of file
+add_subdirectory(C)
diff --git a/testing/adios2/bindings/fortran/CMakeLists.txt b/testing/adios2/bindings/fortran/CMakeLists.txt
index 913dab1a7..02aec3e50 100644
--- a/testing/adios2/bindings/fortran/CMakeLists.txt
+++ b/testing/adios2/bindings/fortran/CMakeLists.txt
@@ -7,15 +7,17 @@ add_executable(TestBPWriteTypes_f SmallTestData_mod.f90)
 
 if(ADIOS2_HAVE_MPI)
   target_sources(TestBPWriteTypes_f PRIVATE TestBPWriteTypes.f90)
-  target_include_directories(TestBPWriteTypes_f 
+  target_include_directories(TestBPWriteTypes_f
                                         PRIVATE ${MPI_Fortran_INCLUDE_PATH}
                                                 ${MPI_C_INCLUDE_PATH})
   target_link_libraries(TestBPWriteTypes_f PRIVATE ${MPI_Fortran_LIBRARIES}
-                                                   ${MPI_C_LIBRARIES})  
+                                                   ${MPI_C_LIBRARIES})
+  set(test_parameters
+    ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS})
 else()
   target_sources(TestBPWriteTypes_f PRIVATE TestBPWriteTypes_nompi.f90)
 endif()
 
 target_link_libraries(TestBPWriteTypes_f PRIVATE adios2_f)
 
-add_test(NAME BPWrite_f COMMAND TestBPWriteTypes_f)
+add_test(NAME BPWrite_f COMMAND ${test_parameters} $<TARGET_FILE:TestBPWriteTypes_f>)
diff --git a/testing/adios2/bindings/python/CMakeLists.txt b/testing/adios2/bindings/python/CMakeLists.txt
index 96e47759a..6286000b8 100644
--- a/testing/adios2/bindings/python/CMakeLists.txt
+++ b/testing/adios2/bindings/python/CMakeLists.txt
@@ -4,9 +4,12 @@
 #------------------------------------------------------------------------------#
 
 if(NOT ADIOS2_HAVE_MPI)
-    python_add_test(PythonBPWrite TestBPWriteTypes_nompi.py)
+    python_add_test(NAME PythonBPWrite SCRIPT TestBPWriteTypes_nompi.py)
 endif()
 
 if(ADIOS2_HAVE_MPI)
-    python_add_test(PythonBPWrite TestBPWriteTypes.py)
-endif()
\ No newline at end of file
+    set(test_parameters
+      EXEC_WRAPPER
+      ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS})
+    python_add_test(NAME PythonBPWrite ${test_parameters} SCRIPT TestBPWriteTypes.py)
+endif()
-- 
GitLab