Couchbase

 view release on metacpan or  search on metacpan

lib/Couchbase/Test/ClientSync.pm  view on Meta::CPAN

    multi_ok(\@docs, "Multi upsert OK");

    $batch = $o->batch();
    map {$batch->get($_)} @docs;
    $batch->wait_all();
    multi_ok(\@docs, "Multi get OK");

    is(scalar grep($_->value eq $_->id, @docs), scalar @docs, "get_multi: Got expected values");

    $batch = $o->batch();
    map{$batch->remove($_)} @docs;
    $batch->wait_all();
    multi_ok(\@docs, "Multi remove OK");
}

sub T07_stats :Test(no_plan) {
    my $self = shift;
    my $o = $self->cbo;
    my $rv = $o->stats();
    ok($rv->is_ok);
    my $stats = $rv->value;

    ok($stats && ref $stats eq 'HASH', "Got a hashref");
    ok(scalar keys %$stats, "stats not empty");

    if($self->mock && $self->mock->nodes) {
        ok(scalar keys %$stats == $self->mock->nodes, "Got expected stat count");
    } else {
        diag "Cannot determine expected stat count for real cluster";
    }
}

sub T08_iterator :Test(no_plan) {
    my $self = shift;
    my $o = $self->cbo;
    my @docs = map { Couchbase::Document->new("T08_NonExistent_$_") } (1..200);
    my $batch = $o->batch;
    map {$batch->get($_)} @docs;

    my %khash = ();
    while ((my $doc = $batch->wait_one)) {
        if (exists $khash{$doc->id}) {
            fail("Document returned twice!");
        }
        if (!$doc->is_not_found) {
            fail("Expected NOT_FOUND");
        }
        $khash{$doc->id} = 1;
    }
    is(200, scalar values %khash)
}

sub T10_locks :Test(no_plan) {
    my $self = shift;
    my $o = $self->cbo;
    my $doc = Couchbase::Document->new("GETL", "value");

    $o->remove($doc); # Ensure it's gone
    $o->insert($doc);
    ok($o->get_and_lock($doc, {lock_duration=>10}), "Locked OK");
    ok($o->unlock($doc), "Unlocked OK");
    #ok($o->unlock($doc), "Unlock again fails");
    #
    #print Dumper($doc);
    #
    #is(COUCHBASE_ETMPFAIL, $doc->errnum, "Temporary failure returned for re-locking");

    # Unlock while locked, but with bad CAS
    my $doc2 = $doc->copy();
    ok($o->get_and_lock($doc2, {lock_duration=>10}));

    $doc->_cas(0xdeadbeef);
    ok((!$o->unlock($doc)), "Can't unlock with stale CAS");
    ok($o->unlock($doc2), "Unlock with good CAS ok");

    # Lock without a timeout (should fail)
    eval { $o->get_and_lock($doc) };
    ok($@, "Can't lock without explicit duration");
    eval { $o->unlock(Couchbase::Document->new("dummy"))};
    ok($@, "Can't unlock with no CAS");

    $o->get_and_lock($doc, {lock_duration=>5});
    ok($o->upsert($doc), "Implicit unlock with CAS ok");
    $o->remove($doc); # Clean up
}

sub wait_for_exp {
    my ($o,$doc,$limit) = @_;
    my $begin_time = time();
    while (time() - $begin_time < $limit) {
        sleep(1);
        $o->get($doc);
        if ($doc->errnum == COUCHBASE_KEY_ENOENT) {
            return 1;
        }
        diag("Sleeping again..");
    }
    return 0;
}

sub T11_expiry :Test(no_plan) {
    my $self = shift;
    my $o = $self->cbo;

    my $doc = Couchbase::Document->new("exp_key", "exp_val", {expiry=>1});
    ok($o->upsert($doc), "Inserted document with expiry");
    ok(wait_for_exp($o, $doc, 3), "Document is no longer here (expired!)");

    $doc->expiry("bad-expiry");
    eval { $o->upsert($doc) };
    ok($@, "Set with bad expiry raises error ($@)");

    $doc->expiry(-1);
    eval { $o->upsert($doc) };
    ok($@, "Set with negative expiry raises error ($@)");

    # Restore the expiry:
    $doc->expiry(1);
}

sub T12_observe :Test(no_plan) {
    my $self = shift;
    my $cb = $self->cbo;
    my $doc = Couchbase::Document->new("Hello", "World");
    $cb->upsert($doc);

    my $obsret = $cb->observe($doc);
    my @m = grep { $_->{master} } @{$obsret->value};



( run in 0.440 second using v1.01-cache-2.11-cpan-483215c6ad5 )