Changeset: 0ef0f0a9e649 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=0ef0f0a9e649
Added Files:
        ctest/tools/monetdbe/cmocka_test.c
        ctest/tools/monetdbe/test_helper.c
        ctest/tools/monetdbe/test_helper.h
        ctest/tools/monetdbe/test_helper_template.h
Modified Files:
        cmake/monetdb-findpackages.cmake
        cmake/monetdb-options.cmake
        ctest/tools/monetdbe/CMakeLists.txt
Branch: default
Log Message:

Make a start with cmocka based unit-testing.


diffs (truncated from 388 to 300 lines):

diff --git a/cmake/monetdb-findpackages.cmake b/cmake/monetdb-findpackages.cmake
--- a/cmake/monetdb-findpackages.cmake
+++ b/cmake/monetdb-findpackages.cmake
@@ -26,6 +26,10 @@ if(WITH_XML2)
   find_package(LibXml2)
 endif()
 
+if(WITH_CMOCKA)
+  find_package(CMocka)
+endif()
+
 if(WITH_PCRE)
   find_package(PCRE)
 endif()
diff --git a/cmake/monetdb-options.cmake b/cmake/monetdb-options.cmake
--- a/cmake/monetdb-options.cmake
+++ b/cmake/monetdb-options.cmake
@@ -97,6 +97,10 @@ option(WITH_XML2
   "Include xml2 support"
   ON)
 
+option(WITH_CMOCKA
+  "Include cmocka support"
+  OFF)
+
 option(WITH_LZ4
   "Include lz4 support"
   ON)
diff --git a/ctest/tools/monetdbe/CMakeLists.txt 
b/ctest/tools/monetdbe/CMakeLists.txt
--- a/ctest/tools/monetdbe/CMakeLists.txt
+++ b/ctest/tools/monetdbe/CMakeLists.txt
@@ -68,3 +68,15 @@ target_link_libraries(example_remote
     monetdb_config_header
     monetdbe)
 add_test(run_example_remote example_remote)
+
+if(WITH_CMOCKA)
+  add_executable(cmocka_test cmocka_test.c test_helper.c)
+  target_include_directories(cmocka_test PRIVATE "${CMOCKA_INCLUDE_DIR}")
+  target_link_libraries(cmocka_test
+    PRIVATE
+    monetdb_config_header
+    monetdbe
+    "${CMOCKA_LIBRARY}"
+  )
+  add_test(run_cmocka_test cmocka_test)
+endif()
diff --git a/ctest/tools/monetdbe/cmocka_test.c 
b/ctest/tools/monetdbe/cmocka_test.c
new file mode 100644
--- /dev/null
+++ b/ctest/tools/monetdbe/cmocka_test.c
@@ -0,0 +1,117 @@
+/*
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * Copyright 1997 - July 2008 CWI, August 2008 - 2020 MonetDB B.V.
+ */
+
+#include "monetdbe.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <inttypes.h>
+#include <setjmp.h>
+#include "cmocka.h"
+#include "test_helper.h"
+
+#define error(msg) {fprintf(stderr, "Failure: %s\n", msg); return -1;}
+
+static int setup(void **state) {
+       char* err = NULL;
+       monetdbe_database mdbe = NULL;
+       if ((err = monetdbe_open(&mdbe, NULL, NULL)) != NULL)
+               error(err)
+
+       *state = mdbe;
+     return 0;
+}
+
+static int teardown(void **state) {
+       char* err = NULL;
+
+       monetdbe_database mdbe = *state;
+
+       if ((err = monetdbe_close(mdbe)) != NULL)
+               error(err)
+     return 0;
+}
+
+static void create_table_test(void **state) {
+       monetdbe_database mdbe = *state;
+    char* err;
+
+       err = monetdbe_query(mdbe, "CREATE TABLE test (x integer, y string)", 
NULL, NULL);
+
+       assert_null(err);
+}
+
+static void populate_table_test(void **state) {
+       monetdbe_database mdbe = *state;
+    char* err;
+
+       err = monetdbe_query(mdbe, "INSERT INTO test VALUES (42, 'Hello, '), 
(58, 'World!')", NULL, NULL);
+
+       assert_null(err);
+}
+
+static void query_table_test(void **state) {
+
+       monetdbe_result* result = NULL;
+       monetdbe_database mdbe = *state;
+    char* err;
+
+       err = monetdbe_query(mdbe, "SELECT MIN(x), CONCAT(MIN(y), MAX(y)) FROM 
test; ", &result, NULL);
+
+       assert_null(err);
+
+       assert_int_equal((int) result->nrows, 1);
+       assert_int_equal((int) result->ncols, 2);
+       monetdbe_column* rcol;
+
+       CHECK_COLUMN(mdbe, result, 0, int32_t, {42});
+
+       err = monetdbe_result_fetch(result, &rcol, 1);
+       assert_null(err);
+
+       monetdbe_column_str * col_y = (monetdbe_column_str *) rcol;
+
+       assert_string_equal((const char*) col_y->data[0], "Hello, World!");
+
+       err = monetdbe_cleanup_result(mdbe, result);
+
+       assert_null(err);
+}
+
+static void query_table_test2(void **state) {
+
+       monetdbe_result* result = NULL;
+       monetdbe_database mdbe = *state;
+    char* err;
+
+       err = monetdbe_query(mdbe, "SELECT x, y FROM test; ", &result, NULL);
+
+       assert_null(err);
+
+       assert_int_equal((int) result->nrows, 2);
+       assert_int_equal((int) result->ncols, 2);
+
+       assert_true(CHECK_COLUMN(mdbe, result, 0, int32_t, {42, 58}));
+       assert_true(CHECK_COLUMN(mdbe, result, 1, str, {"Hello, ", "World!"}));
+
+       err = monetdbe_cleanup_result(mdbe, result);
+
+       assert_null(err);
+}
+
+int
+main(void)
+{
+       const struct CMUnitTest tests[] = {
+        cmocka_unit_test(create_table_test),
+               cmocka_unit_test(populate_table_test),
+               cmocka_unit_test(query_table_test),
+               cmocka_unit_test(query_table_test2)
+    };
+
+       return cmocka_run_group_tests_name("SQL queries for MonetDBe", tests, 
setup, teardown);
+}
diff --git a/ctest/tools/monetdbe/test_helper.c 
b/ctest/tools/monetdbe/test_helper.c
new file mode 100644
--- /dev/null
+++ b/ctest/tools/monetdbe/test_helper.c
@@ -0,0 +1,119 @@
+#include "test_helper.h"
+
+#define ACTUAL_TPE_monetdb_bool int8_t
+#define ACTUAL_TPE_monetdb_int8_t int8_t
+#define ACTUAL_TPE_monetdb_int16_t int16_t
+#define ACTUAL_TPE_monetdb_int32_t int32_t
+#define ACTUAL_TPE_monetdb_int64_t int64_t
+#if HAVE_HGE
+#define ACTUAL_TPE_monetdb_int128_t __int128
+#endif
+#define ACTUAL_TPE_monetdb_size_t size_t
+#define ACTUAL_TPE_monetdb_float float
+#define ACTUAL_TPE_monetdb_double double
+#define ACTUAL_TPE_monetdb_str char*
+#define ACTUAL_TPE_monetdb_blob monetdbe_data_blob
+#define ACTUAL_TPE_monetdb_date monetdbe_data_date
+#define ACTUAL_TPE_monetdb_time monetdbe_data_time
+#define ACTUAL_TPE_monetdb_timestamp monetdbe_data_timestamp
+
+#define _CONCAT(A, B)   A##B
+#define CONCAT(A, B)    _CONCAT(A, B)
+
+#define EXPAND(A) A
+
+#define GET_ACTUAL_TPE(TPE_ID) ACTUAL_TPE_monetdb_##TPE_ID
+#define GET_TPE_ENUM(TPE) CONCAT(monetdb_, TPE)
+
+#define TPE int8_t
+#define CHECK_COLUMN_FUNC check_column_bool
+#define TPE_ENUM monetdbe_bool
+#define MONETDB_COLUMN_TPE monetdbe_column_bool
+#include "test_helper_template.h"
+
+#define TPE int8_t
+#define CHECK_COLUMN_FUNC check_column_int8_t
+#define TPE_ENUM monetdbe_int8_t
+#define MONETDB_COLUMN_TPE monetdbe_column_int8_t
+#include "test_helper_template.h"
+
+#define TPE int16_t
+#define CHECK_COLUMN_FUNC check_column_int16_t
+#define TPE_ENUM monetdbe_int16_t
+#define MONETDB_COLUMN_TPE monetdbe_column_int16_t
+#include "test_helper_template.h"
+
+#define TPE int32_t
+#define CHECK_COLUMN_FUNC check_column_int32_t
+#define TPE_ENUM monetdbe_int32_t
+#define MONETDB_COLUMN_TPE monetdbe_column_int32_t
+#include "test_helper_template.h"
+
+#define TPE int64_t
+#define CHECK_COLUMN_FUNC check_column_int64_t
+#define TPE_ENUM monetdbe_int64_t
+#define MONETDB_COLUMN_TPE monetdbe_column_int64_t
+#include "test_helper_template.h"
+
+#if HAVE_HGE
+#define TPE __int128
+#define CHECK_COLUMN_FUNC check_column_int128_t
+#define TPE_ENUM monetdbe_int128_t
+#define MONETDB_COLUMN_TPE monetdbe_column_int128_t
+#include "test_helper_template.h"
+#endif
+
+#define TPE size_t
+#define CHECK_COLUMN_FUNC check_column_size_t
+#define TPE_ENUM monetdbe_size_t
+#define MONETDB_COLUMN_TPE monetdbe_column_size_t
+#include "test_helper_template.h"
+
+#define TPE float
+#define CHECK_COLUMN_FUNC check_column_float
+#define TPE_ENUM monetdbe_float
+#define MONETDB_COLUMN_TPE monetdbe_column_float
+#include "test_helper_template.h"
+
+#define TPE double
+#define CHECK_COLUMN_FUNC check_column_double
+#define TPE_ENUM monetdbe_double
+#define MONETDB_COLUMN_TPE monetdbe_column_double
+#include "test_helper_template.h"
+
+#define TPE char*
+#define CHECK_COLUMN_FUNC check_column_str
+#define TPE_ENUM monetdbe_str
+#define MONETDB_COLUMN_TPE monetdbe_column_str
+#define EQUALS(A,B) (strcmp(A, B)==0)
+#include "test_helper_template.h"
+
+#define TPE monetdbe_data_blob
+#define CHECK_COLUMN_FUNC check_column_blob
+#define TPE_ENUM monetdbe_blob
+#define EQUALS(A,B) ((A).size != (B).size?false:(memcmp((A).data, (B).data, 
(A).size)) == 0)
+#define MONETDB_COLUMN_TPE monetdbe_column_blob
+#include "test_helper_template.h"
+
+#define TPE monetdbe_data_date
+#define CHECK_COLUMN_FUNC check_column_date
+#define TPE_ENUM monetdbe_date
+#define EQUALS_DATE(A,B) (((A).day == (B).day) && ((A).month == (B).month) && 
((A).year == (B).year))
+#define EQUALS EQUALS_DATE
+#define MONETDB_COLUMN_TPE monetdbe_column_date
+#include "test_helper_template.h"
+
+#define TPE monetdbe_data_time
+#define CHECK_COLUMN_FUNC check_column_time
+#define TPE_ENUM monetdbe_time
+#define EQUALS_TIME(A,B) (((A).ms == (B).ms) && ((A).seconds == (B).seconds) 
&& ((A).minutes == (B).minutes) && ((A).hours == (B).hours))
+#define EQUALS EQUALS_TIME
+#define MONETDB_COLUMN_TPE monetdbe_column_time
+#include "test_helper_template.h"
+
+#define TPE monetdbe_data_timestamp
+#define CHECK_COLUMN_FUNC check_column_timestamp
+#define TPE_ENUM monetdbe_timestamp
+#define EQUALS(A,B) (EQUALS_DATE(A.date, B.date) && EQUALS_TIME(A.time, 
B.time))
+#define MONETDB_COLUMN_TPE monetdbe_column_timestamp
+#include "test_helper_template.h"
diff --git a/ctest/tools/monetdbe/test_helper.h 
b/ctest/tools/monetdbe/test_helper.h
new file mode 100644
--- /dev/null
+++ b/ctest/tools/monetdbe/test_helper.h
@@ -0,0 +1,30 @@
+
+#include "monetdbe.h"
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to