X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F93storage_replication.t;h=7617af36398d17fbd8168d78763296eff4e11a99;hb=9c0df5f32b68e23c670c89ce6cdbff60b4bd0ed0;hp=eb31c816cff37b9c9d8258da790d698aebc67c28;hpb=de5dc9efd2c3575f78a7dc71c50d571c9a17c38d;p=dbsrgits%2FDBIx-Class.git diff --git a/t/93storage_replication.t b/t/93storage_replication.t index eb31c81..7617af3 100644 --- a/t/93storage_replication.t +++ b/t/93storage_replication.t @@ -8,7 +8,7 @@ BEGIN { eval "use Moose; use Test::Moose"; plan $@ ? ( skip_all => 'needs Moose for testing' ) - : ( tests => 41 ); + : ( tests => 50 ); } use_ok 'DBIx::Class::Storage::DBI::Replicated::Pool'; @@ -61,11 +61,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 +198,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,7 +213,7 @@ 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'; does_ok $replicated_storages[0] @@ -365,10 +368,71 @@ ok $replicated->schema->resultset('Artist')->find(2) ## Getting slave status tests -use Data::Dump qw/dump/; -my $lag1 = $replicated->schema->storage->replicants->{$replicant_names[0]}->lag_behind_master; -warn dump $lag1; - +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"; +} + ## Delete the old database files $replicated->cleanup;