Skip to content

Commit 1c187c9

Browse files
committed
CSHARP-2222: Legacy API should use implicit sessions
1 parent c3e08ac commit 1c187c9

File tree

10 files changed

+120
-15
lines changed

10 files changed

+120
-15
lines changed

src/MongoDB.Driver.Legacy/MongoDatabase.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,7 @@ public virtual MongoCollection<TDefaultDocument> GetCollection<TDefaultDocument>
559559
public virtual MongoCollection<TDefaultDocument> GetCollection<TDefaultDocument>(
560560
string collectionName, MongoCollectionSettings collectionSettings)
561561
{
562-
return new MongoCollection<TDefaultDocument>(this, collectionName, collectionSettings);
562+
return new MongoCollection<TDefaultDocument>(this, collectionName, collectionSettings, _operationExecutor);
563563
}
564564

565565
/// <summary>
@@ -638,8 +638,12 @@ public virtual MongoCollection GetCollection(Type defaultDocumentType, string co
638638
{
639639
var collectionDefinition = typeof(MongoCollection<>);
640640
var collectionType = collectionDefinition.MakeGenericType(defaultDocumentType);
641-
var constructorInfo = collectionType.GetTypeInfo().GetConstructor(new Type[] { typeof(MongoDatabase), typeof(string), typeof(MongoCollectionSettings) });
642-
return (MongoCollection)constructorInfo.Invoke(new object[] { this, collectionName, collectionSettings });
641+
var constructorParameterTypes = new Type[] { typeof(MongoDatabase), typeof(string), typeof(MongoCollectionSettings), typeof(IOperationExecutor) };
642+
var constructorInfo = collectionType.GetTypeInfo()
643+
.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance)
644+
.Where(c => c.GetParameters().Select(p => p.ParameterType).SequenceEqual(constructorParameterTypes))
645+
.Single();
646+
return (MongoCollection)constructorInfo.Invoke(new object[] { this, collectionName, collectionSettings, _operationExecutor });
643647
}
644648

645649
/// <summary>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/* Copyright 2018-present MongoDB Inc.
2+
*
3+
* Licensed under the Apache License, Version 2.0 (the "License");
4+
* you may not use this file except in compliance with the License.
5+
* You may obtain a copy of the License at
6+
*
7+
* http://www.apache.org/licenses/LICENSE-2.0
8+
*
9+
* Unless required by applicable law or agreed to in writing, software
10+
* distributed under the License is distributed on an "AS IS" BASIS,
11+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
* See the License for the specific language governing permissions and
13+
* limitations under the License.
14+
*/
15+
16+
using System;
17+
using MongoDB.Driver.TestHelpers;
18+
19+
namespace MongoDB.Driver.Legacy.Tests
20+
{
21+
public static class DisposableMongoClientExtensions
22+
{
23+
public static MongoServer GetServer(this DisposableMongoClient disposableClient)
24+
{
25+
var client = (MongoClient)disposableClient.Wrapped;
26+
#pragma warning disable 618
27+
return client.GetServer();
28+
#pragma warning restore
29+
}
30+
}
31+
}

tests/MongoDB.Driver.Legacy.Tests/MongoCollectionTests.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
using MongoDB.Driver.Core.TestHelpers.XunitExtensions;
3232
using MongoDB.Driver.Core.Clusters;
3333
using MongoDB.Driver.Core.Misc;
34+
using MongoDB.Driver.TestHelpers;
35+
using MongoDB.Driver.Core.Events;
36+
using MongoDB.Driver.Legacy.Tests;
37+
using MongoDB.Bson.TestHelpers;
3438

3539
namespace MongoDB.Driver.Tests
3640
{
@@ -423,6 +427,26 @@ public void TestCountZero()
423427
Assert.Equal(0, count);
424428
}
425429

430+
[SkippableFact]
431+
public void TestCountUsesImplicitSession()
432+
{
433+
RequireServer.Check();
434+
435+
var events = new EventCapturer().Capture<CommandStartedEvent>(x => x.CommandName == "count");
436+
using (var client = DriverTestConfiguration.CreateDisposableClient(events))
437+
{
438+
var server = client.GetServer();
439+
var database = server.GetDatabase(DriverTestConfiguration.DatabaseNamespace.DatabaseName);
440+
var collection = database.GetCollection<BsonDocument>(DriverTestConfiguration.CollectionNamespace.CollectionName);
441+
collection.Count();
442+
443+
var commandStartedEvent = events.Next().Should().BeOfType<CommandStartedEvent>().Subject;
444+
var command = commandStartedEvent.Command;
445+
var areSessionsSupported = AreSessionsSupported(client);
446+
command.Contains("lsid").Should().Be(areSessionsSupported);
447+
}
448+
}
449+
426450
[Fact]
427451
public void TestCountOne()
428452
{
@@ -1227,7 +1251,7 @@ public void TestFindAndRemoveWithWriteConcernError()
12271251
var collection = _database.GetCollection(_collection.Name, collectionSettings);
12281252
var args = new FindAndRemoveArgs
12291253
{
1230-
Query = Query.EQ("x", 1)
1254+
Query = Query.EQ("x", 1)
12311255
};
12321256

12331257
BsonDocument modifiedDocument;
@@ -3504,6 +3528,12 @@ public void TestWithWriteConcern()
35043528
}
35053529

35063530
// private methods
3531+
private bool AreSessionsSupported(IMongoClient client)
3532+
{
3533+
var description = client.Cluster.Description;
3534+
return description.LogicalSessionTimeout.HasValue;
3535+
}
3536+
35073537
private void CheckExpectedResult(ExpectedWriteConcernResult expectedResult, WriteConcernResult result)
35083538
{
35093539
Assert.Equal(expectedResult.DocumentsAffected ?? 0, result.DocumentsAffected);

tests/MongoDB.Driver.Legacy.Tests/MongoDB.Driver.Legacy.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@
8585
<Compile Include="CommandResults\DatabaseStatsResultTests.cs" />
8686
<Compile Include="CommandResults\ValidateCollectionResultTests.cs" />
8787
<Compile Include="DefaultLegacyOperationExecutorTests.cs" />
88+
<Compile Include="DisposableMongoClientExtensions.cs" />
8889
<Compile Include="FailPoint.cs" />
8990
<Compile Include="Jira\CSharp100Tests.cs" />
9091
<Compile Include="Jira\CSharp101Tests.cs" />

tests/MongoDB.Driver.Legacy.Tests/MongoDatabaseTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using System.Linq;
1818
using FluentAssertions;
1919
using MongoDB.Bson;
20+
using MongoDB.Bson.TestHelpers;
2021
using MongoDB.Bson.TestHelpers.XunitExtensions;
2122
using MongoDB.Driver;
2223
using MongoDB.Driver.Builders;
@@ -322,6 +323,7 @@ public void TestGetCollection()
322323
Assert.Equal(_database.Name + "." + collectionName, collection.FullName);
323324
Assert.Equal(collectionName, collection.Name);
324325
Assert.Equal(_database.Settings.WriteConcern, collection.Settings.WriteConcern);
326+
Assert.Equal(_database._operationExecutor(), collection.OperationExecutor);
325327
}
326328

327329
[Fact]
@@ -333,6 +335,7 @@ public void TestGetCollectionGeneric()
333335
Assert.Equal(_database.Name + "." + collectionName, collection.FullName);
334336
Assert.Equal(collectionName, collection.Name);
335337
Assert.Equal(_database.Settings.WriteConcern, collection.Settings.WriteConcern);
338+
Assert.Equal(_database._operationExecutor(), collection.OperationExecutor);
336339
}
337340

338341
[Fact]
@@ -589,4 +592,9 @@ private void EnsureCollectionExists(string collectionName)
589592
_database.CreateCollection(collectionName);
590593
}
591594
}
595+
596+
internal static class MongoDatabaseReflector
597+
{
598+
public static IOperationExecutor _operationExecutor(this MongoDatabase obj) => (IOperationExecutor)Reflector.GetFieldValue(obj, nameof(_operationExecutor));
599+
}
592600
}

tests/MongoDB.Driver.Legacy.Tests/MongoServerTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
using System.Linq;
1818
using FluentAssertions;
1919
using MongoDB.Bson;
20+
using MongoDB.Bson.TestHelpers;
2021
using MongoDB.Bson.TestHelpers.XunitExtensions;
2122
using MongoDB.Driver;
2223
using MongoDB.Driver.Core.Clusters;
@@ -178,6 +179,7 @@ public void TestGetDatabase()
178179
var database = __server.GetDatabase("test", settings);
179180
Assert.Equal("test", database.Name);
180181
Assert.Equal(ReadPreference.Primary, database.Settings.ReadPreference);
182+
Assert.Equal(database._operationExecutor(), __server._operationExecutor());
181183
}
182184

183185
[Fact]
@@ -346,4 +348,9 @@ public void TestWithWriteConcern()
346348
result.WithWriteConcern(originalWriteConcern).Settings.Should().Be(subject.Settings);
347349
}
348350
}
351+
352+
internal static class MongoServerReflector
353+
{
354+
public static IOperationExecutor _operationExecutor(this MongoServer obj) => (IOperationExecutor)Reflector.GetFieldValue(obj, nameof(_operationExecutor));
355+
}
349356
}

tests/MongoDB.Driver.TestHelpers/DisposableMongoClient.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public DisposableMongoClient(IMongoClient wrapped)
3434

3535
public MongoClientSettings Settings => wrapped.Settings;
3636

37+
public IMongoClient Wrapped => wrapped;
38+
3739
public void DropDatabase(string name, CancellationToken cancellationToken = default(CancellationToken))
3840
{
3941
wrapped.DropDatabase(name, cancellationToken);

tests/MongoDB.Driver.TestHelpers/DriverTestConfiguration.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
*/
1515

1616
using System;
17+
using MongoDB.Driver.Core;
18+
using MongoDB.Driver.Core.Configuration;
19+
using MongoDB.Driver.TestHelpers;
1720

1821
namespace MongoDB.Driver.Tests
1922
{
@@ -67,6 +70,30 @@ public static DatabaseNamespace DatabaseNamespace
6770
}
6871

6972
// public static methods
73+
public static DisposableMongoClient CreateDisposableClient()
74+
{
75+
return CreateDisposableClient((MongoClientSettings s) => { });
76+
}
77+
78+
public static DisposableMongoClient CreateDisposableClient(Action<ClusterBuilder> clusterConfigurator)
79+
{
80+
return CreateDisposableClient((MongoClientSettings s) => s.ClusterConfigurator = clusterConfigurator);
81+
}
82+
83+
public static DisposableMongoClient CreateDisposableClient(Action<MongoClientSettings> clientSettingsConfigurator)
84+
{
85+
var connectionString = CoreTestConfiguration.ConnectionString.ToString();
86+
var clientSettings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
87+
clientSettingsConfigurator(clientSettings);
88+
var client = new MongoClient(clientSettings);
89+
return new DisposableMongoClient(client);
90+
}
91+
92+
public static DisposableMongoClient CreateDisposableClient(EventCapturer capturer)
93+
{
94+
return CreateDisposableClient((ClusterBuilder c) => c.Subscribe(capturer));
95+
}
96+
7097
public static MongoClientSettings GetClientSettings()
7198
{
7299
var connectionString = CoreTestConfiguration.ConnectionString.ToString();

tests/MongoDB.Driver.Tests/CausalConsistencyTests.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,11 +209,7 @@ public void ReadConcern_should_include_level_when_not_using_the_server_default()
209209

210210
private DisposableMongoClient GetClient(EventCapturer capturer)
211211
{
212-
var connectionString = CoreTestConfiguration.ConnectionString.ToString();
213-
var clientSettings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
214-
clientSettings.ClusterConfigurator = cb => cb.Subscribe(capturer);
215-
216-
return new DisposableMongoClient(new MongoClient(clientSettings));
212+
return DriverTestConfiguration.CreateDisposableClient(capturer);
217213
}
218214
}
219215
}

tests/MongoDB.Driver.Tests/RetryableWritesTests.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,12 +183,11 @@ private DisposableMongoClient GetClient()
183183

184184
private DisposableMongoClient GetClient(Action<ClusterBuilder> clusterConfigurator)
185185
{
186-
var connectionString = CoreTestConfiguration.ConnectionString.ToString();
187-
var clientSettings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
188-
clientSettings.RetryWrites = true;
189-
clientSettings.ClusterConfigurator = clusterConfigurator;
190-
191-
return new DisposableMongoClient(new MongoClient(clientSettings));
186+
return DriverTestConfiguration.CreateDisposableClient((MongoClientSettings clientSettings) =>
187+
{
188+
clientSettings.ClusterConfigurator = clusterConfigurator;
189+
clientSettings.RetryWrites = true;
190+
});
192191
}
193192

194193
private DisposableMongoClient GetClient(EventCapturer capturer)

0 commit comments

Comments
 (0)