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