176 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			176 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
| 
								 | 
							
								# ==== Purpose ====
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Check if a condition holds, fail with debug info if not.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# The condition is parsed before executed. The following constructs
							 | 
						||
| 
								 | 
							
								# are supported:
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#   [SQL_STATEMENT, COLUMN, ROW]
							 | 
						||
| 
								 | 
							
								#     The square bracket is replaced by the result from SQL_STATEMENT,
							 | 
						||
| 
								 | 
							
								#     in the given COLUMN and ROW.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#     Optionally, SQL_STATEMENT may have the form:
							 | 
						||
| 
								 | 
							
								#       connection:SQL_STATEMENT
							 | 
						||
| 
								 | 
							
								#     In this case, SQL_STATEMENT is executed on the named connection.
							 | 
						||
| 
								 | 
							
								#     All other queries executed by this script will be executed on
							 | 
						||
| 
								 | 
							
								#     the connection that was in use when this script was started.
							 | 
						||
| 
								 | 
							
								#     The current connection will also be restored at the end of this
							 | 
						||
| 
								 | 
							
								#     script.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#     Nested sub-statements on this form are not allowed.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#   <1>
							 | 
						||
| 
								 | 
							
								#     This is a shorthand for the result of the first executed square
							 | 
						||
| 
								 | 
							
								#     bracket. <2> is a shorthand for the second executed square
							 | 
						||
| 
								 | 
							
								#     bracket, and so on.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# ==== Usage ====
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# --let $assert_text= Relay_Log_Pos must be between min_pos and max_pos
							 | 
						||
| 
								 | 
							
								# --let $assert_cond= [SHOW SLAVE STATUS, Relay_Log_Pos, 1] >= $min_pos AND <1> <= $max_pos
							 | 
						||
| 
								 | 
							
								# [--let $assert_quiet= 1]
							 | 
						||
| 
								 | 
							
								# [--let $rpl_debug= 1]
							 | 
						||
| 
								 | 
							
								# --source include/assert.inc
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# Parameters:
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# $assert_text
							 | 
						||
| 
								 | 
							
								#   Text that describes what is being checked. This text is written to
							 | 
						||
| 
								 | 
							
								#   the query log so it should not contain non-deterministic elements.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# $assert_cond
							 | 
						||
| 
								 | 
							
								#   Condition to check.  See above for details about the format.  The
							 | 
						||
| 
								 | 
							
								#   condition will be executed as `SELECT $assert_cond`.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								#   Both $assert_cond and the result from any substatement on the
							 | 
						||
| 
								 | 
							
								#   form [SQL_STATEMENT, COLUMN, ROW] will be used in SQL statements,
							 | 
						||
| 
								 | 
							
								#   inside single quotes (as in '$assert_text').  So any single quotes
							 | 
						||
| 
								 | 
							
								#   in these texts must be escaped or replaced by double quotes.
							 | 
						||
| 
								 | 
							
								#
							 | 
						||
| 
								 | 
							
								# $rpl_debug
							 | 
						||
| 
								 | 
							
								#   Print extra debug info.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--let $include_filename= assert.inc [$assert_text]
							 | 
						||
| 
								 | 
							
								--source include/begin_include_file.inc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ($rpl_debug)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  --echo # debug: assert_text='$assert_text' assert_cond='$assert_cond'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Sanity-check input
							 | 
						||
| 
								 | 
							
								if (!$assert_text)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  --die ERROR IN TEST: the mysqltest variable rpl_test must be set
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--let $_assert_old_connection= $CURRENT_CONNECTION
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Evaluate square brackets in cond.
							 | 
						||
| 
								 | 
							
								--let $_assert_substmt_number= 1
							 | 
						||
| 
								 | 
							
								--let $_assert_cond_interp= '$assert_cond'
							 | 
						||
| 
								 | 
							
								--let $_assert_lbracket= `SELECT LOCATE('[', $_assert_cond_interp)`
							 | 
						||
| 
								 | 
							
								while ($_assert_lbracket)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  # Get position of right bracket
							 | 
						||
| 
								 | 
							
								  --let $_assert_rbracket= `SELECT LOCATE(']', $_assert_cond_interp)`
							 | 
						||
| 
								 | 
							
								  if (!$_assert_rbracket)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    --echo BUG IN TEST: Mismatching square brackets in assert_cond.
							 | 
						||
| 
								 | 
							
								    --echo Original assert_cond='$assert_cond'
							 | 
						||
| 
								 | 
							
								    --echo Interpolated assert_cond=$_assert_cond_interp
							 | 
						||
| 
								 | 
							
								    --die BUG IN TEST: Mismatching square brackets in $assert_cond
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # Get sub-statement from statement. Preserve escapes for single quotes.
							 | 
						||
| 
								 | 
							
								  --let $_assert_full_substmt= `SELECT QUOTE(SUBSTRING($_assert_cond_interp, $_assert_lbracket + 1, $_assert_rbracket - $_assert_lbracket - 1))`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # Get connection from sub-statement
							 | 
						||
| 
								 | 
							
								  --let $_assert_colon= `SELECT IF($_assert_full_substmt REGEXP '^[a-zA-Z_][a-zA-Z_0-9]*:', LOCATE(':', $_assert_full_substmt), 0)`
							 | 
						||
| 
								 | 
							
								  --let $_assert_connection=
							 | 
						||
| 
								 | 
							
								  --let $_assert_substmt= $_assert_full_substmt
							 | 
						||
| 
								 | 
							
								  if ($_assert_colon)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    --let $_assert_connection= `SELECT SUBSTRING($_assert_substmt, 1, $_assert_colon - 1)`
							 | 
						||
| 
								 | 
							
								    # Preserve escapes for single quotes.
							 | 
						||
| 
								 | 
							
								    --let $_assert_substmt= `SELECT QUOTE(SUBSTRING($_assert_substmt, $_assert_colon + 1))`
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # Interpolate escapes before using condition outside string context.
							 | 
						||
| 
								 | 
							
								  --let $_assert_substmt_interp= `SELECT $_assert_substmt`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # Execute and get result from sub-statement
							 | 
						||
| 
								 | 
							
								  if ($_assert_connection)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    if ($rpl_debug)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      --echo # debug: connection='$_assert_connection' sub-statement=$_assert_substmt
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    --let $rpl_connection_name= $_assert_connection
							 | 
						||
| 
								 | 
							
								    --source include/rpl_connection.inc
							 | 
						||
| 
								 | 
							
								    --let $_assert_substmt_result= query_get_value($_assert_substmt_interp)
							 | 
						||
| 
								 | 
							
								    --let $rpl_connection_name= $_assert_old_connection
							 | 
						||
| 
								 | 
							
								    --source include/rpl_connection.inc
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if (!$_assert_connection)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    if ($rpl_debug)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      --echo # debug: old connection, sub-statement=$_assert_substmt
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    --let $_assert_substmt_result= query_get_value($_assert_substmt_interp)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  if ($rpl_debug)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    --echo # debug: result of sub-statement='$_assert_substmt_result'
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # Replace sub-statement by its result
							 | 
						||
| 
								 | 
							
								  --let $_assert_cond_interp= `SELECT QUOTE(REPLACE($_assert_cond_interp, CONCAT('[', $_assert_full_substmt, ']'), '$_assert_substmt_result'))`
							 | 
						||
| 
								 | 
							
								  # Replace result references by result
							 | 
						||
| 
								 | 
							
								  --let $_assert_cond_interp= `SELECT QUOTE(REPLACE($_assert_cond_interp, '<$_assert_substmt_number>', '$_assert_substmt_result'))`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  --let $_assert_lbracket= `SELECT LOCATE('[', $_assert_cond_interp)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  --inc $_assert_substmt_number
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Interpolate escapes before using condition outside string context.
							 | 
						||
| 
								 | 
							
								--let $_assert_cond_interp= `SELECT $_assert_cond_interp`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ($rpl_debug)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  --echo # debug: interpolated_cond='$_assert_cond_interp'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Execute.
							 | 
						||
| 
								 | 
							
								--let $_assert_result= `SELECT $_assert_cond_interp`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if ($rpl_debug)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  --echo # debug: result='$_assert_result'
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Check.
							 | 
						||
| 
								 | 
							
								if (!$_assert_result)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  --echo ######## Test assertion failed: $assert_text ########
							 | 
						||
| 
								 | 
							
								  --echo Dumping debug info:
							 | 
						||
| 
								 | 
							
								  if ($rpl_inited)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    --source include/show_rpl_debug_info.inc
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  --echo Assertion text: '$assert_text'
							 | 
						||
| 
								 | 
							
								  --echo Assertion condition: '$assert_cond'
							 | 
						||
| 
								 | 
							
								  --echo Assertion condition, interpolated: '$_assert_cond_interp'
							 | 
						||
| 
								 | 
							
								  --echo Assertion result: '$_assert_result'
							 | 
						||
| 
								 | 
							
								  --die Test assertion failed in assertion.inc
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--let $include_filename= assert.inc [$assert_text]
							 | 
						||
| 
								 | 
							
								--source include/end_include_file.inc
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								--let $assert_text=
							 | 
						||
| 
								 | 
							
								--let $assert_cond=
							 |