%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /home/opti/optisoftcom/.cpanm/work/1544535406.20768/MongoDB-v2.0.2/t/
Upload File :
Create Path :
Current File : /home/opti/optisoftcom/.cpanm/work/1544535406.20768/MongoDB-v2.0.2/t/max_time_ms.t

#  Copyright 2014 - present MongoDB, Inc.
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#  http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

use strict;
use warnings;
use version;
use Test::More 0.96;
use Test::Fatal;

use MongoDB;

use lib "t/lib";
use MongoDBTest qw(
  skip_unless_mongod build_client get_test_db server_type server_version
  skip_unless_failpoints_available
);

skip_unless_mongod();
skip_unless_failpoints_available();

my $conn           = build_client();
my $testdb         = get_test_db($conn);
my $server_type    = server_type($conn);
my $server_version = server_version($conn);

my $coll;
my $admin = $conn->get_database("admin");

note "CAP-401 test plan";

can_ok( 'MongoDB::Cursor', 'max_time_ms' );

$coll = $testdb->get_collection("test_collection");

my $bulk = $coll->ordered_bulk;
$bulk->insert_one( { _id => $_ } ) for 1 .. 20;
my $err = exception { $bulk->execute };
is( $err, undef, "inserted 20 documents for testing" );

my $iv = $coll->indexes;

subtest "expected behaviors" => sub {

    is( exception { $coll->find->max_time_ms()->next },  undef, "find->max_time_ms()" );
    is( exception { $coll->find->max_time_ms(0)->next }, undef, "find->max_time_ms(0)" );
    is( exception { $coll->find->max_time_ms(5000)->next },
        undef, "find->max_time_ms(5000)" );

    like( exception { $coll->find->max_time_ms(-1)->next },
        qr/non-negative/, "find->max_time_ms(-1) throws exception" );

    is( exception { $coll->find( {}, { maxTimeMS => 5000 } ) },
        undef, "find with maxTimeMS" );

    is(
        exception {
            my $doc = $coll->find_one( { _id => 1 }, undef, { maxTimeMS => 5000 } );
        },
        undef,
        "find_one with maxTimeMS works"
    );

    SKIP: {
        skip "aggregate not available until MongoDB v2.2", 1
            unless $server_version > v2.2.0;

        is(
            exception {
                my $doc = $coll->aggregate(
                    [ { '$project' => { name => 1, count => 1 } } ],
                    { maxTimeMS => 5000 },
                );
            },
            undef,
            "aggregate helper with maxTimeMS works"
        );
    }

    is(
        exception {
            my $doc = $coll->count_documents( {}, { maxTimeMS => 5000 } );
        },
        undef,
        "count helper with maxTimeMS works"
    );

    is(
        exception {
            my $doc = $coll->distinct( 'a', {}, { maxTimeMS => 5000 } );
        },
        undef,
        "distinct helper with maxTimeMS works"
    );

    is(
        exception {
            my $doc = $coll->find_one_and_replace(
                { _id    => 22 },
                { x      => 1 },
                { upsert => 1, maxTimeMS => 5000 }
            );
        },
        undef,
        "find_one_and_replace helper with maxTimeMS works"
    );

    is(
        exception {
            my $doc = $coll->find_one_and_update(
                { _id    => 23 },
                { '$set' => { x => 1 } },
                { upsert => 1, maxTimeMS => 5000 }
            );
        },
        undef,
        "find_one_and_update helper with maxTimeMS works"
    );

    is(
        exception {
            my $doc = $coll->find_one_and_delete( { _id => 23 }, { maxTimeMS => 5000 } );
        },
        undef,
        "find_one_and_delete helper with maxTimeMS works"
    );

    is(
        exception {
            my $cursor = $coll->database->list_collections( {}, { maxTimeMS => 5000 } );
        },
        undef,
        "list_collections command with maxTimeMS works"
    );

    subtest "parallel_scan" => sub { 
        plan skip_all => "Parallel scan not supported before MongoDB 2.6"
        unless $server_version >= v2.6.0;
        plan skip_all => "Parallel scan not supported on mongos"
        if $server_type eq 'Mongos';
        plan skip_all => "Not supported on Atlas Free Tier"
          if $ENV{ATLAS_PROXY};

        is(
            exception {
                my $cursor = $coll->parallel_scan( 20, { maxTimeMS => 5000 } );
            },
            undef,
            "parallel_scan command with maxTimeMS works"
        );
    };

};

subtest "force maxTimeMS failures" => sub {
    plan skip_all => "maxTimeMS not available before 2.6"
      unless $server_version >= v2.6.0;

    # low batchSize to force multiple batches to get all docs
    my $cursor = $coll->find( {}, { batchSize => 5, maxTimeMS => 5000 } )->result;
    $cursor->next; # before turning on fail point

    is(
        exception {
            $admin->run_command(
                [ configureFailPoint => 'maxTimeAlwaysTimeOut', mode => 'alwaysOn' ] );
        },
        undef,
        "turned on maxTimeAlwaysTimeOut fail point"
    );

    my @foo;
    like(
        exception { @foo = $cursor->all },
        qr/exceeded time limit/,
        "existing cursor with max_time_ms times out"
    ) or diag explain \@foo;

    like(
        exception { $coll->find()->max_time_ms(10)->next },
        qr/exceeded time limit/,
        "new cursor with max_time_ms times out"
    );

    like(
        exception { $coll->find( {}, { maxTimeMS => 10 } )->next },
        qr/exceeded time limit/,
        , "find with maxTimeMS times out"
    );

    like(
        exception {
            my $doc = $coll->find_one( { _id => 1 }, undef, { maxTimeMS => 10 } );
        },
        qr/exceeded time limit/,
        "find_one with maxTimeMS times out"
    );

    like(
        exception {
            my $doc = $coll->count_documents( {}, { maxTimeMS => 10 } );
        },
        qr/exceeded time limit/,
        "count command with maxTimeMS times out"
    );

    SKIP: {
        skip "aggregate not available until MongoDB v2.2", 1
            unless $server_version > v2.2.0;

        like(
            exception {
                my $doc = $coll->aggregate(
                    [ { '$project' => { name => 1, count => 1 } } ],
                    { maxTimeMS => 10 },
                );
            },
            qr/exceeded time limit/,
            "aggregate helper with maxTimeMS times out"
        );
    }

    like(
        exception {
            my $doc = $coll->count_documents( {}, { maxTimeMS => 10 } );
        },
        qr/exceeded time limit/,
        "count helper with maxTimeMS times out"
    );

    like(
        exception {
            my $doc = $coll->distinct( 'a', {}, { maxTimeMS => 10 } );
        },
        qr/exceeded time limit/,
        "distinct helper with maxTimeMS times out"
    );

    like(
        exception {
            my $doc = $coll->find_one_and_replace(
                { _id    => 22 },
                { x      => 1 },
                { upsert => 1, maxTimeMS => 10 }
            );
        },
        qr/exceeded time limit/,
        "find_one_and_replace helper with maxTimeMS times out"
    );

    like(
        exception {
            my $doc = $coll->find_one_and_update(
                { _id    => 23 },
                { '$set' => { x => 1 } },
                { upsert => 1, maxTimeMS => 10 }
            );
        },
        qr/exceeded time limit/,
        "find_one_and_update helper with maxTimeMS times out"
    );

    like(
        exception {
            my $doc = $coll->find_one_and_delete( { _id => 23 }, { maxTimeMS => 10 } );
        },
        qr/exceeded time limit/,
        "find_one_and_delete helper with maxTimeMS times out"
    );

    like(
        exception {
            my $cursor = $coll->database->list_collections( {}, { maxTimeMS => 10 } );
        },
        qr/exceeded time limit/,
        "list_collections command times out"
    );

    subtest "parallel_scan" => sub { 
        plan skip_all => "Parallel scan not supported before MongoDB 2.6"
        unless $server_version >= v2.6.0;
        plan skip_all => "Parallel scan not supported on mongos"
        if $server_type eq 'Mongos';

        like(
            exception {
                my $cursor = $coll->parallel_scan( 20, { maxTimeMS => 10 } );
            },
            qr/exceeded time limit/,
            "parallel_scan command times out"
        );
    };

    subtest "max_time_ms via constructor" => sub {
        is(
            exception { my $doc = $coll->count_documents( {} ) },
            undef,
            "count helper with default maxTimeMS 0 from client works"
        );

        my $conn2   = build_client( max_time_ms => 10 );
        my $testdb2 = get_test_db($conn2);
        my $coll2   = $testdb2->get_collection("test_collection");

        like(
            exception {
                my $doc = $coll2->count_documents( {} );
            },
            qr/exceeded time limit/,
            "count helper with configured maxTimeMS times out"
        );
    };

    subtest "zero disables maxTimeMS" => sub {
        is( exception { $coll->find->max_time_ms(0)->next }, undef, "find->max_time_ms(0)" );
        is( exception { $coll->find( {}, { maxTimeMS => 5000 } ) },
            undef, "find with MaxTimeMS 5000 works" );

        is(
            exception {
                my $doc = $coll->find_one( { _id => 1 }, undef, { maxTimeMS => 0 } );
            },
            undef,
            "find_one with MaxTimeMS zero works"
        );

        SKIP: {
            skip "aggregate not available until MongoDB v2.2", 1
                unless $server_version > v2.2.0;
            is(
                exception {
                    my $doc = $coll->aggregate(
                        [ { '$project' => { name => 1, count => 1 } } ],
                        { maxTimeMS => 0 },
                    );
                },
                undef,
                "aggregate helper with MaxTimeMS zero works"
            );
        }

        is(
            exception {
                my $doc = $coll->count_documents( {}, { maxTimeMS => 0 } );
            },
            undef,
            "count helper with MaxTimeMS zero works"
        );

        is(
            exception {
                my $doc = $coll->distinct( 'a', {}, { maxTimeMS => 0 } );
            },
            undef,
            "distinct helper with MaxTimeMS zero works"
        );

        is(
            exception {
                my $doc = $coll->find_one_and_replace(
                    { _id    => 22 },
                    { x      => 1 },
                    { upsert => 1, maxTimeMS => 0 }
                );
            },
            undef,
            "find_one_and_replace helper with MaxTimeMS zero works"
        );

        is(
            exception {
                my $doc = $coll->find_one_and_update(
                    { _id    => 23 },
                    { '$set' => { x => 1 } },
                    { upsert => 1, maxTimeMS => 0 }
                );
            },
            undef,
            "find_one_and_update helper with MaxTimeMS zero works"
        );

        is(
            exception {
                my $doc = $coll->find_one_and_delete( { _id => 23 }, { maxTimeMS => 0 } );
            },
            undef,
            "find_one_and_delete helper with MaxTimeMS zero works"
        );

    };

    is(
        exception {
            $admin->run_command(
                [ configureFailPoint => 'maxTimeAlwaysTimeOut', mode => 'off' ] );
        },
        undef,
        "turned off maxTimeAlwaysTimeOut fail point"
    );
};

subtest "create_many w/ maxTimeMS" => sub {
    plan skip_all => "maxTimeMS not available before 3.6"
      unless $server_version >= v3.6.0;

    $coll->drop;

    is(
        exception {
            $admin->run_command([
                configureFailPoint => 'maxTimeAlwaysTimeOut',
                mode => 'alwaysOn',
            ]);
        },
        undef,
        'max time failpoint on',
    );

    like(
        exception {
            $iv->create_many(
                { keys => [ x => 1 ] }, { keys => [ y => -1 ] },
                { maxTimeMS => 10 },
            );
        },
        qr/exceeded time limit/,
        'timeout for index creation',
    );

    is(
        exception {
            $iv->create_many(
                { keys => [ x => 1 ] }, { keys => [ y => -1 ] },
            );
        },
        undef,
        'no timeout without max time',
    );

    is(
        exception {
            $admin->run_command([
                configureFailPoint => 'maxTimeAlwaysTimeOut',
                mode => 'off',
            ]);
        },
        undef,
        'max time failpoint off',
    );

    is(
        exception {
            $iv->create_many(
                { keys => [ x => 1 ] }, { keys => [ y => -1 ] },
                { maxTimeMS => 5000 },
            );
        },
        undef,
        'no timeout for index creation',
    );
};

subtest "create_one w/ maxTimeMS" => sub {
    plan skip_all => "maxTimeMS not available before 3.6"
      unless $server_version >= v3.6.0;

    $coll->drop;

    is(
        exception {
            $admin->run_command([
                configureFailPoint => 'maxTimeAlwaysTimeOut',
                mode => 'alwaysOn',
            ]);
        },
        undef,
        'max time failpoint on',
    );

    is(
        exception {
            $iv->create_one([ x => 1 ]);
        },
        undef,
        'no timeout without max time',
    );

    like(
        exception {
            $iv->create_one([ x => 1 ], { maxTimeMS => 10 });
        },
        qr/exceeded time limit/,
        'timeout for index creation',
    );

    is(
        exception {
            $admin->run_command([
                configureFailPoint => 'maxTimeAlwaysTimeOut',
                mode => 'off',
            ]);
        },
        undef,
        'max time failpoint off',
    );

    is(
        exception {
            $iv->create_one([ x => 1 ], { maxTimeMS => 5000 });
        },
        undef,
        'no timeout for index creation',
    );
};

subtest "drop_one w/ maxTimeMS" => sub {
    plan skip_all => "maxTimeMS not available before 3.6"
      unless $server_version >= v3.6.0;

    $coll->drop;

    is(
        exception {
            $admin->run_command([
                configureFailPoint => 'maxTimeAlwaysTimeOut',
                mode => 'alwaysOn',
            ]);
        },
        undef,
        'max time failpoint on',
    );

    is(
        exception {
            my $name = $iv->create_one([ x => 1 ]);
            $iv->drop_one($name);
        },
        undef,
        'no timeout without max time',
    );

    like(
        exception {
            my $name = $iv->create_one([ x => 1 ]);
            $iv->drop_one($name, { maxTimeMS => 10 });
        },
        qr/exceeded time limit/,
        'timeout for index drop',
    );

    is(
        exception {
            $admin->run_command([
                configureFailPoint => 'maxTimeAlwaysTimeOut',
                mode => 'off',
            ]);
        },
        undef,
        'max time failpoint off',
    );

    is(
        exception {
            my $name = $iv->create_one([ x => 1 ]);
            $iv->drop_one($name, { maxTimeMS => 5000 });
        },
        undef,
        'no timeout for index drop',
    );
};

subtest "drop_all w/ maxTimeMS" => sub {
    plan skip_all => "maxTimeMS not available before 3.6"
      unless $server_version >= v3.6.0;

    $coll->drop;

    is(
        exception {
            $admin->run_command([
                configureFailPoint => 'maxTimeAlwaysTimeOut',
                mode => 'alwaysOn',
            ]);
        },
        undef,
        'max time failpoint on',
    );

    is(
        exception {
            $iv->create_many( map { { keys => $_ } }[ x => 1 ], [ y => 1 ], [ z => 1 ] );
            $iv->drop_all();
        },
        undef,
        'no timeout without max time',
    );

    like(
        exception {
            $iv->create_many( map { { keys => $_ } }[ x => 1 ], [ y => 1 ], [ z => 1 ] );
            $iv->drop_all({ maxTimeMS => 10 });
        },
        qr/exceeded time limit/,
        'timeout for index drop',
    );

    is(
        exception {
            $admin->run_command([
                configureFailPoint => 'maxTimeAlwaysTimeOut',
                mode => 'off',
            ]);
        },
        undef,
        'max time failpoint off',
    );

    is(
        exception {
            $iv->create_many( map { { keys => $_ } }[ x => 1 ], [ y => 1 ], [ z => 1 ] );
            $iv->drop_all({ maxTimeMS => 5000 });
        },
        undef,
        'no timeout for index drop',
    );
};

done_testing;

Zerion Mini Shell 1.0