From 56297f27e6fa37444d7ddfd5b3ae4348371ee155 Mon Sep 17 00:00:00 2001 From: Haru Date: Sun, 11 Oct 2015 04:59:56 +0200 Subject: Added test_libconfig test suite. - To be used for regression tests when updating or editing libconfig. Signed-off-by: Haru --- src/test/Makefile.in | 34 +- src/test/libconfig/test.conf | 1 + src/test/test_libconfig.c | 842 +++++++++++++++++++++++++++++++++++++++++++ src/test/test_spinlock.c | 2 + 4 files changed, 865 insertions(+), 14 deletions(-) create mode 100644 src/test/libconfig/test.conf create mode 100644 src/test/test_libconfig.c diff --git a/src/test/Makefile.in b/src/test/Makefile.in index 8f999fb37..4d8f55e1f 100644 --- a/src/test/Makefile.in +++ b/src/test/Makefile.in @@ -24,10 +24,12 @@ MT19937AR_D = $(THIRDPARTY_D)/mt19937ar MT19937AR_OBJ = $(MT19937AR_D)/mt19937ar.o MT19937AR_H = $(MT19937AR_D)/mt19937ar.h -TEST_SPINLOCK_OBJ = obj/test_spinlock.o -TEST_SPINLOCK_C = test_spinlock.c -TEST_SPINLOCK_H = -TEST_SPINLOCK_DEPENDS = $(TEST_SPINLOCK_OBJ) $(COMMON_D)/obj_sql/common_sql.a $(COMMON_D)/obj_all/common.a $(MT19937AR_OBJ) $(LIBCONFIG_OBJ $(SYSINFO_INC)) +TEST_C = test_libconfig.c test_spinlock.c +TEST_OBJ = $(addprefix obj/, $(patsubst %c,%o,%(TEST_C))) +TEST_H = +TEST_DEPENDS = $(COMMON_D)/obj_sql/common_sql.a $(COMMON_D)/obj_all/common.a $(MT19937AR_OBJ) $(LIBCONFIG_OBJ) $(SYSINFO_INC) + +TESTS_ALL = test_libconfig test_spinlock @SET_MAKE@ @@ -35,9 +37,9 @@ CC = @CC@ export CC ##################################################################### -.PHONY: all test_spinlock clean buildclean +.PHONY: all $(TESTS_ALL) clean buildclean -all: test_spinlock Makefile +all: $(TESTS_ALL) Makefile buildclean: @echo " CLEAN test (build temp files)" @@ -45,14 +47,14 @@ buildclean: clean: buildclean @echo " CLEAN test" - @rm -rf ../../test_spinlock@EXEEXT@ + @rm -rf ../../test_*@EXEEXT@ ##################################################################### Makefile: Makefile.in @$(MAKE) -C ../.. src/test/Makefile -$(SYSINFO_INC): $(TEST_SPINLOCK_C) $(TEST_SPINLOCK_H) $(COMMON_H) $(CONFIG_H) $(MT19937AR_H) $(LIBCONFIG_H) +$(SYSINFO_INC): $(TEST_C) $(TEST_H) $(COMMON_H) $(CONFIG_H) $(MT19937AR_H) $(LIBCONFIG_H) @echo " MAKE $@" @$(MAKE) -C ../.. sysinfo @@ -62,17 +64,21 @@ obj: @echo " MKDIR obj" @-mkdir obj -#executables +# executables + +$(TESTS_ALL): test_%: ../../test_%@EXEEXT@ + @echo " TEST $@" -test_spinlock: $(TEST_SPINLOCK_DEPENDS) Makefile - @echo " LD $@" - @$(CC) @LDFLAGS@ -o ../../test_spinlock@EXEEXT@ $(TEST_SPINLOCK_DEPENDS) @LIBS@ @MYSQL_LIBS@ +../../test_%@EXEEXT@: obj/test_%.o $(TEST_DEPENDS) Makefile + @echo " LD $(notdir $@)" + @$(CC) @STATIC@ @LDFLAGS@ -o $@ $< $(COMMON_D)/obj_sql/common_sql.a \ + $(COMMON_D)/obj_all/common.a $(MT19937AR_OBJ) $(LIBCONFIG_OBJ) @LIBS@ @PCRE_LIBS@ @MYSQL_LIBS@ # object files -obj/%.o: %.c $(TEST_SPINLOCK_H) $(COMMON_H) $(CONFIG_H) $(MT19937AR_H) $(LIBCONFIG_H) | obj +obj/%.o: %.c $(TEST_H) $(COMMON_H) $(CONFIG_H) $(MT19937AR_H) $(LIBCONFIG_H) | obj @echo " CC $<" - @$(CC) @CFLAGS@ @DEFS@ $(COMMON_INCLUDE) $(THIRDPARTY_INCLUDE) -DWITH_SQL @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< + @$(CC) @CFLAGS@ @DEFS@ $(COMMON_INCLUDE) $(THIRDPARTY_INCLUDE) $(PCRE_CFLAGS) @MYSQL_CFLAGS@ @CPPFLAGS@ -c $(OUTPUT_OPTION) $< # missing object files $(COMMON_D)/obj_all/common.a: diff --git a/src/test/libconfig/test.conf b/src/test/libconfig/test.conf new file mode 100644 index 000000000..bbdc2cd96 --- /dev/null +++ b/src/test/libconfig/test.conf @@ -0,0 +1 @@ +Test: true diff --git a/src/test/test_libconfig.c b/src/test/test_libconfig.c new file mode 100644 index 000000000..e0b5b3fca --- /dev/null +++ b/src/test/test_libconfig.c @@ -0,0 +1,842 @@ +// Copyright (c) Hercules Dev Team, licensed under GNU GPL. +// See the LICENSE file +// Base author: Haru +#define HERCULES_CORE + +#include "common/cbasetypes.h" +#include "common/conf.h" +#include "common/core.h" +#include "common/showmsg.h" +#include "common/strlib.h" + +#include + +#define TEST(name, function, ...) do { \ + const char *message = NULL; \ + ShowMessage("-------------------------------------------------------------------------------\n"); \ + ShowNotice("Testing %s...\n", (name)); \ + if ((message = (function)(##__VA_ARGS__)) != NULL) { \ + ShowError("Failed. %s\n", message); \ + ShowMessage("===============================================================================\n"); \ + ShowFatalError("Failure. Aborting further tests.\n"); \ + exit(EXIT_FAILURE); \ + } \ + ShowInfo("Test passed.\n"); \ +} while (false) + +static const char *test_libconfig_truefalse(void) +{ + if (CONFIG_TRUE != true) { + return "CONFIG_TRUE != true"; + } + if (CONFIG_FALSE != false) { + return "CONFIG_FALSE != false"; + } + return NULL; +} + +static const char *test_libconfig_defaults(void) +{ + if (libconfig == NULL) { + return "Unable to find libconfig interface."; + } + if (libconfig->init == NULL) { + return "Unable to find libconfig methods"; + } + if (libconfig->read_file_src == NULL) { + return "Unable to find libconfig core methods"; + } + return NULL; +} + +static const char *test_libconfig_init_destroy(void) +{ + config_t config; + libconfig->init(&config); + if (config.root == NULL || config.root != config_root_setting(&config)) { + return "Unable to create config."; + } + libconfig->destroy(&config); + if (config.root != NULL) { + return "Unable to destroy config."; + } + return NULL; +} + +static const char *test_libconfig_read_file_src(void) +{ + config_t config; +#define FILENAME "src/test/libconfig/test.conf" + if (libconfig->read_file_src(&config, FILENAME) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to read file '" FILENAME "'."; + } +#undef FILENAME + if (config.root == NULL) { + libconfig->destroy(&config); + return "Invalid config."; + } + libconfig->destroy(&config); + return NULL; +} + +static const char *test_libconfig_read(void) +{ + config_t config; +#define FILENAME "src/test/libconfig/test.conf" + FILE *fp = fopen(FILENAME, "r"); + if (!fp) { + return "File not found: '" FILENAME "'."; + } + if (libconfig->read(&config, fp) == CONFIG_FALSE) { + fclose(fp); + libconfig->destroy(&config); + return "Unable to read from file '" FILENAME "'."; + } +#undef FILENAME + if (config.root == NULL) { + libconfig->destroy(&config); + return "Invalid config."; + } + libconfig->destroy(&config); + return NULL; +} + +static const char *test_libconfig_read_file(void) +{ + config_t config; +#define FILENAME "src/test/libconfig/test.conf" + if (libconfig->read_file(&config, FILENAME) != 0) { + return "Unable to read file '" FILENAME "'."; + } +#undef FILENAME + if (config.root == NULL || !config_setting_is_root(config.root)) { + libconfig->destroy(&config); + return "Invalid config."; + } + libconfig->destroy(&config); + return NULL; +} + +static const char *test_libconfig_write(void) +{ + //void (*write) (const config_t *config, FILE *stream); + return "TEST NOT IMPLEMENTED"; +} + +static const char *test_libconfig_write_file(void) +{ + //int (*write_file) (config_t *config, const char *filename); + return "TEST NOT IMPLEMENTED"; +} + +static const char *test_libconfig_read_string(void) +{ + config_t config; + if (libconfig->read_string(&config, "") == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to read from string."; + } + if (config.root == NULL) { + libconfig->destroy(&config); + return "Invalid config."; + } + libconfig->destroy(&config); + return NULL; +} + +static const char *test_libconfig_syntax(void) +{ + config_t config; + const char *input = "/* Test File */\n" + "Setting_Int: 1;\n" + "Setting_Int64: 1L;\n" + "Setting_Float: 1.0;\n" + "Setting_Bool: true;\n" + "Setting_String: \"1\";\n" + "Setting_Array: [ ];\n" + "Setting_Group: { };\n" + "Setting_List: ( );\n" + "/* End test file */\n"; + + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to read from string."; + } + if (config.root == NULL) { + libconfig->destroy(&config); + return "Invalid config."; + } + libconfig->destroy(&config); + return NULL; +} + +static const char *test_libconfig_set_include_dir(void) +{ + //void (*set_include_dir) (config_t *config, const char *include_dir); + return "TEST NOT IMPLEMENTED"; +} + +static const char *test_libconfig_lookup(void) +{ + config_t config; + config_setting_t *t = NULL; + int32 i32; + int64 i64; + double f; + const char *str; + const char *input = "/* Test File */\n" + "Setting_Int: 1;\n" + "Setting_Int64: 1L;\n" + "Setting_Float: 1.0;\n" + "Setting_Bool: true;\n" + "Setting_String: \"1\";\n" + "Setting_Array: [ ];\n" + "Setting_Group: { };\n" + "Setting_List: ( );\n" + "/* End test file */\n"; + + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to parse configuration."; + } + + if ((t = libconfig->lookup(&config, "Setting_Int")) == NULL) { + libconfig->destroy(&config); + return "libconfig->lookup failed."; + } + + if ((t = libconfig->lookup_from(config.root, "Setting_Int")) == NULL) { + libconfig->destroy(&config); + return "libconfig->lookup_from failed."; + } + + if (libconfig->lookup_int(&config, "Setting_Int", &i32) == CONFIG_FALSE || i32 != 1) { + libconfig->destroy(&config); + return "libconfig->lookup_int failed."; + } + + if (libconfig->lookup_int64(&config, "Setting_Int64", &i64) == CONFIG_FALSE || i64 != 1) { + libconfig->destroy(&config); + return "libconfig->lookup_int64 failed."; + } + + if (libconfig->lookup_float(&config, "Setting_Float", &f) == CONFIG_FALSE || f < 1.0 - 0.1 || f > 1.0 + 0.1) { + libconfig->destroy(&config); + return "libconfig->lookup_float failed."; + } + + if (libconfig->lookup_bool(&config, "Setting_Bool", &i32) == CONFIG_FALSE || i32 != 1) { + libconfig->destroy(&config); + return "libconfig->lookup_bool failed."; + } + + if (libconfig->lookup_string(&config, "Setting_String", &str) == CONFIG_FALSE || str == NULL || str[0] != '1' || str[1] != '\0') { + libconfig->destroy(&config); + return "libconfig->lookup_string failed."; + } + + libconfig->destroy(&config); + + return NULL; +} + +static const char *test_libconfig_setting_get(void) +{ + config_t config; + config_setting_t *t = NULL; + double f; + const char *str; + const char *input = "/* Test File */\n" + "Setting_Int: 1;\n" + "Setting_Int64: 1L;\n" + "Setting_Float: 1.0;\n" + "Setting_Bool: true;\n" + "Setting_String: \"1\";\n" + "Setting_Array: [ ];\n" + "Setting_Group: { };\n" + "Setting_List: ( );\n" + "/* End test file */\n"; + + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to parse configuration."; + } + + if ((t = libconfig->lookup(&config, "Setting_Int")) == NULL || libconfig->setting_get_int(t) != 1) { + libconfig->destroy(&config); + return "libconfig->setting_get_int failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Int64")) == NULL || libconfig->setting_get_int64(t) != 1) { + libconfig->destroy(&config); + return "libconfig->lookup_int64 failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Float")) == NULL || (f = libconfig->setting_get_float(t)) < 1.0 - 0.1 || f > 1.0 + 0.1) { + libconfig->destroy(&config); + return "libconfig->lookup_float failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Bool")) == NULL || libconfig->setting_get_bool(t) != 1) { + libconfig->destroy(&config); + return "libconfig->lookup_bool failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_String")) == NULL || (str = libconfig->setting_get_string(t)) == NULL || str[0] != '1' || str[1] != '\0') { + libconfig->destroy(&config); + return "libconfig->lookup_string failed."; + } + + t = config_root_setting(&config); + + if (libconfig->setting_get_int_elem(t, 0) != 1) { + libconfig->destroy(&config); + return "libconfig->setting_get_int_elem failed."; + } + + if (libconfig->setting_get_int64_elem(t, 1) != 1) { + libconfig->destroy(&config); + return "libconfig->setting_get_int64_elem failed."; + } + + if ((f = libconfig->setting_get_float_elem(t, 2)) < 1.0 - 0.1 || f > 1.0 + 0.1) { + libconfig->destroy(&config); + return "libconfig->setting_get_float_elem failed."; + } + + if (libconfig->setting_get_bool_elem(t, 3) != 1) { + libconfig->destroy(&config); + return "libconfig->setting_get_bool_elem failed."; + } + + if ((str = libconfig->setting_get_string_elem(t, 4)) == NULL || str[0] != '1' || str[1] != '\0') { + libconfig->destroy(&config); + return "libconfig->setting_get_string_elem failed."; + } + + if ((t = libconfig->setting_get_elem(config.root, 0)) == NULL || libconfig->setting_get_int(t) != 1) { + libconfig->destroy(&config); + return "libconfig->setting_get_elem failed."; + } + + if ((t = libconfig->setting_get_member(config.root, "Setting_Int")) == NULL || libconfig->setting_get_int(t) != 1 || strcmp(config_setting_name(t), "Setting_Int") != 0) { + libconfig->destroy(&config); + return "libconfig->setting_get_member failed."; + } + + if ((t = libconfig->setting_get_elem(config.root, 0)) == NULL || strcmp(config_setting_name(t), "Setting_Int") != 0) { + libconfig->destroy(&config); + return "config_setting_name failed."; + } + + if ((t = libconfig->setting_get_member(config.root, "Setting_Int")) == NULL || libconfig->setting_index(t) != 0) { + libconfig->destroy(&config); + return "libconfig->setting_index failed."; + } + + if (libconfig->setting_length(config.root) != 8) { + libconfig->destroy(&config); + return "libconfig->setting_length failed."; + } + + libconfig->destroy(&config); + return NULL; +} + +static const char *test_libconfig_set(void) +{ + //int (*setting_set_int) (config_setting_t *setting ,int value); + //int (*setting_set_int64) (config_setting_t *setting, long long value); + //int (*setting_set_float) (config_setting_t *setting, double value); + //int (*setting_set_bool) (config_setting_t *setting, int value); + //int (*setting_set_string) (config_setting_t *setting, const char *value); + return "TEST NOT IMPLEMENTED"; +} + +static const char *test_libconfig_setting_lookup(void) +{ + config_t config; + int32 i32; + int64 i64; + double f; + const char *str; + const char *input = "/* Test File */\n" + "Setting_Int: 1;\n" + "Setting_Int64: 1L;\n" + "Setting_Float: 1.0;\n" + "Setting_Bool: true;\n" + "Setting_String: \"1\";\n" + "Setting_Array: [ ];\n" + "Setting_Group: { };\n" + "Setting_List: ( );\n" + "/* End test file */\n"; + + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to parse configuration."; + } + + if (libconfig->setting_lookup_int(config.root, "Setting_Int", &i32) == CONFIG_FALSE || i32 != 1) { + libconfig->destroy(&config); + return "libconfig->setting_lookup_int failed."; + } + + if (libconfig->setting_lookup_int64(config.root, "Setting_Int64", &i64) == CONFIG_FALSE || i64 != 1) { + libconfig->destroy(&config); + return "libconfig->setting_lookup_int64 failed."; + } + + if (libconfig->setting_lookup_float(config.root, "Setting_Float", &f) == CONFIG_FALSE || f < 1.0 - 0.1 || f > 1.0 + 0.1) { + libconfig->destroy(&config); + return "libconfig->setting_lookup_float failed."; + } + + if (libconfig->setting_lookup_bool(config.root, "Setting_Bool", &i32) == CONFIG_FALSE || i32 != 1) { + libconfig->destroy(&config); + return "libconfig->setting_lookup_bool failed."; + } + + if (libconfig->setting_lookup_string(config.root, "Setting_String", &str) == CONFIG_FALSE || str == NULL || str[0] != '1' || str[1] != '\0') { + libconfig->destroy(&config); + return "libconfig->setting_lookup_string failed."; + } + + libconfig->destroy(&config); + + return NULL; +} + +static const char *test_libconfig_setting_types(void) +{ + config_t config; + config_setting_t *t; + const char *input = "/* Test File */\n" + "Setting_Int: 1;\n" + "Setting_Int64: 1L;\n" + "Setting_Float: 1.0;\n" + "Setting_Bool: true;\n" + "Setting_String: \"1\";\n" + "Setting_Array: [ ];\n" + "Setting_Group: { };\n" + "Setting_List: ( );\n" + "/* End test file */\n"; + + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to parse configuration."; + } + + if (config_setting_type(config.root) != CONFIG_TYPE_GROUP) { + libconfig->destroy(&config); + return "CONFIG_TYPE_GROUP failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Int")) == NULL || config_setting_type(t) != CONFIG_TYPE_INT + || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) + || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || !config_setting_is_number(t) + ) { + libconfig->destroy(&config); + return "CONFIG_TYPE_INT failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Int64")) == NULL || config_setting_type(t) != CONFIG_TYPE_INT64 + || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) + || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || !config_setting_is_number(t) + ) { + libconfig->destroy(&config); + return "CONFIG_TYPE_INT64 failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Float")) == NULL || config_setting_type(t) != CONFIG_TYPE_FLOAT + || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) + || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || !config_setting_is_number(t) + ) { + libconfig->destroy(&config); + return "CONFIG_TYPE_FLOAT failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Bool")) == NULL || config_setting_type(t) != CONFIG_TYPE_BOOL + || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) + || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || config_setting_is_number(t) + ) { + libconfig->destroy(&config); + return "CONFIG_TYPE_BOOL failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_String")) == NULL || config_setting_type(t) != CONFIG_TYPE_STRING + || config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) + || config_setting_is_aggregate(t) || !config_setting_is_scalar(t) || config_setting_is_number(t) + ) { + libconfig->destroy(&config); + return "CONFIG_TYPE_STRING failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Array")) == NULL || config_setting_type(t) != CONFIG_TYPE_ARRAY + || config_setting_is_group(t) || !config_setting_is_array(t) || config_setting_is_list(t) + || !config_setting_is_aggregate(t) || config_setting_is_scalar(t) || config_setting_is_number(t) + ) { + libconfig->destroy(&config); + return "CONFIG_TYPE_ARRAY failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Group")) == NULL || config_setting_type(t) != CONFIG_TYPE_GROUP + || !config_setting_is_group(t) || config_setting_is_array(t) || config_setting_is_list(t) + || !config_setting_is_aggregate(t) || config_setting_is_scalar(t) || config_setting_is_number(t) + ) { + libconfig->destroy(&config); + return "CONFIG_TYPE_GROUP failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_List")) == NULL || config_setting_type(t) != CONFIG_TYPE_LIST + || config_setting_is_group(t) || config_setting_is_array(t) || !config_setting_is_list(t) + || !config_setting_is_aggregate(t) || config_setting_is_scalar(t) || config_setting_is_number(t) + ) { + libconfig->destroy(&config); + return "CONFIG_TYPE_LIST failed."; + } + + libconfig->destroy(&config); + + return NULL; +} + +static const char *test_libconfig_values(void) +{ + config_t config; + int32 i32; + int64 i64; + const char *input = "/* Test File */\n" + "Setting_Int1: 1;\n" + "Setting_IntHex: 0x10;\n" + "Setting_IntNegative: -1;\n" + "Setting_Int64: 1L;\n" + "Setting_Int64Hex: 0x10L;\n" + "Setting_Int64Negative: -1L;\n" + "Setting_IntSignedMax: 0x7fffffff;\n" + "/* End test file */\n"; + + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to parse configuration."; + } + + if (libconfig->setting_lookup_int(config.root, "Setting_Int1", &i32) == CONFIG_FALSE || i32 != 1) { + libconfig->destroy(&config); + return "(int) 1 failed."; + } + + if (libconfig->setting_lookup_int(config.root, "Setting_IntHex", &i32) == CONFIG_FALSE || i32 != 0x10) { + libconfig->destroy(&config); + return "(int) 0x10 failed."; + } + + if (libconfig->setting_lookup_int(config.root, "Setting_IntNegative", &i32) == CONFIG_FALSE || i32 != -1) { + libconfig->destroy(&config); + return "(int) -1 failed."; + } + + if (libconfig->setting_lookup_int64(config.root, "Setting_Int64", &i64) == CONFIG_FALSE || i64 != 1) { + libconfig->destroy(&config); + return "(int64) 1 failed."; + } + + if (libconfig->setting_lookup_int64(config.root, "Setting_Int64Hex", &i64) == CONFIG_FALSE || i64 != 0x10) { + libconfig->destroy(&config); + return "(int64) 0x10 failed."; + } + + if (libconfig->setting_lookup_int64(config.root, "Setting_Int64Negative", &i64) == CONFIG_FALSE || i64 != -1) { + libconfig->destroy(&config); + return "(int64) -1 failed."; + } + + if (libconfig->setting_lookup_int(config.root, "Setting_IntSignedMax", &i32) == CONFIG_FALSE || i32 != INT32_MAX) { + libconfig->destroy(&config); + return "(int) INT32_MAX failed."; + } + + libconfig->destroy(&config); + + return NULL; +} + +static const char *test_libconfig_path_lookup(void) +{ + config_t config; + int32 i32; + const char *input = "/* Test File */\n" + "Setting_Array: [1, 2, 3];\n" + "Setting_Group: {\n" + " Group_Nested1: 4;\n" + " Group_Nested2: 5;\n" + " Group_Nested3: 6;\n" + " Group_Nested4: 7;\n" + "};\n" + "Setting_List: (\n" + " (\"List_Nested1\", 8),\n" + " (\"List_Nested2\", 9),\n" + " 10,\n" + ");\n" + "/* End test file */\n"; + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to parse configuration."; + } + + if (libconfig->lookup_int(&config, "Setting_Array/[0]", &i32) == CONFIG_FALSE || i32 != 1) { + libconfig->destroy(&config); + return "Setting_Array/[0] failed."; + } + + if (libconfig->lookup_int(&config, "Setting_Array:[0]", &i32) == CONFIG_FALSE || i32 != 1) { + libconfig->destroy(&config); + return "Setting_Array:[0] failed."; + } + + if (libconfig->lookup_int(&config, "Setting_Array/[1]", &i32) == CONFIG_FALSE || i32 != 2) { + ShowDebug("%d\n", i32); + libconfig->destroy(&config); + return "Setting_Array/[1] failed."; + } + + if (libconfig->lookup_int(&config, "Setting_Array/[2]", &i32) == CONFIG_FALSE || i32 != 3) { + libconfig->destroy(&config); + return "Setting_Array/[2] failed."; + } + + if (libconfig->lookup_int(&config, "Setting_Group/Group_Nested1", &i32) == CONFIG_FALSE || i32 != 4) { + libconfig->destroy(&config); + return "Setting_Group/Group_Nested1 failed."; + } + + if (libconfig->lookup_int(&config, "Setting_Group/Group_Nested2", &i32) == CONFIG_FALSE || i32 != 5) { + libconfig->destroy(&config); + return "Setting_Group/Group_Nested2 failed."; + } + + if (libconfig->lookup_int(&config, "Setting_Group/Group_Nested3", &i32) == CONFIG_FALSE || i32 != 6) { + libconfig->destroy(&config); + return "Setting_Group/Group_Nested3 failed."; + } + + if (libconfig->lookup_int(&config, "Setting_Group/Group_Nested4", &i32) == CONFIG_FALSE || i32 != 7) { + libconfig->destroy(&config); + return "Setting_Group/Group_Nested4 failed."; + } + + if (libconfig->lookup_int(&config, "Setting_List/[0]/[1]", &i32) == CONFIG_FALSE || i32 != 8) { + libconfig->destroy(&config); + return "Setting_List/[0]/[1] failed."; + } + + if (libconfig->lookup_int(&config, "Setting_List/[1]/[1]", &i32) == CONFIG_FALSE || i32 != 9) { + libconfig->destroy(&config); + return "Setting_List/[1]/[1] failed."; + } + + if (libconfig->lookup_int(&config, "Setting_List/[2]", &i32) == CONFIG_FALSE || i32 != 10) { + libconfig->destroy(&config); + return "Setting_List/[2] failed."; + } + + libconfig->destroy(&config); + return NULL; +} + +static const char *test_libconfig_setting_names(void) +{ + config_t config; + int32 i32; + const char *input = "/* Test File */\n" + "Setting'with'apostrophes: 1;\n" + "Setting.with.periods: 2;\n" + "Setting: {\n" + " with: {\n" + " periods: 3;\n" + " };\n" + " nested: {\n" + " in: {\n" + " groups: 4;\n" + " };\n" + " };\n" + "};\n" + "1st_setting_with_numbers: 5;\n" + "/* End test file */\n"; + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to parse configuration."; + } + + if (libconfig->lookup_int(&config, "Setting'with'apostrophes", &i32) == CONFIG_FALSE || i32 != 1) { + libconfig->destroy(&config); + return "Setting'with'apostrophes failed."; + } + + if (libconfig->lookup_int(&config, "Setting.with.periods", &i32) == CONFIG_FALSE || i32 != 2) { + libconfig->destroy(&config); + return "Setting.with.periods failed."; + } + + if (libconfig->lookup_int(&config, "Setting:with:periods", &i32) == CONFIG_FALSE || i32 != 3) { + libconfig->destroy(&config); + return "Setting:with:periods failed."; + } + + if (libconfig->lookup_int(&config, "Setting:nested:in:groups", &i32) == CONFIG_FALSE || i32 != 4) { + libconfig->destroy(&config); + return "Setting:nested:in:groups failed."; + } + + if (libconfig->lookup_int(&config, "Setting/nested/in/groups", &i32) == CONFIG_FALSE || i32 != 4) { + libconfig->destroy(&config); + return "Setting/nested/in/groups failed."; + } + + if (libconfig->lookup_int(&config, "1st_setting_with_numbers", &i32) == CONFIG_FALSE || i32 != 5) { + libconfig->destroy(&config); + return "1st_setting_with_numbers failed."; + } + + libconfig->destroy(&config); + return NULL; +} + +static const char *test_libconfig_duplicate_keys(void) +{ + config_t config; + int32 i32; + config_setting_t *t, *tt; + int i = 0; + const char *input = "/* Test File */\n" + "Setting_Group: {\n" + " Duplicate: 1;\n" + " Duplicate: 2;\n" + " Duplicate: 3;\n" + " Duplicate: 4;\n" + "};\n" + "/* End test file */\n"; + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to parse configuration."; + } + + if (libconfig->lookup_int(&config, "Setting_Group/Duplicate", &i32) == CONFIG_FALSE || i32 != 1) { + libconfig->destroy(&config); + return "Setting_Group/Duplicate failed."; + } + + if ((t = libconfig->lookup(&config, "Setting_Group")) == NULL) { + libconfig->destroy(&config); + return "Setting_Group failed."; + } + + if (libconfig->setting_length(t) != 4) { + libconfig->destroy(&config); + return "Wrong amount of duplicates."; + } + + while ((tt = libconfig->setting_get_elem(t, i++)) != NULL) { + if (i != libconfig->setting_get_int(tt)) { + libconfig->destroy(&config); + return "Duplicate ordering error."; + } + } + + if (i != 5) { + libconfig->destroy(&config); + return "Wrong amount of duplicates scanned."; + } + + + libconfig->destroy(&config); + return NULL; +} + +static const char *test_libconfig_special_string_syntax(void) +{ + config_t config; + const char *str; + const char *input = "/* Test File */\n" + "SpecialString: <\"This is an \"Item_Script\" Special String\n\tWith a line-break inside.\">;\n" + "/* End test file */\n"; + if (libconfig->read_string(&config, input) == CONFIG_FALSE) { + libconfig->destroy(&config); + return "Unable to parse configuration."; + } + + if (libconfig->lookup_string(&config, "SpecialString", &str) == CONFIG_FALSE || str == NULL) { + libconfig->destroy(&config); + return "String lookup failed."; + } + + if (strcmp("This is an \"Item_Script\" Special String\n\tWith a line-break inside.", str) != 0) { + libconfig->destroy(&config); + return "String mismatch."; + } + + libconfig->destroy(&config); + return NULL; +} + +int do_init(int argc, char **argv) +{ + ShowMessage("===============================================================================\n"); + ShowStatus("Starting tests.\n"); + + TEST("CONFIG_TRUE and CONFIG_FALSE", test_libconfig_truefalse); + TEST("libconfig availability", test_libconfig_defaults); + TEST("libconfig->init and libconfig->destroy", test_libconfig_init_destroy); + TEST("libconfig->read_file_src", test_libconfig_read_file_src); + TEST("libconfig->read", test_libconfig_read); + TEST("libconfig->read_file", test_libconfig_read_file); + (void)test_libconfig_write; //TEST("libconfig->write", test_libconfig_write); + (void)test_libconfig_write_file; //TEST("libconfig->write_file", test_libconfig_write_file); + TEST("libconfig->read_string", test_libconfig_read_string); + TEST("libconfig syntax", test_libconfig_syntax); + (void)test_libconfig_set_include_dir; //TEST("libconfig->set_include_dir", test_libconfig_set_include_dir); + //int (*setting_set_format) (config_setting_t *setting, short format); + //short (*setting_get_format) (const config_setting_t *setting); + //config_setting_t * (*setting_set_int_elem) (config_setting_t *setting, int idx, int value); + //config_setting_t * (*setting_set_int64_elem) (config_setting_t *setting, int idx, long long value); + //config_setting_t * (*setting_set_float_elem) (config_setting_t *setting, int idx, double value); + //config_setting_t * (*setting_set_bool_elem) (config_setting_t *setting, int idx, int value); + //config_setting_t * (*setting_set_string_elem) (config_setting_t *setting, int idx, const char *value); + //config_setting_t * (*setting_add) (config_setting_t *parent, const char *name, int type); + //int (*setting_remove) (config_setting_t *parent, const char *name); + //int (*setting_remove_elem) (config_setting_t *parent, unsigned int idx); + //void (*setting_set_hook) (config_setting_t *setting, void *hook); + //void (*set_destructor) (config_t *config, void (*destructor)(void *)); + TEST("libconfig->lookup_*", test_libconfig_lookup); + TEST("libconfig->setting_get_*", test_libconfig_setting_get); + (void)test_libconfig_set; //TEST("libconfig->setting_set_*", test_libconfig_setting_set); + TEST("libconfig->setting_lookup_*", test_libconfig_setting_lookup); + TEST("setting types", test_libconfig_setting_types); + //void (*setting_copy_simple) (config_setting_t *parent, const config_setting_t *src); + //void (*setting_copy_elem) (config_setting_t *parent, const config_setting_t *src); + //void (*setting_copy_aggregate) (config_setting_t *parent, const config_setting_t *src); + //int (*setting_copy) (config_setting_t *parent, const config_setting_t *src); + TEST("values", test_libconfig_values); + TEST("path lookup", test_libconfig_path_lookup); + TEST("setting key names", test_libconfig_setting_names); + TEST("duplicate keys", test_libconfig_duplicate_keys); + TEST("special string syntax", test_libconfig_special_string_syntax); + + core->runflag = CORE_ST_STOP; + return EXIT_SUCCESS; +} + +int do_final(void) { + ShowMessage("===============================================================================\n"); + ShowStatus("All tests passed.\n"); + return EXIT_SUCCESS; +} + +void do_abort(void) { } + +void set_server_type(void) +{ + SERVER_TYPE = SERVER_TYPE_UNKNOWN; +} + +void cmdline_args_init_local(void) { } diff --git a/src/test/test_spinlock.c b/src/test/test_spinlock.c index a11f8643b..d4b2c48f9 100644 --- a/src/test/test_spinlock.c +++ b/src/test/test_spinlock.c @@ -103,3 +103,5 @@ int do_final(void) { int parse_console(const char* command){ return 0; }//end: parse_console + +void cmdline_args_init_local(void) { } -- cgit v1.2.3-60-g2f50