public void Serialize_should_throw_when_effectiveGuidRepresentation_is_Unspecified(
            GuidRepresentationMode defaultGuidRepresentationMode,
            GuidRepresentation defaultGuidRepresentation,
            GuidRepresentation serializerGuidRepresentation,
            GuidRepresentation?writerGuidRepresentation)
        {
            GuidMode.Set(defaultGuidRepresentationMode, defaultGuidRepresentation);

            var subject        = new GuidSerializer(serializerGuidRepresentation);
            var memoryStream   = new MemoryStream();
            var writerSettings = new BsonBinaryWriterSettings();

            if (defaultGuidRepresentationMode == GuidRepresentationMode.V2 && writerGuidRepresentation.HasValue)
            {
#pragma warning disable 618
                writerSettings.GuidRepresentation = writerGuidRepresentation.Value;
#pragma warning restore 618
            }
            var writer  = new BsonBinaryWriter(memoryStream, writerSettings);
            var context = BsonSerializationContext.CreateRoot(writer);
            var args    = new BsonSerializationArgs();
            var value   = new Guid("01020304-0506-0708-090a-0b0c0d0e0f10");

            writer.WriteStartDocument();
            writer.WriteName("x");
            var exception = Record.Exception(() => subject.Serialize(context, args, value));

            exception.Should().BeOfType <BsonSerializationException>();
        }
Пример #2
0
        public void RoundTrip()
        {
            using (var ms = new MemoryStream())
            {
                using (var writer = new BsonBinaryWriter(ms))
                {
                    var bsContext  = BsonSerializationContext.CreateRoot(writer);
                    var serializer = new MigrationVersionSerializer();
                    var bsArgs     = new BsonSerializationArgs();

                    writer.WriteStartDocument();
                    writer.WriteName("version");
                    serializer.Serialize(bsContext, bsArgs, new MigrationVersion("M20010203040506_foo"));
                    writer.WriteEndDocument();
                }
                ms.Position = 0;
                using (var reader = new BsonBinaryReader(ms))
                {
                    var bsContext  = BsonDeserializationContext.CreateRoot(reader);
                    var serializer = new MigrationVersionSerializer();
                    var bsArgs     = new BsonDeserializationArgs();

                    reader.ReadStartDocument();
                    reader.ReadName().Should().Be("version");
                    var version = serializer.Deserialize(bsContext, bsArgs);
                    version.Should().BeEquivalentTo(new MigrationVersion("M20010203040506_foo"));
                    reader.ReadEndDocument();
                }
            }
        }
        public void BsonBinaryReader_should_support_reading_more_than_2GB()
        {
            RequireEnvironment.Check().EnvironmentVariable("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 TestWriteNameThrowsWhenValueIsNull()
 {
     using (var stream = new MemoryStream())
         using (var bsonWriter = new BsonBinaryWriter(stream, BsonBinaryWriterSettings.Defaults))
         {
             Assert.Throws <ArgumentNullException>(() => { bsonWriter.WriteName(null); });
         }
 }
 public void WriteName_should_throw_when_value_contains_nulls()
 {
     using (var stream = new MemoryStream())
         using (var bsonWriter = new BsonBinaryWriter(stream, BsonBinaryWriterSettings.Defaults))
         {
             Assert.Throws <BsonSerializationException>(() => { bsonWriter.WriteName("a\0b"); });
         }
 }
 public void WriteName_should_throw_when_value_is_null()
 {
     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 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();
            }
Пример #10
0
            // 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();
            }
Пример #11
0
 private byte[] Serialize <TEnum>(IBsonSerializer <TEnum> serializer, TEnum value)
 {
     using (var stream = new MemoryStream())
         using (var writer = new BsonBinaryWriter(stream))
         {
             var context = BsonSerializationContext.CreateRoot(writer);
             writer.WriteStartDocument();
             writer.WriteName("x");
             serializer.Serialize(context, value);
             writer.WriteEndDocument();
             return(stream.ToArray());
         }
 }
Пример #12
0
        /// <summary>
        /// 写bson
        /// </summary>
        /// <param name="outputFileName"></param>
        public static void WriteBson(string outputFileName)
        {
            //如果存在,则覆盖(注意原来的不截断)
            using (FileStream stream = File.OpenWrite(outputFileName))
            {
                using (BsonBinaryWriter writer = new BsonBinaryWriter(stream))
                {
                    writer.WriteStartDocument();
                    writer.WriteName("a");
                    writer.WriteInt32(1);

                    writer.WriteEndDocument();
                }
            }
        }
Пример #13
0
        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 Serialize_guid_should_have_expected_result_when_guid_representation_is_unspecified_and_mode_is_v2(
            [Values(GuidRepresentation.CSharpLegacy, GuidRepresentation.JavaLegacy, GuidRepresentation.PythonLegacy, GuidRepresentation.Standard, GuidRepresentation.Unspecified)]
            GuidRepresentation defaultGuidRepresentation,
            [Values(GuidRepresentation.CSharpLegacy, GuidRepresentation.JavaLegacy, GuidRepresentation.PythonLegacy, GuidRepresentation.Standard, GuidRepresentation.Unspecified)]
            GuidRepresentation writerGuidRepresentation)
        {
#pragma warning disable 618
            var expectedGuidRepresentation = writerGuidRepresentation != GuidRepresentation.Unspecified ? writerGuidRepresentation : defaultGuidRepresentation;
            if (expectedGuidRepresentation == GuidRepresentation.Unspecified)
            {
                throw new SkipException("Test skipped because expectedGuidRepresentation is Unspecified.");
            }
            BsonDefaults.GuidRepresentationMode = GuidRepresentationMode.V2;
            BsonDefaults.GuidRepresentation     = defaultGuidRepresentation;
            var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(object));
            var subject        = new ObjectSerializer(discriminatorConvention, GuidRepresentation.Unspecified);
            var writerSettings = new BsonBinaryWriterSettings();
            if (writerGuidRepresentation != GuidRepresentation.Unspecified)
            {
                writerSettings.GuidRepresentation = writerGuidRepresentation;
            }
            using (var memoryStream = new MemoryStream())
                using (var writer = new BsonBinaryWriter(memoryStream, writerSettings))
                {
                    var context = BsonSerializationContext.CreateRoot(writer);
                    var guid    = Guid.Parse("01020304-0506-0708-090a-0b0c0d0e0f10");

                    writer.WriteStartDocument();
                    writer.WriteName("x");
                    subject.Serialize(context, guid);
                    writer.WriteEndDocument();

                    var bytes             = memoryStream.ToArray();
                    var expectedBytes     = new byte[] { 29, 0, 0, 0, 5, 120, 0, 16, 0, 0, 0, 3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0 };
                    var expectedSubType   = GuidConverter.GetSubType(expectedGuidRepresentation);
                    var expectedGuidBytes = GuidConverter.ToBytes(guid, expectedGuidRepresentation);
                    expectedBytes[11] = (byte)expectedSubType;
                    Array.Copy(expectedGuidBytes, 0, expectedBytes, 12, 16);
                    bytes.Should().Equal(expectedBytes);
                }
#pragma warning restore 618
        }
        public void Serialize_guid_should_throw_when_guid_representation_is_unspecified_and_mode_is_v3()
        {
#pragma warning disable 618
            BsonDefaults.GuidRepresentationMode = GuidRepresentationMode.V3;
            var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(object));
            var subject = new ObjectSerializer(discriminatorConvention, GuidRepresentation.Unspecified);
            using (var memoryStream = new MemoryStream())
                using (var writer = new BsonBinaryWriter(memoryStream))
                {
                    var context = BsonSerializationContext.CreateRoot(writer);
                    var guid    = Guid.Parse("01020304-0506-0708-090a-0b0c0d0e0f10");

                    writer.WriteStartDocument();
                    writer.WriteName("x");
                    var exception = Record.Exception(() => subject.Serialize(context, guid));

                    exception.Should().BeOfType <BsonSerializationException>();
                }
#pragma warning restore 618
        }
        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);
                }
        }
Пример #17
0
        protected byte[] Serialize <T>(IBsonSerializer <T> serializer, T value, bool mustBeNested = false, GuidRepresentation guidRepresentation = GuidRepresentation.Unspecified)
        {
            using (var memoryStream = new MemoryStream())
                using (var writer = new BsonBinaryWriter(memoryStream, new BsonBinaryWriterSettings {
                    GuidRepresentation = guidRepresentation
                }))
                {
                    if (mustBeNested)
                    {
                        writer.WriteStartDocument();
                        writer.WriteName("x");
                    }

                    var context = BsonSerializationContext.CreateRoot(writer);
                    serializer.Serialize(context, value);

                    if (mustBeNested)
                    {
                        writer.WriteEndDocument();
                    }

                    return(memoryStream.ToArray());
                }
        }
        public void Serialize_should_write_expected_bytes(
            GuidRepresentationMode defaultGuiRepresentationMode,
            GuidRepresentation defaultGuidRepresentation,
            GuidRepresentation serializerGuidRepresentation,
            GuidRepresentation?writerGuidRepresentation,
            BsonBinarySubType expectedSubType,
            GuidRepresentation effectiveGuidRepresentation)
        {
            GuidMode.Set(defaultGuiRepresentationMode, defaultGuidRepresentation);

            var subject        = new GuidSerializer(serializerGuidRepresentation);
            var memoryStream   = new MemoryStream();
            var writerSettings = new BsonBinaryWriterSettings();

            if (defaultGuiRepresentationMode == GuidRepresentationMode.V2 && writerGuidRepresentation.HasValue)
            {
#pragma warning disable 618
                writerSettings.GuidRepresentation = writerGuidRepresentation.Value;
#pragma warning restore 618
            }
            var writer  = new BsonBinaryWriter(memoryStream, writerSettings);
            var context = BsonSerializationContext.CreateRoot(writer);
            var args    = new BsonSerializationArgs();
            var value   = new Guid("01020304-0506-0708-090a-0b0c0d0e0f10");

            writer.WriteStartDocument();
            writer.WriteName("x");
            subject.Serialize(context, args, value);
            writer.WriteEndDocument();
            var result = memoryStream.ToArray();

            var expectedBytes = new byte[] { 29, 0, 0, 0, 5, 120, 0, 16, 0, 0, 0, 4, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0 };
            expectedBytes[11] = (byte)expectedSubType;
            Array.Copy(GuidConverter.ToBytes(value, effectiveGuidRepresentation), 0, expectedBytes, 12, 16);
            result.Should().Equal(expectedBytes);
        }