use strict; use warnings; use Test::More; use MongoDB; use Try::Tiny; use threads; my $conn = try { MongoDB::Connection->new({ host => exists $ENV{MONGOD} ? $ENV{MONGOD} : 'localhost', ssl => $ENV{MONGO_SSL} }); } catch { plan skip_all => $_; }; my $col = $conn->get_database('moo')->get_collection('kooh'); $col->drop; { my $ret = try { threads->create(sub { $col->insert({ foo => 42 }, { safe => 1 }); })->join->value; } catch { diag $_; }; ok $ret, 'we survived destruction of a cloned connection'; my $o = $col->find_one({ foo => 42 }); is $ret, $o->{_id}, 'we inserted and joined the OID back'; } { my @threads = map { threads->create(sub { my $col = $conn->get_database('moo')->get_collection('kooh'); $col->insert({ foo => threads->self->tid }, { safe => 1 }); }) } 0 .. 9; my @vals = map { $_->tid } @threads; my @ids = map { $_->join } @threads; is scalar keys %{ { map { ($_ => 1) } @ids } }, scalar @ids, 'we got 10 unique OIDs'; is_deeply( [map { $col->find_one({ _id => $_ })->{foo} } @ids], [@vals], 'right values inserted from threads', ); } END { if ($conn) { $conn->moo->drop; } } done_testing();