PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/tests/MongoDB.Driver.Core.Tests/Core/Bindings/SplitReadWriteBindingTests.cs

http://github.com/mongodb/mongo-csharp-driver
C# | 296 lines | 228 code | 54 blank | 14 comment | 4 complexity | 48ad01b1d1bfb59bf5ac77ebdc1df19b MD5 | raw file
Possible License(s): Apache-2.0
  1. /* Copyright 2013-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. using System;
  16. using System.Reflection;
  17. using System.Threading;
  18. using FluentAssertions;
  19. using MongoDB.Bson.TestHelpers.XunitExtensions;
  20. using MongoDB.Driver.Core.Bindings;
  21. using MongoDB.Driver.Core.Clusters;
  22. using Moq;
  23. using Xunit;
  24. namespace MongoDB.Driver.Core.Bindings
  25. {
  26. public class SplitReadWriteBindingTests
  27. {
  28. private Mock<IReadBinding> _mockReadBinding;
  29. private Mock<IWriteBinding> _mockWriteBinding;
  30. public SplitReadWriteBindingTests()
  31. {
  32. _mockReadBinding = new Mock<IReadBinding>();
  33. _mockWriteBinding = new Mock<IWriteBinding>();
  34. var mockSession = new Mock<ICoreSessionHandle>();
  35. mockSession.Setup(s => s.Fork()).Returns(mockSession.Object);
  36. _mockReadBinding.SetupGet(b => b.Session).Returns(mockSession.Object);
  37. _mockWriteBinding.SetupGet(b => b.Session).Returns(mockSession.Object);
  38. }
  39. [Fact]
  40. public void Constructor_should_throw_if_readBinding_is_null()
  41. {
  42. Action act = () => new SplitReadWriteBinding(null, _mockWriteBinding.Object);
  43. act.ShouldThrow<ArgumentNullException>();
  44. }
  45. [Fact]
  46. public void Constructor_should_throw_if_readPreference_is_null()
  47. {
  48. Action act = () => new SplitReadWriteBinding(_mockReadBinding.Object, null);
  49. act.ShouldThrow<ArgumentNullException>();
  50. }
  51. [Fact]
  52. public void constructor_with_read_and_write_bindings_should_initialize_instance()
  53. {
  54. var session = new Mock<ICoreSessionHandle>().Object;
  55. var mockReadBinding = new Mock<IReadBinding>();
  56. var mockWriteBinding = new Mock<IWriteBinding>();
  57. mockReadBinding.SetupGet(m => m.Session).Returns(session);
  58. mockWriteBinding.SetupGet(m => m.Session).Returns(session);
  59. var result = new SplitReadWriteBinding(mockReadBinding.Object, mockWriteBinding.Object);
  60. result._readBinding().Should().BeSameAs(mockReadBinding.Object);
  61. result._writeBinding().Should().BeSameAs(mockWriteBinding.Object);
  62. }
  63. [Fact]
  64. public void constructor_with_read_and_write_bindings_should_throw_if_read_binding_is_null()
  65. {
  66. var writeBinding = new Mock<IWriteBinding>().Object;
  67. var exception = Record.Exception(() => new SplitReadWriteBinding(null, writeBinding));
  68. var e = exception.Should().BeOfType<ArgumentNullException>().Subject;
  69. e.ParamName.Should().Be("readBinding");
  70. }
  71. [Fact]
  72. public void constructor_with_read_and_write_bindings_should_throw_if_write_binding_is_null()
  73. {
  74. var readBinding = new Mock<IReadBinding>().Object;
  75. var exception = Record.Exception(() => new SplitReadWriteBinding(readBinding, null));
  76. var e = exception.Should().BeOfType<ArgumentNullException>().Subject;
  77. e.ParamName.Should().Be("writeBinding");
  78. }
  79. [Fact]
  80. public void constructor_with_read_and_write_bindings_should_throw_if_bindings_have_different_sessions()
  81. {
  82. var cluster = new Mock<ICluster>().Object;
  83. var session1 = new Mock<ICoreSessionHandle>().Object;
  84. var session2 = new Mock<ICoreSessionHandle>().Object;
  85. var readBinding = new ReadPreferenceBinding(cluster, ReadPreference.Secondary, session1);
  86. var writeBinding = new WritableServerBinding(cluster, session2);
  87. var exception = Record.Exception(() => new SplitReadWriteBinding(readBinding, writeBinding));
  88. exception.Should().BeOfType<ArgumentException>();
  89. }
  90. [Fact]
  91. public void constructor_with_cluster_read_preference_and_session_should_initialize_instance()
  92. {
  93. var cluster = new Mock<ICluster>().Object;
  94. var readPreference = ReadPreference.Secondary;
  95. var mockSession = new Mock<ICoreSessionHandle>();
  96. var forkedSession = new Mock<ICoreSessionHandle>().Object;
  97. mockSession.Setup(m => m.Fork()).Returns(forkedSession);
  98. var result = new SplitReadWriteBinding(cluster, readPreference, mockSession.Object);
  99. var readBinding = result._readBinding().Should().BeOfType<ReadPreferenceBinding>().Subject;
  100. readBinding._cluster().Should().BeSameAs(cluster);
  101. readBinding.ReadPreference.Should().BeSameAs(readPreference);
  102. readBinding.Session.Should().BeSameAs(mockSession.Object);
  103. var writeBinding = result._writeBinding().Should().BeOfType<WritableServerBinding>().Subject;
  104. writeBinding._cluster().Should().BeSameAs(cluster);
  105. writeBinding.Session.Should().BeSameAs(forkedSession);
  106. }
  107. [Fact]
  108. public void constructor_with_cluster_read_preference_and_session_should_throw_when_cluster_is_null()
  109. {
  110. var readPreference = ReadPreference.Primary;
  111. var session = new Mock<ICoreSessionHandle>().Object;
  112. var exception = Record.Exception(() => new SplitReadWriteBinding(null, readPreference, session));
  113. var e = exception.Should().BeOfType<ArgumentNullException>().Subject;
  114. e.ParamName.Should().Be("cluster");
  115. }
  116. [Fact]
  117. public void constructor_with_cluster_read_preference_and_session_should_throw_when_readPreference_is_null()
  118. {
  119. var cluster = new Mock<ICluster>().Object;
  120. var session = new Mock<ICoreSessionHandle>().Object;
  121. var exception = Record.Exception(() => new SplitReadWriteBinding(cluster, null, session));
  122. var e = exception.Should().BeOfType<ArgumentNullException>().Subject;
  123. e.ParamName.Should().Be("readPreference");
  124. }
  125. [Fact]
  126. public void constructor_with_cluster_read_preference_and_session_should_throw_when_session_is_null()
  127. {
  128. var cluster = new Mock<ICluster>().Object;
  129. var readPreference = ReadPreference.Primary;
  130. var exception = Record.Exception(() => new SplitReadWriteBinding(cluster, readPreference, null));
  131. var e = exception.Should().BeOfType<ArgumentNullException>().Subject;
  132. e.ParamName.Should().Be("session");
  133. }
  134. [Fact]
  135. public void Session_should_delegate_to_read_binding()
  136. {
  137. var session = new Mock<ICoreSessionHandle>().Object;
  138. var mockReadBinding = new Mock<IReadBinding>();
  139. var mockWriteBinding = new Mock<IWriteBinding>();
  140. mockReadBinding.SetupGet(m => m.Session).Returns(session);
  141. mockWriteBinding.SetupGet(m => m.Session).Returns(session);
  142. var subject = new SplitReadWriteBinding(mockReadBinding.Object, mockWriteBinding.Object);
  143. var result = subject.Session;
  144. mockReadBinding.Verify(m => m.Session, Times.Exactly(2)); // called once in the constructor also
  145. }
  146. [Theory]
  147. [ParameterAttributeData]
  148. public void GetReadChannelSource_should_throw_if_disposed(
  149. [Values(false, true)]
  150. bool async)
  151. {
  152. var subject = new SplitReadWriteBinding(_mockReadBinding.Object, _mockWriteBinding.Object);
  153. subject.Dispose();
  154. Action act;
  155. if (async)
  156. {
  157. act = () => subject.GetReadChannelSourceAsync(CancellationToken.None).GetAwaiter().GetResult();
  158. }
  159. else
  160. {
  161. act = () => subject.GetReadChannelSource(CancellationToken.None);
  162. }
  163. act.ShouldThrow<ObjectDisposedException>();
  164. }
  165. [Theory]
  166. [ParameterAttributeData]
  167. public void GetReadChannelSource_should_get_the_connection_source_from_the_read_binding(
  168. [Values(false, true)]
  169. bool async)
  170. {
  171. var subject = new SplitReadWriteBinding(_mockReadBinding.Object, _mockWriteBinding.Object);
  172. if (async)
  173. {
  174. subject.GetReadChannelSourceAsync(CancellationToken.None).GetAwaiter().GetResult();
  175. _mockReadBinding.Verify(b => b.GetReadChannelSourceAsync(CancellationToken.None), Times.Once);
  176. }
  177. else
  178. {
  179. subject.GetReadChannelSource(CancellationToken.None);
  180. _mockReadBinding.Verify(b => b.GetReadChannelSource(CancellationToken.None), Times.Once);
  181. }
  182. }
  183. [Theory]
  184. [ParameterAttributeData]
  185. public void GetWriteChannelSource_should_throw_if_disposed(
  186. [Values(false, true)]
  187. bool async)
  188. {
  189. var subject = new SplitReadWriteBinding(_mockReadBinding.Object, _mockWriteBinding.Object);
  190. subject.Dispose();
  191. Action act;
  192. if (async)
  193. {
  194. act = () => subject.GetWriteChannelSourceAsync(CancellationToken.None).GetAwaiter().GetResult();
  195. }
  196. else
  197. {
  198. act = () => subject.GetWriteChannelSource(CancellationToken.None);
  199. }
  200. act.ShouldThrow<ObjectDisposedException>();
  201. }
  202. [Theory]
  203. [ParameterAttributeData]
  204. public void GetWriteChannelSource_should_get_the_connection_source_from_the_write_binding(
  205. [Values(false, true)]
  206. bool async)
  207. {
  208. var subject = new SplitReadWriteBinding(_mockReadBinding.Object, _mockWriteBinding.Object);
  209. if (async)
  210. {
  211. subject.GetWriteChannelSourceAsync(CancellationToken.None).GetAwaiter().GetResult();
  212. _mockWriteBinding.Verify(b => b.GetWriteChannelSourceAsync(CancellationToken.None), Times.Once);
  213. }
  214. else
  215. {
  216. subject.GetWriteChannelSource(CancellationToken.None);
  217. _mockWriteBinding.Verify(b => b.GetWriteChannelSource(CancellationToken.None), Times.Once);
  218. }
  219. }
  220. [Fact]
  221. public void Dispose_should_call_dispose_on_read_binding_and_write_binding()
  222. {
  223. var subject = new SplitReadWriteBinding(_mockReadBinding.Object, _mockWriteBinding.Object);
  224. subject.Dispose();
  225. _mockReadBinding.Verify(b => b.Dispose(), Times.Once);
  226. _mockWriteBinding.Verify(b => b.Dispose(), Times.Once);
  227. }
  228. }
  229. public static class SplitReadWriteBindingReflector
  230. {
  231. public static IReadBinding _readBinding(this SplitReadWriteBinding obj)
  232. {
  233. var fieldInfo = typeof(SplitReadWriteBinding).GetField("_readBinding", BindingFlags.NonPublic | BindingFlags.Instance);
  234. return (IReadBinding)fieldInfo.GetValue(obj);
  235. }
  236. public static IWriteBinding _writeBinding(this SplitReadWriteBinding obj)
  237. {
  238. var fieldInfo = typeof(SplitReadWriteBinding).GetField("_writeBinding", BindingFlags.NonPublic | BindingFlags.Instance);
  239. return (IWriteBinding)fieldInfo.GetValue(obj);
  240. }
  241. }
  242. }