From: Tor Didriksen Date: December 4 2012 12:58pm Subject: bzr push into mysql-5.6 branch (tor.didriksen:4718 to 4719) Bug#15947828 List-Archive: http://lists.mysql.com/commits/145434 X-Bug: 15947828 Message-Id: <20121204125858.11973.21620.4719@atum07.no.oracle.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit 4719 Tor Didriksen 2012-12-04 Bug#15947828 MERGE UNIT TESTS INTO FEWER EXECUTABLES Move some common utilities (array_size et.al.) into a common place. Change from unnamed to named namespaces. Caveat: gtest registers the test name in TEST and TEST_F, so test fixture names will have to be unique across several tests. Kept an option to have separate executables. @ unittest/gunit/mdl_mytap-t.cc Remove this test, we don't need it anymore. removed: unittest/gunit/mdl_mytap-t.cc modified: .bzrignore unittest/gunit/CMakeLists.txt unittest/gunit/alignment-t.cc unittest/gunit/bounded_queue-t.cc unittest/gunit/bounds_checked_array-t.cc unittest/gunit/byteorder-t.cc unittest/gunit/copy_info-t.cc unittest/gunit/cost_estimate-t.cc unittest/gunit/create_field-t.cc unittest/gunit/dbug-t.cc unittest/gunit/decimal-t.cc unittest/gunit/dynarray-t.cc unittest/gunit/field-t.cc unittest/gunit/field_date-t.cc unittest/gunit/field_datetime-t.cc unittest/gunit/field_long-t.cc unittest/gunit/field_newdecimal-t.cc unittest/gunit/field_timestamp-t.cc unittest/gunit/filesort_buffer-t.cc unittest/gunit/filesort_compare-t.cc unittest/gunit/get_diagnostics-t.cc unittest/gunit/gunit_test_main.cc unittest/gunit/handler-t.h unittest/gunit/item-t.cc unittest/gunit/item_func_now_local-t.cc unittest/gunit/join_tab_sort-t.cc unittest/gunit/make_sortkey-t.cc unittest/gunit/mdl-t.cc unittest/gunit/my_bitmap-t.cc unittest/gunit/my_decimal-t.cc unittest/gunit/my_error-t.cc unittest/gunit/my_regex-t.cc unittest/gunit/opt_range-t.cc unittest/gunit/opt_trace-t.cc unittest/gunit/segfault-t.cc unittest/gunit/sql_list-t.cc unittest/gunit/sql_plist-t.cc unittest/gunit/sql_table-t.cc unittest/gunit/table_cache-t.cc unittest/gunit/test_utils.cc unittest/gunit/test_utils.h unittest/gunit/thread_utils-t.cc 4718 Manish Kumar 2012-12-04 [merge] BUG#13812374 - RPL.RPL_REPORT_PORT FAILS OCCASIONALLY ON PB2 Upmerge from 5.5 -> 5.6 modified: mysql-test/collections/default.experimental mysql-test/suite/rpl/r/rpl_report_port.result mysql-test/suite/rpl/t/rpl_report_port.test === modified file '.bzrignore' --- a/.bzrignore 2012-06-06 10:10:17 +0000 +++ b/.bzrignore 2012-12-04 12:48:34 +0000 @@ -2979,6 +2979,8 @@ unittest/examples/.deps/simple-t.Po unittest/examples/.deps/skip-t.Po unittest/examples/.deps/skip_all-t.Po unittest/examples/.deps/todo-t.Po +unittest/gunit/merge_large_tests.cc +unittest/gunit/merge_small_tests.cc unittest/mysys/*.t unittest/mysys/.deps/base64-t.Po unittest/mysys/.deps/my_atomic-t.Po === modified file 'unittest/gunit/CMakeLists.txt' --- a/unittest/gunit/CMakeLists.txt 2012-11-23 09:02:13 +0000 +++ b/unittest/gunit/CMakeLists.txt 2012-12-04 12:48:34 +0000 @@ -205,7 +205,7 @@ SET(TESTS bounded_queue bounds_checked_array byteorder - client_string +## client_string TODO: move to a client test directory cost_estimate dbug decimal @@ -213,7 +213,6 @@ SET(TESTS filesort_buffer filesort_compare mdl - mdl_mytap my_bitmap my_error my_fileutils @@ -245,30 +244,76 @@ SET(SERVER_TESTS table_cache ) -FOREACH(test ${TESTS}) - ADD_EXECUTABLE(${test}-t ${test}-t.cc) - TARGET_LINK_LIBRARIES(${test}-t gunit_small sqlgunitlib strings dbug regex) - ADD_TEST(${test} ${test}-t) -ENDFOREACH() +## Merging tests into fewer executables saves *a lot* of +## link time and disk space ... +OPTION(MERGE_UNITTESTS "Merge tests into one executable" ON) +IF (MERGE_UNITTESTS) + SET(MERGE_LARGE_TESTS ${CMAKE_CURRENT_BINARY_DIR}/merge_large_tests.cc) + SET(MERGE_SMALL_TESTS ${CMAKE_CURRENT_BINARY_DIR}/merge_small_tests.cc) + SET_SOURCE_FILES_PROPERTIES(MERGE_SMALL_TESTS MERGE_LARGE_TESTS + PROPERTIES GENERATED 1) -FOREACH(test ${SERVER_TESTS}) - SET(SRC_FILES ${test}-t.cc) + INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) + + FILE(WRITE ${MERGE_LARGE_TESTS} "// Merging large unit tests\n") + FILE(WRITE ${MERGE_SMALL_TESTS} "// Merging small unit tests\n") + FOREACH(test ${TESTS}) + FILE(APPEND ${MERGE_SMALL_TESTS} "#include \"${test}-t.cc\"\n") + ENDFOREACH() + FOREACH(test ${SERVER_TESTS}) + FILE(APPEND ${MERGE_LARGE_TESTS} "#include \"${test}-t.cc\"\n") + ENDFOREACH() + + ADD_EXECUTABLE(merge_small_tests-t ${MERGE_SMALL_TESTS}) + SET(SRC_FILES ${MERGE_LARGE_TESTS}) IF(WIN32) LIST(APPEND SRC_FILES ../../sql/nt_servc.cc) ENDIF() - IF(test MATCHES "table_cache") - LIST(APPEND SRC_FILES ../../storage/example/ha_example.cc) - SET_SOURCE_FILES_PROPERTIES( - ../../storage/example/ha_example.cc - PROPERTIES COMPILE_FLAGS "-DDISABLE_DTRACE" - ) - ENDIF() - ADD_EXECUTABLE(${test}-t ${SRC_FILES}) - TARGET_LINK_LIBRARIES(${test}-t sql binlog rpl master slave sql) - TARGET_LINK_LIBRARIES(${test}-t gunit_large strings dbug regex mysys) - TARGET_LINK_LIBRARIES(${test}-t sql binlog rpl master slave sql) - ADD_TEST(${test} ${test}-t) -ENDFOREACH() + LIST(APPEND SRC_FILES ../../storage/example/ha_example.cc) + SET_SOURCE_FILES_PROPERTIES( + ../../storage/example/ha_example.cc + PROPERTIES COMPILE_FLAGS "-DDISABLE_DTRACE" + ) + ADD_EXECUTABLE(merge_large_tests-t ${SRC_FILES}) + + TARGET_LINK_LIBRARIES(merge_small_tests-t + gunit_small sqlgunitlib strings dbug regex) + TARGET_LINK_LIBRARIES(merge_large_tests-t sql binlog rpl master slave sql) + TARGET_LINK_LIBRARIES(merge_large_tests-t + gunit_large strings dbug regex mysys) + TARGET_LINK_LIBRARIES(merge_large_tests-t sql binlog rpl master slave sql) + + ADD_TEST(merge_large_tests merge_large_tests-t) + ADD_TEST(merge_small_tests merge_small_tests-t) + +ELSE() + + FOREACH(test ${TESTS}) + ADD_EXECUTABLE(${test}-t ${test}-t.cc) + TARGET_LINK_LIBRARIES(${test}-t gunit_small sqlgunitlib strings dbug regex) + ADD_TEST(${test} ${test}-t) + ENDFOREACH() + + FOREACH(test ${SERVER_TESTS}) + SET(SRC_FILES ${test}-t.cc) + IF(WIN32) + LIST(APPEND SRC_FILES ../../sql/nt_servc.cc) + ENDIF() + IF(test MATCHES "table_cache") + LIST(APPEND SRC_FILES ../../storage/example/ha_example.cc) + SET_SOURCE_FILES_PROPERTIES( + ../../storage/example/ha_example.cc + PROPERTIES COMPILE_FLAGS "-DDISABLE_DTRACE" + ) + ENDIF() + ADD_EXECUTABLE(${test}-t ${SRC_FILES}) + TARGET_LINK_LIBRARIES(${test}-t sql binlog rpl master slave sql) + TARGET_LINK_LIBRARIES(${test}-t gunit_large strings dbug regex mysys) + TARGET_LINK_LIBRARIES(${test}-t sql binlog rpl master slave sql) + ADD_TEST(${test} ${test}-t) + ENDFOREACH() + +ENDIF() ## Most executables depend on libeay32.dll (through mysys_ssl). COPY_OPENSSL_DLLS(copy_openssl_gunit) === modified file 'unittest/gunit/alignment-t.cc' --- a/unittest/gunit/alignment-t.cc 2012-11-23 09:02:13 +0000 +++ b/unittest/gunit/alignment-t.cc 2012-12-04 12:48:34 +0000 @@ -22,7 +22,7 @@ #include #include -namespace { +namespace alignment_unittest { /* Testing performance penalty of accessing un-aligned data. === modified file 'unittest/gunit/bounded_queue-t.cc' --- a/unittest/gunit/bounded_queue-t.cc 2011-12-20 09:51:05 +0000 +++ b/unittest/gunit/bounded_queue-t.cc 2012-12-04 12:48:34 +0000 @@ -23,7 +23,7 @@ #include "filesort_utils.h" #include "my_sys.h" -namespace { +namespace bounded_queue_unittest { const int num_elements= 14; === modified file 'unittest/gunit/bounds_checked_array-t.cc' --- a/unittest/gunit/bounds_checked_array-t.cc 2012-08-08 10:23:44 +0000 +++ b/unittest/gunit/bounds_checked_array-t.cc 2012-12-04 12:48:34 +0000 @@ -19,7 +19,7 @@ #include "sql_array.h" -namespace { +namespace bounds_check_array_unittest { typedef Bounds_checked_array Int_array; @@ -47,16 +47,18 @@ public: operator<<() is needed by the EXPECT macros. It is a template argument, so static rather than in unnamed namespace. */ -static inline std::ostream &operator<<(std::ostream &s, const Int_array &v) +static inline +std::ostream &operator<<(std::ostream &s, + const bounds_check_array_unittest::Int_array &v) { return s << "{" - << v.array() << ", " - << v.size() - << "}" + << v.array() << ", " + << v.size() + << "}" ; } -namespace { +namespace bounds_check_array_unittest { TEST_F(BoundsCheckedArray, Empty) { === modified file 'unittest/gunit/byteorder-t.cc' --- a/unittest/gunit/byteorder-t.cc 2012-01-11 09:33:52 +0000 +++ b/unittest/gunit/byteorder-t.cc 2012-12-04 12:48:34 +0000 @@ -19,7 +19,7 @@ #include "my_global.h" -namespace { +namespace byteorder_unittest { using std::numeric_limits; === modified file 'unittest/gunit/copy_info-t.cc' --- a/unittest/gunit/copy_info-t.cc 2012-11-27 13:01:48 +0000 +++ b/unittest/gunit/copy_info-t.cc 2012-12-04 12:48:34 +0000 @@ -24,7 +24,7 @@ #include "test_utils.h" #include "sql_data_change.h" -namespace { +namespace copy_info_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/cost_estimate-t.cc' --- a/unittest/gunit/cost_estimate-t.cc 2011-12-20 09:51:05 +0000 +++ b/unittest/gunit/cost_estimate-t.cc 2012-12-04 12:48:34 +0000 @@ -19,7 +19,7 @@ #include "handler.h" -namespace { +namespace cost_estimate_unittest { TEST(CostEstimateTest, Basics) { === modified file 'unittest/gunit/create_field-t.cc' --- a/unittest/gunit/create_field-t.cc 2012-05-07 12:05:48 +0000 +++ b/unittest/gunit/create_field-t.cc 2012-12-04 12:48:34 +0000 @@ -22,7 +22,7 @@ #include "mock_create_field.h" -namespace { +namespace create_field_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/dbug-t.cc' --- a/unittest/gunit/dbug-t.cc 2012-09-26 13:52:56 +0000 +++ b/unittest/gunit/dbug-t.cc 2012-12-04 12:48:34 +0000 @@ -25,7 +25,7 @@ using thread::Notification; using thread::Thread; -namespace { +namespace dbug_unittest { #if defined(DBUG_OFF) TEST(DebugTest, NoSuicide) === modified file 'unittest/gunit/decimal-t.cc' --- a/unittest/gunit/decimal-t.cc 2012-10-30 14:40:02 +0000 +++ b/unittest/gunit/decimal-t.cc 2012-12-04 12:48:34 +0000 @@ -30,7 +30,7 @@ int decimal_shift(decimal_t *dec, int sh } -namespace { +namespace decimal_unittest { #define DIG_PER_DEC1 9 #define DIG_BASE 1000000000 === modified file 'unittest/gunit/dynarray-t.cc' --- a/unittest/gunit/dynarray-t.cc 2012-04-27 11:57:38 +0000 +++ b/unittest/gunit/dynarray-t.cc 2012-12-04 12:48:34 +0000 @@ -33,14 +33,6 @@ functionality of Mem_root_array. */ -pthread_key(MEM_ROOT**, THR_MALLOC); -pthread_key(THD*, THR_THD); - -extern "C" void sql_alloc_error_handler(void) -{ - ADD_FAILURE(); -} - /* Rewrite of sort_keyuse() to comparison operator for use by std::less<> @@ -96,7 +88,7 @@ static inline std::ostream &operator<<(s } -namespace { +namespace dynarray_unittest { /* Cut'n paste this function from sql_select.cc, === modified file 'unittest/gunit/field-t.cc' --- a/unittest/gunit/field-t.cc 2012-10-30 14:40:02 +0000 +++ b/unittest/gunit/field-t.cc 2012-12-04 12:48:34 +0000 @@ -24,7 +24,7 @@ #include "sql_time.h" #include -namespace { +namespace field_unittests { using my_testing::Server_initializer; using my_testing::Mock_error_handler; @@ -475,9 +475,11 @@ void test_make_sort_key(Field *field) } -size_t mock_strnxfrm(const CHARSET_INFO *, uchar *, size_t, uint, const uchar *, - size_t, uint); - +extern "C" +{ + static size_t mock_strnxfrm(const CHARSET_INFO *, uchar *, size_t, + uint, const uchar *, size_t, uint); +} class Mock_collation : public MY_COLLATION_HANDLER { === modified file 'unittest/gunit/field_date-t.cc' --- a/unittest/gunit/field_date-t.cc 2012-05-07 12:05:48 +0000 +++ b/unittest/gunit/field_date-t.cc 2012-12-04 12:48:34 +0000 @@ -23,7 +23,7 @@ #include "field.h" -namespace { +namespace field_date_unittests { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/field_datetime-t.cc' --- a/unittest/gunit/field_datetime-t.cc 2012-05-07 12:05:48 +0000 +++ b/unittest/gunit/field_datetime-t.cc 2012-12-04 12:48:34 +0000 @@ -23,7 +23,7 @@ #include "field.h" -namespace { +namespace field_datetime_unittests { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/field_long-t.cc' --- a/unittest/gunit/field_long-t.cc 2012-06-24 07:07:58 +0000 +++ b/unittest/gunit/field_long-t.cc 2012-12-04 12:48:34 +0000 @@ -22,7 +22,7 @@ #include "field.h" -namespace { +namespace field_long_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; @@ -379,5 +379,4 @@ TEST_F(FieldLongTest, StoreNullValue) } } - } === modified file 'unittest/gunit/field_newdecimal-t.cc' --- a/unittest/gunit/field_newdecimal-t.cc 2012-05-07 12:05:48 +0000 +++ b/unittest/gunit/field_newdecimal-t.cc 2012-12-04 12:48:34 +0000 @@ -25,8 +25,9 @@ type_conversion_status store_internal_with_error_check(Field_new_decimal *field, int conversion_err, my_decimal *value); -namespace { +namespace field_newdecimal_unittest { +using my_testing::chars_2_decimal; using my_testing::Server_initializer; using my_testing::Mock_error_handler; @@ -163,12 +164,6 @@ TEST_F(FieldNewDecimalTest, StoreIllegal } -static int chars_2_decimal(const char *chars, my_decimal *to) -{ - char *end= strend(chars); - return string2decimal(chars, to, &end); -} - static void test_store_internal(Field_new_decimal *field, my_decimal *value, const char *expected_string_result, === modified file 'unittest/gunit/field_timestamp-t.cc' --- a/unittest/gunit/field_timestamp-t.cc 2012-05-07 12:05:48 +0000 +++ b/unittest/gunit/field_timestamp-t.cc 2012-12-04 12:48:34 +0000 @@ -21,7 +21,7 @@ #include "mock_field_timestamp.h" #include "test_utils.h" -namespace { +namespace field_timestamp_unittests { using my_testing::Server_initializer; === modified file 'unittest/gunit/filesort_buffer-t.cc' --- a/unittest/gunit/filesort_buffer-t.cc 2012-01-18 14:42:16 +0000 +++ b/unittest/gunit/filesort_buffer-t.cc 2012-12-04 12:48:34 +0000 @@ -21,7 +21,7 @@ #include "filesort_utils.h" #include "table.h" -namespace { +namespace filesort_buffer_unittest { class FileSortBufferTest : public ::testing::Test { === modified file 'unittest/gunit/filesort_compare-t.cc' --- a/unittest/gunit/filesort_compare-t.cc 2012-10-30 14:40:02 +0000 +++ b/unittest/gunit/filesort_compare-t.cc 2012-12-04 12:48:34 +0000 @@ -23,7 +23,7 @@ #include #include -namespace { +namespace filesort_compare_unittest { /* Below are some performance microbenchmarks in order to compare our sorting @@ -68,7 +68,7 @@ inline void int_to_bytes(uchar *s, int v } -TEST(AlignmentTest, IntsToBytesToInt) +TEST(BufferAlignmentTest, IntsToBytesToInt) { uchar buf[10]; memset(buf, 0, sizeof(buf)); === modified file 'unittest/gunit/get_diagnostics-t.cc' --- a/unittest/gunit/get_diagnostics-t.cc 2012-05-07 12:05:48 +0000 +++ b/unittest/gunit/get_diagnostics-t.cc 2012-12-04 12:48:34 +0000 @@ -22,7 +22,7 @@ #include "item.h" #include "sql_get_diagnostics.h" -namespace { +namespace get_diagnostics_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/gunit_test_main.cc' --- a/unittest/gunit/gunit_test_main.cc 2012-11-23 09:02:13 +0000 +++ b/unittest/gunit/gunit_test_main.cc 2012-12-04 12:48:34 +0000 @@ -52,6 +52,17 @@ extern "C" my_bool get_one_option(int, c } // namespace +// Some globals needed for merge_small_tests.cc +mysql_mutex_t LOCK_open; +uint opt_debug_sync_timeout= 0; +pthread_key(MEM_ROOT**,THR_MALLOC); +pthread_key(THD*, THR_THD); + +extern "C" void sql_alloc_error_handler(void) +{ + ADD_FAILURE(); +} + extern void install_tap_listener(); === modified file 'unittest/gunit/handler-t.h' --- a/unittest/gunit/handler-t.h 2012-11-27 13:01:48 +0000 +++ b/unittest/gunit/handler-t.h 2012-12-04 12:48:34 +0000 @@ -13,6 +13,9 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 USA */ +#ifndef HANDLER_T_INCLUDED +#define HANDLER_T_INCLUDED + // First include (the generated) my_config.h, to get correct platform defines. #include "my_config.h" #include @@ -51,3 +54,6 @@ public: : handler(ht_arg, share_arg) {} }; + + +#endif // HANDLER_T_INCLUDED === modified file 'unittest/gunit/item-t.cc' --- a/unittest/gunit/item-t.cc 2012-11-23 09:02:13 +0000 +++ b/unittest/gunit/item-t.cc 2012-12-04 12:48:34 +0000 @@ -26,7 +26,7 @@ #include "mock_field_timestamp.h" -namespace { +namespace item_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/item_func_now_local-t.cc' --- a/unittest/gunit/item_func_now_local-t.cc 2012-05-07 12:05:48 +0000 +++ b/unittest/gunit/item_func_now_local-t.cc 2012-12-04 12:48:34 +0000 @@ -26,7 +26,7 @@ #include "rpl_handler.h" // delegates_init() #include "tztime.h" -namespace { +namespace item_func_now_local_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/join_tab_sort-t.cc' --- a/unittest/gunit/join_tab_sort-t.cc 2012-05-07 12:05:48 +0000 +++ b/unittest/gunit/join_tab_sort-t.cc 2012-12-04 12:48:34 +0000 @@ -24,7 +24,7 @@ #include -namespace { +namespace join_tab_sort_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/make_sortkey-t.cc' --- a/unittest/gunit/make_sortkey-t.cc 2012-09-12 09:24:37 +0000 +++ b/unittest/gunit/make_sortkey-t.cc 2012-12-04 12:48:34 +0000 @@ -25,7 +25,7 @@ #include "filesort.h" #include "sql_sort.h" -namespace { +namespace make_sortkey_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/mdl-t.cc' --- a/unittest/gunit/mdl-t.cc 2012-09-27 14:54:18 +0000 +++ b/unittest/gunit/mdl-t.cc 2012-12-04 12:48:34 +0000 @@ -33,11 +33,6 @@ #include "thread_utils.h" #include "test_mdl_context_owner.h" -pthread_key(MEM_ROOT**,THR_MALLOC); -pthread_key(THD*, THR_THD); -mysql_mutex_t LOCK_open; -uint opt_debug_sync_timeout= 0; - /* Mock thd_wait_begin/end functions */ @@ -60,15 +55,6 @@ extern "C" void test_error_handler_hook( } /* - A mock out-of-memory handler. - We do not expect this to be called during testing. -*/ -extern "C" void sql_alloc_error_handler(void) -{ - ADD_FAILURE(); -} - -/* Mock away this global function. We don't need DEBUG_SYNC functionality in a unit test. */ @@ -79,10 +65,10 @@ void debug_sync(THD *thd, const char *sy } /* - Putting everything in an unnamed namespace prevents any (unintentional) + Putting everything in a namespace prevents any (unintentional) name clashes with the code under test. */ -namespace { +namespace mdl_unittest { using thread::Notification; using thread::Thread; === removed file 'unittest/gunit/mdl_mytap-t.cc' --- a/unittest/gunit/mdl_mytap-t.cc 2012-09-27 14:54:18 +0000 +++ b/unittest/gunit/mdl_mytap-t.cc 1970-01-01 00:00:00 +0000 @@ -1,762 +0,0 @@ -/* Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -/** - This is a port of the corresponding mdl_test.cc (written for Google Test) - to mytap. Do a 'tkdiff mdl-t.cc mdl_mytap-t.cc' to see the differences. - In order to illustrate (some of) the features of Google Test, I have - added some extensions below, notably support for reporting of line - numbers in case of failures. - */ - -// First include (the generated) my_config.h, to get correct platform defines. -#include "my_config.h" -#include -#include -#include - -#include - -#include "mdl.h" -#include - -#include "thr_malloc.h" -#include "thread_utils.h" -#include "test_mdl_context_owner.h" - -pthread_key(MEM_ROOT**,THR_MALLOC); -pthread_key(THD*, THR_THD); -mysql_mutex_t LOCK_open; -uint opt_debug_sync_timeout= 0; - -// Reimplemented some macros from Google Test, so that the tests below -// could be kept unchanged. No support for streaming of user messages -// in this simplified version. -void print_message(const char* file, int line, const char* message) -{ - std::cout << "# " << file << ":" << line << " " << message << "\n"; -} - -// Some macro tricks to generate names like result123 and result456 -#define CONCAT_TOKEN_(foo, bar) CONCAT_TOKEN_IMPL_(foo, bar) -#define CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar -#define BOOL_VAR_ CONCAT_TOKEN_(result, __LINE__) - -#define MESSAGE_(message) \ - print_message(__FILE__, __LINE__, message) - -// This is where we call the ok() function from mytap!!! -#define TEST_BOOLEAN_(boolexpr, booltext, actual, expected, fail) \ -do { \ - const bool BOOL_VAR_ = boolexpr; \ - ok(BOOL_VAR_, BOOL_VAR_ ? "" : booltext); \ - if (!BOOL_VAR_) \ - fail("\n# Value of: " booltext \ - "\n# Actual: " #actual \ - "\n# Expected: " #expected); \ -} while(0) - -// Boolean assertions. -#define EXPECT_TRUE(condition) \ - TEST_BOOLEAN_(condition, #condition, false, true, MESSAGE_) -#define EXPECT_FALSE(condition) \ - TEST_BOOLEAN_(!(condition), #condition, true, false, MESSAGE_) - - -// Some (very) simplified versions of comparison predicates. -// There is no distinction between ASSERT and EXPECT in mytap. -#define ASSERT_NE(val1, val2) \ - EXPECT_NE(val1, val2) - -// This version will not print expected or actual values for arguments. -#define EXPECT_NE(val1, val2) \ - EXPECT_TRUE(val1 != val2) - -// This version will not print expected or actual values for arguments. -#define EXPECT_EQ(val1, val2) \ - EXPECT_TRUE(val1 == val2) - -#define FAIL() \ - EXPECT_TRUE(1 == 0) - - -/* - Mock thd_wait_begin/end functions -*/ - -extern "C" void thd_wait_begin(MYSQL_THD thd, int wait_type) -{ -} - -extern "C" void thd_wait_end(MYSQL_THD thd) -{ -} - -/* - A mock error handler. -*/ -static uint expected_error= 0; -extern "C" void test_error_handler_hook(uint err, const char *str, myf MyFlags) -{ - EXPECT_EQ(expected_error, err); -} - -/* - A mock out-of-memory handler. - We do not expect this to be called during testing. -*/ -extern "C" void sql_alloc_error_handler(void) -{ - FAIL(); -} - -/* - Mock away this global function. - We don't need DEBUG_SYNC functionality in a unit test. - */ -void debug_sync(THD *thd, const char *sync_point_name, size_t name_len) -{ - DBUG_PRINT("debug_sync_point", ("hit: '%s'", sync_point_name)); - FAIL(); -} - -/* - Putting everything in an unnamed namespace prevents any (unintentional) - name clashes with the code under test. -*/ -namespace { - -using thread::Notification; -using thread::Thread; - -const char db_name[]= "some_database"; -const char table_name1[]= "some_table1"; -const char table_name2[]= "some_table2"; -const char table_name3[]= "some_table3"; -const char table_name4[]= "some_table4"; -const ulong zero_timeout= 0; -const ulong long_timeout= (ulong) 3600L*24L*365L; - - -class MDLTest : public Test_MDL_context_owner -{ -public: - // Utility function to run one test case. - typedef void (MDLTest::* Pmdl_mem)(); - static void run_one_test(Pmdl_mem member_function); - - // Utility function to run all the test cases. - static int RUN_ALL_TESTS(); - -protected: - MDLTest() - : m_null_ticket(NULL), - m_null_request(NULL) - { - } - - static void SetUpTestCase() - { - error_handler_hook= test_error_handler_hook; - mdl_locks_hash_partitions= MDL_LOCKS_HASH_PARTITIONS_DEFAULT; - } - - void SetUp() - { - expected_error= 0; - mdl_init(); - m_mdl_context.init(this); - EXPECT_FALSE(m_mdl_context.has_locks()); - m_global_request.init(MDL_key::GLOBAL, "", "", MDL_INTENTION_EXCLUSIVE, - MDL_TRANSACTION); - } - - void TearDown() - { - m_mdl_context.destroy(); - mdl_destroy(); - } - - virtual bool notify_shared_lock(MDL_context_owner *in_use, - bool needs_thr_lock_abort) - { - return in_use->notify_shared_lock(NULL, needs_thr_lock_abort); - } - - // A utility member for testing single lock requests. - void test_one_simple_shared_lock(enum_mdl_type lock_type); - - // We must list all the individual tests here. - void DieWhenMTicketsNonempty(); - void DieWhenHoldingGlobalSharedLock(); - void ConstructAndDestruct(); - void OneShared(); - void OneSharedHighPrio(); - void OneSharedRead(); - void OneSharedWrite(); - void OneExclusive(); - void TwoShared(); - void SharedLocksBetweenContexts(); - void UpgradeSharedUpgradable(); - void DieUpgradeShared(); - void SavePoint(); - void ConcurrentShared(); - void ConcurrentSharedExclusive(); - void ConcurrentExclusiveShared(); - void ConcurrentUpgrade(); - - const MDL_ticket *m_null_ticket; - const MDL_request *m_null_request; - MDL_context m_mdl_context; - MDL_request m_request; - MDL_request m_global_request; - MDL_request_list m_request_list; -private: - // GTEST_DISALLOW_COPY_AND_ASSIGN_(MDLTest); -}; - - -/* - Will grab a lock on table_name of given type in the run() function. - The two notifications are for synchronizing with the main thread. - Does *not* take ownership of the notifications. -*/ -class MDL_thread : public Thread, public Test_MDL_context_owner -{ -public: - MDL_thread(const char *table_name, - enum_mdl_type mdl_type, - Notification *lock_grabbed, - Notification *release_locks) - : m_table_name(table_name), - m_mdl_type(mdl_type), - m_lock_grabbed(lock_grabbed), - m_release_locks(release_locks), - m_ignore_notify(false) - { - m_mdl_context.init(this); - } - - ~MDL_thread() - { - m_mdl_context.destroy(); - } - - virtual void run(); - void ignore_notify() { m_ignore_notify= true; } - - virtual bool notify_shared_lock(MDL_context_owner *in_use, - bool needs_thr_lock_abort) - { - if (in_use) - return in_use->notify_shared_lock(NULL, needs_thr_lock_abort); - - if (m_ignore_notify) - return false; - m_release_locks->notify(); - return true; - } - -private: - const char *m_table_name; - enum_mdl_type m_mdl_type; - Notification *m_lock_grabbed; - Notification *m_release_locks; - bool m_ignore_notify; - MDL_context m_mdl_context; -}; - - -void MDL_thread::run() -{ - MDL_request request; - MDL_request global_request; - MDL_request_list request_list; - global_request.init(MDL_key::GLOBAL, "", "", MDL_INTENTION_EXCLUSIVE, - MDL_TRANSACTION); - request.init(MDL_key::TABLE, db_name, m_table_name, m_mdl_type, - MDL_TRANSACTION); - - request_list.push_front(&request); - if (m_mdl_type >= MDL_SHARED_UPGRADABLE) - request_list.push_front(&global_request); - - EXPECT_FALSE(m_mdl_context.acquire_locks(&request_list, long_timeout)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, m_table_name, m_mdl_type)); - - // Tell the main thread that we have grabbed our locks. - m_lock_grabbed->notify(); - // Hold on to locks until we are told to release them - m_release_locks->wait_for_notification(); - - m_mdl_context.release_transactional_locks(); -} - -// Google Test recommends DeathTest suffix for classes use in death tests. -typedef MDLTest MDLDeathTest; - -// Our own (simplified) version of the TEST_F macro. -#define TEST_F(FixtureClass, FunctionName) \ - void FixtureClass::FunctionName() - - -/* - The most basic test: just construct and destruct our test fixture. - */ -TEST_F(MDLTest, ConstructAndDestruct) -{ -} - - -void MDLTest::test_one_simple_shared_lock(enum_mdl_type lock_type) -{ - m_request.init(MDL_key::TABLE, db_name, table_name1, lock_type, - MDL_TRANSACTION); - - EXPECT_EQ(lock_type, m_request.type); - EXPECT_EQ(m_null_ticket, m_request.ticket); - - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&m_request)); - EXPECT_NE(m_null_ticket, m_request.ticket); - EXPECT_TRUE(m_mdl_context.has_locks()); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, lock_type)); - - MDL_request request_2; - request_2.init(&m_request.key, lock_type, MDL_TRANSACTION); - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&request_2)); - EXPECT_EQ(m_request.ticket, request_2.ticket); - - m_mdl_context.release_transactional_locks(); - EXPECT_FALSE(m_mdl_context.has_locks()); -} - - -/* - Acquires one lock of type MDL_SHARED. - */ -TEST_F(MDLTest, OneShared) -{ - test_one_simple_shared_lock(MDL_SHARED); -} - - -/* - Acquires one lock of type MDL_SHARED_HIGH_PRIO. - */ -TEST_F(MDLTest, OneSharedHighPrio) -{ - test_one_simple_shared_lock(MDL_SHARED_HIGH_PRIO); -} - - -/* - Acquires one lock of type MDL_SHARED_READ. - */ -TEST_F(MDLTest, OneSharedRead) -{ - test_one_simple_shared_lock(MDL_SHARED_READ); -} - - -/* - Acquires one lock of type MDL_SHARED_WRITE. - */ -TEST_F(MDLTest, OneSharedWrite) -{ - test_one_simple_shared_lock(MDL_SHARED_WRITE); -} - - -/* - Acquires one lock of type MDL_EXCLUSIVE. - */ -TEST_F(MDLTest, OneExclusive) -{ - const enum_mdl_type lock_type= MDL_EXCLUSIVE; - m_request.init(MDL_key::TABLE, db_name, table_name1, lock_type, - MDL_TRANSACTION); - EXPECT_EQ(m_null_ticket, m_request.ticket); - - m_request_list.push_front(&m_request); - m_request_list.push_front(&m_global_request); - - EXPECT_FALSE(m_mdl_context.acquire_locks(&m_request_list, long_timeout)); - - EXPECT_NE(m_null_ticket, m_request.ticket); - EXPECT_NE(m_null_ticket, m_global_request.ticket); - EXPECT_TRUE(m_mdl_context.has_locks()); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, lock_type)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::GLOBAL, "", "", MDL_INTENTION_EXCLUSIVE)); - EXPECT_TRUE(m_request.ticket->is_upgradable_or_exclusive()); - - m_mdl_context.release_transactional_locks(); - EXPECT_FALSE(m_mdl_context.has_locks()); -} - - -/* - Acquires two locks, on different tables, of type MDL_SHARED. - Verifies that they are independent. - */ -TEST_F(MDLTest, TwoShared) -{ - MDL_request request_2; - m_request.init(MDL_key::TABLE, db_name, table_name1, MDL_SHARED, MDL_EXPLICIT); - request_2.init(MDL_key::TABLE, db_name, table_name2, MDL_SHARED, MDL_EXPLICIT); - - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&m_request)); - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&request_2)); - EXPECT_TRUE(m_mdl_context.has_locks()); - ASSERT_NE(m_null_ticket, m_request.ticket); - ASSERT_NE(m_null_ticket, request_2.ticket); - - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, MDL_SHARED)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name2, MDL_SHARED)); - EXPECT_FALSE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name3, MDL_SHARED)); - - m_mdl_context.release_lock(m_request.ticket); - EXPECT_FALSE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, MDL_SHARED)); - EXPECT_TRUE(m_mdl_context.has_locks()); - - m_mdl_context.release_lock(request_2.ticket); - EXPECT_FALSE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name2, MDL_SHARED)); - EXPECT_FALSE(m_mdl_context.has_locks()); -} - - -/* - Verifies that two different contexts can acquire a shared lock - on the same table. - */ -TEST_F(MDLTest, SharedLocksBetweenContexts) -{ - MDL_context mdl_context2; - mdl_context2.init(this); - MDL_request request_2; - m_request.init(MDL_key::TABLE, db_name, table_name1, MDL_SHARED, - MDL_TRANSACTION); - request_2.init(MDL_key::TABLE, db_name, table_name1, MDL_SHARED, - MDL_TRANSACTION); - - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&m_request)); - EXPECT_FALSE(mdl_context2.try_acquire_lock(&request_2)); - - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, MDL_SHARED)); - EXPECT_TRUE(mdl_context2. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, MDL_SHARED)); - - m_mdl_context.release_transactional_locks(); - mdl_context2.release_transactional_locks(); -} - - -/* - Verifies that we can upgrade a shared lock to exclusive. - */ -TEST_F(MDLTest, UpgradeSharedUpgradable) -{ - m_request.init(MDL_key::TABLE, db_name, table_name1, MDL_SHARED_UPGRADABLE, - MDL_TRANSACTION); - - m_request_list.push_front(&m_request); - m_request_list.push_front(&m_global_request); - - EXPECT_FALSE(m_mdl_context.acquire_locks(&m_request_list, long_timeout)); - EXPECT_FALSE(m_mdl_context. - upgrade_shared_lock(m_request.ticket, MDL_EXCLUSIVE, long_timeout)); - EXPECT_EQ(MDL_EXCLUSIVE, m_request.ticket->get_type()); - - // Another upgrade should be a no-op. - EXPECT_FALSE(m_mdl_context. - upgrade_shared_lock(m_request.ticket, MDL_EXCLUSIVE, long_timeout)); - EXPECT_EQ(MDL_EXCLUSIVE, m_request.ticket->get_type()); - - m_mdl_context.release_transactional_locks(); -} - - -/* - Verifies that only upgradable locks can be upgraded to exclusive. - */ -TEST_F(MDLDeathTest, DieUpgradeShared) -{ - MDL_request request_2; - m_request.init(MDL_key::TABLE, db_name, table_name1, MDL_SHARED, - MDL_TRANSACTION); - request_2.init(MDL_key::TABLE, db_name, table_name2, MDL_SHARED_NO_READ_WRITE, - MDL_TRANSACTION); - - m_request_list.push_front(&m_request); - m_request_list.push_front(&request_2); - m_request_list.push_front(&m_global_request); - - EXPECT_FALSE(m_mdl_context.acquire_locks(&m_request_list, long_timeout)); - -#if GTEST_HAS_DEATH_TEST && !defined(DBUG_OFF) - ::testing::FLAGS_gtest_death_test_style = "threadsafe"; - EXPECT_DEATH_IF_SUPPORTED(m_mdl_context. - upgrade_shared_lock(m_request.ticket, - MDL_EXCLUSIVE, - long_timeout), - ".*MDL_SHARED_NO_.*"); -#endif - EXPECT_FALSE(m_mdl_context. - upgrade_shared_lock(request_2.ticket, MDL_EXCLUSIVE, - long_timeout)); - m_mdl_context.release_transactional_locks(); -} - - -/* - Verfies that locks are released when we roll back to a savepoint. - */ -TEST_F(MDLTest, SavePoint) -{ - MDL_request request_2; - MDL_request request_3; - MDL_request request_4; - m_request.init(MDL_key::TABLE, db_name, table_name1, MDL_SHARED, - MDL_TRANSACTION); - request_2.init(MDL_key::TABLE, db_name, table_name2, MDL_SHARED, - MDL_TRANSACTION); - request_3.init(MDL_key::TABLE, db_name, table_name3, MDL_SHARED, - MDL_TRANSACTION); - request_4.init(MDL_key::TABLE, db_name, table_name4, MDL_SHARED, - MDL_TRANSACTION); - - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&m_request)); - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&request_2)); - MDL_savepoint savepoint= m_mdl_context.mdl_savepoint(); - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&request_3)); - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&request_4)); - - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, MDL_SHARED)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name2, MDL_SHARED)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name3, MDL_SHARED)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name4, MDL_SHARED)); - - m_mdl_context.rollback_to_savepoint(savepoint); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, MDL_SHARED)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name2, MDL_SHARED)); - EXPECT_FALSE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name3, MDL_SHARED)); - EXPECT_FALSE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name4, MDL_SHARED)); - - m_mdl_context.release_transactional_locks(); - EXPECT_FALSE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, MDL_SHARED)); - EXPECT_FALSE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name2, MDL_SHARED)); -} - - -/* - Verifies that we can grab shared locks concurrently, in different threads. - */ -TEST_F(MDLTest, ConcurrentShared) -{ - Notification lock_grabbed; - Notification release_locks; - MDL_thread mdl_thread(table_name1, MDL_SHARED, &lock_grabbed, &release_locks); - mdl_thread.start(); - lock_grabbed.wait_for_notification(); - - m_request.init(MDL_key::TABLE, db_name, table_name1, MDL_SHARED, - MDL_TRANSACTION); - - EXPECT_FALSE(m_mdl_context.acquire_lock(&m_request, long_timeout)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, db_name, table_name1, MDL_SHARED)); - - release_locks.notify(); - mdl_thread.join(); - - m_mdl_context.release_transactional_locks(); -} - - -/* - Verifies that we cannot grab an exclusive lock on something which - is locked with a shared lock in a different thread. - */ -TEST_F(MDLTest, ConcurrentSharedExclusive) -{ - expected_error= ER_LOCK_WAIT_TIMEOUT; - - Notification lock_grabbed; - Notification release_locks; - MDL_thread mdl_thread(table_name1, MDL_SHARED, &lock_grabbed, &release_locks); - mdl_thread.ignore_notify(); - mdl_thread.start(); - lock_grabbed.wait_for_notification(); - - m_request.init(MDL_key::TABLE, db_name, table_name1, MDL_EXCLUSIVE, - MDL_TRANSACTION); - - m_request_list.push_front(&m_request); - m_request_list.push_front(&m_global_request); - - // We should *not* be able to grab the lock here. - EXPECT_TRUE(m_mdl_context.acquire_locks(&m_request_list, zero_timeout)); - EXPECT_FALSE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, - db_name, table_name1, MDL_EXCLUSIVE)); - - release_locks.notify(); - mdl_thread.join(); - - // Now we should be able to grab the lock. - EXPECT_FALSE(m_mdl_context.acquire_locks(&m_request_list, zero_timeout)); - EXPECT_NE(m_null_ticket, m_request.ticket); - - m_mdl_context.release_transactional_locks(); -} - - -/* - Verifies that we cannot we cannot grab a shared lock on something which - is locked exlusively in a different thread. - */ -TEST_F(MDLTest, ConcurrentExclusiveShared) -{ - Notification lock_grabbed; - Notification release_locks; - MDL_thread mdl_thread(table_name1, MDL_EXCLUSIVE, - &lock_grabbed, &release_locks); - mdl_thread.start(); - lock_grabbed.wait_for_notification(); - - m_request.init(MDL_key::TABLE, db_name, table_name1, MDL_SHARED, - MDL_TRANSACTION); - - // We should *not* be able to grab the lock here. - EXPECT_FALSE(m_mdl_context.try_acquire_lock(&m_request)); - EXPECT_EQ(m_null_ticket, m_request.ticket); - - release_locks.notify(); - - // The other thread should eventually release its locks. - EXPECT_FALSE(m_mdl_context.acquire_lock(&m_request, long_timeout)); - EXPECT_NE(m_null_ticket, m_request.ticket); - - mdl_thread.join(); - m_mdl_context.release_transactional_locks(); -} - - -/* - Verifies the following scenario: - Thread 1: grabs a shared upgradable lock. - Thread 2: grabs a shared lock. - Thread 1: asks for an upgrade to exclusive (needs to wait for thread 2) - Thread 2: gets notified, and releases lock. - Thread 1: gets the exclusive lock. - */ -TEST_F(MDLTest, ConcurrentUpgrade) -{ - m_request.init(MDL_key::TABLE, db_name, table_name1, MDL_SHARED_UPGRADABLE, - MDL_TRANSACTION); - m_request_list.push_front(&m_request); - m_request_list.push_front(&m_global_request); - - EXPECT_FALSE(m_mdl_context.acquire_locks(&m_request_list, long_timeout)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, - db_name, table_name1, MDL_SHARED_UPGRADABLE)); - EXPECT_FALSE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, - db_name, table_name1, MDL_EXCLUSIVE)); - - Notification lock_grabbed; - Notification release_locks; - MDL_thread mdl_thread(table_name1, MDL_SHARED, &lock_grabbed, &release_locks); - mdl_thread.start(); - lock_grabbed.wait_for_notification(); - - EXPECT_FALSE(m_mdl_context. - upgrade_shared_lock(m_request.ticket, MDL_EXCLUSIVE, - long_timeout)); - EXPECT_TRUE(m_mdl_context. - is_lock_owner(MDL_key::TABLE, - db_name, table_name1, MDL_EXCLUSIVE)); - - mdl_thread.join(); - m_mdl_context.release_transactional_locks(); -} - -} // namespace - - -// Creates a new fixture object for each test case. -void MDLTest::run_one_test(Pmdl_mem member_function) -{ - MDLTest *test_object = new MDLTest; - test_object->SetUp(); - (test_object->*member_function)(); - test_object->TearDown(); - delete test_object; -} - - -// We have to invoke each test explicitly here, since we don't have -// the auto-registration support from the TEST and TEST_F macros. -int MDLTest::RUN_ALL_TESTS() -{ - MDLTest::SetUpTestCase(); - - run_one_test(&MDLTest::ConstructAndDestruct); - run_one_test(&MDLTest::OneShared); - run_one_test(&MDLTest::OneSharedHighPrio); - run_one_test(&MDLTest::OneSharedRead); - run_one_test(&MDLTest::OneSharedWrite); - run_one_test(&MDLTest::OneExclusive); - run_one_test(&MDLTest::TwoShared); - run_one_test(&MDLTest::SharedLocksBetweenContexts); - run_one_test(&MDLTest::UpgradeSharedUpgradable); - run_one_test(&MDLTest::DieUpgradeShared); - run_one_test(&MDLTest::SavePoint); - run_one_test(&MDLTest::ConcurrentShared); - run_one_test(&MDLTest::ConcurrentSharedExclusive); - run_one_test(&MDLTest::ConcurrentExclusiveShared); - run_one_test(&MDLTest::ConcurrentUpgrade); - - // Execute MDLTest::TearDownTestCase() here, if it is defined. - return exit_status(); -} - - -int main(int argc, char **argv) { - // ::testing::InitGoogleTest(&argc, argv); - MY_INIT(argv[0]); - plan(NO_PLAN); - return MDLTest::RUN_ALL_TESTS(); -} === modified file 'unittest/gunit/my_bitmap-t.cc' --- a/unittest/gunit/my_bitmap-t.cc 2012-05-31 23:23:37 +0000 +++ b/unittest/gunit/my_bitmap-t.cc 2012-12-04 12:48:34 +0000 @@ -22,7 +22,7 @@ #include #include -namespace { +namespace my_bitmap_unittest { const uint MAX_TESTED_BITMAP_SIZE= 1024; @@ -534,8 +534,20 @@ protected: uint bitsize; }; +const uint test_values[]= +{ + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 2*32U - 1, 2*32U, 2*32U + 1, + 3*32U - 1, 3*32U, 3*32U + 1, + 4*32U - 1, 4*32U, 4*32U + 1, + MAX_TESTED_BITMAP_SIZE +}; + INSTANTIATE_TEST_CASE_P(Foo, BitMapTest, - ::testing::Range(1U, MAX_TESTED_BITMAP_SIZE, 1U)); + ::testing::ValuesIn(test_values)); TEST_P(BitMapTest, TestSetGetClearBit) { === modified file 'unittest/gunit/my_decimal-t.cc' --- a/unittest/gunit/my_decimal-t.cc 2012-11-30 08:39:51 +0000 +++ b/unittest/gunit/my_decimal-t.cc 2012-12-04 12:48:34 +0000 @@ -20,8 +20,9 @@ #include -namespace { +namespace my_decimal_unittest { +using my_testing::chars_2_decimal; using my_testing::Server_initializer; using my_testing::Mock_error_handler; @@ -110,13 +111,6 @@ TEST_F(DecimalTest, Swap) -int chars_2_decimal(const char *chars, my_decimal *to) -{ - char *end= strend(chars); - return string2decimal(chars, to, &end); -} - - TEST_F(DecimalTest, Multiply) { const char arg1[]= === modified file 'unittest/gunit/my_error-t.cc' --- a/unittest/gunit/my_error-t.cc 2012-05-03 10:59:36 +0000 +++ b/unittest/gunit/my_error-t.cc 2012-12-04 12:48:34 +0000 @@ -21,7 +21,7 @@ #include "my_base.h" // HA_ERR_KEY_NOT_FOUND #include -namespace { +namespace my_error_unittest { TEST(MyErrorTest, MyStrErrorSystem) { === modified file 'unittest/gunit/my_regex-t.cc' --- a/unittest/gunit/my_regex-t.cc 2011-12-20 09:51:05 +0000 +++ b/unittest/gunit/my_regex-t.cc 2012-12-04 12:48:34 +0000 @@ -26,7 +26,7 @@ and tests expected sucess/failure with basic/extended regexps etc. etc. */ -namespace { +namespace my_regex_unittest { const int NSUBS= 10; === modified file 'unittest/gunit/opt_range-t.cc' --- a/unittest/gunit/opt_range-t.cc 2012-05-07 12:05:48 +0000 +++ b/unittest/gunit/opt_range-t.cc 2012-12-04 12:48:34 +0000 @@ -21,7 +21,7 @@ #include "opt_range.cc" -namespace { +namespace opt_range_unittest { using my_testing::Server_initializer; === modified file 'unittest/gunit/opt_trace-t.cc' --- a/unittest/gunit/opt_trace-t.cc 2012-03-21 21:19:11 +0000 +++ b/unittest/gunit/opt_trace-t.cc 2012-12-04 12:48:34 +0000 @@ -31,7 +31,7 @@ #include // for WEXITSTATUS #endif -namespace { +namespace opt_trace_unittest { const ulonglong all_features= Opt_trace_context::default_features; === modified file 'unittest/gunit/segfault-t.cc' --- a/unittest/gunit/segfault-t.cc 2012-11-23 09:02:13 +0000 +++ b/unittest/gunit/segfault-t.cc 2012-12-04 12:48:34 +0000 @@ -22,7 +22,7 @@ #include "m_string.h" #include "hash_filo.h" -namespace { +namespace segfault_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/sql_list-t.cc' --- a/unittest/gunit/sql_list-t.cc 2012-02-15 13:57:17 +0000 +++ b/unittest/gunit/sql_list-t.cc 2012-12-04 12:48:34 +0000 @@ -30,23 +30,9 @@ #include "sql_string.h" #include "sql_error.h" #include +#include "test_utils.h" -pthread_key(MEM_ROOT**, THR_MALLOC); -pthread_key(THD*, THR_THD); - -extern "C" void sql_alloc_error_handler(void) -{ - ADD_FAILURE(); -} - -namespace { - -// A simple helper function to determine array size. -template -int array_size(const T (&)[size]) -{ - return size; -} +namespace sql_list_unittest { // A simple helper function to insert values into a List. template === modified file 'unittest/gunit/sql_plist-t.cc' --- a/unittest/gunit/sql_plist-t.cc 2011-12-20 09:51:05 +0000 +++ b/unittest/gunit/sql_plist-t.cc 2012-12-04 12:48:34 +0000 @@ -18,15 +18,9 @@ #include #include "sql_plist.h" +#include "test_utils.h" -namespace { - -// A simple helper function to determine array size. -template -int array_size(const T (&)[size]) -{ - return size; -} +namespace sql_plist_unittest { // A simple helper function to insert values into a List. template === modified file 'unittest/gunit/sql_table-t.cc' --- a/unittest/gunit/sql_table-t.cc 2012-10-31 16:27:43 +0000 +++ b/unittest/gunit/sql_table-t.cc 2012-12-04 12:48:34 +0000 @@ -26,7 +26,7 @@ #include "rpl_handler.h" // delegates_init() #include "sql_table.h" -namespace { +namespace sql_table_unittest { using my_testing::Server_initializer; using my_testing::Mock_error_handler; === modified file 'unittest/gunit/table_cache-t.cc' --- a/unittest/gunit/table_cache-t.cc 2012-05-24 18:58:39 +0000 +++ b/unittest/gunit/table_cache-t.cc 2012-12-04 12:48:34 +0000 @@ -28,7 +28,7 @@ */ extern handlerton *example_hton; -namespace { +namespace table_cache_unittest { using my_testing::Server_initializer; === modified file 'unittest/gunit/test_utils.cc' --- a/unittest/gunit/test_utils.cc 2012-10-09 12:36:52 +0000 +++ b/unittest/gunit/test_utils.cc 2012-12-04 12:48:34 +0000 @@ -22,6 +22,13 @@ namespace my_testing { +int chars_2_decimal(const char *chars, my_decimal *to) +{ + char *end= strend(chars); + return string2decimal(chars, to, &end); +} + + /* A mock error handler for error_handler_hook. */ === modified file 'unittest/gunit/test_utils.h' --- a/unittest/gunit/test_utils.h 2012-10-09 12:36:52 +0000 +++ b/unittest/gunit/test_utils.h 2012-12-04 12:48:34 +0000 @@ -21,10 +21,24 @@ #include "sql_class.h" #include "set_var.h" +extern pthread_key(MEM_ROOT**,THR_MALLOC); +extern pthread_key(THD*, THR_THD); +extern mysql_mutex_t LOCK_open; +extern uint opt_debug_sync_timeout; +extern "C" void sql_alloc_error_handler(void); + +// A simple helper function to determine array size. +template +int array_size(const T (&)[size]) +{ + return size; +} + namespace my_testing { void setup_server_for_unit_tests(); void teardown_server_for_unit_tests(); +int chars_2_decimal(const char *chars, my_decimal *to); /* A class which wraps the necessary setup/teardown logic for === modified file 'unittest/gunit/thread_utils-t.cc' --- a/unittest/gunit/thread_utils-t.cc 2011-12-20 09:51:05 +0000 +++ b/unittest/gunit/thread_utils-t.cc 2012-12-04 12:48:34 +0000 @@ -21,14 +21,6 @@ #include "mdl.h" -pthread_key(MEM_ROOT**,THR_MALLOC); -pthread_key(THD*, THR_THD); - -extern "C" void sql_alloc_error_handler(void) -{ - ADD_FAILURE(); -} - using thread::Mutex_lock; using thread::Notification; using thread::Thread; No bundle (reason: useless for push emails).