コード例 #1
0
        public async Task RegistersWhenSchemaIncompatible()
        {
            var serializer = new AsyncSchemaRegistrySerializer <int>(
                RegistryClientMock.Object,
                registerAutomatically: true
                );

            var data     = 6;
            var encoding = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0c };
            var metadata = new MessageMetadata();
            var context  = new SerializationContext(MessageComponentType.Value, "test_topic");
            var subject  = $"{context.Topic}-value";

            RegistryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new Schema(subject, 1, 9, "\"string\""));

            RegistryClientMock
            .Setup(c => c.RegisterSchemaAsync(subject, It.IsAny <string>()))
            .ReturnsAsync(10);

            Assert.Equal(encoding,
                         await serializer.SerializeAsync(data, context)
                         );
        }
コード例 #2
0
        public async Task RegistersWhenSubjectMissing()
        {
            var serializer = new AsyncSchemaRegistrySerializer <int>(
                RegistryClientMock.Object,
                registerAutomatically: true
                );

            var data     = 6;
            var encoding = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x08, 0x0c };
            var metadata = new MessageMetadata();
            var context  = new SerializationContext(MessageComponentType.Value, "test_topic");
            var subject  = $"{context.Topic}-value";

            RegistryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ThrowsAsync(new SchemaRegistryException("Subject not found", HttpStatusCode.NotFound, 40401));

            RegistryClientMock
            .Setup(c => c.RegisterSchemaAsync(subject, It.IsAny <string>()))
            .ReturnsAsync(8);

            Assert.Equal(encoding,
                         await serializer.SerializeAsync(data, context)
                         );
        }
コード例 #3
0
        public async Task SerializesWithAutoRegistrationNever()
        {
            var serializer = new AsyncSchemaRegistrySerializer <int>(
                registryClientMock.Object,
                registerAutomatically: AutomaticRegistrationBehavior.Never);

            var data    = 6;
            var context = new SerializationContext(MessageComponentType.Value, "test_topic");
            var subject = $"{context.Topic}-value";

            registryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, 1, 9, "\"string\"", SchemaType.Avro, null));

            await Assert.ThrowsAsync <UnsupportedTypeException>(() => serializer.SerializeAsync(data, context));
        }
コード例 #4
0
        public async Task SerializesTombstone()
        {
            var serializer = new AsyncSchemaRegistrySerializer <object>(
                registryClientMock.Object,
                tombstoneBehavior: TombstoneBehavior.Strict);

            var data    = (int?)null;
            var context = new SerializationContext(MessageComponentType.Value, "test_topic");
            var subject = $"{context.Topic}-value";

            registryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, 1, 4, "\"int\"", SchemaType.Avro, null));

            Assert.Null(await serializer.SerializeAsync(data, context));
        }
コード例 #5
0
        public async Task ThrowsOnInvalidTombstoneComponent()
        {
            var serializer = new AsyncSchemaRegistrySerializer <int?>(
                registryClientMock.Object,
                tombstoneBehavior: TombstoneBehavior.Strict);

            var data    = (int?)null;
            var context = new SerializationContext(MessageComponentType.Key, "test_topic");
            var subject = $"{context.Topic}-key";

            registryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, 1, 4, "\"int\"", SchemaType.Avro, null));

            await Assert.ThrowsAsync <InvalidOperationException>(() =>
                                                                 serializer.SerializeAsync(data, context));
        }
コード例 #6
0
        public async Task SerializesWithAutoRegistrationAlways()
        {
            var serializer = new AsyncSchemaRegistrySerializer <int>(
                registryClientMock.Object,
                registerAutomatically: AutomaticRegistrationBehavior.Always);

            var data     = 6;
            var encoding = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x09, 0x0c };
            var context  = new SerializationContext(MessageComponentType.Value, "test_topic");
            var subject  = $"{context.Topic}-value";

            registryClientMock
            .Setup(c => c.RegisterSchemaAsync(subject, It.Is <Schema>(s => s.SchemaType == SchemaType.Avro)))
            .ReturnsAsync(9);

            Assert.Equal(encoding, await serializer.SerializeAsync(data, context));
        }
コード例 #7
0
        public async Task ProvidesDefaultSerializationComponents()
        {
            var serializer = new AsyncSchemaRegistrySerializer <int>(
                registryClientMock.Object);

            var data     = 4;
            var encoding = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x04, 0x08 };
            var context  = new SerializationContext(MessageComponentType.Key, "test_topic");
            var subject  = $"{context.Topic}-key";

            registryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, 1, 4, "\"int\"", SchemaType.Avro, null));

            Assert.Equal(
                encoding,
                await serializer.SerializeAsync(data, context));
        }
コード例 #8
0
        public async Task HandlesConfluentWireFormatBytesCase()
        {
            var serializer = new AsyncSchemaRegistrySerializer <object>(
                registryClientMock.Object);

            var data     = new byte[] { 0x02 };
            var encoding = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 };
            var context  = new SerializationContext(MessageComponentType.Value, "test_topic");
            var subject  = $"{context.Topic}-value";

            registryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, 1, 0, "\"bytes\"", SchemaType.Avro, null));

            Assert.Equal(
                encoding,
                await serializer.SerializeAsync(data, context));
        }
コード例 #9
0
        public async Task CachesGeneratedSerializers()
        {
            var serializer = new AsyncSchemaRegistrySerializer <object>(
                registryClientMock.Object);

            var context = new SerializationContext(MessageComponentType.Value, "test_topic");
            var subject = $"{context.Topic}-value";

            registryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, 1, 12, "\"null\"", SchemaType.Avro, null));

            await Task.WhenAll(Enumerable.Range(0, 5).Select(i =>
                                                             serializer.SerializeAsync(null, context)));

            registryClientMock
            .Verify(c => c.GetLatestSchemaAsync(subject), Times.Once());
        }
コード例 #10
0
        public async Task DoesNotCacheSchemaRegistryFailures()
        {
            var serializer = new AsyncSchemaRegistrySerializer <object>(
                registryClientMock.Object);

            var context = new SerializationContext(MessageComponentType.Value, "test_topic");
            var subject = $"{context.Topic}-value";

            registryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ThrowsAsync(new HttpRequestException());

            await Assert.ThrowsAsync <HttpRequestException>(() =>
                                                            serializer.SerializeAsync(null, context));

            registryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, 1, 12, "\"null\"", SchemaType.Avro, null));

            await serializer.SerializeAsync(null, context);
        }
コード例 #11
0
        public async Task UsesSubjectNameBuilder()
        {
            var version = GetType().Assembly.GetName().Version;

            var serializer = new AsyncSchemaRegistrySerializer <int>(
                registryClientMock.Object,
                subjectNameBuilder: c => $"{c.Topic}-{version}-{c.Component.ToString().ToLowerInvariant()}");

            var data     = 2;
            var encoding = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x08, 0x04 };
            var context  = new SerializationContext(MessageComponentType.Key, "test_topic");
            var subject  = $"{context.Topic}-{version}-key";

            registryClientMock
            .Setup(c => c.GetLatestSchemaAsync(subject))
            .ReturnsAsync(new RegisteredSchema(subject, 2, 8, "\"int\"", SchemaType.Avro, null));

            Assert.Equal(
                encoding,
                await serializer.SerializeAsync(data, context));
        }