The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use Test::More;
use Test::Exception;
use Test::Warn;
use Coro;
use Coro::EV;
use MongoDB::Async::Timestamp; # needed if db is being run as master

use MongoDB::Async;
use MongoDB::Async::Pool;


my $pool;
my @conns;

eval {
    my $host = "127.0.0.1";
    if (exists $ENV{MONGOD}) {
        $host = $ENV{MONGOD};
    }
    $pool = MongoDB::Async::Pool->new({host => $host, ssl => $ENV{MONGO_SSL}}, { timeout => 2});
};

if ($@) {
    plan skip_all => $@;
}
else {
    plan tests => 6;
}

push @conns, $pool->get;
push @conns, $pool->get;
push @conns, $pool->get;
push @conns, $pool->get;
push @conns, $pool->get;


	
is($pool->connections_in_use, 5, "allocating connections - connections_in_use");
is($pool->connections_in_pool, 0, "allocating connections - connections_in_pool");

#  test that we not creating new connection when already have 5 connection in pool
@conns = ();
push @conns, $pool->get;
push @conns, $pool->get;
push @conns, $pool->get;
push @conns, $pool->get;
push @conns, $pool->get;
@conns = ();


is($pool->connections_in_use, 0, "keeping connections - connections_in_use");
is($pool->connections_in_pool + @{$pool->{pool}}, 10, "keeping connections - connections_in_pool");


my $coll = $pool->get->driver_test_db->d_test_coll;

$coll->save({ _id => $_ , nyan => ("nyan" x 4096)}) for (1...3000);

# $pool->max_conns(1);

my $queries_running = 0;
my $max_running = 0;
my $queries_completed = 0;

async {
	# warn 'start';
	
	$max_running = $queries_running if $queries_running > $max_running;
	$queries_running++;
	$pool->get->driver_test_db->d_test_coll->find()->data;
	$queries_running--;
	
	$queries_completed++;
	
	if($queries_completed == 5){
		is($queries_completed, 5, 'all async queries compleated');
	
		$pool->get->driver_test_db->d_test_coll->drop();
		
		# is($max_running, 3, 'max_conn blocks coro');
		# TODO: write tests for testing timeout and max_conns. I tested it manually and i seems OK
		
		
		# global destruction not detected when running make test. Cleanup
		$_->{_parent_pool} = undef for @{$pool->{pool}};
		exit 0;
	}
	
	# warn 'done';
} for (1..5);

async {
	schedule while( $queries_running == 1 );
	
	ok($queries_running > 1, 'async queries in multiple connections');
	
};


# warn 'start loop';
my $w = EV::timer 3600, 3600, sub {}; # prevent EV::loop from exiting
EV::loop;