Skip to content

Commit ee541a0

Browse files
CSHARP-2457: Fix of infinity calls of IStreamFactory wrappers.
1 parent 94ee290 commit ee541a0

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

src/MongoDB.Driver.Core/Core/Configuration/ClusterBuilder.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@
1616
using System;
1717
using System.Diagnostics;
1818
using System.IO;
19-
using System.Linq;
20-
using System.Reflection;
2119
using System.Threading;
2220
using MongoDB.Driver.Core.Authentication;
2321
using MongoDB.Driver.Core.Clusters;
@@ -181,7 +179,8 @@ public ClusterBuilder RegisterStreamFactory(Func<IStreamFactory, IStreamFactory>
181179
{
182180
Ensure.IsNotNull(wrapper, nameof(wrapper));
183181

184-
_streamFactoryWrapper = inner => wrapper(_streamFactoryWrapper(inner));
182+
var previous = _streamFactoryWrapper; // use a local variable to ensure the previous value is captured properly by the lambda
183+
_streamFactoryWrapper = inner => wrapper(previous(inner));
185184
return this;
186185
}
187186

tests/MongoDB.Driver.Core.Tests/Core/Configuration/ClusterBuilderTests.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@
1414
*/
1515

1616
using System;
17+
using System.Collections.Generic;
1718
using FluentAssertions;
1819
using MongoDB.Bson.TestHelpers;
1920
using MongoDB.Driver.Core.Authentication;
2021
using MongoDB.Driver.Core.Connections;
2122
using MongoDB.Driver.Core.Servers;
23+
using Moq;
2224
using Xunit;
2325

2426
namespace MongoDB.Driver.Core.Configuration
@@ -59,10 +61,26 @@ public void CreateServerMonitorFactory_should_return_expected_result(int connect
5961

6062
var serverSettings = result._settings();
6163
}
64+
65+
[Fact]
66+
public void StreamFactoryWrappers_should_be_called_in_the_correct_order()
67+
{
68+
var subject = new ClusterBuilder();
69+
var calls = new List<int>();
70+
subject.RegisterStreamFactory(factory => { calls.Add(1); return factory; });
71+
subject.RegisterStreamFactory(factory => { calls.Add(2); return factory; });
72+
subject.RegisterStreamFactory(factory => { calls.Add(3); return factory; });
73+
74+
subject._streamFactoryWrapper()(Mock.Of<IStreamFactory>());
75+
76+
calls.Should().Equal(1, 2, 3);
77+
}
6278
}
6379

6480
public static class ClusterBuilderReflector
6581
{
6682
internal static IServerMonitorFactory CreateServerMonitorFactory(this ClusterBuilder obj) => (IServerMonitorFactory)Reflector.Invoke(obj, nameof(CreateServerMonitorFactory));
83+
84+
internal static Func<IStreamFactory, IStreamFactory> _streamFactoryWrapper(this ClusterBuilder obj) => (Func<IStreamFactory, IStreamFactory>)Reflector.GetFieldValue(obj, nameof(_streamFactoryWrapper));
6785
}
68-
}
86+
}

0 commit comments

Comments
 (0)