public void TestIsAtEndOfFileWithTwoDocuments() { var expected = new BsonDocument("x", 1); byte[] bson; using (var stream = new MemoryStream()) using (var writer = new BsonBinaryWriter(stream)) { BsonSerializer.Serialize(writer, expected); BsonSerializer.Serialize(writer, expected); bson = stream.ToArray(); } using (var stream = new MemoryStream(bson)) using (var reader = new BsonBinaryReader(stream)) { var count = 0; while (!reader.IsAtEndOfFile()) { var document = BsonSerializer.Deserialize<BsonDocument>(reader); Assert.AreEqual(expected, document); count++; } Assert.AreEqual(2, count); } }
public void TestNoCircularReference() { var c2 = new C { X = 2 }; var c1 = new C { X = 1, NestedDocument = c2 }; var json = c1.ToJson(); var expected = "{ 'X' : 1, 'NestedDocument' : { 'X' : 2, 'NestedDocument' : null, 'BsonArray' : { '_csharpnull' : true } }, 'BsonArray' : { '_csharpnull' : true } }".Replace("'", "\""); Assert.AreEqual(expected, json); var memoryStream = new MemoryStream(); using (var writer = new BsonBinaryWriter(memoryStream)) { BsonSerializer.Serialize(writer, c1); Assert.AreEqual(0, writer.SerializationDepth); } var document = new BsonDocument(); using (var writer = new BsonDocumentWriter(document)) { BsonSerializer.Serialize(writer, c1); Assert.AreEqual(0, writer.SerializationDepth); } var stringWriter = new StringWriter(); using (var writer = new JsonWriter(stringWriter)) { BsonSerializer.Serialize(writer, c1); Assert.AreEqual(0, writer.SerializationDepth); } }
public void TestWriteNameThrowsWhenValueIsNull() { using (var stream = new MemoryStream()) using (var bsonWriter = new BsonBinaryWriter(stream, BsonBinaryWriterSettings.Defaults)) { Assert.Throws<ArgumentNullException>(() => { bsonWriter.WriteName(null); }); } }
public void TestWriteNameThrowsWhenValueContainsNulls() { using (var stream = new MemoryStream()) using (var bsonWriter = new BsonBinaryWriter(stream, BsonBinaryWriterSettings.Defaults)) { Assert.Throws<BsonSerializationException>(() => { bsonWriter.WriteName("a\0b"); }); } }
public void BsonBinaryReader_should_support_reading_more_than_2GB() { RequireEnvironmentVariable.IsDefined("EXPLICIT"); var binaryData = new BsonBinaryData(new byte[1024 * 1024]); var tempFileName = Path.GetTempFileName(); try { using (var stream = new FileStream(tempFileName, FileMode.Open)) { using (var binaryWriter = new BsonBinaryWriter(stream)) { while (stream.Position < (long)int.MaxValue * 4) { binaryWriter.WriteStartDocument(); binaryWriter.WriteName("x"); binaryWriter.WriteBinaryData(binaryData); binaryWriter.WriteEndDocument(); } } var endOfFilePosition = stream.Position; stream.Position = 0; using (var binaryReader = new BsonBinaryReader(stream)) { while (!binaryReader.IsAtEndOfFile()) { binaryReader.ReadStartDocument(); var bookmark = binaryReader.GetBookmark(); binaryReader.ReadName("x"); binaryReader.ReturnToBookmark(bookmark); binaryReader.ReadName("x"); var readBinaryData = binaryReader.ReadBinaryData(); Assert.Equal(binaryData.Bytes.Length, readBinaryData.Bytes.Length); binaryReader.ReadEndDocument(); } } Assert.Equal(endOfFilePosition, stream.Position); } } finally { try { File.Delete(tempFileName); } catch { // ignore exceptions } } }
public void Constructor_should_not_throw_if_only_binaryWriter_is_provided() { using (var stream = new MemoryStream()) using (var binaryWriter = new BsonBinaryWriter(stream)) { Action action = () => new GetMoreMessageBinaryEncoder(null, binaryWriter); action.ShouldNotThrow(); } }
public void Constructor_with_two_parameters_should_not_throw_if_only_binaryWriter_is_provided() { using (var stream = new MemoryStream()) using (var binaryWriter = new BsonBinaryWriter(stream)) { Action action = () => new BinaryMessageEncoderFactory(null, binaryWriter); action.ShouldNotThrow(); } }
// internal methods internal void AddDocument(BsonBuffer buffer, Type nominalType, object document) { _lastDocumentStartPosition = buffer.Position; using (var bsonWriter = new BsonBinaryWriter(buffer, false, WriterSettings)) { bsonWriter.CheckElementNames = _checkElementNames; BsonSerializer.Serialize(bsonWriter, nominalType, document, DocumentSerializationOptions.SerializeIdFirstInstance); } BackpatchMessageLength(buffer); }
public void Constructor_should_not_throw_if_binaryReader_and_binaryWriter_are_both_provided() { using (var stream = new MemoryStream()) using (var binaryReader = new BsonBinaryReader(stream)) using (var binaryWriter = new BsonBinaryWriter(stream)) { Action action = () => new DeleteMessageBinaryEncoder(binaryReader, binaryWriter); action.ShouldNotThrow(); } }
public void TestInvalidKeys(string key) { var c = new C { Id = 1, D = new Hashtable { { key, 2 } }, G = new Dictionary<object, int> { { key, 3 } } }; using (var stream = new MemoryStream()) using (var bsonWriter = new BsonBinaryWriter(stream, BsonBinaryWriterSettings.Defaults)) { bsonWriter.PushElementNameValidator(CollectionElementNameValidator.Instance); Assert.Throws<BsonSerializationException>(() => BsonSerializer.Serialize(bsonWriter, c)); } }
// protected methods protected override void SerializeRequest(BsonBinaryWriter bsonWriter, WriteRequest request) { var deleteRequest = (DeleteRequest)request; bsonWriter.PushMaxDocumentSize(MaxDocumentSize); bsonWriter.WriteStartDocument(); bsonWriter.WriteName("q"); BsonSerializer.Serialize(bsonWriter, deleteRequest.Query ?? new QueryDocument()); bsonWriter.WriteInt32("limit", deleteRequest.Limit); bsonWriter.WriteEndDocument(); bsonWriter.PopMaxDocumentSize(); }
public void Test1ChunkPlus1() { var stream = new MemoryStream(); using (var bsonWriter = new BsonBinaryWriter(stream)) { bsonWriter.WriteStartDocument(); bsonWriter.WriteBytes("Data", new byte[16 * 1024 - 15]); bsonWriter.WriteEndDocument(); bsonWriter.Close(); } }
public void TestFlushAndClose() { var stream = new MemoryStream(); using (var bsonWriter = new BsonBinaryWriter(stream)) { bsonWriter.WriteStartDocument(); bsonWriter.WriteEndDocument(); bsonWriter.Flush(); bsonWriter.Close(); } }
public static RawBsonDocument FromBsonDocument(BsonDocument document) { using (var memoryStream = new MemoryStream()) { using (var bsonWriter = new BsonBinaryWriter(memoryStream, BsonBinaryWriterSettings.Defaults)) { var context = BsonSerializationContext.CreateRoot(bsonWriter); BsonDocumentSerializer.Instance.Serialize(context, document); } return new RawBsonDocument(memoryStream.ToArray()); } }
// internal methods internal override void WriteBodyTo(BsonBuffer buffer) { using (var bsonWriter = new BsonBinaryWriter(buffer, false, WriterSettings)) { bsonWriter.PushMaxDocumentSize(_maxDocumentSize); if (_query == null) { bsonWriter.WriteStartDocument(); bsonWriter.WriteEndDocument(); } else { BsonSerializer.Serialize(bsonWriter, _query.GetType(), _query, DocumentSerializationOptions.SerializeIdFirstInstance); } bsonWriter.PopMaxDocumentSize(); } }
// internal methods internal override void WriteBodyTo(BsonStreamWriter streamWriter) { using (var bsonWriter = new BsonBinaryWriter(streamWriter.BaseStream, WriterSettings)) { bsonWriter.PushMaxDocumentSize(_maxDocumentSize); if (_query == null) { bsonWriter.WriteStartDocument(); bsonWriter.WriteEndDocument(); } else { BsonSerializer.Serialize(bsonWriter, _query.GetType(), _query, b => b.SerializeIdFirst = true); } bsonWriter.PopMaxDocumentSize(); } }
// protected methods protected override void WriteBody(BsonBuffer buffer) { buffer.WriteInt32(0); // reserved buffer.WriteCString(_collectionFullName); buffer.WriteInt32((int)_flags); using (var bsonWriter = new BsonBinaryWriter(buffer, false, WriterSettings)) { if (_query == null) { bsonWriter.WriteStartDocument(); bsonWriter.WriteEndDocument(); } else { BsonSerializer.Serialize(bsonWriter, _query.GetType(), _query, DocumentSerializationOptions.SerializeIdFirstInstance); } } }
public void BackpatchSize_should_throw_when_size_is_larger_than_2GB() { using (var stream = new NullBsonStream()) using (var binaryWriter = new BsonBinaryWriter(stream)) { var bytes = new byte[int.MaxValue / 2]; // 1GB var binaryData = new BsonBinaryData(bytes); binaryWriter.WriteStartDocument(); binaryWriter.WriteName("array"); binaryWriter.WriteStartArray(); binaryWriter.WriteBinaryData(binaryData); binaryWriter.WriteBinaryData(binaryData); Action action = () => binaryWriter.WriteEndArray(); // indirectly calls private BackpatchSize method action.ShouldThrow<FormatException>(); } }
public void BsonBinaryWriter_should_support_writing_more_than_2GB() { using (var stream = new NullBsonStream()) using (var binaryWriter = new BsonBinaryWriter(stream)) { var bigBinaryData = new BsonBinaryData(new byte[int.MaxValue / 2 - 1000]); for (var i = 0; i < 3; i++) { binaryWriter.WriteStartDocument(); binaryWriter.WriteName("x"); binaryWriter.WriteBinaryData(bigBinaryData); binaryWriter.WriteEndDocument(); } var smallBinaryData = new BsonBinaryData(new byte[2000]); binaryWriter.WriteStartDocument(); binaryWriter.WriteName("x"); binaryWriter.WriteBinaryData(smallBinaryData); binaryWriter.WriteEndDocument(); } }
// protected methods protected override void SerializeRequest(BsonBinaryWriter bsonWriter, WriteRequest request) { var updateRequest = (UpdateRequest)request; bsonWriter.PushMaxDocumentSize(MaxWireDocumentSize); bsonWriter.WriteStartDocument(); bsonWriter.WriteName("q"); BsonSerializer.Serialize(bsonWriter, updateRequest.Query ?? new QueryDocument()); bsonWriter.WriteName("u"); BsonSerializer.Serialize(bsonWriter, updateRequest.Update); if (updateRequest.IsMultiUpdate.HasValue) { bsonWriter.WriteBoolean("multi", updateRequest.IsMultiUpdate.Value); } if (updateRequest.IsUpsert.HasValue) { bsonWriter.WriteBoolean("upsert", updateRequest.IsUpsert.Value); } bsonWriter.WriteEndDocument(); bsonWriter.PopMaxDocumentSize(); }
public void BsonBinaryWriter_should_support_writing_multiple_documents( [Range(0, 3)] int numberOfDocuments) { var document = new BsonDocument("x", 1); var bson = document.ToBson(); var expectedResult = Enumerable.Repeat(bson, numberOfDocuments).Aggregate(Enumerable.Empty<byte>(), (a, b) => a.Concat(b)).ToArray(); using (var stream = new MemoryStream()) using (var binaryWriter = new BsonBinaryWriter(stream)) { for (var n = 0; n < numberOfDocuments; n++) { binaryWriter.WriteStartDocument(); binaryWriter.WriteName("x"); binaryWriter.WriteInt32(1); binaryWriter.WriteEndDocument(); } var result = stream.ToArray(); result.Should().Equal(expectedResult); } }
// protected methods protected override void WriteBody(BsonBuffer buffer) { buffer.WriteInt32((int)_flags); buffer.WriteCString(new UTF8Encoding(false, true), _collectionFullName); buffer.WriteInt32(_numberToSkip); buffer.WriteInt32(_numberToReturn); using (var bsonWriter = new BsonBinaryWriter(buffer, false, WriterSettings)) { if (_query == null) { bsonWriter.WriteStartDocument(); bsonWriter.WriteEndDocument(); } else { BsonSerializer.Serialize(bsonWriter, _query.GetType(), _query, DocumentSerializationOptions.SerializeIdFirstInstance); } if (_fields != null) { BsonSerializer.Serialize(bsonWriter, _fields); } } }
/// <summary> /// Reads a raw BSON array. /// </summary> /// <returns>The raw BSON array.</returns> public virtual IByteBuffer ReadRawBsonArray() { // overridden in BsonBinaryReader to read the raw bytes from the stream // for all other streams, deserialize the array and reserialize it using a BsonBinaryWriter to get the raw bytes var deserializationContext = BsonDeserializationContext.CreateRoot(this); var array = BsonArraySerializer.Instance.Deserialize(deserializationContext); using (var memoryStream = new MemoryStream()) using (var bsonWriter = new BsonBinaryWriter(memoryStream, BsonBinaryWriterSettings.Defaults)) { var serializationContext = BsonSerializationContext.CreateRoot(bsonWriter); bsonWriter.WriteStartDocument(); var startPosition = memoryStream.Position + 3; // just past BsonType, "x" and null byte bsonWriter.WriteName("x"); BsonArraySerializer.Instance.Serialize(serializationContext, array); var endPosition = memoryStream.Position; bsonWriter.WriteEndDocument(); byte[] memoryStreamBuffer; #if NETSTANDARD1_5 || NETSTANDARD1_6 memoryStreamBuffer = memoryStream.ToArray(); #else memoryStreamBuffer = memoryStream.GetBuffer(); #endif var buffer = new ByteArrayBuffer(memoryStreamBuffer, (int)memoryStream.Length, isReadOnly: true); return new ByteBufferSlice(buffer, (int)startPosition, (int)(endPosition - startPosition)); } }
private JsonWriterAdapter CreateSubject() { var stream = new MemoryStream(); var wrappedWriter = new BsonBinaryWriter(stream); return new JsonWriterAdapter(wrappedWriter); }
private void WriteUpdate(BsonBinaryWriter binaryWriter, BsonDocument update, IElementNameValidator updateValidator) { binaryWriter.PushElementNameValidator(updateValidator); try { var position = binaryWriter.BaseStream.Position; var context = BsonSerializationContext.CreateRoot(binaryWriter); BsonDocumentSerializer.Instance.Serialize(context, update); if (updateValidator is UpdateElementNameValidator && binaryWriter.BaseStream.Position == position + 5) { throw new BsonSerializationException("Update documents cannot be empty."); } } finally { binaryWriter.PopElementNameValidator(); } }
private void WriteQuery(BsonBinaryWriter binaryWriter, BsonDocument query) { var context = BsonSerializationContext.CreateRoot(binaryWriter); BsonDocumentSerializer.Instance.Serialize(context, query); }
// methods private void SerializeCriteria(BsonBinaryWriter bsonWriter, BsonDocument criteria) { var context = BsonSerializationContext.CreateRoot<BsonDocument>(bsonWriter); BsonDocumentSerializer.Instance.Serialize(context, criteria); }
private void SerializeUpdate(BsonBinaryWriter bsonWriter, BsonDocument update) { var updateValidator = new UpdateOrReplacementElementNameValidator(); bsonWriter.PushElementNameValidator(updateValidator); try { var context = BsonSerializationContext.CreateRoot<BsonDocument>(bsonWriter); BsonDocumentSerializer.Instance.Serialize(context, update); } finally { bsonWriter.PopElementNameValidator(); } }
private void WriteQuery(BsonBinaryWriter binaryWriter, BsonDocument query, IElementNameValidator queryValidator) { binaryWriter.PushElementNameValidator(queryValidator); try { var context = BsonSerializationContext.CreateRoot(binaryWriter); BsonDocumentSerializer.Instance.Serialize(context, query ?? new BsonDocument()); } finally { binaryWriter.PopElementNameValidator(); } }
private void WriteOptionalFields(BsonBinaryWriter binaryWriter, BsonDocument fields) { if (fields != null) { var context = BsonSerializationContext.CreateRoot(binaryWriter); BsonDocumentSerializer.Instance.Serialize(context, fields); } }