/
111-Client.t
144 lines (111 loc) · 4.06 KB
/
111-Client.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
use v6;
use lib 't';
use Test;
use Test-support;
use MongoDB;
use MongoDB::Client;
use MongoDB::Server;
use MongoDB::Database;
use MongoDB::Collection;
use BSON::Document;
#-------------------------------------------------------------------------------
drop-send-to('mongodb');
#my $handle = 'MongoDB.mlog'.IO.open( :mode<wo>, :create, :truncate);
#modify-send-to( 'mongodb', :level(MongoDB::MdbLoglevels::Trace), :to($handle));
drop-send-to('screen');
#modify-send-to( 'screen', :level(MongoDB::MdbLoglevels::Trace));
info-message("Test start");
my MongoDB::Test-support $ts .= new;
my @serverkeys = $ts.serverkeys.sort;
my Int $p1 = $ts.server-control.get-port-number(@serverkeys[0]);
#exit(0);
#-------------------------------------------------------------------------------
subtest "Client behaviour while shutdown and start server", {
my @options = <serverSelectionTimeoutMS=5000 heartbeatFrequencyMS=500>;
my MongoDB::Client $client .= new(
:uri("mongodb://:$p1/?" ~ @options.join('&'))
);
my MongoDB::Server $server = $client.select-server;
is $client.server-status("localhost:$p1"), SS-Standalone,
"Status of server is SS-Standalone";
# Bring server down to see what Client does...
ok $ts.server-control.stop-mongod(@serverkeys[0]),
"Server @serverkeys[0] is stopped";
sleep 0.9;
$server = $client.select-server;
nok $server.defined, "Server is down";
# Bring server up again to see if the Client recovers...
ok $ts.server-control.start-mongod(@serverkeys[0]),
"Server @serverkeys[0] started";
sleep 0.9;
$server = $client.select-server;
ok $server.defined, 'Server is defined';
is $client.server-status("localhost:$p1"), SS-Standalone,
"Status of server is SS-Standalone again";
$client.cleanup;
}
#-------------------------------------------------------------------------------
subtest "Shutdown/restart server while inserting records", {
my @options = <serverSelectionTimeoutMS=5000 heartbeatFrequencyMS=500>;
my MongoDB::Client $client .= new(
:uri("mongodb://:$p1/?" ~ @options.join('&')),
);
my MongoDB::Server $server = $client.select-server;
is $client.server-status("localhost:$p1"), SS-Standalone, "Standalone server";
# Drop database test
my MongoDB::Database $database = $client.database('test');
my $doc = $database.run-command: (dropDatabase => 1,);
ok $doc<ok>, "Database test dropped";
# Write until it goes wrong because we'll shutdown the server
my Promise $p .= start( {
info-message('save several records');
# Setup collection and database
my MongoDB::Collection $collection = $client.collection('test.myColl');
$database = $collection.database;
# Setup document
my BSON::Document $req .= new: (
insert => $collection.name,
documents => [
BSON::Document.new((a => 1, b => 2),),
BSON::Document.new((a => 11, b => 22),),
]
);
my Int $c = 8;
for ^$c {
my BSON::Document $doc = $database.run-command($req);
my Str $msg = 'no document';
$msg = $doc<ok> ?? 'doc returned ok' !! 'doc returned not ok' if ?$doc;
info-message($msg);
sleep 1;
}
CATCH {
default {
like .message, /:s Failed to connect\: connection refused/, .message
}
}
"$c records inserted";
}
);
# Let it write at least once
sleep 0.7;
# Bring server down to see what Client does...
info-message('shutdown server');
ok $ts.server-control.stop-mongod(@serverkeys[0]),
"Server @serverkeys[0] is stopped";
sleep 1.0;
$server = $client.select-server;
nok $server.defined, "Server is down";
# Bring server up again to see ift Client recovers...
info-message('start server');
ok $ts.server-control.start-mongod(@serverkeys[0]),
"Server @serverkeys[0] started";
sleep 1.0;
# Wait for inserts to finish
is $p.result, "8 records inserted", "8 records inserted";
$client.cleanup;
}
#-------------------------------------------------------------------------------
# Cleanup
info-message("Test $?FILE end");
done-testing();
exit(0);