19
19
using System . IO ;
20
20
using System . Linq ;
21
21
using System . Reflection ;
22
- using System . Threading ;
23
22
using MongoDB . Bson ;
24
- using MongoDB . Bson . TestHelpers . XunitExtensions ;
25
- using MongoDB . Driver . Core . Clusters ;
26
23
using MongoDB . Driver . Core . TestHelpers . XunitExtensions ;
24
+ using MongoDB . Driver . TestHelpers ;
27
25
using Xunit ;
28
26
using Xunit . Abstractions ;
29
27
@@ -44,7 +42,7 @@ public void RunTestDefinition(TestCase testCase)
44
42
var async = testCase . Async ;
45
43
46
44
VerifyServerRequirements ( definition ) ;
47
- VerifyFields ( definition , "path" , "data" , "minServerVersion" , "maxServerVersion ", "tests" ) ;
45
+ VerifyFields ( definition , "path" , "data" , "runOn " , "tests" ) ;
48
46
49
47
InitializeCollection ( definition ) ;
50
48
RunTest ( test , async ) ;
@@ -53,23 +51,14 @@ public void RunTestDefinition(TestCase testCase)
53
51
// private methods
54
52
private void VerifyServerRequirements ( BsonDocument definition )
55
53
{
56
- RequireServer . Check ( ) . ClusterType ( ClusterType . ReplicaSet ) ;
57
-
58
- if ( CoreTestConfiguration . GetStorageEngine ( ) == "mmapv1" )
59
- {
60
- throw new SkipException ( "Test skipped because mmapv1 does not support retryable writes." ) ;
61
- }
62
-
63
- BsonValue minServerVersion ;
64
- if ( definition . TryGetValue ( "minServerVersion" , out minServerVersion ) )
54
+ if ( definition . TryGetValue ( "runOn" , out var runOn ) )
65
55
{
66
- RequireServer . Check ( ) . VersionGreaterThanOrEqualTo ( minServerVersion . AsString ) ;
56
+ RequireServer . Check ( ) . RunOn ( runOn . AsBsonArray ) ;
67
57
}
68
58
69
- BsonValue maxServerVersion ;
70
- if ( definition . TryGetValue ( "maxServerVersion" , out maxServerVersion ) )
59
+ if ( CoreTestConfiguration . GetStorageEngine ( ) == "mmapv1" )
71
60
{
72
- RequireServer . Check ( ) . VersionLessThanOrEqualTo ( maxServerVersion . AsString ) ;
61
+ throw new SkipException ( "Test skipped because mmapv1 does not support retryable writes." ) ;
73
62
}
74
63
}
75
64
@@ -96,35 +85,41 @@ private void InitializeCollection(BsonDocument definition)
96
85
97
86
private void RunTest ( BsonDocument test , bool async )
98
87
{
99
- VerifyFields ( test , "description" , "clientOptions" , "failPoint" , "operation" , "outcome" ) ;
100
- var clientOptions = ( BsonDocument ) test . GetValue ( "clientOptions" , null ) ;
88
+ VerifyFields ( test , "description" , "clientOptions" , "failPoint" , "operation" , "outcome" , "useMultipleMongoses" ) ;
101
89
var failPoint = ( BsonDocument ) test . GetValue ( "failPoint" , null ) ;
102
90
var operation = test [ "operation" ] . AsBsonDocument ;
103
91
var outcome = test [ "outcome" ] . AsBsonDocument ;
104
92
105
- var client = CreateClient ( clientOptions ) ;
106
- var database = client . GetDatabase ( _databaseName ) ;
107
- var collection = database . GetCollection < BsonDocument > ( _collectionName ) ;
108
- var executableTest = CreateExecutableTest ( operation ) ;
109
-
110
- using ( ConfigureFailPoint ( client , failPoint ) )
93
+ using ( var client = CreateDisposableClient ( test ) )
111
94
{
112
- executableTest . Execute ( collection , async ) ;
113
- }
95
+ var database = client . GetDatabase ( _databaseName ) ;
96
+ var collection = database . GetCollection < BsonDocument > ( _collectionName ) ;
97
+ var executableTest = CreateExecutableTest ( operation ) ;
98
+
99
+ using ( ConfigureFailPoint ( client , failPoint ) )
100
+ {
101
+ executableTest . Execute ( collection , async ) ;
102
+ }
114
103
115
- executableTest . VerifyOutcome ( collection , outcome ) ;
104
+ executableTest . VerifyOutcome ( collection , outcome ) ;
105
+ }
116
106
}
117
107
118
- private IMongoClient CreateClient ( BsonDocument clientOptions )
108
+ private DisposableMongoClient CreateDisposableClient ( BsonDocument test )
119
109
{
120
- var clientSettings = ParseClientOptions ( clientOptions ) ;
121
- return new MongoClient ( clientSettings ) ;
110
+ var useMultipleShardRouters = test . GetValue ( "useMultipleMongoses" , false ) . AsBoolean ;
111
+ var clientOptions = ( BsonDocument ) test . GetValue ( "clientOptions" , null ) ;
112
+
113
+ return DriverTestConfiguration . CreateDisposableClient (
114
+ settings =>
115
+ {
116
+ ParseClientOptions ( settings , clientOptions ) ;
117
+ } ,
118
+ useMultipleShardRouters ) ;
122
119
}
123
120
124
- private MongoClientSettings ParseClientOptions ( BsonDocument clientOptions )
121
+ private void ParseClientOptions ( MongoClientSettings settings , BsonDocument clientOptions )
125
122
{
126
- var settings = DriverTestConfiguration . Client . Settings . Clone ( ) ;
127
-
128
123
if ( clientOptions == null )
129
124
{
130
125
settings . RetryWrites = true ;
@@ -147,8 +142,6 @@ private MongoClientSettings ParseClientOptions(BsonDocument clientOptions)
147
142
}
148
143
}
149
144
}
150
-
151
- return settings ;
152
145
}
153
146
154
147
private IRetryableWriteTest CreateExecutableTest ( BsonDocument operation )
@@ -160,13 +153,15 @@ private IRetryableWriteTest CreateExecutableTest(BsonDocument operation)
160
153
{
161
154
case "bulkWrite" : executableTest = new BulkWriteTest ( ) ; break ;
162
155
case "deleteOne" : executableTest = new DeleteOneTest ( ) ; break ;
156
+ case "deleteMany" : executableTest = new DeleteManyTest ( ) ; break ;
163
157
case "findOneAndDelete" : executableTest = new FindOneAndDeleteTest ( ) ; break ;
164
158
case "findOneAndReplace" : executableTest = new FindOneAndReplaceTest ( ) ; break ;
165
159
case "findOneAndUpdate" : executableTest = new FindOneAndUpdateTest ( ) ; break ;
166
160
case "insertOne" : executableTest = new InsertOneTest ( ) ; break ;
167
161
case "insertMany" : executableTest = new InsertManyTest ( ) ; break ;
168
162
case "replaceOne" : executableTest = new ReplaceOneTest ( ) ; break ;
169
163
case "updateOne" : executableTest = new UpdateOneTest ( ) ; break ;
164
+ case "updateMany" : executableTest = new UpdateManyTest ( ) ; break ;
170
165
default : throw new ArgumentException ( $ "Unexpected operation name: { operationName } .") ;
171
166
}
172
167
executableTest . Initialize ( operation ) ;
0 commit comments