Files
MaxScale/maxscale-system-test/HOW_TO_WRITE_TEST.md
Markus Mäkelä d7d4ec29bb Add tests from develop
Added tests from develop. The test results need to be modified for 2.0.
2017-05-26 15:40:40 +03:00

8.8 KiB

Creating a test case

This document describes basic principles of test case creation and provides list of basic usefull functions and properties. For detailed function and properties description and thier full list please see documetation generated by Doxygen.

Test case basics

For every test case following should be created:

  • test executable
  • record in the 'templates' file
  • Maxscale configuration template (if test requires special Maxscale configuration)
  • CMakeLists.txt record:
    • add_test_executable(<source.cpp> <binary_name> <cnf_template_name>)
    • 'set_tests_properties' if test should be added to the group or bigger timeout should be defined (> default 1800s)

'templates' file

'templates' file contains information about Maxscale configuration template for every test in plain text format:

<test_executable_name> <suffix_of_cnf_template>

Template itself should be:

cnf/maxscale.cnf.template.<suffix_of_cnf_template>

Maxscale configuration template

All templates are in cnf/ directory:

cnf/maxscale.cnf.template.<suffix_of_cnf_template>

Template can contain following varables:

Variable Maeaning
###threads### Number of Maxscale treads
###node_server_IP_N### IP of Master/Slave node N
###node_server_port_N### port of Master/Slave node N
###galera_server_IP_N### IP of Galera node N
###galera_server_port_N### port of Galera node N

Test creation principles

  • start from initializing of an object of TestConnections class
  • set timeout before every operation which can got stuck, do not forget to disable timeout before long sleep()
  • use TestConnections::tprintf function to print test log
  • use TestConnections::add_result() to idicate test failure and print explanation message
  • execute TestConnections::copy_all_logs at the end of test
  • return TestConnections::global_result value
  • do not leave any node blocked by firewall

Class TestConnections

This class contains all information about Maxscale node and about all backend nodes as well as a set of functions to handle Maxscale and backends, interact with Maxscale routers and Maxadmin. Here is only list of main functions, for all details see Doxygen comments in testconnections.h

Currently two backend sets are supported (represented by Mariadb_nodes class objects): 'repl' and 'galera'

  • contains all info and operations for Master/Slave and Galera setups (see Doxygen comments in mariadb_nodes.h )

It is assumed that following routers+listers are configured

Router Port
RWSplit 4006
ReadConn master 4008
ReadConn Slave 4009
binlog 5306
test case -specific 4016

Most important fuctions and variables

Please check Doxygen comments for details

TestConnections(int argc, char *argv[]);

  • reads all information from environmental variables
  • checks backends, if broken - does one attempt to restore
  • create maxscale.cnf out of template and copy it to Maxscale node
  • create needed directories, set access righs for them, cleanup logs, coredumps
  • start Maxscale
  • initialize internal structures

Timeout functions

int set_timeout(int timeout_seconds) stop_timeout()

If after set_timeout() a new call of set_timeout() or stop_timeout() is not done the test execution terminated, logs from Maxscale are copied to host.

Open connection functions

Function Short description
int connect_maxscale();
int connect_rwsplit();
int connect_readconn_master();
int connect_maxscale_slave();
store MYSQL handler in TestConnections object (only one cnnection can be created by them, second call leads to MYSQL handler leak)
MYSQL * open_rwsplit_connection()
MYSQL * open_readconn_master_connection()
MYSQL * open_readconn_slave_connection()
returns MYSQL handler (can be used to create a number of connections to each router)
int create_connections(int conn_N) - open and then close N connections to each router

A number of useful wrappers for mysql_real_connect() are not included into TestConnections class, but they are availve from mariadb_func.h

Backend check and setup functions

Function Short description
start_replication() Configure nodes from 'repl' object as Master/Slave
start_galera() Configure nodes from 'galera'
start_binlog() Configure nodes from 'repl' in following way: node0 - Master, node1 - slave of node0, all others - slaves of Maxscale binlog router
start_mm() Configure nodes from 'repl' in multimuster setup

Result reporting functions

Function Short description
add_result() failure printing, increase global_result
tprint() printing with timestamp
copy_logs() copy Maxscale log, maxscale.cnf file and core dump from Maxscale machine to current directory

Different checks functions

Function Short description
try_query() try SQL query and print error message in case of failure, increase global_result
check_t1_table() check if t1 present in give DB
test_maxscale_connections check status of connections to RWSplit, ReadConn master, ReadConn slave routers
check_maxscale_alive() Check if RWSplit, ReadConn master, ReadConn slave routers are alive
check_log_err() Check Maxscale log for presence of absence of specific string
find_connected_slave find first slave that have connections from Maxscale

Maxscale machine control functions

Function Short description
start_maxscale()
stop_maxscale()
restart_maxscale()
execute_ssh_maxscale() execute command on Maxscale node via ssh

Properties

Name Short description Corresponding env variable
global_result 0 if there is not single failure during the test -
repl Mariadb_nodes object for Master/Slave nodes -
galera Mariadb_nodes object for Galera nodes -
smoke do short tests if TRUE smoke
maxscale_IP IP address of Maxscale machine maxscale_IP
maxscale_user DB user name to access via Maxscale maxscale_user
maxscale_password password for MaxscaleDB user maxscale_password
maxadmin_password password for MaxAdmin interface (user name is hard coded 'admin') maxadmin_password
conn_rwsplit MYSQL handler of connections to RWSplit router -
conn_master MYSQL handler of connections to ReadConn router in master mode -
conn_slave MYSQL handler of connections to ReadConn router in master mode -

Mariadb_nodes class

Master/Slave and Galera setup and check

Function Short description
start_replication() Configure nodes from 'repl' object as Master/Slave
start_galera() Configure nodes from 'galera'
set_slave() execute CHANGE MASTER TO agains the node
check_replication() Check if 'repl' nodes are properly configured as Master/Slave
check_galera() Check if 'galera' nodes are are properly configured as Galera cluster
change_master Make another node to be a master

Connections functions

Function Short description
connect() open connections to all nodes, store MYSQL handlers in internal variable, second call leads to handlers leak
close_connections() close connections to all nodes

Nodes control functions

Function Short description
block_node() block MariaDB server on the node by firawall
unblock_node() unblock MariaDB server on the node by firawall
unblock_all_nodes() unblock MariaDB server on all nodes by firawall
stop_node() stop MariaDB server on the node
start node() start MariaDB server on the node
restart_node() stop and restart MariaDB server on the node
check_node() check if MariaDB server on the node is alive
check_and_restart_node() check if MariaDB server on the node is alive and restart it if it is not alive
stop_nodes() stop MariaDB server on all nodes
ssh_node() Execute command on the node via ssh, return error code
ssh_node_output() Same as ssh_nodE(), but return command output
flush_hosts() Execute 'mysqladmin flush-hosts' on all nodes
execute_query_all_nodes() Execute same query on all nodes

Properties

Name Short description Corresponding env variable
N Number of nodes node_N
galera_N
user_name DB user name node_user
galera_user
password password for DB user node_password
galera_password
IP[ ] IP address of the node node_XXX
galera_XXX
IP_private[ ] private IP of the node (for AWS nodes) node_private_XXX
galera_private_XXX
port[ ] MariaDB port for the node node_port_XXX
galera_port_XXX
nodes[ ] MYSQL handler -

Maxadmin operations functions

maxadmin_operations.h contains fuctions to communicate to Maxscale via MaxAdmin interface

Function Short description
execute_maxadmin_command() send MaxAdmin command to Maxscale
execute_maxadmin_command_print() send MaxAdmin command to Maxscale and print reply
get_maxadmin_param() send MaxAdmin command to Maxscale and try to find the value of given parameter in output