PageRenderTime 40ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/MongoDB.Driver.Tests/MongoBulkWriteExceptionTests.cs

http://github.com/mongodb/mongo-csharp-driver
C# | 164 lines | 133 code | 17 blank | 14 comment | 1 complexity | 26b053720c75847e32f4a921a96bee4e MD5 | raw file
Possible License(s): Apache-2.0
  1. /* Copyright 2010-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.Collections.Generic;
  16. using System.IO;
  17. using System.Net;
  18. #if NET452
  19. using System.Runtime.Serialization.Formatters.Binary;
  20. #endif
  21. using FluentAssertions;
  22. using MongoDB.Bson;
  23. using MongoDB.Bson.TestHelpers.EqualityComparers;
  24. using MongoDB.Driver.Core.Clusters;
  25. using MongoDB.Driver.Core.Connections;
  26. using MongoDB.Driver.Core.Operations;
  27. using MongoDB.Driver.Core.Servers;
  28. using Xunit;
  29. namespace MongoDB.Driver.Tests
  30. {
  31. public class MongoBulkWriteExceptionTests
  32. {
  33. private static BulkWriteResult<BsonDocument> __bulkWriteResult;
  34. private static ConnectionId __connectionId;
  35. private static WriteConcernError __writeConcernError;
  36. private static BulkWriteError[] __writeErrors;
  37. private static WriteModel<BsonDocument>[] __unprocessedRequests;
  38. private static bool __oneTimeSetupHasRun = false;
  39. private static object __oneTimeSetupLock = new object();
  40. public MongoBulkWriteExceptionTests()
  41. {
  42. lock (__oneTimeSetupLock)
  43. {
  44. __oneTimeSetupHasRun = __oneTimeSetupHasRun || OneTimeSetup();
  45. }
  46. }
  47. public bool OneTimeSetup()
  48. {
  49. __connectionId = new ConnectionId(new ServerId(new ClusterId(1), new DnsEndPoint("localhost", 27017)), 2);
  50. var processedRequests = new[] { new InsertOneModel<BsonDocument>(new BsonDocument("b", 1)) };
  51. var upserts = new BulkWriteUpsert[0];
  52. __bulkWriteResult = new BulkWriteResult<BsonDocument>.Acknowledged(1, 1, 0, 0, 0, processedRequests, upserts);
  53. __writeConcernError = new WriteConcernError(11, null, "funny", new BsonDocument("c", 1));
  54. __writeErrors = new[] { new BulkWriteError(10, ServerErrorCategory.Uncategorized, 1, "blah", new BsonDocument("a", 1)) };
  55. __unprocessedRequests = new[] { new InsertOneModel<BsonDocument>(new BsonDocument("a", 1)) };
  56. return true;
  57. }
  58. [Fact]
  59. public void constructor_should_initialize_subject()
  60. {
  61. var subject = new MongoBulkWriteException<BsonDocument>(__connectionId, __bulkWriteResult, __writeErrors, __writeConcernError, __unprocessedRequests);
  62. subject.ConnectionId.Should().BeSameAs(__connectionId);
  63. subject.Message.Should().Contain("bulk write operation");
  64. subject.Result.Should().BeSameAs(__bulkWriteResult);
  65. subject.UnprocessedRequests.Should().Equal(__unprocessedRequests);
  66. subject.WriteConcernError.Should().BeSameAs(__writeConcernError);
  67. subject.WriteErrors.Should().Equal(__writeErrors);
  68. }
  69. [Fact]
  70. public void FromCore_should_convert_from_core_exception_with_a_write_concern_error_when_original_models_exists()
  71. {
  72. var exception = new MongoBulkWriteOperationException(
  73. __connectionId,
  74. result: new BulkWriteOperationResult.Acknowledged(
  75. requestCount: 1,
  76. matchedCount: 1,
  77. deletedCount: 0,
  78. insertedCount: 0,
  79. modifiedCount: 0,
  80. processedRequests: new[] { new InsertRequest(new BsonDocument("b", 1)) { CorrelationId = 1 } },
  81. upserts: new List<BulkWriteOperationUpsert>()),
  82. writeErrors: new[] { new BulkWriteOperationError(10, 1, "blah", new BsonDocument("a", 1)) },
  83. writeConcernError: new BulkWriteConcernError(11, "funny", new BsonDocument("c", 1)),
  84. unprocessedRequests: new[] { new InsertRequest(new BsonDocument("a", 1)) { CorrelationId = 0 } });
  85. var models = new[]
  86. {
  87. new InsertOneModel<BsonDocument>(new BsonDocument("a", 1)),
  88. new InsertOneModel<BsonDocument>(new BsonDocument("b", 1))
  89. };
  90. var mapped = MongoBulkWriteException<BsonDocument>.FromCore(exception, models);
  91. mapped.Result.ProcessedRequests.Count.Should().Be(1);
  92. mapped.Result.ProcessedRequests[0].Should().BeSameAs(models[1]);
  93. mapped.WriteConcernError.Should().NotBeNull();
  94. mapped.WriteErrors.Count.Should().Be(1);
  95. mapped.WriteErrors[0].Should().NotBeNull();
  96. mapped.UnprocessedRequests.Count.Should().Be(1);
  97. mapped.UnprocessedRequests[0].Should().BeSameAs(models[0]);
  98. }
  99. [Fact]
  100. public void FromCore_should_convert_from_core_exception_with_a_write_concern_error_when_original_models_do_not_exist()
  101. {
  102. var exception = new MongoBulkWriteOperationException(
  103. __connectionId,
  104. result: new BulkWriteOperationResult.Acknowledged(
  105. requestCount: 1,
  106. matchedCount: 1,
  107. deletedCount: 0,
  108. insertedCount: 0,
  109. modifiedCount: 0,
  110. processedRequests: new[] { new InsertRequest(new BsonDocumentWrapper(new BsonDocument("b", 1))) { CorrelationId = 1 } },
  111. upserts: new List<BulkWriteOperationUpsert>()),
  112. writeErrors: new[] { new BulkWriteOperationError(10, 1, "blah", new BsonDocument("a", 1)) },
  113. writeConcernError: new BulkWriteConcernError(11, "funny", new BsonDocument("c", 1)),
  114. unprocessedRequests: new[] { new InsertRequest(new BsonDocumentWrapper(new BsonDocument("a", 1))) { CorrelationId = 0 } });
  115. var mapped = MongoBulkWriteException<BsonDocument>.FromCore(exception);
  116. mapped.Result.ProcessedRequests.Count.Should().Be(1);
  117. mapped.Result.ProcessedRequests[0].Should().BeOfType<InsertOneModel<BsonDocument>>();
  118. ((InsertOneModel<BsonDocument>)mapped.Result.ProcessedRequests[0]).Document.Should().Be("{b:1}");
  119. mapped.WriteConcernError.Should().NotBeNull();
  120. mapped.WriteErrors.Count.Should().Be(1);
  121. mapped.WriteErrors[0].Should().NotBeNull();
  122. mapped.UnprocessedRequests.Count.Should().Be(1);
  123. mapped.UnprocessedRequests[0].Should().BeOfType<InsertOneModel<BsonDocument>>();
  124. ((InsertOneModel<BsonDocument>)mapped.UnprocessedRequests[0]).Document.Should().Be("{a:1}");
  125. }
  126. #if NET452
  127. [Fact]
  128. public void Serialization_should_work()
  129. {
  130. var subject = new MongoBulkWriteException<BsonDocument>(__connectionId, __bulkWriteResult, __writeErrors, __writeConcernError, __unprocessedRequests);
  131. var formatter = new BinaryFormatter();
  132. using (var stream = new MemoryStream())
  133. {
  134. formatter.Serialize(stream, subject);
  135. stream.Position = 0;
  136. var rehydrated = (MongoBulkWriteException<BsonDocument>)formatter.Deserialize(stream);
  137. rehydrated.ConnectionId.Should().Be(subject.ConnectionId);
  138. rehydrated.Message.Should().Be(subject.Message);
  139. rehydrated.Result.Should().BeUsing(subject.Result, EqualityComparerRegistry.Default);
  140. rehydrated.UnprocessedRequests.Should().EqualUsing(subject.UnprocessedRequests, EqualityComparerRegistry.Default);
  141. rehydrated.WriteConcernError.Should().BeUsing(subject.WriteConcernError, EqualityComparerRegistry.Default);
  142. rehydrated.WriteErrors.Should().EqualUsing(subject.WriteErrors, EqualityComparerRegistry.Default);
  143. }
  144. }
  145. #endif
  146. }
  147. }