blob: c18da4068eab2cd732997e71a75922c650fc9e95 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.IO;
using Avro.IO;
using Avro.Reflect;
using NUnit.Framework;
namespace Avro.test.Reflect
{
public class TestLogicalSchema
{
[TestCase]
public void WriteAndReadObjectsWithLogicalSchemaFields_WithNullValues()
{
//Arrange
var obj = new TestObject
{
AvroDecimalNullableProperty = null,
AvroDecimalProperty = 13.42m,
GuidNullableProperty = null,
GuidProperty = Guid.NewGuid(),
DateNullableProperty = null,
DateProperty = new DateTime(2022, 05, 26, 14, 57, 24, 123),
DateTimeMicrosecondNullableProperty = null,
DateTimeMicrosecondProperty = DateTime.UtcNow,
DateTimeMillisecondNullableProperty = null,
DateTimeMillisecondProperty = DateTime.UtcNow,
TimeSpanMicrosecondNullableProperty = null,
TimeSpanMicrosecondProperty = new TimeSpan(23, 59, 59),
TimeSpanMillisecondNullableProperty = null,
TimeSpanMillisecondProperty = new TimeSpan(23, 59, 59),
};
var schema = Schema.Parse(SchemaJson);
var writer = new ReflectWriter<TestObject>(schema);
var reader = new ReflectReader<TestObject>(schema, schema);
var writeStream = new MemoryStream();
var writeBinaryEncoder = new BinaryEncoder(writeStream);
//Act
writer.Write(obj, writeBinaryEncoder);
var data = writeStream.ToArray();
var readStream = new MemoryStream(data);
var result = reader.Read(null, new BinaryDecoder(readStream));
//Assert
Assert.NotNull(result);
Assert.IsNull(result.AvroDecimalNullableProperty);
Assert.AreEqual(obj.AvroDecimalProperty, result.AvroDecimalProperty);
Assert.IsNull(result.GuidNullableProperty);
Assert.AreEqual(obj.GuidProperty, result.GuidProperty);
Assert.IsNull(obj.DateNullableProperty);
Assert.AreEqual(obj.DateProperty.Date, result.DateProperty);
Assert.IsNull(result.DateTimeMicrosecondNullableProperty);
Assert.AreEqual((obj.DateTimeMicrosecondProperty.Ticks / 10 ) * 10, result.DateTimeMicrosecondProperty.Ticks);
Assert.IsNull(result.DateTimeMillisecondNullableProperty);
Assert.AreEqual((obj.DateTimeMillisecondProperty.Ticks / 10000) * 10000, result.DateTimeMillisecondProperty.Ticks);
Assert.IsNull(result.TimeSpanMicrosecondNullableProperty);
Assert.AreEqual(obj.TimeSpanMicrosecondProperty, result.TimeSpanMicrosecondProperty);
Assert.IsNull(result.TimeSpanMillisecondNullableProperty);
Assert.AreEqual(obj.TimeSpanMillisecondProperty, result.TimeSpanMillisecondProperty);
}
[TestCase]
public void WriteAndReadObjectsWithLogicalSchemaFields_WithoutNullValues()
{
//Arrange
var obj = new TestObject
{
AvroDecimalNullableProperty = 136.42m,
AvroDecimalProperty = 13.42m,
GuidNullableProperty = Guid.NewGuid(),
GuidProperty = Guid.NewGuid(),
DateNullableProperty = new DateTime(2022, 05, 26, 14, 57, 24, 123),
DateProperty = new DateTime(2022, 05, 26, 14, 57, 24, 123),
DateTimeMicrosecondNullableProperty = DateTime.UtcNow,
DateTimeMicrosecondProperty = DateTime.UtcNow,
DateTimeMillisecondNullableProperty = DateTime.UtcNow,
DateTimeMillisecondProperty = DateTime.UtcNow,
TimeSpanMicrosecondNullableProperty = new TimeSpan(23, 59, 59),
TimeSpanMicrosecondProperty = new TimeSpan(23, 59, 59),
TimeSpanMillisecondNullableProperty = new TimeSpan(23, 59, 59),
TimeSpanMillisecondProperty = new TimeSpan(23, 59, 59),
};
var schema = Schema.Parse(SchemaJson);
var writer = new ReflectWriter<TestObject>(schema);
var reader = new ReflectReader<TestObject>(schema, schema);
var writeStream = new MemoryStream();
var writeBinaryEncoder = new BinaryEncoder(writeStream);
//Act
writer.Write(obj, writeBinaryEncoder);
var data = writeStream.ToArray();
var readStream = new MemoryStream(data);
var result = reader.Read(null, new BinaryDecoder(readStream));
//Assert
Assert.NotNull(result);
Assert.NotNull(result.AvroDecimalNullableProperty);
Assert.AreEqual(obj.AvroDecimalNullableProperty, result.AvroDecimalNullableProperty);
Assert.AreEqual(obj.AvroDecimalProperty, result.AvroDecimalProperty);
Assert.NotNull(result.GuidNullableProperty);
Assert.AreEqual(obj.GuidNullableProperty, result.GuidNullableProperty);
Assert.AreEqual(obj.GuidProperty, result.GuidProperty);
Assert.NotNull(result.DateProperty);
Assert.AreEqual(obj.DateNullableProperty?.Date, result.DateProperty);
Assert.AreEqual(obj.DateProperty.Date, result.DateProperty);
Assert.NotNull(result.DateTimeMicrosecondNullableProperty);
Assert.AreEqual((obj.DateTimeMicrosecondNullableProperty?.Ticks / 10) * 10, result.DateTimeMicrosecondNullableProperty?.Ticks);
Assert.AreEqual((obj.DateTimeMicrosecondProperty.Ticks / 10) * 10, result.DateTimeMicrosecondProperty.Ticks);
Assert.NotNull(result.DateTimeMillisecondNullableProperty);
Assert.AreEqual((obj.DateTimeMillisecondNullableProperty?.Ticks / 10000) * 10000, result.DateTimeMillisecondNullableProperty?.Ticks);
Assert.AreEqual((obj.DateTimeMillisecondProperty.Ticks / 10000) * 10000, result.DateTimeMillisecondProperty.Ticks);
Assert.NotNull(result.TimeSpanMicrosecondNullableProperty);
Assert.AreEqual(obj.TimeSpanMicrosecondNullableProperty, result.TimeSpanMicrosecondNullableProperty);
Assert.AreEqual(obj.TimeSpanMicrosecondProperty, result.TimeSpanMicrosecondProperty);
Assert.NotNull(result.TimeSpanMillisecondNullableProperty);
Assert.AreEqual(obj.TimeSpanMillisecondNullableProperty, result.TimeSpanMillisecondNullableProperty);
Assert.AreEqual(obj.TimeSpanMillisecondProperty, result.TimeSpanMillisecondProperty);
}
private const string SchemaJson = @"
{
""type"" : ""record"",
""namespace"" : ""Avro.test.Reflect.Converters"",
""name"" : ""TestObject"",
""fields"" : [
{ ""name"" : ""AvroDecimalNullableProperty"" , ""type"" : [""null"", { ""type"": ""bytes"", ""logicalType"": ""decimal"", ""precision"": 6, ""scale"": 2 }] },
{ ""name"" : ""AvroDecimalProperty"" , ""type"" : { ""type"": ""bytes"", ""logicalType"": ""decimal"", ""precision"": 6, ""scale"": 2 } },
{ ""name"" : ""GuidNullableProperty"" , ""type"" : [""null"", { ""type"": ""string"", ""logicalType"": ""uuid""}] },
{ ""name"" : ""GuidProperty"" , ""type"" : { ""type"": ""string"", ""logicalType"": ""uuid""} },
{ ""name"" : ""DateNullableProperty"" , ""type"" : [""null"", { ""type"": ""int"", ""logicalType"": ""date""}] },
{ ""name"" : ""DateProperty"" , ""type"" : { ""type"": ""int"", ""logicalType"": ""date""} },
{ ""name"" : ""DateTimeMicrosecondNullableProperty"" , ""type"" : [""null"", { ""type"": ""long"", ""logicalType"": ""timestamp-micros""}] },
{ ""name"" : ""DateTimeMicrosecondProperty"" , ""type"" : { ""type"": ""long"", ""logicalType"": ""timestamp-micros""} },
{ ""name"" : ""DateTimeMillisecondNullableProperty"" , ""type"" : [""null"", { ""type"": ""long"", ""logicalType"": ""timestamp-millis""}] },
{ ""name"" : ""DateTimeMillisecondProperty"" , ""type"" : { ""type"": ""long"", ""logicalType"": ""timestamp-millis""} },
{ ""name"" : ""TimeSpanMicrosecondNullableProperty"" , ""type"" : [""null"", { ""type"": ""long"", ""logicalType"": ""time-micros""}] },
{ ""name"" : ""TimeSpanMicrosecondProperty"" , ""type"" : { ""type"": ""long"", ""logicalType"": ""time-micros""} },
{ ""name"" : ""TimeSpanMillisecondNullableProperty"" , ""type"" : [""null"", { ""type"": ""int"", ""logicalType"": ""time-millis""}] },
{ ""name"" : ""TimeSpanMillisecondProperty"" , ""type"" : { ""type"": ""int"", ""logicalType"": ""time-millis""} }
]
}
";
public class TestObject
{
public AvroDecimal? AvroDecimalNullableProperty { get; set; }
public AvroDecimal AvroDecimalProperty { get; set; }
public Guid? GuidNullableProperty { get; set; }
public Guid GuidProperty { get; set; }
public DateTime? DateNullableProperty { get; set; }
public DateTime DateProperty { get; set; }
public DateTime? DateTimeMicrosecondNullableProperty { get; set; }
public DateTime DateTimeMicrosecondProperty { get; set; }
public DateTime? DateTimeMillisecondNullableProperty { get; set; }
public DateTime DateTimeMillisecondProperty { get; set; }
public TimeSpan? TimeSpanMicrosecondNullableProperty { get; set; }
public TimeSpan TimeSpanMicrosecondProperty { get; set; }
public TimeSpan? TimeSpanMillisecondNullableProperty { get; set; }
public TimeSpan TimeSpanMillisecondProperty { get; set; }
}
}
}