Skip to content

Commit b943820

Browse files
author
rstam
committed
CSHARP-666: Added lots of unit tests and fixed a few bugs.
1 parent ab79856 commit b943820

34 files changed

+2725
-120
lines changed

MongoDB.Bson/IO/BsonBinaryReader.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,6 @@ public BsonBinaryReader(BsonBuffer buffer, bool disposeBuffer, BsonBinaryReaderS
5858
{
5959
throw new ArgumentNullException("buffer");
6060
}
61-
if (settings == null)
62-
{
63-
throw new ArgumentNullException("settings");
64-
}
6561

6662
_buffer = buffer;
6763
_disposeBuffer = disposeBuffer;
@@ -452,7 +448,7 @@ public override ObjectId ReadObjectId()
452448
public override IByteBuffer ReadRawBsonArray()
453449
{
454450
if (Disposed) { ThrowObjectDisposedException(); }
455-
VerifyBsonType("ReadStartArray", BsonType.Array);
451+
VerifyBsonType("ReadRawBsonArray", BsonType.Array);
456452

457453
var position = _buffer.Position;
458454
var length = _buffer.ReadInt32();
@@ -670,11 +666,14 @@ protected override void Dispose(bool disposing)
670666
try
671667
{
672668
Close();
673-
if (_disposeBuffer)
669+
if (_buffer != null)
674670
{
675-
_buffer.Dispose();
671+
if (_disposeBuffer)
672+
{
673+
_buffer.Dispose();
674+
}
675+
_buffer = null;
676676
}
677-
_buffer = null;
678677
}
679678
catch { } // ignore exceptions
680679
}

MongoDB.Bson/IO/BsonBinaryWriter.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,6 @@ public BsonBinaryWriter(BsonBuffer buffer, bool disposeBuffer, BsonBinaryWriterS
6161
{
6262
throw new ArgumentNullException("encoder");
6363
}
64-
if (settings == null)
65-
{
66-
throw new ArgumentNullException("settings");
67-
}
6864

6965
_buffer = buffer;
7066
_disposeBuffer = disposeBuffer;
@@ -482,7 +478,6 @@ public override void WriteObjectId(ObjectId objectId)
482478
/// Writes a raw BSON array.
483479
/// </summary>
484480
/// <param name="slice">The byte buffer containing the raw BSON array.</param>
485-
/// <exception cref="System.NotImplementedException"></exception>
486481
public override void WriteRawBsonArray(IByteBuffer slice)
487482
{
488483
if (Disposed) { throw new ObjectDisposedException("BsonBinaryWriter"); }
@@ -493,7 +488,7 @@ public override void WriteRawBsonArray(IByteBuffer slice)
493488

494489
_buffer.WriteByte((byte)BsonType.Array);
495490
WriteNameHelper();
496-
_buffer.ByteBuffer.WriteBytes(slice); // assumes byteBuffer is a valid raw BSON document
491+
_buffer.ByteBuffer.WriteBytes(slice); // assumes byteBuffer is a valid raw BSON array
497492

498493
State = GetNextState();
499494
}
@@ -680,11 +675,14 @@ protected override void Dispose(bool disposing)
680675
if (disposing)
681676
{
682677
Close();
683-
if (_disposeBuffer)
678+
if (_buffer != null)
684679
{
685-
_buffer.Dispose();
680+
if (_disposeBuffer)
681+
{
682+
_buffer.Dispose();
683+
}
684+
_buffer = null;
686685
}
687-
_buffer = null;
688686
}
689687
base.Dispose(disposing);
690688
}

MongoDB.Bson/IO/BsonBuffer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ public byte ReadByte()
264264
/// <returns>A byte array.</returns>
265265
public byte[] ReadBytes(int count)
266266
{
267+
ThrowIfDisposed();
267268
return _byteBuffer.ReadBytes(count);
268269
}
269270

@@ -779,10 +780,9 @@ private string ReadCString(int nullPosition)
779780
}
780781

781782
var length = nullPosition - _byteBuffer.Position + 1;
782-
var segment = _byteBuffer.WriteBackingBytes(length);
783+
var segment = _byteBuffer.ReadBackingBytes(length);
783784
if (segment.Count >= length)
784785
{
785-
_byteBuffer.Position += length;
786786
return DecodeUtf8String(segment.Array, segment.Offset, length - 1);
787787
}
788788
else

MongoDB.Bson/IO/BsonChunk.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace MongoDB.Bson.IO
2020
/// <summary>
2121
/// Represents a BSON buffer chunk.
2222
/// </summary>
23-
internal class BsonChunk
23+
public class BsonChunk
2424
{
2525
// private fields
2626
private readonly byte[] _bytes;

MongoDB.Bson/IO/BsonDocumentReader.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* limitations under the License.
1414
*/
1515

16+
using System;
1617
using System.IO;
1718

1819
namespace MongoDB.Bson.IO
@@ -36,6 +37,11 @@ public class BsonDocumentReader : BsonReader
3637
public BsonDocumentReader(BsonDocument document, BsonDocumentReaderSettings settings)
3738
: base(settings)
3839
{
40+
if (document == null)
41+
{
42+
throw new ArgumentNullException("document");
43+
}
44+
3945
_context = new BsonDocumentReaderContext(null, ContextType.TopLevel, document);
4046
_currentValue = document;
4147
_documentReaderSettings = settings; // already frozen by base class

MongoDB.Bson/IO/BsonDocumentWriter.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ public class BsonDocumentWriter : BsonWriter
3636
public BsonDocumentWriter(BsonDocument topLevelDocument, BsonDocumentWriterSettings settings)
3737
: base(settings)
3838
{
39+
if (topLevelDocument == null)
40+
{
41+
throw new ArgumentNullException("topLevelDocument");
42+
}
43+
3944
_topLevelDocument = topLevelDocument;
4045
_documentWriterSettings = settings; // already frozen by base class
4146
_context = null;

MongoDB.Bson/IO/BsonReader.cs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ public abstract class BsonReader : IDisposable
3939
/// <param name="settings">The reader settings.</param>
4040
protected BsonReader(BsonReaderSettings settings)
4141
{
42+
if (settings == null)
43+
{
44+
throw new ArgumentNullException("settings");
45+
}
46+
4247
_settings = settings.FrozenCopy();
4348
_state = BsonReaderState.Initial;
4449
}
@@ -171,6 +176,7 @@ public static BsonReader Create(Stream stream)
171176
public static BsonReader Create(Stream stream, BsonBinaryReaderSettings settings)
172177
{
173178
var byteBuffer = ByteBufferFactory.LoadFrom(stream);
179+
byteBuffer.MakeReadOnly();
174180
return new BsonBinaryReader(new BsonBuffer(byteBuffer, true), true, settings);
175181
}
176182

@@ -669,9 +675,21 @@ public void ReadObjectId(string name, out int timestamp, out int machine, out sh
669675
public virtual IByteBuffer ReadRawBsonArray()
670676
{
671677
// overridden in BsonBinaryReader
672-
var array = BsonDocumentSerializer.Instance.Deserialize(this, typeof(BsonArray), null);
673-
var bytes = array.ToBson();
674-
return new ByteArrayBuffer(bytes, 0, bytes.Length, true);
678+
var array = BsonArraySerializer.Instance.Deserialize(this, typeof(BsonArray), null);
679+
using (var bsonWriter = new BsonBinaryWriter(new BsonBuffer(), true, BsonBinaryWriterSettings.Defaults))
680+
{
681+
bsonWriter.WriteStartDocument();
682+
var startPosition = bsonWriter.Buffer.Position + 3; // just past BsonType, "x" and null byte
683+
bsonWriter.WriteName("x");
684+
BsonArraySerializer.Instance.Serialize(bsonWriter, typeof(BsonArray), array, null);
685+
var endPosition = bsonWriter.Buffer.Position;
686+
bsonWriter.WriteEndDocument();
687+
688+
var length = (int)(endPosition - startPosition);
689+
bsonWriter.Buffer.Position = startPosition;
690+
var bytes = bsonWriter.Buffer.ReadBytes(length);
691+
return new ByteArrayBuffer(bytes, 0, length, true);
692+
}
675693
}
676694

677695
/// <summary>

MongoDB.Bson/IO/BsonWriter.cs

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ public abstract class BsonWriter : IDisposable
4242
/// <param name="settings">The writer settings.</param>
4343
protected BsonWriter(BsonWriterSettings settings)
4444
{
45+
if (settings == null)
46+
{
47+
throw new ArgumentNullException("settings");
48+
}
49+
4550
_settings = settings.FrozenCopy();
4651
_state = BsonWriterState.Initial;
4752
}
@@ -569,9 +574,30 @@ public void WriteObjectId(string name, int timestamp, int machine, short pid, in
569574
public virtual void WriteRawBsonArray(IByteBuffer slice)
570575
{
571576
// overridden in BsonBinaryWriter
572-
using (var bsonReader = new BsonBinaryReader(new BsonBuffer(slice, false), true, BsonBinaryReaderSettings.Defaults))
577+
578+
using (var bsonBuffer = new BsonBuffer())
573579
{
574-
var array = BsonSerializer.Deserialize<BsonArray>(bsonReader);
580+
BsonArray array;
581+
582+
// wrap the array in a fake document so we can deserialize it
583+
var arrayLength = slice.Length;
584+
var documentLength = arrayLength + 8;
585+
bsonBuffer.WriteInt32(documentLength);
586+
bsonBuffer.WriteByte((byte)BsonType.Array);
587+
bsonBuffer.WriteByte((byte)'x');
588+
bsonBuffer.WriteByte((byte)0);
589+
bsonBuffer.ByteBuffer.WriteBytes(slice);
590+
bsonBuffer.WriteByte((byte)0);
591+
592+
bsonBuffer.Position = 0;
593+
using (var bsonReader = new BsonBinaryReader(bsonBuffer, true, BsonBinaryReaderSettings.Defaults))
594+
{
595+
bsonReader.ReadStartDocument();
596+
bsonReader.ReadName("x");
597+
array = (BsonArray)BsonArraySerializer.Instance.Deserialize(bsonReader, typeof(BsonArray), null);
598+
bsonReader.ReadEndDocument();
599+
}
600+
575601
BsonArraySerializer.Instance.Serialize(this, typeof(BsonArray), array, null);
576602
}
577603
}

MongoDB.Bson/IO/ByteArrayBuffer.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ public void Dispose()
213213
public int FindNullByte()
214214
{
215215
ThrowIfDisposed();
216-
return Array.IndexOf<byte>(_bytes, 0, _position, _length - _position);
216+
var index = Array.IndexOf<byte>(_bytes, 0, _sliceOffset + _position, _length - _position);
217+
return (index == -1) ? -1 : index - _sliceOffset;
217218
}
218219

219220
/// <summary>

MongoDB.Bson/IO/JsonReader.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ public class JsonReader : BsonReader
4444
public JsonReader(JsonBuffer buffer, JsonReaderSettings settings)
4545
: base(settings)
4646
{
47+
if (buffer == null)
48+
{
49+
throw new ArgumentNullException("buffer");
50+
}
51+
4752
_buffer = buffer;
4853
_jsonReaderSettings = settings; // already frozen by base class
4954
_context = new JsonReaderContext(null, ContextType.TopLevel);

0 commit comments

Comments
 (0)