MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Lars Thalmann Date:November 30 2009 8:06am
Subject:Re: bzr commit into nuts branch (Serge.Kozlov:364) Bug#48815 Bug#48819
Bug#48845 Bug#48903 Bug#48908
View as plain text  
Great work, Serge!

Some comments:

1. I think we need to document the test cases with what
   requirement they test.  E.g.

   Tested Requirement: In row-based replication, if the bitfield
   size on master and slave are different, then a proper error
   message should be generated on the slave.

   Tested Requirement: In row-based replication, if the decimal
   precision is different between master and slave, then error
   1535 should be generated.

   Specifying this also opens up another question: Should the
   tests be generalized to all types of changes of types or do we
   already have such tests?

2. Is it not better to check error code instead of error message?
   Do we not have an error code for that error?

3. I think the test should follow the same coding guidelines as
   the code, i.e. each function should have documentation on what
   it does.

Note WL#5151 which will soon be ready.  A generalized test for
that would be good too.

/L


On Sun, Nov 29, 2009 at 10:57:03PM +0300, Serge Kozlov wrote:
> #At file:///home/ksm/sun/repo/new_bugs/nuts-1/ based on
> revid:luis.soares@stripped
> 
>   364 Serge Kozlov	2009-11-29
>       1. Test cases for bugs: bug#48815, bug#48819, bug#48845, bug#48903, bug#48908
>       2. Added sorting test cases by their file names.
>       3. Added test template Replication.pm
>       added:
>         lib/My/Nuts/Library/Tests/Replication.pm
>         suites/bugs/
>         suites/bugs/bug48815.pm
>         suites/bugs/bug48819.pm
>         suites/bugs/bug48845.pm
>         suites/bugs/bug48903.pm
>         suites/bugs/bug48908.pm
>       modified:
>         bin/Driver.pm
> 
> === modified file 'bin/Driver.pm'
> --- a/bin/Driver.pm	2009-11-26 13:15:16 +0000
> +++ b/bin/Driver.pm	2009-11-29 19:57:00 +0000
> @@ -412,7 +412,7 @@ sub run_driver
>        }
>      }
>  
> -    foreach my $test (@tests)
> +    foreach my $test (sort @tests)
>      {
>          $logger->info ("Clean previous test.\n");
>          clean_process ();
> 
> === added file 'lib/My/Nuts/Library/Tests/Replication.pm'
> --- a/lib/My/Nuts/Library/Tests/Replication.pm	1970-01-01 00:00:00 +0000
> +++ b/lib/My/Nuts/Library/Tests/Replication.pm	2009-11-29 19:57:00 +0000
> @@ -0,0 +1,213 @@
> +package My::Nuts::Library::Tests::Replication;
> +use Exporter;
> +our @ISA    = qw(Exporter My::Nuts::Test);
> +our @EXPORT = qw(ok_servers servers get_combination);
> +use strict;
> +use warnings;
> +use My;
> +use My::Nuts::Library::Kernel::Manager;
> +use My::Nuts::Library::Kernel::Server;
> +use My::Nuts::Library::Kernel::Replication;
> +use My::Nuts::Library::Kernel::Result;
> +use My::Nuts::Library::File;
> +use My::Nuts::Properties::BuildProperties;
> +use My::Nuts::Test;
> +use Class::Std::Utils;
> +use Log::Log4perl qw(get_logger :levels); 
> +use Test::More;
> +my $logger = get_logger("My::Nuts::Library::Tests::Replication");
> +my %server;
> +my %counter;
> +
> +sub get_combination
> +{
> +    my ($self) = @_;
> +    return $self->get_combination_tag();
> +}
> +
> +sub ok_server
> +{
> +    my ($self, $params) = @_;
> +    if ( is_defined ($self) == My::FALSE)
> +    {
> +        ok ( 0, "Error in the parameters for server" )
> +          or diag ("Check the parameters (test)");
> +        return (My::FAILURE);
> +    }
> +    my $ret = server($self, $params);
> +    if (is_server($ret) == My::FALSE || state($ret) != My::RUNNING)
> +    {
> +      $logger->fatal("Error allocating server or can not initialize plugins. 
> Please, check the logs for more information.");
> +      die;
> +    }
> +    return ( $ret );
> +}
> +
> +sub server
> +{
> +    my ($self, $args) = @_;
> +    my $ident = ident ($self);
> +    $counter{$ident} = $counter{$ident} ? ( $counter{$ident} + 1 ) : 1;
> +    $server{$ident} = get_server("my.server.id" => $counter{$ident});
> +    $logger->info("deploy server: ($counter{$ident})");
> +    return (My::UNABLE_TO_DEPLOY) unless  ( deploy_server( $server{$ident} ) ==
> My::SUCCESS );
> +    $server{$ident}->get_my_properties()->set_my_server_args($args) if
> (defined $args);
> +    $logger->info("start server: ($counter{$ident})");
> +    return (My::UNABLE_TO_START) unless (start_server( $server{$ident} ) ==
> My::SUCCESS);
> +    return ( $server{$ident} );
> +}
> +
> +sub ok_servers
> +{
> +    my @data = @_;
> +    my @server_list = servers ( @data );
> +    foreach my $server ( @server_list )
> +    {
> +	if ( is_server($server) == My::FALSE || state($server) != My::RUNNING )
> +	{
> +    	    $logger->fatal("Error allocating server.  Please, check the logs for
> more information.");
> +    	    die;
> +	}	
> +    }
> +    #unshift ( @server_list, $data[0] );
> +    return @server_list;
> +}
> +
> +sub servers
> +{
> +    my $self = shift;
> +    my @rep_links = @_;
> +    my %run_servers = ();
> +    my @out_servers = ();
> +    my @tags = ();
> +    my @create_dbs = ();
> +    my @reps = ();
> +    foreach my $rep_link ( @rep_links )
> +    {
> +	if ( $rep_link =~ m/(.+)\-\>(.+)/i )
> +	{
> +	    my $master_cfg = $1;
> +	    my $slave_cfg = $2;
> +	    my @server_pair = ();
> +	    foreach my $option ( ($master_cfg, $slave_cfg) )
> +	    {
> +		if ( $option =~ m/([a-zA-Z0-9]+)/i )
> +		{
> +		    my $server_name = $1;
> +		    my $arg = undef;
> +		    if ( $option =~ m/\((.+)\)/i )
> +		    {
> +			$arg = $1;
> +		    }
> +		    if (! defined ( $run_servers{$server_name} ) )
> +		    {
> +			$run_servers{$server_name} = server ( $self, $arg );
> +			push ( @out_servers, $run_servers{$server_name} );
> +		    }
> +		    push( @server_pair, $run_servers{$server_name} );
> +		}
> +	    }
> +	    attach ( $server_pair[0], $server_pair[1] );
> +	    wait_start_replication ( $server_pair[1] );
> +	    push ( @reps, [ $server_pair[0], $server_pair[1] ] );
> +	}
> +	else
> +	{
> +	    @tags = split (", ", $rep_link);	    
> +	}
> +    }
> +    foreach my $tag ( @tags )
> +    {
> +	if ($tag =~ m/(.+)\:create\_db\_(.+)/i)
> +	{
> +	    my $server = $1;	    
> +	    my $dbname = $2;	    	    
> +	    sql ( $run_servers{$server}, "DROP DATABASE IF EXISTS $dbname;" );
> +	    sql ( $run_servers{$server}, "CREATE DATABASE $dbname;" );
> +	    foreach my $rep (@reps)
> +	    {
> +		synchronize ( $rep->[0], $rep->[1] );
> +		sql ( $rep->[0], "USE $dbname;" );
> +		sql ( $rep->[1], "USE $dbname;" );
> +	    }	    
> +	}
> +    }
> +    return @out_servers;
> +}
> +
> +sub prepare
> +{
> +    return;
> +}
> +
> +sub startup
> +{
> +    return;
> +}
> +
> +sub fire
> +{
> +    return;
> +}
> +
> +sub shutdown
> +{
> +    return;
> +}
> +
> +1;
> +__END__
> +
> +=over
> +
> +=back
> +
> +=head1 My::Nuts::Library::Tests::Replication
> +
> +=over
> +
> +=back
> +
> +=head2 SYNOPSYS
> +
> +The class creates an environment to develop test cases for replication.
> +
> +=over
> +
> +=back
> +
> +=head2 METHODS
> +
> +=over 
> +
> +=back
> +
> +=head3 servers ($opt1, $opt2, $opt3 ... $optX)
> +
> +Description: Returns a list of references to a MySQL Instances.
> +
> +Each option $optX can have following values:
> +
> +=over
> +
> +=item 1. "master_name(mysql command line arguments)->slave_name(mysql command
> line arguments)". 
> +Create new servers named "master_name","slave_name" if they do not exist and start
> replication between them.
> +
> +Sample: "master(--binlog-format=row)->slave_name(--innodb)"
> +
> +=item 2. "server:created_db_test" where "server", name of a existed master. 
> +This creates DB named "test" on given server and synchronizes all slaves pairs.
> +
> +Sample:  "master:created_db_test"
> +
> +=back
> +
> +=head3 get_combination ()
> +
> +Description: Return a combination tag under which the test is running.
> +
> +=over
> +
> +=back
> +
> +=cut
> 
> === added directory 'suites/bugs'
> === added file 'suites/bugs/bug48815.pm'
> --- a/suites/bugs/bug48815.pm	1970-01-01 00:00:00 +0000
> +++ b/suites/bugs/bug48815.pm	2009-11-29 19:57:00 +0000
> @@ -0,0 +1,68 @@
> +package bugs::bug48815;
> +use Exporter;
> +our @ISA = qw(Exporter My::Nuts::Library::Tests::Replication);
> +use strict;
> +use warnings;
> +use My;
> +use My::Nuts::Library::Kernel::Server;
> +use My::Nuts::Library::Kernel::ServerResult;
> +use My::Nuts::Library::Kernel::Manager;
> +use My::Nuts::Library::Kernel::Result;
> +use My::Nuts::Library::Tests::Replication;
> +use My::Nuts::Library::Kernel::Replication;
> +use Test::More;
> +
> +sub prepare
> +{
> +    return;
> +}
> +
> +sub startup
> +{
> +    return;
> +}
> +
> +sub fire
> +{
> +    my ($test) = @_;
> +    # Setup topology, start server, create test db
> +    my ($master, $slave, $slave2) = ok_servers($test, 
> +	"master(--binlog-format=row)->slave(--binlog-format=row)",
> +	"slave(--binlog-format=statement)->slave2(--binlog-format=statement)",
> +	"master:create_db_test");    
> +    
> +    plan tests => 4;
> +
> +    # Bug code
> +    ok_sql ( $master, "CREATE TABLE t1 (a INT);");
> +    ok_sql ( $master, "INSERT INTO t1 VALUES(1);");
> +    synchronize ( $master, $slave );
> +    synchronize ( $slave, $slave2 );
> +    my $query = "SELECT COUNT(*) FROM t1 WHERE a = 1;";
> +    my $rs = ok_sql( $slave, $query );
> +    my @rs_data = get_next($rs);
> +    if (! ok ($rs_data[0] eq "0", "Check result for $query") )
> +    {
> +	diag("Expected: 0");
> +	diag("Got: ".$rs_data[0]);
> +    }
> +    
> +    
> +}
> +
> +sub shutdown
> +{
> +    return;
> +}
> +
> +1;
> +__END__;
> +
> +=head1 NAME
> +
> +bugs::bug48815 - Bug#48815
> +
> +=head1 SYNOPSIS
> +
> +Test case for Bug#48815
> +
> 
> === added file 'suites/bugs/bug48819.pm'
> --- a/suites/bugs/bug48819.pm	1970-01-01 00:00:00 +0000
> +++ b/suites/bugs/bug48819.pm	2009-11-29 19:57:00 +0000
> @@ -0,0 +1,76 @@
> +package bugs::bug48819;
> +use Exporter;
> +our @ISA = qw(Exporter My::Nuts::Library::Tests::Replication);
> +use strict;
> +use warnings;
> +use My;
> +use My::Nuts::Library::Kernel::Server;
> +use My::Nuts::Library::Kernel::ServerResult;
> +use My::Nuts::Library::Kernel::Manager;
> +use My::Nuts::Library::Kernel::Result;
> +use My::Nuts::Library::Tests::Replication;
> +use My::Nuts::Library::Kernel::Replication;
> +use Test::More;
> +
> +sub prepare
> +{
> +    return;
> +}
> +
> +sub startup
> +{
> +    return;
> +}
> +
> +sub fire
> +{
> +    my ($test) = @_;
> +    # Setup topology, start server, create test db
> +    my ($master, $slave) = ok_servers($test, 
> +	"master(--binlog-format=row)->slave(--binlog-format=row)",
> +	"master:create_db_test");    
> +    
> +    plan tests => 8;
> +
> +    # Bug code
> +    ok_sql ( $master, "CREATE TABLE t1 (a INT);");
> +    ok_synchronize ( $master, $slave );
> +    ok_sql ( $slave, "ALTER TABLE t1 ADD b TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON
> UPDATE CURRENT_TIMESTAMP;");
> +    ok_sql ( $master, "INSERT INTO t1 VALUES(0);");
> +    ok_synchronize ( $master, $slave );
> +    my $rs = ok_sql( $slave, "SELECT b FROM t1;");
> +    if (! is_error($rs) )
> +    {
> +	my @rs_data = get_next($rs);
> +	if (! ok( defined ($rs_data[0]), "Check result data") )
> +	{
> +	    diag("Expected: timestamp");
> +	    diag("Got: undef");
> +	}
> +	else
> +	{
> +	    if (! ok($rs_data[0] ne "0000-00-00 00:00:00", "Check value of column a") )
> +	    {
> +		diag("Expected: current timestamp");
> +		diag("Got: 0000-00-00 00:00:00");
> +	    }
> +	}
> +    }
> +}
> +
> +sub shutdown
> +{
> +    return;
> +}
> +
> +1;
> +__END__;
> +
> +=head1 NAME
> +
> +bugs::bug48819 - Bug#48819
> +
> +=head1 SYNOPSIS
> +
> +Test case for Bug#48819
> +
> 
> === added file 'suites/bugs/bug48845.pm'
> --- a/suites/bugs/bug48845.pm	1970-01-01 00:00:00 +0000
> +++ b/suites/bugs/bug48845.pm	2009-11-29 19:57:00 +0000
> @@ -0,0 +1,58 @@
> +package bugs::bug48845;
> +use Exporter;
> +our @ISA = qw(Exporter My::Nuts::Library::Tests::Replication);
> +use strict;
> +use warnings;
> +use My;
> +use My::Nuts::Library::Kernel::Server;
> +use My::Nuts::Library::Kernel::ServerResult;
> +use My::Nuts::Library::Kernel::Manager;
> +use My::Nuts::Library::Kernel::Result;
> +use My::Nuts::Library::Tests::Replication;
> +use My::Nuts::Library::Kernel::Replication;
> +use Test::More;
> +
> +sub prepare
> +{
> +    return;
> +}
> +
> +sub startup
> +{
> +    return;
> +}
> +
> +sub fire
> +{
> +    my ($test) = @_;
> +    # Setup topology, start server, create test db
> +    my ($master, $slave) = ok_servers($test, 
> +	"master(--binlog-format=row)->slave(--binlog-format=row)",
> +	"master:create_db_test");    
> +    
> +    plan tests => 5;
> +
> +    # Bug code
> +    ok_sql ( $master, "CREATE TABLE t1 (a CHAR(2));");
> +    ok_synchronize ( $master, $slave );
> +    ok_sql ( $slave, "ALTER TABLE t1 CHANGE a a CHAR(1);");
> +    ok_sql ( $master, "INSERT INTO t1 VALUES('ab');");
> +    ok_synchronize ( $master, $slave );
> +}
> +
> +sub shutdown
> +{
> +    return;
> +}
> +
> +1;
> +__END__;
> +
> +=head1 NAME
> +
> +bugs::bug48845 - Bug#48845
> +
> +=head1 SYNOPSIS
> +
> +Test case for Bug#48845
> +
> 
> === added file 'suites/bugs/bug48903.pm'
> --- a/suites/bugs/bug48903.pm	1970-01-01 00:00:00 +0000
> +++ b/suites/bugs/bug48903.pm	2009-11-29 19:57:00 +0000
> @@ -0,0 +1,65 @@
> +package bugs::bug48903;
> +use Exporter;
> +our @ISA = qw(Exporter My::Nuts::Library::Tests::Replication);
> +use strict;
> +use warnings;
> +use My;
> +use My::Nuts::Library::Kernel::Server;
> +use My::Nuts::Library::Kernel::ServerResult;
> +use My::Nuts::Library::Kernel::Manager;
> +use My::Nuts::Library::Kernel::Result;
> +use My::Nuts::Library::Tests::Replication;
> +use My::Nuts::Library::Kernel::Replication;
> +use Test::More;
> +
> +sub prepare
> +{
> +    return;
> +}
> +
> +sub startup
> +{
> +    return;
> +}
> +
> +sub fire
> +{
> +    my ($test) = @_;
> +    # Setup topology, start server, create test db
> +    my ($master, $slave) = ok_servers($test, 
> +	"master(--binlog-format=row)->slave(--binlog-format=row)",
> +	"master:create_db_test");    
> +    
> +    plan tests => 5;
> +
> +    # Bug code
> +    ok_sql ( $master, "CREATE TABLE t1 (a DECIMAL(9,3));");
> +    ok_synchronize ( $master, $slave );
> +    ok_sql ( $slave, "ALTER TABLE t1 CHANGE a a DECIMAL(9,4);");
> +    ok_sql ( $master, "INSERT INTO t1 VALUES (-123456.123), (654321.456);");
> +    synchronize ( $master, $slave );
> +    my $sql_errno = retrieve_slave_status( $slave, "Last_SQL_Errno" );
> +    my $sql_state = retrieve_slave_status( $slave, "Slave_SQL_Running" );
> +    if (! ok ( $sql_state.",".$sql_errno eq "No,1535", "Check state of SQL Thread
> and the error" ) )
> +    {
> +	diag ( "Expected: Slave_SQL_Running: No, Last_SQL_Errno: 1535" );
> +	diag ( "Got: Slave_SQL_Running: $sql_state, Last_SQL_Errno: $sql_errno" );
> +    }
> +}
> +
> +sub shutdown
> +{
> +    return;
> +}
> +
> +1;
> +__END__;
> +
> +=head1 NAME
> +
> +bugs::bug48903 - Bug#48903
> +
> +=head1 SYNOPSIS
> +
> +Test case for Bug#48903
> +
> 
> === added file 'suites/bugs/bug48908.pm'
> --- a/suites/bugs/bug48908.pm	1970-01-01 00:00:00 +0000
> +++ b/suites/bugs/bug48908.pm	2009-11-29 19:57:00 +0000
> @@ -0,0 +1,65 @@
> +package bugs::bug48908;
> +use Exporter;
> +our @ISA = qw(Exporter My::Nuts::Library::Tests::Replication);
> +use strict;
> +use warnings;
> +use My;
> +use My::Nuts::Library::Kernel::Server;
> +use My::Nuts::Library::Kernel::ServerResult;
> +use My::Nuts::Library::Kernel::Manager;
> +use My::Nuts::Library::Kernel::Result;
> +use My::Nuts::Library::Tests::Replication;
> +use My::Nuts::Library::Kernel::Replication;
> +use Test::More;
> +
> +sub prepare
> +{
> +    return;
> +}
> +
> +sub startup
> +{
> +    return;
> +}
> +
> +sub fire
> +{
> +    my ($test) = @_;
> +    # Setup topology, start server, create test db
> +    my ($master, $slave) = ok_servers($test, 
> +	"master(--binlog-format=row)->slave(--binlog-format=row)",
> +	"master:create_db_test");    
> +    
> +    plan tests => 6;
> +
> +    # Bug code
> +    ok_sql ( $master, "CREATE TABLE t1 (a BIT(20));");
> +    ok_synchronize ( $master, $slave );
> +    ok_sql ( $slave, "ALTER TABLE t1 CHANGE a a BIT(19);");
> +    ok_sql ( $master, "INSERT INTO t1 VALUES(0);");
> +    ok_wait_stop_sql_replication($slave);
> +    my $error_message = retrieve_slave_status($slave, "Last_Error");
> +    if (! ok ( $error_message =~ m/.+master has size 20.+slave has size 19.+/ig, 
> +	"Check the error message on the slave") )
> +    {
> +	diag("Expected: ... master has size 20 ... slave has size 19 ...");
> +	diag("Got: $error_message");
> +    }
> +}
> +
> +sub shutdown
> +{
> +    return;
> +}
> +
> +1;
> +__END__;
> +
> +=head1 NAME
> +
> +bugs::bug48908 - Bug#48908
> +
> +=head1 SYNOPSIS
> +
> +Test case for Bug#48908
> +
> 
> 
> -- 
> MySQL Code Commits Mailing List
> For list archives: http://lists.mysql.com/commits
> To unsubscribe:    http://lists.mysql.com/commits?unsub=1
> 

-- 
Dr Lars Thalmann, Development Manager, Replication & Backup, www.mysql.com
Thread
bzr commit into nuts branch (Serge.Kozlov:364) Bug#48815 Bug#48819 Bug#48845Bug#48903 Bug#48908Serge Kozlov29 Nov
  • Re: bzr commit into nuts branch (Serge.Kozlov:364) Bug#48815 Bug#48819Bug#48845 Bug#48903 Bug#48908Lars Thalmann30 Nov
    • Re: bzr commit into nuts branch (Serge.Kozlov:364) Bug#48815 Bug#48819Bug#48845 Bug#48903 Bug#48908Serge Kozlov30 Nov
      • Re: bzr commit into nuts branch (Serge.Kozlov:364) Bug#48815 Bug#48819Bug#48845 Bug#48903 Bug#48908Lars Thalmann30 Nov