From 80c9af5f3646b3184720ac6e94cfacd565a98ca1 Mon Sep 17 00:00:00 2001 From: Vasiliy Kiryanov Date: Mon, 28 Oct 2024 14:42:18 -0400 Subject: [PATCH 1/8] refactor tests for invalid format items --- CMakeLists.txt | 8 +- include/test/helper/fixture.hpp | 23 ++++++ test/corpora/invalid_param_name/1 | 1 + test/corpora/invalid_param_name/2 | 1 + test/corpora/invalid_param_name/3 | 1 + test/function/element.cpp | 93 ++++++++++------------ test/function/entry.cpp | 128 +++++++++++++----------------- test/function/param.cpp | 55 ++++++------- test/helper/fixture.cpp | 29 +++++++ 9 files changed, 184 insertions(+), 155 deletions(-) create mode 100644 test/corpora/invalid_param_name/1 create mode 100644 test/corpora/invalid_param_name/2 create mode 100644 test/corpora/invalid_param_name/3 diff --git a/CMakeLists.txt b/CMakeLists.txt index 5022e71c5..93fb967a1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -844,7 +844,9 @@ add_function_test(current_target ) add_function_test(element - SOURCES test/function/element.cpp + SOURCES + test/function/element.cpp + $ ) add_function_test(element_leak @@ -1055,7 +1057,9 @@ add_function_test(memory ) add_function_test(param - SOURCES ${PROJECT_SOURCE_DIR}/test/function/param.cpp + SOURCES + ${PROJECT_SOURCE_DIR}/test/function/param.cpp + $ ) add_function_test(perror diff --git a/include/test/helper/fixture.hpp b/include/test/helper/fixture.hpp index 4a2582311..8e4ce76b0 100644 --- a/include/test/helper/fixture.hpp +++ b/include/test/helper/fixture.hpp @@ -85,4 +85,27 @@ create_nil_entry( void ); const char * load_corpus( const std::string& name ); +struct stumpless_test_data { + int length; + char **test_strings; +}; + +/** + * Returns stumpless_test_data holding the contents of all the files at the named + * location in the test/corpora folder. For example, a name of "invalid_param_name" + * will return the contents of all the files under test/corpora/invalid_param_name + * directory in the form of an array. + * + * The allocated memory for test_strings must be safely freed up using free() + * and the buffer content (returned from load_corpus method) should also be + * destroyed using delete[] when no longer needed to avoid memory leaks. + * + * @param name The directory name. + * + * @return stumpless_test_data holding the test_strings pointing to contents of the + * directory as an array and corresponding size stored as length. + */ +stumpless_test_data +load_corpus_folder( const std::string& name ); + #endif /* __STUMPLESS_TEST_HELPER_FIXTURE_HPP */ diff --git a/test/corpora/invalid_param_name/1 b/test/corpora/invalid_param_name/1 new file mode 100644 index 000000000..a5124030c --- /dev/null +++ b/test/corpora/invalid_param_name/1 @@ -0,0 +1 @@ +par=am \ No newline at end of file diff --git a/test/corpora/invalid_param_name/2 b/test/corpora/invalid_param_name/2 new file mode 100644 index 000000000..40430b86c --- /dev/null +++ b/test/corpora/invalid_param_name/2 @@ -0,0 +1 @@ +par]am \ No newline at end of file diff --git a/test/corpora/invalid_param_name/3 b/test/corpora/invalid_param_name/3 new file mode 100644 index 000000000..60a838118 --- /dev/null +++ b/test/corpora/invalid_param_name/3 @@ -0,0 +1 @@ +par\"am \ No newline at end of file diff --git a/test/function/element.cpp b/test/function/element.cpp index 4391027e9..ae3dbb735 100644 --- a/test/function/element.cpp +++ b/test/function/element.cpp @@ -22,6 +22,7 @@ #include #include #include "test/helper/assert.hpp" +#include "test/helper/fixture.hpp" #include "test/helper/memory_allocation.hpp" using::testing::HasSubstr; @@ -351,18 +352,16 @@ namespace { TEST_F( ElementTest, GetParamByNameInvalidName ) { const struct stumpless_param *result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_get_param_by_name( element_with_params, "par=am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_get_param_by_name( element_with_params, "par]am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_get_param_by_name( element_with_params, invalid_names.test_strings[i] ); + delete[] invalid_names.test_strings[i]; + EXPECT_NULL( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + } - result = stumpless_get_param_by_name( element_with_params, "par\"am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( ElementTest, GetParamCount ) { @@ -557,18 +556,16 @@ namespace { TEST_F( ElementTest, GetParamValueByNameInvalidName ) { const char *result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_get_param_value_by_name( element_with_params, "par=am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_get_param_value_by_name( element_with_params, "par]am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_get_param_value_by_name( element_with_params, invalid_names.test_strings[i] ); + EXPECT_NULL( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_get_param_value_by_name( element_with_params, "par\"am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( ElementTest, HasParam ) { @@ -593,18 +590,16 @@ namespace { TEST_F( ElementTest, HasParamInvalidName ) { bool result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_element_has_param( element_with_params, "par=am" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_element_has_param( element_with_params, invalid_names.test_strings[i] ); + EXPECT_FALSE( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_element_has_param( element_with_params, "para]m" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_element_has_param( element_with_params, "pa\"ram" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( ElementTest, SetName ) { @@ -1017,19 +1012,16 @@ namespace { TEST( NewElementTest, InvalidName ) { struct stumpless_element *element; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - element = stumpless_new_element( "ele=ment" ); - EXPECT_NULL( element ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + element = stumpless_new_element( invalid_names.test_strings[i] ); + EXPECT_NULL( element ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - element = stumpless_new_element( "element]" ); - EXPECT_NULL( element ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - element = stumpless_new_element( "El\"ment" ); - EXPECT_NULL( element ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - + free((void *) invalid_names.test_strings); stumpless_free_all( ); } @@ -1056,22 +1048,19 @@ namespace { TEST( SetElementNameTest, InvalidName) { struct stumpless_element *element; struct stumpless_element *result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); element = stumpless_new_element( "element" ); ASSERT_NOT_NULL( element ); - result = stumpless_set_element_name( element, "ele=ment"); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_set_element_name( element, "eleme]nt"); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_set_element_name( element, invalid_names.test_strings[i]); + EXPECT_NULL( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_set_element_name( element, "element\""); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - + free((void *) invalid_names.test_strings); stumpless_destroy_element_and_contents( element ); stumpless_free_all( ); } diff --git a/test/function/entry.cpp b/test/function/entry.cpp index f6755b668..56aaaffa3 100644 --- a/test/function/entry.cpp +++ b/test/function/entry.cpp @@ -596,34 +596,30 @@ namespace { TEST_F( EntryTest, GetParamByNameInvalidParamName ) { const struct stumpless_param *result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_get_entry_param_by_name( basic_entry, "e-name", "par=am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_get_entry_param_by_name( basic_entry, "e-name", "par]am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_get_entry_param_by_name( basic_entry, "e-name", invalid_names.test_strings[i]); + EXPECT_NULL( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_get_entry_param_by_name( basic_entry, "e-name", "par\"am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetParamByNameInvalidElementName ) { const struct stumpless_param *result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_get_entry_param_by_name( basic_entry, "ele=ment", "param" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_get_entry_param_by_name( basic_entry, "ele]ment", "param" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_get_entry_param_by_name( basic_entry, invalid_names.test_strings[i], "param" ); + EXPECT_NULL( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_get_entry_param_by_name( basic_entry, "e-name\"", "param" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetParamValueByIndex ) { @@ -689,34 +685,30 @@ namespace { TEST_F( EntryTest, GetParamValueByNameInvalidParamName ) { const char *result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_get_entry_param_value_by_name( basic_entry, "e-name", "par=am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_get_entry_param_value_by_name( basic_entry, "e-name", "par]am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_get_entry_param_value_by_name( basic_entry, "e-name", invalid_names.test_strings[i] ); + EXPECT_NULL( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_get_entry_param_value_by_name( basic_entry, "e-name", "par\"am" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetParamValueByNameInvalidElementName ) { const char *result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_get_entry_param_value_by_name( basic_entry, "e=name", "param" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_get_entry_param_value_by_name( basic_entry, "e]name", "param" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_get_entry_param_value_by_name( basic_entry, invalid_names.test_strings[i], "param" ); + EXPECT_NULL( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_get_entry_param_value_by_name( basic_entry, "\"e-name", "param" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( EntryTest, HasElement ) { @@ -745,50 +737,44 @@ namespace { TEST_F( EntryTest, HasElementInvalidName ) { bool result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_entry_has_element( basic_entry, "ele=ment" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_entry_has_element( basic_entry, "ele]ment" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_entry_has_element( basic_entry, invalid_names.test_strings[i] ); + EXPECT_FALSE( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_entry_has_element( basic_entry, "element\"" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetElementInvalidName ) { bool result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_get_element_by_name( basic_entry, "ele=ment" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_get_element_by_name( basic_entry, "ele]ment" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_get_element_by_name( basic_entry, invalid_names.test_strings[i] ); + EXPECT_FALSE( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_get_element_by_name( basic_entry, "element\"" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetElementIdxInvalidName ) { bool result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_get_element_index( basic_entry, "ele=ment" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_get_element_index( basic_entry, "ele]ment" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_get_element_index( basic_entry, invalid_names.test_strings[i] ); + EXPECT_FALSE( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_get_element_index( basic_entry, "element\"" ); - EXPECT_FALSE( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + free((void *) invalid_names.test_strings); } TEST_F( EntryTest, SetAppName ) { @@ -1740,7 +1726,7 @@ namespace { stumpless_free_all( ); } - TEST( NewEntryStrTest, New ){ + TEST( NewEntryStrTest, New ) { struct stumpless_entry *entry; const char *app_name = "test-app-name"; const char *msgid = "test-msgid"; diff --git a/test/function/param.cpp b/test/function/param.cpp index 2a5a04a2c..a0ada2f3a 100644 --- a/test/function/param.cpp +++ b/test/function/param.cpp @@ -22,6 +22,7 @@ #include #include #include "test/helper/assert.hpp" +#include "test/helper/fixture.hpp" #include "test/helper/memory_allocation.hpp" namespace { @@ -235,19 +236,16 @@ namespace { TEST( LoadParamTest, InvalidName ) { struct stumpless_param param; const struct stumpless_param *result; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - result = stumpless_load_param( ¶m, "par=am", "test-value" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - result = stumpless_load_param( ¶m, "param]", "test-value" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + result = stumpless_load_param( ¶m, invalid_names.test_strings[i], "test-value" ); + EXPECT_NULL( result ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - result = stumpless_load_param( ¶m, "p\"aram", "test-value" ); - EXPECT_NULL( result ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - + free((void *) invalid_names.test_strings); stumpless_free_all( ); } @@ -335,19 +333,16 @@ namespace { TEST( NewParamTest, InvalidName ) { struct stumpless_param *param; + stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); - param = stumpless_new_param( "par=am", "test-value" ); - EXPECT_NULL( param ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - - param = stumpless_new_param( "param]", "test-value" ); - EXPECT_NULL( param ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + for(int i = 0; i < invalid_names.length; ++i) { + param = stumpless_new_param( invalid_names.test_strings[i], "test-value" ); + EXPECT_NULL( param ); + EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); + delete[] invalid_names.test_strings[i]; + } - param = stumpless_new_param( "p\"aram", "test-value" ); - EXPECT_NULL( param ); - EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - + free((void *) invalid_names.test_strings); stumpless_free_all( ); } @@ -371,7 +366,7 @@ namespace { stumpless_free_all( ); } - TEST( NewParamTest, ValidUTF8 ){ + TEST( NewParamTest, ValidUTF8 ) { const struct stumpless_param *param; const char *name = "test-param-name"; // U+2162 U+2264 U+0035(5) @@ -396,7 +391,7 @@ namespace { stumpless_free_all( ); } - TEST( NewParamTest, InvalidUTF8 ){ + TEST( NewParamTest, InvalidUTF8 ) { struct stumpless_param *param; const char *name = "test-param-name"; @@ -606,7 +601,7 @@ namespace { stumpless_free_all( ); } - TEST( ParamFromStringTest, MallocFail ){ + TEST( ParamFromStringTest, MallocFail ) { void * ( *set_malloc_result )( size_t ); const struct stumpless_param *param; @@ -621,7 +616,7 @@ namespace { EXPECT_TRUE( set_malloc_result == malloc ); } - TEST( ParamFromStringTest, MallocFailOnValue ){ + TEST( ParamFromStringTest, MallocFailOnValue ) { void * ( *set_malloc_result )( size_t ); const struct stumpless_param *param; @@ -636,7 +631,7 @@ namespace { EXPECT_TRUE( set_malloc_result == malloc ); } - TEST( ParamFromStringTest, New ){ + TEST( ParamFromStringTest, New ) { struct stumpless_param *param; const char *param_string = "test-param-name=\"test-param-value\""; @@ -660,7 +655,7 @@ namespace { stumpless_free_all(); } - TEST( ParamFromStringTest, NullName ){ + TEST( ParamFromStringTest, NullName ) { struct stumpless_param *param; param = stumpless_new_param_from_string( NULL ); @@ -670,7 +665,7 @@ namespace { stumpless_free_all(); } - TEST( ParamFromStringTest, InvalidFormat ){ + TEST( ParamFromStringTest, InvalidFormat ) { std::vector invalid_names = { "param-na=me=\"param-value\"", "param-name\"param-value\"", @@ -691,7 +686,7 @@ namespace { stumpless_free_all(); } - TEST( ParamFromStringTest, NameTooLong ){ + TEST( ParamFromStringTest, NameTooLong ) { const char *str = "param-name-that-is-entirely-too-long=\"param-value\""; struct stumpless_param *param; diff --git a/test/helper/fixture.cpp b/test/helper/fixture.cpp index 5e0c5cb60..70bc00b3d 100644 --- a/test/helper/fixture.cpp +++ b/test/helper/fixture.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "test/config.hpp" #include "test/helper/fixture.hpp" @@ -88,3 +89,31 @@ load_corpus( const string& name ) { return buffer; } + +stumpless_test_data +load_corpus_folder( const string& name){ + + DIR *dir; + struct dirent *ent; + string corpora_dir ( FUZZ_CORPORA_DIR ); + int fileIndex = 0; + + char **test_strings; + if((dir = opendir((corpora_dir + "/" + name).c_str())) != NULL){ + while((ent = readdir(dir)) != NULL){ + const char *test_string = load_corpus(name + "/" + ent->d_name); + if(test_string != NULL){ + if(fileIndex > 0){ + test_strings = (char **) realloc(test_strings, sizeof(char *) * (fileIndex + 1)); + } + else{ + test_strings = (char **) malloc(sizeof(char *)); + } + test_strings[fileIndex] = (char *)test_string; + ++fileIndex; + } + } + closedir(dir); + } + return {fileIndex, test_strings}; +} From 145d1170de0e5c46e9278287c3319529ea9d7aa5 Mon Sep 17 00:00:00 2001 From: Vasiliy Kiryanov Date: Tue, 29 Oct 2024 20:04:00 -0400 Subject: [PATCH 2/8] include added to stumples_private.yml --- include/test/helper/fixture.hpp | 1 + test/helper/fixture.cpp | 1 - tools/check_headers/stumpless_private.yml | 4 ++++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/test/helper/fixture.hpp b/include/test/helper/fixture.hpp index 8e4ce76b0..f7885147f 100644 --- a/include/test/helper/fixture.hpp +++ b/include/test/helper/fixture.hpp @@ -20,6 +20,7 @@ # define __STUMPLESS_TEST_HELPER_FIXTURE_HPP # include +# include # include # include # include diff --git a/test/helper/fixture.cpp b/test/helper/fixture.cpp index 70bc00b3d..38f65b8c0 100644 --- a/test/helper/fixture.cpp +++ b/test/helper/fixture.cpp @@ -20,7 +20,6 @@ #include #include #include -#include #include "test/config.hpp" #include "test/helper/fixture.hpp" diff --git a/tools/check_headers/stumpless_private.yml b/tools/check_headers/stumpless_private.yml index a7e62cfe5..3aeb6d409 100644 --- a/tools/check_headers/stumpless_private.yml +++ b/tools/check_headers/stumpless_private.yml @@ -59,6 +59,7 @@ "copy_wel_data": "private/config/wel_supported.h" "create_empty_entry": "test/helper/fixture.hpp" "create_nil_entry": "test/helper/fixture.hpp" +"closedir": "test/helper/fixture.hpp" "destroy_chain_target": "private/target/chain.h" "destroy_sqlite3_target": "private/target/sqlite3.h" "fallback_copy_wstring_to_cstring": "private/config/fallback.h" @@ -109,6 +110,7 @@ "locked_get_element_by_name": "private/entry.h" "locked_get_param_by_index": "private/element.h" "locked_swap_wel_insertion_string": "private/config/wel_supported.h" +"malloc": "test/helper/fixture.hpp" "new_entry": "private/entry.h" "new_chain_target": "private/target/chain.h" "new_sqlite3_target": "private/target/sqlite3.h" @@ -117,6 +119,7 @@ "no_thread_safety_compare_exchange_bool": "private/config/thread_safety_unsupported.h" "no_thread_safety_compare_exchange_ptr": "private/config/thread_safety_unsupported.h" "no_wcsrtombs_s_copy_wstring_to_cstring": "private/config/no_wcsrtombs_s.h" +"opendir": "test/helper/fixture.hpp" "open_tcp_server_socket": "test/helper/server.hpp" "open_tcp4_server_socket": "test/helper/server.hpp" "open_tcp6_server_socket": "test/helper/server.hpp" @@ -137,6 +140,7 @@ "raise_sqlite3_failure": "private/error.h" "raise_wide_conversion_failure": "private/error.h" "raise_windows_failure": "private/error.h" +"realloc": "test/helper/fixture.hpp" "repeat_add_entry": "test/helper/usage.hpp" "RFC_5424_FULL_DATE_BUFFER_SIZE": "private/formatter.h" "RFC_5424_FULL_TIME_BUFFER_SIZE": "private/formatter.h" From 6bf8e73658eb21717ab3d636767b1fd954bf1250 Mon Sep 17 00:00:00 2001 From: Vasiliy Kiryanov Date: Fri, 1 Nov 2024 21:22:40 -0400 Subject: [PATCH 3/8] line terminators added to the test data files --- test/corpora/invalid_param_name/1 | 2 +- test/corpora/invalid_param_name/2 | 2 +- test/corpora/invalid_param_name/3 | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/corpora/invalid_param_name/1 b/test/corpora/invalid_param_name/1 index a5124030c..e66752584 100644 --- a/test/corpora/invalid_param_name/1 +++ b/test/corpora/invalid_param_name/1 @@ -1 +1 @@ -par=am \ No newline at end of file +par=am diff --git a/test/corpora/invalid_param_name/2 b/test/corpora/invalid_param_name/2 index 40430b86c..9cc6a8496 100644 --- a/test/corpora/invalid_param_name/2 +++ b/test/corpora/invalid_param_name/2 @@ -1 +1 @@ -par]am \ No newline at end of file +par]am diff --git a/test/corpora/invalid_param_name/3 b/test/corpora/invalid_param_name/3 index 60a838118..546514e07 100644 --- a/test/corpora/invalid_param_name/3 +++ b/test/corpora/invalid_param_name/3 @@ -1 +1 @@ -par\"am \ No newline at end of file +par\"a From 4c5fb3a8e943d03b57fe32405d3c375aaa35eb69 Mon Sep 17 00:00:00 2001 From: Vasiliy Kiryanov Date: Sat, 2 Nov 2024 15:40:21 -0400 Subject: [PATCH 4/8] made code Win and Unix/Linux/MacOS compatible --- include/test/helper/fixture.hpp | 3 +- test/corpora/invalid_param_name/1 | 2 +- test/corpora/invalid_param_name/2 | 2 +- test/corpora/invalid_param_name/3 | 2 +- test/helper/fixture.cpp | 81 ++++++++++++++++++++++--------- 5 files changed, 63 insertions(+), 27 deletions(-) diff --git a/include/test/helper/fixture.hpp b/include/test/helper/fixture.hpp index f7885147f..01879210a 100644 --- a/include/test/helper/fixture.hpp +++ b/include/test/helper/fixture.hpp @@ -20,7 +20,6 @@ # define __STUMPLESS_TEST_HELPER_FIXTURE_HPP # include -# include # include # include # include @@ -107,6 +106,6 @@ struct stumpless_test_data { * directory as an array and corresponding size stored as length. */ stumpless_test_data -load_corpus_folder( const std::string& name ); +load_corpus_folder( const char* name ); #endif /* __STUMPLESS_TEST_HELPER_FIXTURE_HPP */ diff --git a/test/corpora/invalid_param_name/1 b/test/corpora/invalid_param_name/1 index e66752584..a5124030c 100644 --- a/test/corpora/invalid_param_name/1 +++ b/test/corpora/invalid_param_name/1 @@ -1 +1 @@ -par=am +par=am \ No newline at end of file diff --git a/test/corpora/invalid_param_name/2 b/test/corpora/invalid_param_name/2 index 9cc6a8496..40430b86c 100644 --- a/test/corpora/invalid_param_name/2 +++ b/test/corpora/invalid_param_name/2 @@ -1 +1 @@ -par]am +par]am \ No newline at end of file diff --git a/test/corpora/invalid_param_name/3 b/test/corpora/invalid_param_name/3 index 546514e07..60a838118 100644 --- a/test/corpora/invalid_param_name/3 +++ b/test/corpora/invalid_param_name/3 @@ -1 +1 @@ -par\"a +par\"am \ No newline at end of file diff --git a/test/helper/fixture.cpp b/test/helper/fixture.cpp index 38f65b8c0..b74b32b49 100644 --- a/test/helper/fixture.cpp +++ b/test/helper/fixture.cpp @@ -16,6 +16,10 @@ * limitations under the License. */ +#ifndef HAVE_WINDOWS_H + #include +#endif + #include #include #include @@ -90,29 +94,62 @@ load_corpus( const string& name ) { } stumpless_test_data -load_corpus_folder( const string& name){ +load_corpus_folder( const char* name ) { + char** test_strings = NULL; + int fileIndex = 0; + +#if defined(HAVE_WINDOWS_H) + // Windows directory traversal + char corpora_dir[MAX_PATH]; + snprintf( corpora_dir, sizeof( corpora_dir ), "%s\\%s\\*", FUZZ_CORPORA_DIR, name ); + + WIN32_FIND_DATA findFileData; + HANDLE hFind = FindFirstFile( corpora_dir, &findFileData ); + + if ( hFind != INVALID_HANDLE_VALUE ) { + do { + if ( !( findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ) { + char filePath[MAX_PATH]; + snprintf( filePath, MAX_PATH, "%s\\%s\\%s", FUZZ_CORPORA_DIR, name, findFileData.cFileName ); + + const char* test_string = load_corpus( filePath ); + if (test_string != NULL) { + test_strings = (char**) realloc( test_strings, sizeof(char*) * ( fileIndex + 1 ) ) ; + test_strings[fileIndex] = (char*) test_string; + ++fileIndex; + } + } + } while ( FindNextFile( hFind, &findFileData ) != 0 ); + FindClose(hFind); + } - DIR *dir; - struct dirent *ent; - string corpora_dir ( FUZZ_CORPORA_DIR ); - int fileIndex = 0; - - char **test_strings; - if((dir = opendir((corpora_dir + "/" + name).c_str())) != NULL){ - while((ent = readdir(dir)) != NULL){ - const char *test_string = load_corpus(name + "/" + ent->d_name); - if(test_string != NULL){ - if(fileIndex > 0){ - test_strings = (char **) realloc(test_strings, sizeof(char *) * (fileIndex + 1)); +#else + // POSIX (macOS Unix/Linux) directory traversal + char corpora_dir[PATH_MAX]; + snprintf( corpora_dir, sizeof( corpora_dir ), "%s/%s", FUZZ_CORPORA_DIR, name ); + + DIR* dir = opendir( corpora_dir ); + dirent* ent; + if (dir != NULL) { + while ( ( ent = readdir(dir) ) != NULL ) { + if ( ent->d_type == DT_REG ) { // Only process regular files + char filePath[1024]; + snprintf( filePath, sizeof(filePath), "%s/%s", corpora_dir, ent->d_name ); + + const char* test_string = load_corpus( filePath ); + if ( test_string != NULL ) { + test_strings = (char**) realloc( test_strings, sizeof(char*) * ( fileIndex + 1 ) ); + test_strings[fileIndex] = (char*) test_string; + ++fileIndex; + } + } } - else{ - test_strings = (char **) malloc(sizeof(char *)); - } - test_strings[fileIndex] = (char *)test_string; - ++fileIndex; - } + closedir( dir ); } - closedir(dir); - } - return {fileIndex, test_strings}; +#endif + + stumpless_test_data result; + result.length = fileIndex; + result.test_strings = test_strings; + return result; } From 750d50856eb4d2e6dbcc1b28e6eb0df9e9e81cb3 Mon Sep 17 00:00:00 2001 From: Vasiliy Kiryanov Date: Sun, 3 Nov 2024 13:58:03 -0500 Subject: [PATCH 5/8] load_corpus_folder logic conteverted to c++17 to simplify code --- CMakeLists.txt | 3 + include/test/helper/fixture.hpp | 15 +--- test/function/element.cpp | 44 +++++------- test/function/entry.cpp | 63 ++++++----------- test/function/param.cpp | 18 ++--- test/helper/fixture.cpp | 86 +++++++---------------- tools/check_headers/stumpless_private.yml | 4 -- 7 files changed, 76 insertions(+), 157 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 93fb967a1..e1dd5cc91 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,8 @@ cmake_minimum_required(VERSION 3.2.3) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) + if(POLICY CMP0135) cmake_policy(SET CMP0135 NEW) endif() diff --git a/include/test/helper/fixture.hpp b/include/test/helper/fixture.hpp index 01879210a..38ae9480c 100644 --- a/include/test/helper/fixture.hpp +++ b/include/test/helper/fixture.hpp @@ -85,27 +85,18 @@ create_nil_entry( void ); const char * load_corpus( const std::string& name ); -struct stumpless_test_data { - int length; - char **test_strings; -}; - /** * Returns stumpless_test_data holding the contents of all the files at the named * location in the test/corpora folder. For example, a name of "invalid_param_name" * will return the contents of all the files under test/corpora/invalid_param_name * directory in the form of an array. * - * The allocated memory for test_strings must be safely freed up using free() - * and the buffer content (returned from load_corpus method) should also be - * destroyed using delete[] when no longer needed to avoid memory leaks. * * @param name The directory name. * - * @return stumpless_test_data holding the test_strings pointing to contents of the - * directory as an array and corresponding size stored as length. + * @return vector of strings holding test values. */ -stumpless_test_data -load_corpus_folder( const char* name ); +std::vector +load_corpus_folder( const std::string& name ); #endif /* __STUMPLESS_TEST_HELPER_FIXTURE_HPP */ diff --git a/test/function/element.cpp b/test/function/element.cpp index ae3dbb735..b4896597b 100644 --- a/test/function/element.cpp +++ b/test/function/element.cpp @@ -18,6 +18,7 @@ #include #include +#include #include #include #include @@ -352,16 +353,13 @@ namespace { TEST_F( ElementTest, GetParamByNameInvalidName ) { const struct stumpless_param *result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_get_param_by_name( element_with_params, invalid_names.test_strings[i] ); - delete[] invalid_names.test_strings[i]; + for(const auto& invalid_name : invalid_names) { + result = stumpless_get_param_by_name( element_with_params, invalid_name.c_str() ); EXPECT_NULL( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); } - - free((void *) invalid_names.test_strings); } TEST_F( ElementTest, GetParamCount ) { @@ -556,16 +554,13 @@ namespace { TEST_F( ElementTest, GetParamValueByNameInvalidName ) { const char *result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_get_param_value_by_name( element_with_params, invalid_names.test_strings[i] ); + for(const auto& invalid_name : invalid_names) { + result = stumpless_get_param_value_by_name( element_with_params, invalid_name.c_str() ); EXPECT_NULL( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); } TEST_F( ElementTest, HasParam ) { @@ -590,16 +585,13 @@ namespace { TEST_F( ElementTest, HasParamInvalidName ) { bool result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_element_has_param( element_with_params, invalid_names.test_strings[i] ); + for(const auto& invalid_name : invalid_names) { + result = stumpless_element_has_param( element_with_params, invalid_name.c_str() ); EXPECT_FALSE( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); } TEST_F( ElementTest, SetName ) { @@ -1012,16 +1004,14 @@ namespace { TEST( NewElementTest, InvalidName ) { struct stumpless_element *element; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - element = stumpless_new_element( invalid_names.test_strings[i] ); + for(const auto& invalid_name : invalid_names) { + element = stumpless_new_element( invalid_name.c_str() ); EXPECT_NULL( element ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - free((void *) invalid_names.test_strings); stumpless_free_all( ); } @@ -1048,19 +1038,17 @@ namespace { TEST( SetElementNameTest, InvalidName) { struct stumpless_element *element; struct stumpless_element *result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); element = stumpless_new_element( "element" ); ASSERT_NOT_NULL( element ); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_set_element_name( element, invalid_names.test_strings[i]); + for(const auto& invalid_name : invalid_names) { + result = stumpless_set_element_name( element, invalid_name.c_str() ); EXPECT_NULL( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - free((void *) invalid_names.test_strings); stumpless_destroy_element_and_contents( element ); stumpless_free_all( ); } diff --git a/test/function/entry.cpp b/test/function/entry.cpp index 56aaaffa3..6935ff4bd 100644 --- a/test/function/entry.cpp +++ b/test/function/entry.cpp @@ -596,30 +596,24 @@ namespace { TEST_F( EntryTest, GetParamByNameInvalidParamName ) { const struct stumpless_param *result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_get_entry_param_by_name( basic_entry, "e-name", invalid_names.test_strings[i]); + for(const auto& invalid_name : invalid_names) { + result = stumpless_get_entry_param_by_name( basic_entry, "e-name", invalid_name.c_str() ); EXPECT_NULL( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetParamByNameInvalidElementName ) { const struct stumpless_param *result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_get_entry_param_by_name( basic_entry, invalid_names.test_strings[i], "param" ); + for(const auto& invalid_name : invalid_names) { + result = stumpless_get_entry_param_by_name( basic_entry, invalid_name.c_str(), "param" ); EXPECT_NULL( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetParamValueByIndex ) { @@ -685,30 +679,24 @@ namespace { TEST_F( EntryTest, GetParamValueByNameInvalidParamName ) { const char *result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_get_entry_param_value_by_name( basic_entry, "e-name", invalid_names.test_strings[i] ); + for(const auto& invalid_name : invalid_names) { + result = stumpless_get_entry_param_value_by_name( basic_entry, "e-name", invalid_name.c_str() ); EXPECT_NULL( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetParamValueByNameInvalidElementName ) { const char *result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_get_entry_param_value_by_name( basic_entry, invalid_names.test_strings[i], "param" ); + for(const auto& invalid_name : invalid_names) { + result = stumpless_get_entry_param_value_by_name( basic_entry, invalid_name.c_str(), "param" ); EXPECT_NULL( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); } TEST_F( EntryTest, HasElement ) { @@ -737,44 +725,35 @@ namespace { TEST_F( EntryTest, HasElementInvalidName ) { bool result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_entry_has_element( basic_entry, invalid_names.test_strings[i] ); + for(const auto& invalid_name : invalid_names) { + result = stumpless_entry_has_element( basic_entry, invalid_name.c_str() ); EXPECT_FALSE( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetElementInvalidName ) { bool result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_get_element_by_name( basic_entry, invalid_names.test_strings[i] ); + for(const auto& invalid_name : invalid_names) { + result = stumpless_get_element_by_name( basic_entry, invalid_name.c_str() ); EXPECT_FALSE( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); } TEST_F( EntryTest, GetElementIdxInvalidName ) { bool result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_get_element_index( basic_entry, invalid_names.test_strings[i] ); + for(const auto& invalid_name : invalid_names) { + result = stumpless_get_element_index( basic_entry, invalid_name.c_str() ); EXPECT_FALSE( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); } TEST_F( EntryTest, SetAppName ) { diff --git a/test/function/param.cpp b/test/function/param.cpp index a0ada2f3a..9eb21060b 100644 --- a/test/function/param.cpp +++ b/test/function/param.cpp @@ -236,16 +236,13 @@ namespace { TEST( LoadParamTest, InvalidName ) { struct stumpless_param param; const struct stumpless_param *result; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - result = stumpless_load_param( ¶m, invalid_names.test_strings[i], "test-value" ); + for(const auto& invalid_name : invalid_names) { + result = stumpless_load_param( ¶m, invalid_name.c_str(), "test-value" ); EXPECT_NULL( result ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); stumpless_free_all( ); } @@ -333,16 +330,13 @@ namespace { TEST( NewParamTest, InvalidName ) { struct stumpless_param *param; - stumpless_test_data invalid_names = load_corpus_folder("invalid_param_name"); + std::vector invalid_names = load_corpus_folder("invalid_param_name"); - for(int i = 0; i < invalid_names.length; ++i) { - param = stumpless_new_param( invalid_names.test_strings[i], "test-value" ); + for(const auto& invalid_name : invalid_names) { + param = stumpless_new_param( invalid_name.c_str(), "test-value" ); EXPECT_NULL( param ); EXPECT_ERROR_ID_EQ( STUMPLESS_INVALID_ENCODING ); - delete[] invalid_names.test_strings[i]; } - - free((void *) invalid_names.test_strings); stumpless_free_all( ); } diff --git a/test/helper/fixture.cpp b/test/helper/fixture.cpp index b74b32b49..59a106917 100644 --- a/test/helper/fixture.cpp +++ b/test/helper/fixture.cpp @@ -16,9 +16,6 @@ * limitations under the License. */ -#ifndef HAVE_WINDOWS_H - #include -#endif #include #include @@ -26,6 +23,13 @@ #include #include "test/config.hpp" #include "test/helper/fixture.hpp" +#include + +#if defined(__APPLE__) + namespace fs = std::__fs::filesystem; +#else + namespace fs = std::fs::filesystem; +#endif using namespace std; @@ -93,63 +97,27 @@ load_corpus( const string& name ) { return buffer; } -stumpless_test_data -load_corpus_folder( const char* name ) { - char** test_strings = NULL; - int fileIndex = 0; - -#if defined(HAVE_WINDOWS_H) - // Windows directory traversal - char corpora_dir[MAX_PATH]; - snprintf( corpora_dir, sizeof( corpora_dir ), "%s\\%s\\*", FUZZ_CORPORA_DIR, name ); - - WIN32_FIND_DATA findFileData; - HANDLE hFind = FindFirstFile( corpora_dir, &findFileData ); - - if ( hFind != INVALID_HANDLE_VALUE ) { - do { - if ( !( findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) ) { - char filePath[MAX_PATH]; - snprintf( filePath, MAX_PATH, "%s\\%s\\%s", FUZZ_CORPORA_DIR, name, findFileData.cFileName ); - - const char* test_string = load_corpus( filePath ); - if (test_string != NULL) { - test_strings = (char**) realloc( test_strings, sizeof(char*) * ( fileIndex + 1 ) ) ; - test_strings[fileIndex] = (char*) test_string; - ++fileIndex; - } - } - } while ( FindNextFile( hFind, &findFileData ) != 0 ); - FindClose(hFind); - } +std::vector load_corpus_folder( const std::string& name ) { + std::vector test_strings; + std::string corpora_dir = std::string( FUZZ_CORPORA_DIR ) + "/" + name; -#else - // POSIX (macOS Unix/Linux) directory traversal - char corpora_dir[PATH_MAX]; - snprintf( corpora_dir, sizeof( corpora_dir ), "%s/%s", FUZZ_CORPORA_DIR, name ); - - DIR* dir = opendir( corpora_dir ); - dirent* ent; - if (dir != NULL) { - while ( ( ent = readdir(dir) ) != NULL ) { - if ( ent->d_type == DT_REG ) { // Only process regular files - char filePath[1024]; - snprintf( filePath, sizeof(filePath), "%s/%s", corpora_dir, ent->d_name ); - - const char* test_string = load_corpus( filePath ); - if ( test_string != NULL ) { - test_strings = (char**) realloc( test_strings, sizeof(char*) * ( fileIndex + 1 ) ); - test_strings[fileIndex] = (char*) test_string; - ++fileIndex; - } - } - } - closedir( dir ); + // Check if the directory exists + if (!fs::exists(corpora_dir) || !fs::is_directory(corpora_dir)) { + return test_strings; // Return an empty vector + } + + for ( const auto& entry : fs::directory_iterator( corpora_dir ) ) { + if ( entry.is_regular_file() ) { // Only process regular files + std::string filePath = entry.path().string(); + + const char* buffer = load_corpus(filePath); + if (buffer) { // Check if buffer is not NULL + std::string test_string(buffer); // Convert char* to std::string + test_strings.push_back(test_string); + delete[] buffer; // Clean up allocated memory after using it + } } -#endif + } - stumpless_test_data result; - result.length = fileIndex; - result.test_strings = test_strings; - return result; + return test_strings; } diff --git a/tools/check_headers/stumpless_private.yml b/tools/check_headers/stumpless_private.yml index 3aeb6d409..a7e62cfe5 100644 --- a/tools/check_headers/stumpless_private.yml +++ b/tools/check_headers/stumpless_private.yml @@ -59,7 +59,6 @@ "copy_wel_data": "private/config/wel_supported.h" "create_empty_entry": "test/helper/fixture.hpp" "create_nil_entry": "test/helper/fixture.hpp" -"closedir": "test/helper/fixture.hpp" "destroy_chain_target": "private/target/chain.h" "destroy_sqlite3_target": "private/target/sqlite3.h" "fallback_copy_wstring_to_cstring": "private/config/fallback.h" @@ -110,7 +109,6 @@ "locked_get_element_by_name": "private/entry.h" "locked_get_param_by_index": "private/element.h" "locked_swap_wel_insertion_string": "private/config/wel_supported.h" -"malloc": "test/helper/fixture.hpp" "new_entry": "private/entry.h" "new_chain_target": "private/target/chain.h" "new_sqlite3_target": "private/target/sqlite3.h" @@ -119,7 +117,6 @@ "no_thread_safety_compare_exchange_bool": "private/config/thread_safety_unsupported.h" "no_thread_safety_compare_exchange_ptr": "private/config/thread_safety_unsupported.h" "no_wcsrtombs_s_copy_wstring_to_cstring": "private/config/no_wcsrtombs_s.h" -"opendir": "test/helper/fixture.hpp" "open_tcp_server_socket": "test/helper/server.hpp" "open_tcp4_server_socket": "test/helper/server.hpp" "open_tcp6_server_socket": "test/helper/server.hpp" @@ -140,7 +137,6 @@ "raise_sqlite3_failure": "private/error.h" "raise_wide_conversion_failure": "private/error.h" "raise_windows_failure": "private/error.h" -"realloc": "test/helper/fixture.hpp" "repeat_add_entry": "test/helper/usage.hpp" "RFC_5424_FULL_DATE_BUFFER_SIZE": "private/formatter.h" "RFC_5424_FULL_TIME_BUFFER_SIZE": "private/formatter.h" From 18f95511fbcd714947d9ff305b2057aabe08c730 Mon Sep 17 00:00:00 2001 From: Vasiliy Kiryanov Date: Mon, 4 Nov 2024 07:41:25 -0500 Subject: [PATCH 6/8] fs namespace fix for Windows OS --- test/helper/fixture.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/helper/fixture.cpp b/test/helper/fixture.cpp index 59a106917..c9b2b116e 100644 --- a/test/helper/fixture.cpp +++ b/test/helper/fixture.cpp @@ -28,7 +28,7 @@ #if defined(__APPLE__) namespace fs = std::__fs::filesystem; #else - namespace fs = std::fs::filesystem; + namespace fs = std::filesystem; #endif using namespace std; From 13d0812bd75633a5d3154d4baba672bda916c144 Mon Sep 17 00:00:00 2001 From: Vasiliy Kiryanov Date: Tue, 5 Nov 2024 20:34:18 -0500 Subject: [PATCH 7/8] test.cmake updated to use c++17 standard --- tools/cmake/test.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/cmake/test.cmake b/tools/cmake/test.cmake index 2396f4683..7d0367e32 100644 --- a/tools/cmake/test.cmake +++ b/tools/cmake/test.cmake @@ -5,8 +5,8 @@ if(MSVC) # platform-dependent code, such as the _s functions, just for tests set(function_test_compile_flags "-D_CRT_SECURE_NO_WARNINGS -DGTEST_LINKED_AS_SHARED_LIBRARY=1") else() - set(function_test_compile_flags "-std=gnu++14 -DGTEST_LINKED_AS_SHARED_LIBRARY=1") - set(performance_test_compile_flags "-std=gnu++14") + set(function_test_compile_flags "-std=gnu++17 -DGTEST_LINKED_AS_SHARED_LIBRARY=1") + set(performance_test_compile_flags "-std=gnu++17") endif(MSVC) set(fuzz_test_compile_flags "-g -O1 -fsanitize=fuzzer,address") From 08f87cae7667e47d595aa9eb66134b4788ac0d4a Mon Sep 17 00:00:00 2001 From: Vasiliy Kiryanov Date: Thu, 7 Nov 2024 20:33:09 -0500 Subject: [PATCH 8/8] headers configuration added --- test/function/entry.cpp | 1 + test/function/param.cpp | 1 + tools/check_headers/cpp_standard_library.yml | 1 + tools/check_headers/stumpless_private.yml | 1 + 4 files changed, 4 insertions(+) diff --git a/test/function/entry.cpp b/test/function/entry.cpp index 6935ff4bd..3a783c810 100644 --- a/test/function/entry.cpp +++ b/test/function/entry.cpp @@ -16,6 +16,7 @@ * limitations under the License. */ +#include #include #include #include diff --git a/test/function/param.cpp b/test/function/param.cpp index 9eb21060b..f816fee04 100644 --- a/test/function/param.cpp +++ b/test/function/param.cpp @@ -16,6 +16,7 @@ * limitations under the License. */ +#include #include #include #include diff --git a/tools/check_headers/cpp_standard_library.yml b/tools/check_headers/cpp_standard_library.yml index 76002d2fe..4e72826f5 100644 --- a/tools/check_headers/cpp_standard_library.yml +++ b/tools/check_headers/cpp_standard_library.yml @@ -16,3 +16,4 @@ "va_end": "cstdarg" "va_list": "cstdarg" "va_start": "cstdarg" +"filesystem": "filesystem" diff --git a/tools/check_headers/stumpless_private.yml b/tools/check_headers/stumpless_private.yml index a7e62cfe5..cf508c18d 100644 --- a/tools/check_headers/stumpless_private.yml +++ b/tools/check_headers/stumpless_private.yml @@ -89,6 +89,7 @@ "journald_init_journald_param": "private/config/journald_supported.h" "L10N_": "private/config/wrapper/locale.h" "load_corpus": "test/helper/fixture.hpp" +"load_corpus_folder": "test/helper/fixture.hpp" "load_facility": "private/target/journald.h" "load_identifier": "private/target/journald.h" "load_message": "private/target/journald.h"