X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F93storage_replication.t;h=77657677dffe68c54a21d1b1297e4e83762b5f50;hb=c4d3fae2d68b67050e6f4a04031608506e9a18e8;hp=26f60394c4bd9e7a0888b284e086d6bd2f7712bf;hpb=89cf6a706832b79c02f980077bd30525b3716ee0;p=dbsrgits%2FDBIx-Class.git diff --git a/t/93storage_replication.t b/t/93storage_replication.t index 26f6039..7765767 100644 --- a/t/93storage_replication.t +++ b/t/93storage_replication.t @@ -2,13 +2,14 @@ use strict; use warnings; use lib qw(t/lib); use Test::More; +use Test::Exception; use DBICTest; BEGIN { - eval "use Moose"; + eval "use Moose; use Test::Moose"; plan $@ ? ( skip_all => 'needs Moose for testing' ) - : ( tests => 40 ); + : ( tests => 57 ); } use_ok 'DBIx::Class::Storage::DBI::Replicated::Pool'; @@ -61,11 +62,14 @@ TESTSCHEMACLASSES: { my $class = shift @_; my $schema = DBICTest->init_schema( - storage_type=>[ + storage_type=>{ '::DBI::Replicated' => { balancer_type=>'::Random', + balancer_args=>{ + auto_validate_every=>100, + }, } - ], + }, deploy_args=>{ add_drop_table => 1, }, @@ -195,7 +199,7 @@ isa_ok $replicated->schema->storage->master isa_ok $replicated->schema->storage->pool => 'DBIx::Class::Storage::DBI::Replicated::Pool'; -isa_ok $replicated->schema->storage->balancer +does_ok $replicated->schema->storage->balancer => 'DBIx::Class::Storage::DBI::Replicated::Balancer'; ok my @replicant_connects = $replicated->generate_replicant_connect_info @@ -210,21 +214,21 @@ isa_ok $replicated->schema->storage->balancer->current_replicant ok $replicated->schema->storage->pool->has_replicants => 'does have replicants'; -is $replicated->schema->storage->num_replicants => 2 +is $replicated->schema->storage->pool->num_replicants => 2 => 'has two replicants'; -isa_ok $replicated_storages[0] +does_ok $replicated_storages[0] => 'DBIx::Class::Storage::DBI::Replicated::Replicant'; -isa_ok $replicated_storages[1] +does_ok $replicated_storages[1] => 'DBIx::Class::Storage::DBI::Replicated::Replicant'; my @replicant_names = keys %{$replicated->schema->storage->replicants}; - -isa_ok $replicated->schema->storage->replicants->{$replicant_names[0]} + +does_ok $replicated->schema->storage->replicants->{$replicant_names[0]} => 'DBIx::Class::Storage::DBI::Replicated::Replicant'; -isa_ok $replicated->schema->storage->replicants->{$replicant_names[1]} +does_ok $replicated->schema->storage->replicants->{$replicant_names[1]} => 'DBIx::Class::Storage::DBI::Replicated::Replicant'; ## Add some info to the database @@ -355,8 +359,127 @@ $replicated->schema->storage->replicants->{$replicant_names[0]}->active(0); $replicated->schema->storage->replicants->{$replicant_names[1]}->active(0); ok $replicated->schema->resultset('Artist')->find(2) - => 'Fallback to master'; - + => 'Fallback to master'; + +$replicated->schema->storage->replicants->{$replicant_names[0]}->active(1); +$replicated->schema->storage->replicants->{$replicant_names[1]}->active(1); + +ok $replicated->schema->resultset('Artist')->find(2) + => 'Returned to replicates'; + +## Getting slave status tests + +SKIP: { + ## We skip this tests unless you have a custom replicants, since the default + ## sqlite based replication tests don't support these functions. + + skip 'Cannot Test Replicant Status on Non Replicating Database', 9 + unless DBICTest->has_custom_dsn && $ENV{"DBICTEST_SLAVE0_DSN"}; + + $replicated->replicate; ## Give the slaves a chance to catchup. + + ok $replicated->schema->storage->replicants->{$replicant_names[0]}->is_replicating + => 'Replicants are replicating'; + + is $replicated->schema->storage->replicants->{$replicant_names[0]}->lag_behind_master, 0 + => 'Replicant is zero seconds behind master'; + + ## Test the validate replicants + + $replicated->schema->storage->pool->validate_replicants; + + is $replicated->schema->storage->pool->active_replicants, 2 + => 'Still have 2 replicants after validation'; + + ## Force the replicants to fail the validate test by required their lag to + ## be negative (ie ahead of the master!) + + $replicated->schema->storage->pool->maximum_lag(-10); + $replicated->schema->storage->pool->validate_replicants; + + is $replicated->schema->storage->pool->active_replicants, 0 + => 'No way a replicant be be ahead of the master'; + + ## Let's be fair to the replicants again. Let them lag up to 5 + + $replicated->schema->storage->pool->maximum_lag(5); + $replicated->schema->storage->pool->validate_replicants; + + is $replicated->schema->storage->pool->active_replicants, 2 + => 'Both replicants in good standing again'; + + ## Check auto validate + + is $replicated->schema->storage->balancer->auto_validate_every, 100 + => "Got the expected value for auto validate"; + + ## This will make sure we auto validatge everytime + $replicated->schema->storage->balancer->auto_validate_every(0); + + ## set all the replicants to inactive, and make sure the balancer falls back to + ## the master. + + $replicated->schema->storage->replicants->{$replicant_names[0]}->active(0); + $replicated->schema->storage->replicants->{$replicant_names[1]}->active(0); + + ## Ok, now when we go to run a query, autovalidate SHOULD reconnect + + is $replicated->schema->storage->pool->active_replicants => 0 + => "both replicants turned off"; + + ok $replicated->schema->resultset('Artist')->find(5) + => 'replicant reactivated'; + + is $replicated->schema->storage->pool->active_replicants => 2 + => "both replicants reactivated"; +} + +## Test the reliably callback + +ok my $reliably = sub { + + ok $replicated->schema->resultset('Artist')->find(5) + => 'replicant reactivated'; + +} => 'created coderef properly'; + +$replicated->schema->storage->execute_reliably($reliably); + +## Try something with an error + +ok my $unreliably = sub { + + ok $replicated->schema->resultset('ArtistXX')->find(5) + => 'replicant reactivated'; + +} => 'created coderef properly'; + +throws_ok {$replicated->schema->storage->execute_reliably($unreliably)} + qr/coderef returned an error: Can't find source for ArtistXX/ + => 'Bad coderef throws proper error'; + +## make sure transactions are set to execute_reliably + +ok my $transaction = sub { + + $replicated + ->schema + ->populate('Artist', [ + [ qw/artistid name/ ], + [ 666, "Children of the Grave"], + ]); + + ok my $result = $replicated->schema->resultset('Artist')->find(666); + +}; + +$replicated->schema->txn_do($transaction); + +## Make sure replication came back + +ok $replicated->schema->resultset('Artist')->find(5) + => 'replicant reactivated'; + ## Delete the old database files $replicated->cleanup;