public void Deserialize_should_throw_when_representation_is_binary_and_sub_type_does_not_match(
            GuidRepresentationMode defaultGuidRepresentationMode,
            GuidRepresentation defaultGuidRepresentation,
            GuidRepresentation serializerGuidRepresentation,
            GuidRepresentation?readerGuidRepresentation,
            BsonBinarySubType expectedSubType)
        {
            GuidMode.Set(defaultGuidRepresentationMode, defaultGuidRepresentation);

            var subject            = new GuidSerializer(serializerGuidRepresentation);
            var documentBytes      = new byte[] { 29, 0, 0, 0, 5, 120, 0, 16, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0 };
            var nonMatchingSubType = expectedSubType == BsonBinarySubType.UuidLegacy ? BsonBinarySubType.UuidStandard : BsonBinarySubType.UuidLegacy;

            documentBytes[11] = (byte)nonMatchingSubType;
            var readerSettings = new BsonBinaryReaderSettings();

            if (defaultGuidRepresentationMode == GuidRepresentationMode.V2 && readerGuidRepresentation.HasValue)
            {
#pragma warning disable 618
                readerSettings.GuidRepresentation = readerGuidRepresentation.Value;
#pragma warning restore 618
            }
            var reader = new BsonBinaryReader(new MemoryStream(documentBytes), readerSettings);
            reader.ReadStartDocument();
            reader.ReadName("x");
            var context = BsonDeserializationContext.CreateRoot(reader);
            var args    = new BsonDeserializationArgs();

            var exception = Record.Exception(() => subject.Deserialize(context, args));

            exception.Should().BeOfType <FormatException>();
        }
        public void Deserializer_should_return_expected_result_when_representation_is_binary(
            GuidRepresentationMode defaultGuidRepresentationMode,
            GuidRepresentation defaultGuidRepresentation,
            GuidRepresentation serializerGuidRepresentation,
            GuidRepresentation readerGuidRepresentation,
            GuidRepresentation expectedGuidRepresentation)
        {
            GuidMode.Set(defaultGuidRepresentationMode, defaultGuidRepresentation);

            var subject         = new GuidSerializer(serializerGuidRepresentation);
            var documentBytes   = new byte[] { 29, 0, 0, 0, 5, 120, 0, 16, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0 };
            var documentSubType = GuidConverter.GetSubType(expectedGuidRepresentation);

            documentBytes[11] = (byte)documentSubType;
            var readerSettings = new BsonBinaryReaderSettings();

            if (defaultGuidRepresentationMode == GuidRepresentationMode.V2)
            {
#pragma warning disable 618
                readerSettings.GuidRepresentation = readerGuidRepresentation;
#pragma warning restore 618
            }
            var reader = new BsonBinaryReader(new MemoryStream(documentBytes), readerSettings);
            reader.ReadStartDocument();
            reader.ReadName("x");
            var context = BsonDeserializationContext.CreateRoot(reader);
            var args    = new BsonDeserializationArgs();

            var result = subject.Deserialize(context, args);

            var guidBytes    = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
            var expectedGuid = GuidConverter.FromBytes(guidBytes, expectedGuidRepresentation);
            result.Should().Be(expectedGuid);
        }
        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>();
        }
        public void Deserialize_binary_data_should_throw_when_guid_representation_is_specified_and_sub_type_is_not_expected_sub_type(
            [ClassValues(typeof(GuidModeValues))]
            GuidMode mode,
            [Values(GuidRepresentation.CSharpLegacy, GuidRepresentation.JavaLegacy, GuidRepresentation.PythonLegacy, GuidRepresentation.Standard)]
            GuidRepresentation readerGuidRepresentation,
            [Values(GuidRepresentation.CSharpLegacy, GuidRepresentation.JavaLegacy, GuidRepresentation.PythonLegacy, GuidRepresentation.Standard)]
            GuidRepresentation guidRepresentation)
        {
#pragma warning disable 618
            mode.Set();
            var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(object));
            var subject          = new ObjectSerializer(discriminatorConvention, guidRepresentation);
            var bytes            = 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 incorrectSubType = guidRepresentation == GuidRepresentation.Standard ? BsonBinarySubType.UuidLegacy : BsonBinarySubType.UuidStandard;
            bytes[11] = (byte)incorrectSubType;
            var readerSettings = new BsonBinaryReaderSettings();
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
            {
                readerSettings.GuidRepresentation = readerGuidRepresentation;
            }
            using (var memoryStream = new MemoryStream(bytes))
                using (var reader = new BsonBinaryReader(memoryStream, readerSettings))
                {
                    var context = BsonDeserializationContext.CreateRoot(reader);

                    reader.ReadStartDocument();
                    reader.ReadName("x");
                    var exception = Record.Exception(() => subject.Deserialize <object>(context));

                    exception.Should().BeOfType <FormatException>();
                }
#pragma warning restore 618
        }
Example #5
0
        public void TestGuid(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618, 1062
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
            {
                var document = new BsonDocument
                {
                    { "guid", new Guid("B5F21E0C2A0D42d6AD03D827008D8AB6") }
                };
                using (var bsonReader = new BsonDocumentReader(document))
                {
                    var rehydrated = DeserializeBsonDocument(bsonReader);
                    Assert.True(document.Equals(rehydrated));
                }
            }
            else
            {
                var exception = Record.Exception(() => new BsonDocument("guid", new Guid("B5F21E0C2A0D42d6AD03D827008D8AB6")));
                exception.Should().BeOfType <InvalidOperationException>();
            }
#pragma warning restore 618, 1062
        }
Example #6
0
        public void Explicit_decoding_with_standard_representation_should_work_as_expected()
        {
            GuidMode.Set(GuidRepresentationMode.V3);

            var guid       = new Guid("00112233445566778899aabbccddeeff");
            var bytes      = GuidConverter.ToBytes(guid, GuidRepresentation.Standard);
            var binaryData = new BsonBinaryData(bytes, BsonBinarySubType.UuidStandard);

            var exception = Record.Exception(() => binaryData.ToGuid(GuidRepresentation.Unspecified));

            exception.Should().BeOfType <ArgumentException>();

            foreach (var guidRepresentation in new[] { GuidRepresentation.CSharpLegacy, GuidRepresentation.JavaLegacy, GuidRepresentation.PythonLegacy })
            {
                exception = Record.Exception(() => binaryData.ToGuid(guidRepresentation));
                exception.Should().BeOfType <InvalidOperationException>();
            }

            var result = binaryData.ToGuid();

            result.Should().Be(guid);

            result = binaryData.ToGuid(GuidRepresentation.Standard);
            result.Should().Be(guid);
        }
        public void constructor_should_throw_when_sub_type_is_uuid_and_guid_representation_is_invalid(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode,
            [Values(5)] GuidRepresentation guidRepresentation,
            [Range(1, 2)] int overload)
        {
            mode.Set();

#pragma warning disable 618
            var bytes = new byte[16];
            var guid  = Guid.Empty;

            Exception exception = null;
            switch (overload)
            {
            case 1: exception = Record.Exception(() => new BsonBinaryData(bytes, BsonBinarySubType.UuidLegacy, guidRepresentation)); break;

            case 2: exception = Record.Exception(() => new BsonBinaryData(guid, guidRepresentation)); break;
            }

            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 || overload == 2)
            {
                var e = exception.Should().BeOfType <ArgumentException>().Subject;
                e.Message.Should().StartWith($"Invalid guidRepresentation: 5.");
                e.ParamName.Should().Be("guidRepresentation");
            }
            else
            {
                exception.Should().BeOfType <InvalidOperationException>();
            }
#pragma warning restore 618
        }
        public void Deserialize_binary_data_should_return_expected_result_when_guid_representation_is_specified(
            [ClassValues(typeof(GuidModeValues))]
            GuidMode mode,
            [Values(-1, GuidRepresentation.Unspecified)]
            GuidRepresentation readerGuidRepresentation,
            [Values(GuidRepresentation.CSharpLegacy, GuidRepresentation.JavaLegacy, GuidRepresentation.PythonLegacy, GuidRepresentation.Standard)]
            GuidRepresentation guidRepresentation)
        {
#pragma warning disable 618
            mode.Set();
            var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(object));
            var subject = new ObjectSerializer(discriminatorConvention, guidRepresentation);
            var bytes   = 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 subType = GuidConverter.GetSubType(guidRepresentation);
            bytes[11] = (byte)subType;
            var readerSettings = new BsonBinaryReaderSettings();
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
            {
                readerSettings.GuidRepresentation = readerGuidRepresentation == (GuidRepresentation)(-1) ? guidRepresentation : GuidRepresentation.Unspecified;
            }
            using (var memoryStream = new MemoryStream(bytes))
                using (var reader = new BsonBinaryReader(memoryStream, readerSettings))
                {
                    var context = BsonDeserializationContext.CreateRoot(reader);

                    reader.ReadStartDocument();
                    reader.ReadName("x");
                    var result = subject.Deserialize <object>(context);

                    var guidBytes      = bytes.Skip(12).Take(16).ToArray();
                    var expectedResult = GuidConverter.FromBytes(guidBytes, guidRepresentation);
                    result.Should().Be(expectedResult);
                }
#pragma warning restore 618
        }
        public void Deserialize_should_throw_when_representation_is_binary_and_guid_representation_is_unspecified(
            GuidRepresentationMode defaultGuidRepresentationMode,
            GuidRepresentation defaultGuidRepresentation,
            GuidRepresentation?readerGuidRepresentation)
        {
            GuidMode.Set(defaultGuidRepresentationMode, defaultGuidRepresentation);

            var subject        = new GuidSerializer(GuidRepresentation.Unspecified);
            var documentBytes  = 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 readerSettings = new BsonBinaryReaderSettings();

            if (defaultGuidRepresentationMode == GuidRepresentationMode.V2 && readerGuidRepresentation.HasValue)
            {
#pragma warning disable 618
                readerSettings.GuidRepresentation = readerGuidRepresentation.Value;
#pragma warning restore 618
            }
            var reader = new BsonBinaryReader(new MemoryStream(documentBytes), readerSettings);
            reader.ReadStartDocument();
            reader.ReadName("x");
            var context = BsonDeserializationContext.CreateRoot(reader);
            var args    = new BsonDeserializationArgs();

            var exception = Record.Exception(() => subject.Deserialize(context, args));

            exception.Should().BeOfType <BsonSerializationException>();
        }
Example #10
0
        public void Serialize_should_not_convert_Uuids_in_elements(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode,
            [Values(false, true)] bool useGenericInterface)
        {
            mode.Set();

            var guid  = Guid.Parse("01020304-0506-0708-090a-0b0c0d0e0f10");
            var value = new BsonDocument {
                { "_id", new BsonBinaryData(guid, GuidRepresentation.Standard) }, { "x", 1 }
            };
            var elements = new BsonDocument("b", new BsonBinaryData(guid, GuidRepresentation.Standard));
            var subject  = CreateSubject(elements);

            string result;

            using (var textWriter = new StringWriter())
                using (var writer = new JsonWriter(textWriter, new JsonWriterSettings()))
                {
                    var context = BsonSerializationContext.CreateRoot(writer);
                    var args    = new BsonSerializationArgs {
                        NominalType = typeof(BsonDocument)
                    };

                    if (useGenericInterface)
                    {
                        subject.Serialize(context, args, value);
                    }
                    else
                    {
                        ((IBsonSerializer)subject).Serialize(context, args, value);
                    }

                    result = textWriter.ToString();
                }

            // note that "_id" was converted but "b" was not
            string expectedIdJson;

#pragma warning disable 618
            var guidRepresentation = BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 ? BsonDefaults.GuidRepresentation : GuidRepresentation.Unspecified;
            switch (guidRepresentation)
            {
            case GuidRepresentation.CSharpLegacy: expectedIdJson = "CSUUID(\"01020304-0506-0708-090a-0b0c0d0e0f10\")"; break;

            case GuidRepresentation.JavaLegacy: expectedIdJson = "JUUID(\"01020304-0506-0708-090a-0b0c0d0e0f10\")"; break;

            case GuidRepresentation.PythonLegacy: expectedIdJson = "PYUUID(\"01020304-0506-0708-090a-0b0c0d0e0f10\")"; break;

            case GuidRepresentation.Standard: expectedIdJson = "UUID(\"01020304-0506-0708-090a-0b0c0d0e0f10\")"; break;

            case GuidRepresentation.Unspecified: expectedIdJson = "UUID(\"01020304-0506-0708-090a-0b0c0d0e0f10\")"; break;

            default: throw new Exception("Unexpected GuidRepresentation.");
            }
#pragma warning restore 618
            result.Should().Be($"{{ \"_id\" : {expectedIdJson}, \"x\" : 1, \"b\" : UUID(\"01020304-0506-0708-090a-0b0c0d0e0f10\") }}");
        }
        public void BsonBinaryData_constructor_with_a_Guid_and_a_representation_should_return_expected_result(GuidRepresentation guidRepresentation, BsonBinarySubType expectedSubType, string expectedBytes)
        {
            GuidMode.Set(GuidRepresentationMode.V3);

            var guid = new Guid("00112233445566778899aabbccddeeff");

            var result = new BsonBinaryData(guid, guidRepresentation);

            result.SubType.Should().Be(expectedSubType);
            result.Bytes.Should().Equal(BsonUtils.ParseHexString(expectedBytes));
        }
        public void BsonBinaryData_constructor_with_a_Guid_and_representation_Unspecified_should_throw()
        {
            GuidMode.Set(GuidRepresentationMode.V3);

            var guid = new Guid("00112233445566778899aabbccddeeff");

#pragma warning disable 618
            var exception = Record.Exception(() => new BsonBinaryData(guid, GuidRepresentation.Unspecified));
#pragma warning disable 618

            exception.Should().BeOfType <InvalidOperationException>();
        }
Example #13
0
        public void SerializeValue_should_throw_when_value_representation_is_unspecified(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode,
            [Values(
                 GuidRepresentation.CSharpLegacy,
                 GuidRepresentation.JavaLegacy,
                 GuidRepresentation.PythonLegacy,
                 GuidRepresentation.Standard,
                 GuidRepresentation.Unspecified)] GuidRepresentation writerGuidRepresentation,
            [Values(
                 GuidRepresentation.CSharpLegacy,
                 GuidRepresentation.JavaLegacy,
                 GuidRepresentation.PythonLegacy,
                 GuidRepresentation.Standard,
                 GuidRepresentation.Unspecified)] GuidRepresentation valueGuidRepresentation)
        {
            mode.Set();

#pragma warning disable 618
            var subject = new BsonBinaryDataSerializer();

            var mockWriter     = new Mock <IBsonWriter>();
            var writerSettings = new BsonBinaryWriterSettings();
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
            {
                writerSettings.GuidRepresentation = writerGuidRepresentation;
            }
            mockWriter.SetupGet(m => m.Settings).Returns(writerSettings);
            var context = BsonSerializationContext.CreateRoot(mockWriter.Object);
            var args    = new BsonSerializationArgs();
            var subType = valueGuidRepresentation == GuidRepresentation.Unspecified ? BsonBinarySubType.UuidLegacy : GuidConverter.GetSubType(valueGuidRepresentation);
            var value   = BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2
                ? new BsonBinaryData(new byte[16], subType, valueGuidRepresentation)
                : new BsonBinaryData(new byte[16], subType);

            var exception = Record.Exception(() => subject.Serialize(context, args, value));

            var isExceptionExpected =
                BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 &&
                writerGuidRepresentation != GuidRepresentation.Unspecified &&
                valueGuidRepresentation == GuidRepresentation.Unspecified;

            if (isExceptionExpected)
            {
                var e = exception.Should().BeOfType <BsonSerializationException>().Subject;
                e.Message.Should().Contain("Cannot serialize BsonBinaryData with GuidRepresentation Unspecified");
            }
            else
            {
                exception.Should().BeNull();
            }
#pragma warning restore 618
        }
        public void TestBinaryStrict(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618
            var guid  = Guid.Parse("00112233-4455-6677-8899-aabbccddeeff");
            var tests = new List <TestData <BsonBinaryData> >
            {
                new TestData <BsonBinaryData>(new byte[] { }, "{ \"$binary\" : \"\", \"$type\" : \"00\" }"),
                new TestData <BsonBinaryData>(new byte[] { 1 }, "{ \"$binary\" : \"AQ==\", \"$type\" : \"00\" }"),
                new TestData <BsonBinaryData>(new byte[] { 1, 2 }, "{ \"$binary\" : \"AQI=\", \"$type\" : \"00\" }"),
                new TestData <BsonBinaryData>(new byte[] { 1, 2, 3 }, "{ \"$binary\" : \"AQID\", \"$type\" : \"00\" }")
            };
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
            {
                byte[] expectedBytes;
                string expectedSubType;
                switch (BsonDefaults.GuidRepresentation)
                {
                case GuidRepresentation.CSharpLegacy:
                case GuidRepresentation.JavaLegacy:
                case GuidRepresentation.PythonLegacy:
                    expectedBytes   = GuidConverter.ToBytes(guid, BsonDefaults.GuidRepresentation);
                    expectedSubType = "03";
                    break;

                case GuidRepresentation.Standard:
                    expectedBytes   = GuidConverter.ToBytes(guid, GuidRepresentation.Standard);
                    expectedSubType = "04";
                    break;

                default: throw new Exception("Invalid GuidRepresentation.");
                }
                var expectedBase64   = Convert.ToBase64String(expectedBytes);
                var expectedGuidJson = $"{{ \"$binary\" : \"{expectedBase64}\", \"$type\" : \"{expectedSubType}\" }}";
                tests.Add(new TestData <BsonBinaryData>(guid, expectedGuidJson));
            }
            var jsonSettings = new JsonWriterSettings {
                OutputMode = JsonOutputMode.Strict
            };
            foreach (var test in tests)
            {
                var json = test.Value.ToJson(jsonSettings);
                Assert.Equal(test.Expected, json);
                Assert.Equal(test.Value, BsonSerializer.Deserialize <BsonBinaryData>(new JsonReader(json, new JsonReaderSettings())));
            }
#pragma warning restore 618
        }
Example #15
0
        public void Serialize_should_configure_GuidRepresentation(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode,
            [Values(false, true)] bool useGenericInterface)
        {
            mode.Set();

#pragma warning disable 618
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
            {
                var mockDocumentSerializer     = new Mock <IBsonSerializer <BsonDocument> >();
                var writerSettingsConfigurator = (Action <BsonWriterSettings>)(s => s.GuidRepresentation = GuidRepresentation.Unspecified);
                var subject  = new ElementAppendingSerializer <BsonDocument>(mockDocumentSerializer.Object, new BsonElement[0], writerSettingsConfigurator);
                var stream   = new MemoryStream();
                var settings = new BsonBinaryWriterSettings {
                    GuidRepresentation = GuidRepresentation.CSharpLegacy
                };
                var writer  = new BsonBinaryWriter(stream, settings);
                var context = BsonSerializationContext.CreateRoot(writer);
                var args    = new BsonSerializationArgs {
                    NominalType = typeof(BsonDocument)
                };
                var value = new BsonDocument();
                GuidRepresentation?capturedGuidRepresentation = null;
                mockDocumentSerializer
                .Setup(m => m.Serialize(It.IsAny <BsonSerializationContext>(), args, value))
                .Callback((BsonSerializationContext c, BsonSerializationArgs a, BsonDocument v) =>
                {
                    var elementAppendingWriter = (ElementAppendingBsonWriter)c.Writer;
                    var configurator           = elementAppendingWriter._settingsConfigurator();
                    var configuredSettings     = new BsonBinaryWriterSettings {
                        GuidRepresentation = GuidRepresentation.CSharpLegacy
                    };
                    configurator(configuredSettings);
                    capturedGuidRepresentation = configuredSettings.GuidRepresentation;
                });

                if (useGenericInterface)
                {
                    subject.Serialize(context, args, value);
                }
                else
                {
                    ((IBsonSerializer)subject).Serialize(context, args, value);
                }

                capturedGuidRepresentation.Should().Be(GuidRepresentation.Unspecified);
            }
#pragma warning restore 618
        }
        public void Deserialize_should_return_expected_result_when_representation_is_string(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

            var subject = new GuidSerializer(BsonType.String);
            var json    = "\"01020304-0506-0708-090a-0b0c0d0e0f10\"";
            var reader  = new JsonReader(json, new JsonReaderSettings());
            var context = BsonDeserializationContext.CreateRoot(reader);
            var args    = new BsonDeserializationArgs();

            var result = subject.Deserialize(context, args);

            result.Should().Be(new Guid("01020304-0506-0708-090a-0b0c0d0e0f10"));
        }
Example #17
0
        public void Implicit_encoding_with_unspecified_representation_should_work_as_expected()
        {
            GuidMode.Set(GuidRepresentationMode.V3);

            var collection = GetCollection <ClassWithGuidIdUsingUnspecifiedRepresentation>();
            var guid       = Guid.Parse("00112233445566778899aabbccddeeff");
            var document   = new ClassWithGuidIdUsingUnspecifiedRepresentation {
                Id = guid
            };

            DropCollection(collection);
            var exception = Record.Exception(() => collection.InsertOne(document));

            exception.Should().BeOfType <BsonSerializationException>();
        }
        public void TestGuidRefId(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618
            var guid = Guid.NewGuid();
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation == GuidRepresentation.Unspecified ||
                BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V3)
            {
                var exception = Record.Exception(() => new MongoDBRef("collection", guid));
                exception.Should().BeOfType <InvalidOperationException>();
            }
            else
            {
                var id    = ObjectId.GenerateNewId();
                var dbRef = new MongoDBRef("collection", guid);
                var obj   = new C {
                    Id = id, DBRef = dbRef
                };
                var json     = obj.ToJson();
                var expected = "{ '_id' : ObjectId('#id'), 'DBRef' : { '$ref' : 'collection', '$id' : #uuidConstructorName('#guid') } }";
                expected = expected.Replace("#id", id.ToString());
                string uuidConstructorName;
                switch (BsonDefaults.GuidRepresentation)
                {
                case GuidRepresentation.CSharpLegacy: uuidConstructorName = "CSUUID"; break;

                case GuidRepresentation.JavaLegacy: uuidConstructorName = "JUUID"; break;

                case GuidRepresentation.PythonLegacy: uuidConstructorName = "PYUUID"; break;

                case GuidRepresentation.Standard: uuidConstructorName = "UUID"; break;

                default: throw new Exception("Invalid GuidRepresentation.");
                }
                ;
                expected = expected.Replace("#uuidConstructorName", uuidConstructorName);
                expected = expected.Replace("#guid", guid.ToString());
                expected = expected.Replace("'", "\"");
                Assert.Equal(expected, json);

                var bson       = obj.ToBson();
                var rehydrated = BsonSerializer.Deserialize <C>(bson);
                Assert.True(bson.SequenceEqual(rehydrated.ToBson()));
            }
#pragma warning restore 618
        }
Example #19
0
        public void SerializeValue_should_call_WriteBinaryData(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

            var subject = new BsonBinaryDataSerializer();

            var mockWriter = new Mock <IBsonWriter>();
            var context    = BsonSerializationContext.CreateRoot(mockWriter.Object);
            var args       = new BsonSerializationArgs();
            var value      = new BsonBinaryData(new byte[0]);

            subject.Serialize(context, args, value);

            mockWriter.Verify(m => m.WriteBinaryData(value), Times.Once);
        }
        public void Serialize_shoud_write_expected_string_when_representation_is_string(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

            var subject      = new GuidSerializer(BsonType.String);
            var stringWriter = new StringWriter();
            var writer       = new JsonWriter(stringWriter);
            var context      = BsonSerializationContext.CreateRoot(writer);
            var args         = new BsonSerializationArgs();
            var value        = new Guid("01020304-0506-0708-090a-0b0c0d0e0f10");

            subject.Serialize(context, args, value);
            var result = stringWriter.ToString();

            result.Should().Be("\"01020304-0506-0708-090a-0b0c0d0e0f10\"");
        }
        public void TestGuidJavaLegacy(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618
            var guid       = new Guid("01020304-0506-0708-090a-0b0c0d0e0f10");
            var binaryData = new BsonBinaryData(guid, GuidRepresentation.JavaLegacy);
            var expected   = new byte[] { 8, 7, 6, 5, 4, 3, 2, 1, 16, 15, 14, 13, 12, 11, 10, 9 };
            Assert.True(expected.SequenceEqual(binaryData.Bytes));
            Assert.Equal(BsonBinarySubType.UuidLegacy, binaryData.SubType);
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
            {
                Assert.Equal(GuidRepresentation.JavaLegacy, binaryData.GuidRepresentation);
                Assert.Equal(guid, binaryData.AsGuid);
                Assert.Equal(guid, binaryData.RawValue);
            }
#pragma warning restore
        }
Example #22
0
        public void ReadBinaryData_subtype_4_should_use_GuidRepresentation_Standard(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode,
            [Values(
                 GuidRepresentation.CSharpLegacy,
                 GuidRepresentation.JavaLegacy,
                 GuidRepresentation.PythonLegacy,
                 GuidRepresentation.Standard,
                 GuidRepresentation.Unspecified)] GuidRepresentation guidRepresentation)
        {
            mode.Set();

#pragma warning disable 618
            var settings = new BsonBinaryReaderSettings();
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
            {
                settings.GuidRepresentation = guidRepresentation;
            }
            var bytes = 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 };
            using (var stream = new MemoryStream(bytes))
                using (var reader = new BsonBinaryReader(stream, settings))
                {
                    reader.ReadStartDocument();
                    var type          = reader.ReadBsonType();
                    var name          = reader.ReadName();
                    var binaryData    = reader.ReadBinaryData();
                    var endOfDocument = reader.ReadBsonType();
                    reader.ReadEndDocument();

                    name.Should().Be("x");
                    type.Should().Be(BsonType.Binary);
                    binaryData.SubType.Should().Be(BsonBinarySubType.UuidStandard);
                    binaryData.Bytes.Should().Equal(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 });
                    if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
                    {
                        binaryData.GuidRepresentation.Should().Be(GuidRepresentation.Standard);
                    }
                    endOfDocument.Should().Be(BsonType.EndOfDocument);
                    stream.Position.Should().Be(stream.Length);
                }
#pragma warning restore 618
        }
Example #23
0
        public void Explicit_decoding_with_python_legacy_representation_should_work_as_expected()
        {
            GuidMode.Set(GuidRepresentationMode.V3);

            var bytes      = BsonUtils.ParseHexString("00112233445566778899aabbccddeeff");
            var binaryData = new BsonBinaryData(bytes, BsonBinarySubType.UuidLegacy);

            var exception = Record.Exception(() => binaryData.ToGuid());

            exception.Should().BeOfType <InvalidOperationException>();

            exception = Record.Exception(() => binaryData.ToGuid(GuidRepresentation.Standard));
            exception.Should().BeOfType <InvalidOperationException>();

            exception = Record.Exception(() => binaryData.ToGuid(GuidRepresentation.Unspecified));
            exception.Should().BeOfType <ArgumentException>();

            var result = binaryData.ToGuid(GuidRepresentation.PythonLegacy);

            result.Should().Be(new Guid("00112233445566778899aabbccddeeff"));
        }
        public void TestGuid(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618
            C c = new C {
                Guid = Guid.Empty
            };
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
            {
                var    json = c.ToJson(new JsonWriterSettings());
                string expectedGuidJson;
                var    guidRepresentation = BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 ? BsonDefaults.GuidRepresentation : GuidRepresentation.Unspecified;
                switch (guidRepresentation)
                {
                case GuidRepresentation.CSharpLegacy: expectedGuidJson = "CSUUID('00000000-0000-0000-0000-000000000000')"; break;

                case GuidRepresentation.JavaLegacy: expectedGuidJson = "JUUID('00000000-0000-0000-0000-000000000000')"; break;

                case GuidRepresentation.PythonLegacy: expectedGuidJson = "PYUUID('00000000-0000-0000-0000-000000000000')"; break;

                case GuidRepresentation.Standard: expectedGuidJson = "UUID('00000000-0000-0000-0000-000000000000')"; break;

                default: throw new Exception("Unexpected GuidRepresentation.");
                }
                var expected = _template.Replace("'Guid' : null", $"'Guid' : {expectedGuidJson}").Replace("'", "\"");
                Assert.Equal(expected, json);

                var bson       = c.ToBson(writerSettings: new BsonBinaryWriterSettings());
                var rehydrated = BsonSerializer.Deserialize <C>(new BsonBinaryReader(new MemoryStream(bson), new BsonBinaryReaderSettings()));
                Assert.True(bson.SequenceEqual(rehydrated.ToBson(writerSettings: new BsonBinaryWriterSettings())));
            }
            else
            {
                var exception = Record.Exception(() => c.ToJson(new JsonWriterSettings()));
                exception.Should().BeOfType <BsonSerializationException>();
            }
#pragma warning restore 618
        }
        public void TestAsGuid(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618
            var guid = Guid.NewGuid();
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
            {
                BsonValue v = guid;
                BsonValue s = "";
                var       g = v.AsGuid;
                Assert.Equal(guid, g);
                Assert.Throws <InvalidCastException>(() => { var x = s.AsGuid; });
            }
            else
            {
                var exception = Record.Exception(() => { BsonValue v = guid; });
                exception.Should().BeOfType <InvalidOperationException>();
            }
#pragma warning restore 618
        }
        public void TestBinaryShell(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618
            var guid  = Guid.Parse("00112233-4455-6677-8899-aabbccddeeff");
            var tests = new List <TestData <BsonBinaryData> >
            {
                new TestData <BsonBinaryData>(new byte[] { }, "new BinData(0, \"\")"),
                new TestData <BsonBinaryData>(new byte[] { 1 }, "new BinData(0, \"AQ==\")"),
                new TestData <BsonBinaryData>(new byte[] { 1, 2 }, "new BinData(0, \"AQI=\")"),
                new TestData <BsonBinaryData>(new byte[] { 1, 2, 3 }, "new BinData(0, \"AQID\")")
            };
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
            {
                string expectedGuidJson;
                switch (BsonDefaults.GuidRepresentation)
                {
                case GuidRepresentation.CSharpLegacy: expectedGuidJson = "CSUUID(\"00112233-4455-6677-8899-aabbccddeeff\")"; break;

                case GuidRepresentation.JavaLegacy: expectedGuidJson = "JUUID(\"00112233-4455-6677-8899-aabbccddeeff\")"; break;

                case GuidRepresentation.PythonLegacy: expectedGuidJson = "PYUUID(\"00112233-4455-6677-8899-aabbccddeeff\")"; break;

                case GuidRepresentation.Standard: expectedGuidJson = "UUID(\"00112233-4455-6677-8899-aabbccddeeff\")"; break;

                default: throw new Exception("Invalid GuidRepresentation.");
                }
                tests.Add(new TestData <BsonBinaryData>(guid, expectedGuidJson));
            }
            foreach (var test in tests)
            {
                var json = test.Value.ToJson(new JsonWriterSettings());
                Assert.Equal(test.Expected, json);
                Assert.Equal(test.Value, BsonSerializer.Deserialize <BsonBinaryData>(json));
            }
#pragma warning restore 618
        }
Example #27
0
        public void Test(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618
            var p = new Parent {
                Child = new Child()
            };
            p.Child.A = 1;
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
            {
                var json = p.ToJson(new JsonWriterSettings());
                BsonSerializer.Deserialize <Parent>(json); // throws Unexpected element exception
            }
            else
            {
                var exception = Record.Exception(() => p.ToJson(new JsonWriterSettings()));
                exception.Should().BeOfType <BsonSerializationException>();
            }
#pragma warning restore 618
        }
        public void TestGuid(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618, 1062
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation == GuidRepresentation.Unspecified ||
                BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V3)
            {
                var exception = Record.Exception(() => new BsonDocument("guid", new Guid("00112233445566778899aabbccddeeff")));
                exception.Should().BeOfType <InvalidOperationException>();
            }
            else
            {
                var document = new BsonDocument
                {
                    { "guid", new Guid("00112233445566778899aabbccddeeff") }
                };
                string expected;
                var    guidRepresentation = BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 ? BsonDefaults.GuidRepresentation : GuidRepresentation.Unspecified;
                switch (guidRepresentation)
                {
                case GuidRepresentation.CSharpLegacy: expected = "{ \"guid\" : CSUUID(\"00112233-4455-6677-8899-aabbccddeeff\") }"; break;

                case GuidRepresentation.JavaLegacy: expected = "{ \"guid\" : JUUID(\"00112233-4455-6677-8899-aabbccddeeff\") }"; break;

                case GuidRepresentation.PythonLegacy: expected = "{ \"guid\" : PYUUID(\"00112233-4455-6677-8899-aabbccddeeff\") }"; break;

                case GuidRepresentation.Standard: expected = "{ \"guid\" : UUID(\"00112233-4455-6677-8899-aabbccddeeff\") }"; break;

                default: throw new Exception("Unexpected GuidRepresentation.");
                }

                string actual = document.ToJson(new JsonWriterSettings());
                Assert.Equal(expected, actual);
            }
#pragma warning restore 618, 1062
        }
        public void TestMapGuid(
            [ClassValues(typeof(GuidModeValues))] GuidMode mode)
        {
            mode.Set();

#pragma warning disable 618
            var value = Guid.NewGuid();
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 && BsonDefaults.GuidRepresentation != GuidRepresentation.Unspecified)
            {
                var               bsonValue = (BsonBinaryData)BsonTypeMapper.MapToBsonValue(value);
                byte[]            expectedBytes;
                BsonBinarySubType expectedSubType;
                var               guidRepresentation = BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2 ? BsonDefaults.GuidRepresentation : GuidRepresentation.Unspecified;
                if (guidRepresentation == GuidRepresentation.Unspecified)
                {
                    expectedBytes   = GuidConverter.ToBytes(value, GuidRepresentation.Standard);
                    expectedSubType = BsonBinarySubType.UuidStandard;
                }
                else
                {
                    expectedBytes   = GuidConverter.ToBytes(value, guidRepresentation);
                    expectedSubType = GuidConverter.GetSubType(guidRepresentation);
                }
                Assert.True(expectedBytes.SequenceEqual(bsonValue.Bytes));
                Assert.Equal(expectedSubType, bsonValue.SubType);
                var bsonBinary = (BsonBinaryData)BsonTypeMapper.MapToBsonValue(value, BsonType.Binary);
                Assert.True(expectedBytes.SequenceEqual(bsonBinary.Bytes));
                Assert.Equal(expectedSubType, bsonBinary.SubType);
            }
            else
            {
                var exception = Record.Exception(() => (BsonBinaryData)BsonTypeMapper.MapToBsonValue(value));
                exception.Should().BeOfType <InvalidOperationException>();
                exception = Record.Exception(() => (BsonBinaryData)BsonTypeMapper.MapToBsonValue(value, BsonType.Binary));
                exception.Should().BeOfType <InvalidOperationException>();
            }
#pragma warning restore 618
        }
        public void Serialize_guid_should_have_expected_result_when_guid_representation_is_specified(
            [ClassValues(typeof(GuidModeValues))]
            GuidMode mode,
            [Values(GuidRepresentation.CSharpLegacy, GuidRepresentation.JavaLegacy, GuidRepresentation.PythonLegacy, GuidRepresentation.Standard, GuidRepresentation.Unspecified)]
            GuidRepresentation writerGuidRepresentation,
            [Values(GuidRepresentation.CSharpLegacy, GuidRepresentation.JavaLegacy, GuidRepresentation.PythonLegacy, GuidRepresentation.Standard)]
            GuidRepresentation guidRepresentation)
        {
#pragma warning disable 618
            mode.Set();
            var discriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeof(object));
            var subject        = new ObjectSerializer(discriminatorConvention, guidRepresentation);
            var writerSettings = new BsonBinaryWriterSettings();
            if (BsonDefaults.GuidRepresentationMode == GuidRepresentationMode.V2)
            {
                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(guidRepresentation);
                    var expectedGuidBytes = GuidConverter.ToBytes(guid, guidRepresentation);
                    expectedBytes[11] = (byte)expectedSubType;
                    Array.Copy(expectedGuidBytes, 0, expectedBytes, 12, 16);
                    bytes.Should().Equal(expectedBytes);
                }
#pragma warning restore 618
        }