Skip to content

Commit 1dec08f

Browse files
CSHARP-2184: Update server selection tests for read preferences with sharded clusters.
1 parent 1f1f7e9 commit 1dec08f

21 files changed

+621
-163
lines changed

tests/MongoDB.Driver.Core.Tests/Specifications/server-selection/ServerSelectionTestRunner.cs

Lines changed: 23 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,11 @@
1414
*/
1515

1616
using System;
17-
using System.Collections;
1817
using System.Collections.Generic;
19-
using System.IO;
2018
using System.Linq;
21-
using System.Reflection;
2219
using FluentAssertions;
2320
using MongoDB.Bson;
21+
using MongoDB.Bson.TestHelpers.JsonDrivenTests;
2422
using MongoDB.Driver.Core.Clusters;
2523
using MongoDB.Driver.Core.Clusters.ServerSelectors;
2624
using MongoDB.Driver.Core.Misc;
@@ -36,8 +34,12 @@ public class ServerSelectionTestRunner
3634

3735
[Theory]
3836
[ClassData(typeof(TestCaseFactory))]
39-
public void RunTestDefinition(BsonDocument definition)
37+
public void RunTestDefinition(JsonDrivenTestCase testCase)
4038
{
39+
var definition = testCase.Test;
40+
41+
JsonDrivenHelper.EnsureAllFieldsAreValid(definition, "_path", "in_latency_window", "operation", "read_preference", "suitable_servers", "topology_description", "heartbeatFrequencyMS", "error");
42+
4143
var error = definition.GetValue("error", false).ToBoolean();
4244
var heartbeatInterval = TimeSpan.FromMilliseconds(definition.GetValue("heartbeatFrequencyMS", 10000).ToInt64());
4345
var clusterDescription = BuildClusterDescription((BsonDocument)definition["topology_description"], heartbeatInterval);
@@ -108,6 +110,8 @@ private void AssertServers(List<ServerDescription> actual, List<ServerDescriptio
108110

109111
private ReadPreference BuildReadPreference(BsonDocument readPreferenceDescription)
110112
{
113+
JsonDrivenHelper.EnsureAllFieldsAreValid(readPreferenceDescription, "mode", "tag_sets", "maxStalenessSeconds");
114+
111115
var mode = (ReadPreferenceMode)Enum.Parse(typeof(ReadPreferenceMode), readPreferenceDescription["mode"].AsString);
112116

113117
IEnumerable<TagSet> tagSets = null;
@@ -136,6 +140,8 @@ private ReadPreference BuildReadPreference(BsonDocument readPreferenceDescriptio
136140

137141
private ClusterDescription BuildClusterDescription(BsonDocument topologyDescription, TimeSpan heartbeatInterval)
138142
{
143+
JsonDrivenHelper.EnsureAllFieldsAreValid(topologyDescription, "servers", "type");
144+
139145
var clusterType = GetClusterType(topologyDescription["type"].ToString());
140146
var servers = BuildServerDescriptions((BsonArray)topologyDescription["servers"], heartbeatInterval);
141147

@@ -174,6 +180,8 @@ private ClusterType GetClusterType(string type)
174180

175181
private ServerDescription BuildServerDescription(BsonDocument serverDescription, TimeSpan heartbeatInterval)
176182
{
183+
JsonDrivenHelper.EnsureAllFieldsAreValid(serverDescription, "address", "avg_rtt_ms", "tags", "type", "lastUpdateTime", "lastWrite", "maxWireVersion");
184+
177185
var endPoint = EndPointHelper.Parse(serverDescription["address"].ToString());
178186
var averageRoundTripTime = TimeSpan.FromMilliseconds(serverDescription.GetValue("avg_rtt_ms", 0.0).ToDouble());
179187
var type = GetServerType(serverDescription["type"].ToString());
@@ -244,48 +252,24 @@ private ServerType GetServerType(string type)
244252

245253
private TagSet BuildTagSet(BsonDocument tagSet)
246254
{
255+
JsonDrivenHelper.EnsureAllFieldsAreValid(tagSet, "data_center", "rack", "other_tag");
256+
247257
return new TagSet(tagSet.Elements.Select(x => new Tag(x.Name, x.Value.ToString())));
248258
}
249259

250-
private class TestCaseFactory : IEnumerable<object[]>
260+
// nested types
261+
private class TestCaseFactory : JsonDrivenTestCaseFactory
251262
{
252-
public IEnumerator<object[]> GetEnumerator()
263+
protected override string[] PathPrefixes => new[]
253264
{
254-
const string prefix = "MongoDB.Driver.Core.Tests.Specifications.server_selection.tests.server_selection.";
255-
const string maxStalenessPrefix = "MongoDB.Driver.Core.Tests.Specifications.max_staleness.tests.";
256-
var executingAssembly = typeof(TestCaseFactory).GetTypeInfo().Assembly;
257-
var enumerable = executingAssembly
258-
.GetManifestResourceNames()
259-
.Where(path => (path.StartsWith(prefix) || path.StartsWith(maxStalenessPrefix)) && path.EndsWith(".json"))
260-
.Select(path =>
261-
{
262-
var definition = ReadDefinition(path);
263-
definition.InsertAt(0, new BsonElement("path", path));
264-
//var data = new TestCaseData(definition);
265-
//data.SetCategory("Specifications");
266-
//data.SetCategory("server-selection");
267-
//var fullName = path.Remove(0, prefix.Length);
268-
//data = data.SetName(fullName.Remove(fullName.Length - 5).Replace(".", "_"));
269-
var data = new object[] { definition };
270-
return data;
271-
});
272-
return enumerable.GetEnumerator();
273-
}
274-
275-
IEnumerator IEnumerable.GetEnumerator()
276-
{
277-
return GetEnumerator();
278-
}
265+
"MongoDB.Driver.Core.Tests.Specifications.server_selection.tests.server_selection.",
266+
"MongoDB.Driver.Core.Tests.Specifications.max_staleness.tests."
267+
};
279268

280-
private static BsonDocument ReadDefinition(string path)
269+
protected override IEnumerable<JsonDrivenTestCase> CreateTestCases(BsonDocument document)
281270
{
282-
var executingAssembly = typeof(TestCaseFactory).GetTypeInfo().Assembly;
283-
using (var definitionStream = executingAssembly.GetManifestResourceStream(path))
284-
using (var definitionStringReader = new StreamReader(definitionStream))
285-
{
286-
var definitionString = definitionStringReader.ReadToEnd();
287-
return BsonDocument.Parse(definitionString);
288-
}
271+
var name = GetTestCaseName(document, document, 0);
272+
yield return new JsonDrivenTestCase(name, document, document);
289273
}
290274
}
291275
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"topology_description": {
3+
"type": "Sharded",
4+
"servers": [
5+
{
6+
"address": "g:27017",
7+
"avg_rtt_ms": 5,
8+
"type": "Mongos"
9+
},
10+
{
11+
"address": "h:27017",
12+
"avg_rtt_ms": 35,
13+
"type": "Mongos"
14+
}
15+
]
16+
},
17+
"operation": "read",
18+
"read_preference": {
19+
"mode": "Nearest",
20+
"tag_sets": [
21+
{
22+
"data_center": "nyc"
23+
}
24+
]
25+
},
26+
"suitable_servers": [
27+
{
28+
"address": "g:27017",
29+
"avg_rtt_ms": 5,
30+
"type": "Mongos"
31+
},
32+
{
33+
"address": "h:27017",
34+
"avg_rtt_ms": 35,
35+
"type": "Mongos"
36+
}
37+
],
38+
"in_latency_window": [
39+
{
40+
"address": "g:27017",
41+
"avg_rtt_ms": 5,
42+
"type": "Mongos"
43+
}
44+
]
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
topology_description:
2+
type: Sharded
3+
servers:
4+
- &1
5+
address: g:27017
6+
avg_rtt_ms: 5
7+
type: Mongos
8+
- &2
9+
address: h:27017
10+
avg_rtt_ms: 35
11+
type: Mongos
12+
operation: read
13+
read_preference:
14+
mode: Nearest
15+
tag_sets:
16+
- data_center: nyc
17+
suitable_servers:
18+
- *1
19+
- *2
20+
in_latency_window:
21+
- *1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
"topology_description": {
3+
"type": "Sharded",
4+
"servers": [
5+
{
6+
"address": "g:27017",
7+
"avg_rtt_ms": 5,
8+
"type": "Mongos"
9+
},
10+
{
11+
"address": "h:27017",
12+
"avg_rtt_ms": 35,
13+
"type": "Mongos"
14+
}
15+
]
16+
},
17+
"operation": "read",
18+
"read_preference": {
19+
"mode": "Primary"
20+
},
21+
"suitable_servers": [
22+
{
23+
"address": "g:27017",
24+
"avg_rtt_ms": 5,
25+
"type": "Mongos"
26+
},
27+
{
28+
"address": "h:27017",
29+
"avg_rtt_ms": 35,
30+
"type": "Mongos"
31+
}
32+
],
33+
"in_latency_window": [
34+
{
35+
"address": "g:27017",
36+
"avg_rtt_ms": 5,
37+
"type": "Mongos"
38+
}
39+
]
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
topology_description:
2+
type: Sharded
3+
servers:
4+
- &1
5+
address: g:27017
6+
avg_rtt_ms: 5
7+
type: Mongos
8+
- &2
9+
address: h:27017
10+
avg_rtt_ms: 35
11+
type: Mongos
12+
operation: read
13+
read_preference:
14+
mode: Primary
15+
suitable_servers:
16+
- *1
17+
- *2
18+
in_latency_window:
19+
- *1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"topology_description": {
3+
"type": "Sharded",
4+
"servers": [
5+
{
6+
"address": "g:27017",
7+
"avg_rtt_ms": 5,
8+
"type": "Mongos"
9+
},
10+
{
11+
"address": "h:27017",
12+
"avg_rtt_ms": 35,
13+
"type": "Mongos"
14+
}
15+
]
16+
},
17+
"operation": "read",
18+
"read_preference": {
19+
"mode": "PrimaryPreferred",
20+
"tag_sets": [
21+
{
22+
"data_center": "nyc"
23+
}
24+
]
25+
},
26+
"suitable_servers": [
27+
{
28+
"address": "g:27017",
29+
"avg_rtt_ms": 5,
30+
"type": "Mongos"
31+
},
32+
{
33+
"address": "h:27017",
34+
"avg_rtt_ms": 35,
35+
"type": "Mongos"
36+
}
37+
],
38+
"in_latency_window": [
39+
{
40+
"address": "g:27017",
41+
"avg_rtt_ms": 5,
42+
"type": "Mongos"
43+
}
44+
]
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
topology_description:
2+
type: Sharded
3+
servers:
4+
- &1
5+
address: g:27017
6+
avg_rtt_ms: 5
7+
type: Mongos
8+
- &2
9+
address: h:27017
10+
avg_rtt_ms: 35
11+
type: Mongos
12+
operation: read
13+
read_preference:
14+
mode: PrimaryPreferred
15+
tag_sets:
16+
- data_center: nyc
17+
suitable_servers:
18+
- *1
19+
- *2
20+
in_latency_window:
21+
- *1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"topology_description": {
3+
"type": "Sharded",
4+
"servers": [
5+
{
6+
"address": "g:27017",
7+
"avg_rtt_ms": 5,
8+
"type": "Mongos"
9+
},
10+
{
11+
"address": "h:27017",
12+
"avg_rtt_ms": 35,
13+
"type": "Mongos"
14+
}
15+
]
16+
},
17+
"operation": "read",
18+
"read_preference": {
19+
"mode": "Secondary",
20+
"tag_sets": [
21+
{
22+
"data_center": "nyc"
23+
}
24+
]
25+
},
26+
"suitable_servers": [
27+
{
28+
"address": "g:27017",
29+
"avg_rtt_ms": 5,
30+
"type": "Mongos"
31+
},
32+
{
33+
"address": "h:27017",
34+
"avg_rtt_ms": 35,
35+
"type": "Mongos"
36+
}
37+
],
38+
"in_latency_window": [
39+
{
40+
"address": "g:27017",
41+
"avg_rtt_ms": 5,
42+
"type": "Mongos"
43+
}
44+
]
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
topology_description:
2+
type: Sharded
3+
servers:
4+
- &1
5+
address: g:27017
6+
avg_rtt_ms: 5
7+
type: Mongos
8+
- &2
9+
address: h:27017
10+
avg_rtt_ms: 35
11+
type: Mongos
12+
operation: read
13+
read_preference:
14+
mode: Secondary
15+
tag_sets:
16+
- data_center: nyc
17+
suitable_servers:
18+
- *1
19+
- *2
20+
in_latency_window:
21+
- *1

0 commit comments

Comments
 (0)