From 1d67e8fd0cccef467f4e87f9931896652185dc72 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Fri, 16 Jan 2015 21:28:25 +0000 Subject: Windows CI: use 32 and 64 bit for AppVeyor builds Add 64 bit and always build with default calling conventions, to avoid trying to build with stdcall on amd64. --- appveyor.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 5c3538556..0dcfd4dc0 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,6 +2,12 @@ version: '{build}' branches: only: - master +environment: + matrix: + - GENERATOR: "Visual Studio 11" + ARCH: 32 + - GENERATOR: "Visual Studio 11 Win64" + ARCH: 64 build_script: - ps: >- choco install cmake @@ -12,7 +18,7 @@ build_script: cd build - cmake -D ENABLE_TRACE=ON -D BUILD_CLAR=ON -D STDCALL=ON .. -G"Visual Studio 11" + cmake -D ENABLE_TRACE=ON -D BUILD_CLAR=ON .. -G"$env:GENERATOR" cmake --build . --config RelWithDebInfo test_script: -- cgit v1.2.1 From 0ad5c845d2c5fb709cc4eb4ef7f9309684f75934 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Sun, 18 Jan 2015 00:47:59 -0600 Subject: structinit test: show which byte differs --- tests/structinit/structinit.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/tests/structinit/structinit.c b/tests/structinit/structinit.c index 0e00ab5a0..620743b90 100644 --- a/tests/structinit/structinit.c +++ b/tests/structinit/structinit.c @@ -25,11 +25,8 @@ do { \ structname structname##_func_latest; \ int structname##_curr_ver = structver - 1; \ cl_git_pass(funcinitname(&structname##_func_latest, structver)); \ - cl_check_( \ - memcmp(&structname##_macro_latest, &structname##_func_latest, \ - sizeof(structname)) == 0, \ - "Macro-based and function-based initializer for " STRINGIFY(structname) \ - " are not equivalent."); \ + options_cmp(&structname##_macro_latest, &structname##_func_latest, \ + sizeof(structname), STRINGIFY(structname)); \ \ while (structname##_curr_ver > 0) \ { \ @@ -39,6 +36,24 @@ do { \ }\ } while(0) +static void options_cmp(void *one, void *two, size_t size, const char *name) +{ + size_t i; + + for (i = 0; i < size; i++) { + if (((char *)one)[i] != ((char *)two)[i]) { + char desc[1024]; + + p_snprintf(desc, 1024, "Difference in %s at byte %d: macro=%u / func=%u", + name, i, ((char *)one)[i], ((char *)two)[i]); + clar__fail(__FILE__, __LINE__, + "Difference between macro and function options initializer", + desc, 0); + return; + } + } +} + void test_structinit_structinit__compare(void) { /* blame */ -- cgit v1.2.1 From 7c48508b287d1477089db0400ee8f8165f34b054 Mon Sep 17 00:00:00 2001 From: Edward Thomson Date: Wed, 21 Jan 2015 12:55:17 -0600 Subject: structinit test: only run on DEBUG builds The structinit tests don't make sense unless structure padding is uniformly initialized, which is unlikely to happen on release builds. Only enable them for DEBUG builds. Further, rename them to core::structinit. --- tests/core/structinit.c | 163 ++++++++++++++++++++++++++++++++++++++++++ tests/structinit/structinit.c | 148 -------------------------------------- 2 files changed, 163 insertions(+), 148 deletions(-) create mode 100644 tests/core/structinit.c delete mode 100644 tests/structinit/structinit.c diff --git a/tests/core/structinit.c b/tests/core/structinit.c new file mode 100644 index 000000000..d064f348e --- /dev/null +++ b/tests/core/structinit.c @@ -0,0 +1,163 @@ +#include "clar_libgit2.h" +#include +#include +#include +#include + +#define STRINGIFY(s) #s + +/* Checks two conditions for the specified structure: + * 1. That the initializers for the latest version produces the same + * in-memory representation. + * 2. That the function-based initializer supports all versions from 1...n, + * where n is the latest version (often represented by GIT_*_VERSION). + * + * Parameters: + * structname: The name of the structure to test, e.g. git_blame_options. + * structver: The latest version of the specified structure. + * macroinit: The macro that initializes the latest version of the structure. + * funcinitname: The function that initializes the structure. Must have the + * signature "int (structname* instance, int version)". + */ +#define CHECK_MACRO_FUNC_INIT_EQUAL(structname, structver, macroinit, funcinitname) \ +do { \ + structname structname##_macro_latest = macroinit; \ + structname structname##_func_latest; \ + int structname##_curr_ver = structver - 1; \ + memset(&structname##_func_latest, 0, sizeof(structname##_func_latest)); \ + cl_git_pass(funcinitname(&structname##_func_latest, structver)); \ + options_cmp(&structname##_macro_latest, &structname##_func_latest, \ + sizeof(structname), STRINGIFY(structname)); \ + \ + while (structname##_curr_ver > 0) \ + { \ + structname macro; \ + cl_git_pass(funcinitname(¯o, structname##_curr_ver)); \ + structname##_curr_ver--; \ + }\ +} while(0) + +static void options_cmp(void *one, void *two, size_t size, const char *name) +{ + size_t i; + + for (i = 0; i < size; i++) { + if (((char *)one)[i] != ((char *)two)[i]) { + char desc[1024]; + + p_snprintf(desc, 1024, "Difference in %s at byte %d: macro=%u / func=%u", + name, i, ((char *)one)[i], ((char *)two)[i]); + clar__fail(__FILE__, __LINE__, + "Difference between macro and function options initializer", + desc, 0); + return; + } + } +} + +void test_core_structinit__compare(void) +{ + /* These tests assume that they can memcmp() two structures that were + * initialized with the same static initializer. Eg, + * git_blame_options = GIT_BLAME_OPTIONS_INIT; + * + * This assumption fails when there is padding between structure members, + * which is not guaranteed to be initialized to anything sane at all. + * + * Assume most compilers, in a debug build, will clear that memory for + * us or set it to sentinal markers. Etc. + */ +#if !defined(DEBUG) && !defined(_DEBUG) + clar__skip(); +#endif + + /* blame */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_blame_options, GIT_BLAME_OPTIONS_VERSION, \ + GIT_BLAME_OPTIONS_INIT, git_blame_init_options); + + /* checkout */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_checkout_options, GIT_CHECKOUT_OPTIONS_VERSION, \ + GIT_CHECKOUT_OPTIONS_INIT, git_checkout_init_options); + + /* clone */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_clone_options, GIT_CLONE_OPTIONS_VERSION, \ + GIT_CLONE_OPTIONS_INIT, git_clone_init_options); + + /* diff */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_diff_options, GIT_DIFF_OPTIONS_VERSION, \ + GIT_DIFF_OPTIONS_INIT, git_diff_init_options); + + /* diff_find */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_diff_find_options, GIT_DIFF_FIND_OPTIONS_VERSION, \ + GIT_DIFF_FIND_OPTIONS_INIT, git_diff_find_init_options); + + /* merge_file_input */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_merge_file_input, GIT_MERGE_FILE_INPUT_VERSION, \ + GIT_MERGE_FILE_INPUT_INIT, git_merge_file_init_input); + + /* merge_file */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_merge_file_options, GIT_MERGE_FILE_OPTIONS_VERSION, \ + GIT_MERGE_FILE_OPTIONS_INIT, git_merge_file_init_options); + + /* merge_tree */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_merge_options, GIT_MERGE_OPTIONS_VERSION, \ + GIT_MERGE_OPTIONS_INIT, git_merge_init_options); + + /* push */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_push_options, GIT_PUSH_OPTIONS_VERSION, \ + GIT_PUSH_OPTIONS_INIT, git_push_init_options); + + /* remote */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_remote_callbacks, GIT_REMOTE_CALLBACKS_VERSION, \ + GIT_REMOTE_CALLBACKS_INIT, git_remote_init_callbacks); + + /* repository_init */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_repository_init_options, GIT_REPOSITORY_INIT_OPTIONS_VERSION, \ + GIT_REPOSITORY_INIT_OPTIONS_INIT, git_repository_init_init_options); + + /* revert */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_revert_options, GIT_REVERT_OPTIONS_VERSION, \ + GIT_REVERT_OPTIONS_INIT, git_revert_init_options); + + /* status */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_status_options, GIT_STATUS_OPTIONS_VERSION, \ + GIT_STATUS_OPTIONS_INIT, git_status_init_options); + + /* transport */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_transport, GIT_TRANSPORT_VERSION, \ + GIT_TRANSPORT_INIT, git_transport_init); + + /* config_backend */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_config_backend, GIT_CONFIG_BACKEND_VERSION, \ + GIT_CONFIG_BACKEND_INIT, git_config_init_backend); + + /* odb_backend */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_odb_backend, GIT_ODB_BACKEND_VERSION, \ + GIT_ODB_BACKEND_INIT, git_odb_init_backend); + + /* refdb_backend */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_refdb_backend, GIT_REFDB_BACKEND_VERSION, \ + GIT_REFDB_BACKEND_INIT, git_refdb_init_backend); + + /* submodule update */ + CHECK_MACRO_FUNC_INIT_EQUAL( \ + git_submodule_update_options, GIT_SUBMODULE_UPDATE_OPTIONS_VERSION, \ + GIT_SUBMODULE_UPDATE_OPTIONS_INIT, git_submodule_update_init_options); +} diff --git a/tests/structinit/structinit.c b/tests/structinit/structinit.c deleted file mode 100644 index 620743b90..000000000 --- a/tests/structinit/structinit.c +++ /dev/null @@ -1,148 +0,0 @@ -#include "clar_libgit2.h" -#include -#include -#include -#include - -#define STRINGIFY(s) #s - -/* Checks two conditions for the specified structure: - * 1. That the initializers for the latest version produces the same - * in-memory representation. - * 2. That the function-based initializer supports all versions from 1...n, - * where n is the latest version (often represented by GIT_*_VERSION). - * - * Parameters: - * structname: The name of the structure to test, e.g. git_blame_options. - * structver: The latest version of the specified structure. - * macroinit: The macro that initializes the latest version of the structure. - * funcinitname: The function that initializes the structure. Must have the - * signature "int (structname* instance, int version)". - */ -#define CHECK_MACRO_FUNC_INIT_EQUAL(structname, structver, macroinit, funcinitname) \ -do { \ - structname structname##_macro_latest = macroinit; \ - structname structname##_func_latest; \ - int structname##_curr_ver = structver - 1; \ - cl_git_pass(funcinitname(&structname##_func_latest, structver)); \ - options_cmp(&structname##_macro_latest, &structname##_func_latest, \ - sizeof(structname), STRINGIFY(structname)); \ - \ - while (structname##_curr_ver > 0) \ - { \ - structname macro; \ - cl_git_pass(funcinitname(¯o, structname##_curr_ver)); \ - structname##_curr_ver--; \ - }\ -} while(0) - -static void options_cmp(void *one, void *two, size_t size, const char *name) -{ - size_t i; - - for (i = 0; i < size; i++) { - if (((char *)one)[i] != ((char *)two)[i]) { - char desc[1024]; - - p_snprintf(desc, 1024, "Difference in %s at byte %d: macro=%u / func=%u", - name, i, ((char *)one)[i], ((char *)two)[i]); - clar__fail(__FILE__, __LINE__, - "Difference between macro and function options initializer", - desc, 0); - return; - } - } -} - -void test_structinit_structinit__compare(void) -{ - /* blame */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_blame_options, GIT_BLAME_OPTIONS_VERSION, \ - GIT_BLAME_OPTIONS_INIT, git_blame_init_options); - - /* checkout */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_checkout_options, GIT_CHECKOUT_OPTIONS_VERSION, \ - GIT_CHECKOUT_OPTIONS_INIT, git_checkout_init_options); - - /* clone */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_clone_options, GIT_CLONE_OPTIONS_VERSION, \ - GIT_CLONE_OPTIONS_INIT, git_clone_init_options); - - /* diff */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_diff_options, GIT_DIFF_OPTIONS_VERSION, \ - GIT_DIFF_OPTIONS_INIT, git_diff_init_options); - - /* diff_find */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_diff_find_options, GIT_DIFF_FIND_OPTIONS_VERSION, \ - GIT_DIFF_FIND_OPTIONS_INIT, git_diff_find_init_options); - - /* merge_file_input */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_merge_file_input, GIT_MERGE_FILE_INPUT_VERSION, \ - GIT_MERGE_FILE_INPUT_INIT, git_merge_file_init_input); - - /* merge_file */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_merge_file_options, GIT_MERGE_FILE_OPTIONS_VERSION, \ - GIT_MERGE_FILE_OPTIONS_INIT, git_merge_file_init_options); - - /* merge_tree */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_merge_options, GIT_MERGE_OPTIONS_VERSION, \ - GIT_MERGE_OPTIONS_INIT, git_merge_init_options); - - /* push */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_push_options, GIT_PUSH_OPTIONS_VERSION, \ - GIT_PUSH_OPTIONS_INIT, git_push_init_options); - - /* remote */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_remote_callbacks, GIT_REMOTE_CALLBACKS_VERSION, \ - GIT_REMOTE_CALLBACKS_INIT, git_remote_init_callbacks); - - /* repository_init */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_repository_init_options, GIT_REPOSITORY_INIT_OPTIONS_VERSION, \ - GIT_REPOSITORY_INIT_OPTIONS_INIT, git_repository_init_init_options); - - /* revert */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_revert_options, GIT_REVERT_OPTIONS_VERSION, \ - GIT_REVERT_OPTIONS_INIT, git_revert_init_options); - - /* status */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_status_options, GIT_STATUS_OPTIONS_VERSION, \ - GIT_STATUS_OPTIONS_INIT, git_status_init_options); - - /* transport */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_transport, GIT_TRANSPORT_VERSION, \ - GIT_TRANSPORT_INIT, git_transport_init); - - /* config_backend */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_config_backend, GIT_CONFIG_BACKEND_VERSION, \ - GIT_CONFIG_BACKEND_INIT, git_config_init_backend); - - /* odb_backend */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_odb_backend, GIT_ODB_BACKEND_VERSION, \ - GIT_ODB_BACKEND_INIT, git_odb_init_backend); - - /* refdb_backend */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_refdb_backend, GIT_REFDB_BACKEND_VERSION, \ - GIT_REFDB_BACKEND_INIT, git_refdb_init_backend); - - /* submodule update */ - CHECK_MACRO_FUNC_INIT_EQUAL( \ - git_submodule_update_options, GIT_SUBMODULE_UPDATE_OPTIONS_VERSION, \ - GIT_SUBMODULE_UPDATE_OPTIONS_INIT, git_submodule_update_init_options); -} -- cgit v1.2.1