184 lines
5.2 KiB
C++
184 lines
5.2 KiB
C++
/* Copyright (c) 2011, 2018, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
|
|
|
|
// First include (the generated) my_config.h, to get correct platform defines.
|
|
#include "my_config.h"
|
|
#include <gtest/gtest.h>
|
|
|
|
#include "test_utils.h"
|
|
|
|
#include "binlog.h"
|
|
#include "conn_handler/connection_handler_manager.h"
|
|
#include "debug_sync.h"
|
|
#include "derror.h"
|
|
#include "item_create.h"
|
|
#include "item_func.h"
|
|
#include "keycache.h"
|
|
#include "keycaches.h"
|
|
#include "log.h" // query_logger
|
|
#include "my_sys.h"
|
|
#include "mysqld.h"
|
|
#include "mysqld_thd_manager.h" // Global_THD_manager
|
|
#include "opt_costconstantcache.h" // optimizer cost constant cache
|
|
#include "my_regex.h"
|
|
#include "rpl_handler.h" // delegates_init()
|
|
#include "rpl_filter.h"
|
|
#include "sql_db.h"
|
|
#include "sql_common.h"
|
|
#include "sql_locale.h"
|
|
#include "sql_plugin.h"
|
|
#include "sql_show.h"
|
|
|
|
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.
|
|
*/
|
|
uint expected_error= 0;
|
|
extern "C" void test_error_handler_hook(uint err, const char *str, myf MyFlags)
|
|
{
|
|
EXPECT_EQ(expected_error, err) << str;
|
|
}
|
|
|
|
void setup_server_for_unit_tests()
|
|
{
|
|
std::string my_name(my_progname);
|
|
char *argv[] = { const_cast<char*>(my_name.c_str()),
|
|
const_cast<char*>("--secure-file-priv=NULL"),
|
|
const_cast<char*>("--early_plugin_load=\"\""),
|
|
const_cast<char*>("--log_syslog=0"),
|
|
const_cast<char*>("--explicit_defaults_for_timestamp"),
|
|
const_cast<char*>("--datadir=" DATA_DIR),
|
|
const_cast<char*>("--lc-messages-dir=" ERRMSG_DIR), 0 };
|
|
set_remaining_args(6, argv);
|
|
system_charset_info= &my_charset_utf8_general_ci;
|
|
sys_var_init();
|
|
init_common_variables();
|
|
my_init_signals();
|
|
randominit(&sql_rand, 0, 0);
|
|
transaction_cache_init();
|
|
delegates_init();
|
|
gtid_server_init();
|
|
error_handler_hook= test_error_handler_hook;
|
|
// Initialize Query_logger last, to avoid spurious warnings to stderr.
|
|
query_logger.init();
|
|
init_optimizer_cost_module(false);
|
|
}
|
|
|
|
void teardown_server_for_unit_tests()
|
|
{
|
|
flush_error_log_messages();
|
|
mysql_bin_log.cleanup();
|
|
my_dboptions_cache_free();
|
|
ignore_db_dirs_free();
|
|
sys_var_end();
|
|
delegates_destroy();
|
|
transaction_cache_free();
|
|
gtid_server_cleanup();
|
|
query_logger.cleanup();
|
|
item_func_sleep_free();
|
|
item_create_cleanup();
|
|
delete_optimizer_cost_module();
|
|
key_caches.delete_elements((void (*)(const char*, uchar*)) free_key_cache);
|
|
multi_keycache_free();
|
|
free_tmpdir(&mysql_tmpdir_list);
|
|
bitmap_free(&temp_pool);
|
|
delete binlog_filter;
|
|
delete rpl_filter;
|
|
my_regex_end();
|
|
#if defined(ENABLED_DEBUG_SYNC)
|
|
/* End the debug sync facility. See debug_sync.cc. */
|
|
debug_sync_end();
|
|
#endif /* defined(ENABLED_DEBUG_SYNC) */
|
|
cleanup_errmsgs();
|
|
Connection_handler_manager::destroy_instance();
|
|
mysql_client_plugin_deinit();
|
|
free_list(opt_early_plugin_load_list_ptr);
|
|
free_list(opt_plugin_load_list_ptr);
|
|
deinit_errmessage(); // finish server errs
|
|
Global_THD_manager::destroy_instance();
|
|
my_end(0);
|
|
}
|
|
|
|
void Server_initializer::set_expected_error(uint val)
|
|
{
|
|
expected_error= val;
|
|
}
|
|
|
|
void Server_initializer::SetUp()
|
|
{
|
|
expected_error= 0;
|
|
m_thd= new THD(false);
|
|
THD *stack_thd= m_thd;
|
|
|
|
m_thd->set_new_thread_id();
|
|
|
|
m_thd->thread_stack= (char*) &stack_thd;
|
|
m_thd->store_globals();
|
|
lex_start(m_thd);
|
|
m_thd->set_current_time();
|
|
}
|
|
|
|
void Server_initializer::TearDown()
|
|
{
|
|
m_thd->cleanup_after_query();
|
|
delete m_thd;
|
|
}
|
|
|
|
|
|
Mock_error_handler::Mock_error_handler(THD *thd, uint expected_error)
|
|
: m_thd(thd),
|
|
m_expected_error(expected_error),
|
|
m_handle_called(0)
|
|
{
|
|
thd->push_internal_handler(this);
|
|
}
|
|
|
|
Mock_error_handler::~Mock_error_handler()
|
|
{
|
|
// Strange Visual Studio bug: have to store 'this' in local variable.
|
|
Internal_error_handler *me= this;
|
|
EXPECT_EQ(me, m_thd->pop_internal_handler());
|
|
if (m_expected_error == 0)
|
|
{
|
|
EXPECT_EQ(0, m_handle_called);
|
|
}
|
|
else
|
|
{
|
|
EXPECT_GT(m_handle_called, 0);
|
|
}
|
|
}
|
|
|
|
bool Mock_error_handler::handle_condition(THD *thd,
|
|
uint sql_errno,
|
|
const char* sqlstate,
|
|
Sql_condition::enum_severity_level *level,
|
|
const char* msg)
|
|
{
|
|
EXPECT_EQ(m_expected_error, sql_errno);
|
|
++m_handle_called;
|
|
return true;
|
|
}
|
|
|
|
|
|
} // namespace my_testing
|