diff --git a/sdk/core/Azure.Core/Azure.Core.sln b/sdk/core/Azure.Core/Azure.Core.sln index 52f5ae08b3c8..2181878a4d2b 100644 --- a/sdk/core/Azure.Core/Azure.Core.sln +++ b/sdk/core/Azure.Core/Azure.Core.sln @@ -54,6 +54,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Azure.Core.Expressions.Data EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Azure.Core.Tests.Public", "tests\public\Azure.Core.Tests.Public.csproj", "{BFBF8EF7-61D8-40E7-9E98-468A0427761E}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Azure.Core.Tests.Common", "tests\common\Azure.Core.Tests.Common.csproj", "{0EEDF53F-120A-45B1-8468-A97A0D46DBAC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -132,6 +134,10 @@ Global {BFBF8EF7-61D8-40E7-9E98-468A0427761E}.Debug|Any CPU.Build.0 = Debug|Any CPU {BFBF8EF7-61D8-40E7-9E98-468A0427761E}.Release|Any CPU.ActiveCfg = Release|Any CPU {BFBF8EF7-61D8-40E7-9E98-468A0427761E}.Release|Any CPU.Build.0 = Release|Any CPU + {0EEDF53F-120A-45B1-8468-A97A0D46DBAC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0EEDF53F-120A-45B1-8468-A97A0D46DBAC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0EEDF53F-120A-45B1-8468-A97A0D46DBAC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0EEDF53F-120A-45B1-8468-A97A0D46DBAC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/sdk/core/Azure.Core/api/Azure.Core.net461.cs b/sdk/core/Azure.Core/api/Azure.Core.net461.cs index 2171d7bc1224..7ee082c5c709 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net461.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net461.cs @@ -1150,8 +1150,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Se } public static partial class ModelSerializer { - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerFormat format) where T : Azure.Core.Serialization.IModelSerializable { throw null; } @@ -1187,6 +1185,12 @@ public ModelSerializerOptions(Azure.Core.Serialization.ModelSerializerFormat for public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public System.Func? GenericTypeSerializerCreator { get { throw null; } set { } } } + public sealed partial class ModelWriter : System.IDisposable + { + public ModelWriter(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions options) { } + public void Dispose() { } + public System.BinaryData ToBinaryData() { throw null; } + } public abstract partial class ObjectSerializer { protected ObjectSerializer() { } diff --git a/sdk/core/Azure.Core/api/Azure.Core.net5.0.cs b/sdk/core/Azure.Core/api/Azure.Core.net5.0.cs index 4d0b56b94516..ce1c4465e0ec 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net5.0.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net5.0.cs @@ -1150,8 +1150,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Se } public static partial class ModelSerializer { - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerFormat format) where T : Azure.Core.Serialization.IModelSerializable { throw null; } @@ -1187,6 +1185,12 @@ public ModelSerializerOptions(Azure.Core.Serialization.ModelSerializerFormat for public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public System.Func? GenericTypeSerializerCreator { get { throw null; } set { } } } + public sealed partial class ModelWriter : System.IDisposable + { + public ModelWriter(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions options) { } + public void Dispose() { } + public System.BinaryData ToBinaryData() { throw null; } + } public abstract partial class ObjectSerializer { protected ObjectSerializer() { } diff --git a/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs b/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs index 4d0b56b94516..ce1c4465e0ec 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.net6.0.cs @@ -1150,8 +1150,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Se } public static partial class ModelSerializer { - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerFormat format) where T : Azure.Core.Serialization.IModelSerializable { throw null; } @@ -1187,6 +1185,12 @@ public ModelSerializerOptions(Azure.Core.Serialization.ModelSerializerFormat for public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public System.Func? GenericTypeSerializerCreator { get { throw null; } set { } } } + public sealed partial class ModelWriter : System.IDisposable + { + public ModelWriter(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions options) { } + public void Dispose() { } + public System.BinaryData ToBinaryData() { throw null; } + } public abstract partial class ObjectSerializer { protected ObjectSerializer() { } diff --git a/sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs b/sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs index 2171d7bc1224..7ee082c5c709 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs @@ -1150,8 +1150,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Se } public static partial class ModelSerializer { - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerFormat format) where T : Azure.Core.Serialization.IModelSerializable { throw null; } @@ -1187,6 +1185,12 @@ public ModelSerializerOptions(Azure.Core.Serialization.ModelSerializerFormat for public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public System.Func? GenericTypeSerializerCreator { get { throw null; } set { } } } + public sealed partial class ModelWriter : System.IDisposable + { + public ModelWriter(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions options) { } + public void Dispose() { } + public System.BinaryData ToBinaryData() { throw null; } + } public abstract partial class ObjectSerializer { protected ObjectSerializer() { } diff --git a/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs b/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs index 2171d7bc1224..7ee082c5c709 100644 --- a/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs +++ b/sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs @@ -1150,8 +1150,6 @@ public override void Write(System.Text.Json.Utf8JsonWriter writer, Azure.Core.Se } public static partial class ModelSerializer { - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } - public static System.BinaryData ConvertToBinaryData(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerFormat format) { throw null; } public static object Deserialize(System.BinaryData data, System.Type returnType, Azure.Core.Serialization.ModelSerializerOptions? options = null) { throw null; } public static T Deserialize(System.BinaryData data, Azure.Core.Serialization.ModelSerializerFormat format) where T : Azure.Core.Serialization.IModelSerializable { throw null; } @@ -1187,6 +1185,12 @@ public ModelSerializerOptions(Azure.Core.Serialization.ModelSerializerFormat for public Azure.Core.Serialization.ModelSerializerFormat Format { get { throw null; } } public System.Func? GenericTypeSerializerCreator { get { throw null; } set { } } } + public sealed partial class ModelWriter : System.IDisposable + { + public ModelWriter(Azure.Core.Serialization.IModelJsonSerializable model, Azure.Core.Serialization.ModelSerializerOptions options) { } + public void Dispose() { } + public System.BinaryData ToBinaryData() { throw null; } + } public abstract partial class ObjectSerializer { protected ObjectSerializer() { } diff --git a/sdk/core/Azure.Core/perf/Azure.Core.Perf.csproj b/sdk/core/Azure.Core/perf/Azure.Core.Perf.csproj index c3bd504fdbaa..be1c0a02238f 100644 --- a/sdk/core/Azure.Core/perf/Azure.Core.Perf.csproj +++ b/sdk/core/Azure.Core/perf/Azure.Core.Perf.csproj @@ -22,16 +22,10 @@ - - Always - - - Always - - + Always - + Always diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelContent/LargeModel.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/LargeModel.cs index 692b20efa53a..bec72f6746d2 100644 --- a/sdk/core/Azure.Core/perf/RequestContents/ModelContent/LargeModel.cs +++ b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/LargeModel.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using Azure.Core.Tests.Public.ResourceManager.Resources; +using Azure.Core.Tests.ResourceManager.Resources; namespace Azure.Core.Perf.RequestContents.ModelContent { diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelContent/SmallModel.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/SmallModel.cs index 9165fa610032..c485debc8ff8 100644 --- a/sdk/core/Azure.Core/perf/RequestContents/ModelContent/SmallModel.cs +++ b/sdk/core/Azure.Core/perf/RequestContents/ModelContent/SmallModel.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using Azure.Core.Tests.Public.ResourceManager.Compute; +using Azure.Core.Tests.ResourceManager.Compute; namespace Azure.Core.Perf.RequestContents.ModelContent { diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/LargeModel.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/LargeModel.cs index 81bf67044a41..059688835f5a 100644 --- a/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/LargeModel.cs +++ b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/LargeModel.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using Azure.Core.Tests.Public.ResourceManager.Resources; +using Azure.Core.Tests.ResourceManager.Resources; namespace Azure.Core.Perf.RequestContents.ModelJsonContent { diff --git a/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/SmallModel.cs b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/SmallModel.cs index 47b32034d476..50c640a6c102 100644 --- a/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/SmallModel.cs +++ b/sdk/core/Azure.Core/perf/RequestContents/ModelJsonContent/SmallModel.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using Azure.Core.Tests.Public.ResourceManager.Compute; +using Azure.Core.Tests.ResourceManager.Compute; namespace Azure.Core.Perf.RequestContents.ModelJsonContent { diff --git a/sdk/core/Azure.Core/perf/Serializations/AvailabilitySetDataModel.cs b/sdk/core/Azure.Core/perf/Serializations/AvailabilitySetDataModel.cs index 007454eb7294..5bb785e4dcd7 100644 --- a/sdk/core/Azure.Core/perf/Serializations/AvailabilitySetDataModel.cs +++ b/sdk/core/Azure.Core/perf/Serializations/AvailabilitySetDataModel.cs @@ -2,7 +2,7 @@ // Licensed under the MIT License. using System.Text.Json; -using Azure.Core.Tests.Public.ResourceManager.Compute; +using Azure.Core.Tests.ResourceManager.Compute; namespace Azure.Core.Perf.Serializations { diff --git a/sdk/core/Azure.Core/perf/Serializations/JsonBenchmark.cs b/sdk/core/Azure.Core/perf/Serializations/JsonBenchmark.cs index 5631e1448abc..3bf0044b1ae2 100644 --- a/sdk/core/Azure.Core/perf/Serializations/JsonBenchmark.cs +++ b/sdk/core/Azure.Core/perf/Serializations/JsonBenchmark.cs @@ -6,7 +6,6 @@ using System.Reflection; using System.Text; using System.Text.Json; -using Azure.Core.Internal; using Azure.Core.Serialization; using Azure.Core.TestFramework; using BenchmarkDotNet.Attributes; @@ -99,9 +98,10 @@ public BinaryData Serialize_ModelSerializer() [Benchmark] [BenchmarkCategory("ModelSerializer")] - public BinaryData Serialize_ConvertToBinary() + public BinaryData Serialize_ModelWriter() { - return ModelSerializer.ConvertToBinaryData(_model, _options); + using var writer = new ModelWriter(_model, _options); + return writer.ToBinaryData(); } [Benchmark] diff --git a/sdk/core/Azure.Core/perf/Serializations/ResourceProviderDataModel.cs b/sdk/core/Azure.Core/perf/Serializations/ResourceProviderDataModel.cs index 229a4594c024..43ba6583edee 100644 --- a/sdk/core/Azure.Core/perf/Serializations/ResourceProviderDataModel.cs +++ b/sdk/core/Azure.Core/perf/Serializations/ResourceProviderDataModel.cs @@ -2,7 +2,7 @@ // Licensed under the MIT License. using System.Text.Json; -using Azure.Core.Tests.Public.ResourceManager.Resources; +using Azure.Core.Tests.ResourceManager.Resources; using BenchmarkDotNet.Attributes; namespace Azure.Core.Perf.Serializations diff --git a/sdk/core/Azure.Core/perf/TestData/ModelXml.xml b/sdk/core/Azure.Core/perf/TestData/ModelXml.xml deleted file mode 100644 index ee71bb965ac1..000000000000 --- a/sdk/core/Azure.Core/perf/TestData/ModelXml.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - Color - Red - ReadOnly - - ChildRed - ChildReadOnly - - diff --git a/sdk/core/Azure.Core/src/Internal/ModelWriter.cs b/sdk/core/Azure.Core/src/Internal/ModelWriter.cs deleted file mode 100644 index 9b4c3df05019..000000000000 --- a/sdk/core/Azure.Core/src/Internal/ModelWriter.cs +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Diagnostics; -using System.IO; -using System.Text.Json; -using System.Threading; -using System.Threading.Tasks; -using Azure.Core.Serialization; - -namespace Azure.Core.Internal -{ - internal sealed partial class ModelWriter : IDisposable - { - private readonly IModelJsonSerializable _model; - private readonly ModelSerializerOptions _options; - - private volatile SequenceBuilder? _sequenceBuilder; - - // write lock is used to synchronize between dispose and serialization - // read lock is used to block disposing while a copy to is in progress - private ReaderWriterLockSlim? _lock; - private ReaderWriterLockSlim Lock => _lock ??= new ReaderWriterLockSlim(); - - public ModelWriter(IModelJsonSerializable model, ModelSerializerOptions options) - { - _model = model; - _options = options; - } - - private SequenceBuilder GetSequenceBuilder() - { - if (_sequenceBuilder is null) - { - Lock.EnterWriteLock(); - try - { - if (_sequenceBuilder is null) - { - SequenceBuilder sequenceBuilder = new SequenceBuilder(); - using var jsonWriter = new Utf8JsonWriter(sequenceBuilder); - _model.Serialize(jsonWriter, _options); - jsonWriter.Flush(); - _sequenceBuilder = sequenceBuilder; - } - } - finally - { - Lock.ExitWriteLock(); - } - } - return _sequenceBuilder; - } - - public void CopyTo(Stream stream, CancellationToken cancellation) - { - //can't get the write lock from inside the read lock - SequenceBuilder sequenceBuilder = GetSequenceBuilder(); - Lock.EnterReadLock(); - try - { - sequenceBuilder.CopyTo(stream, cancellation); - } - finally - { - Lock.ExitReadLock(); - } - } - - public bool TryComputeLength(out long length) - { - //can't get the write lock from inside the read lock - SequenceBuilder sequenceBuilder = GetSequenceBuilder(); - Lock.EnterReadLock(); - try - { - return sequenceBuilder.TryComputeLength(out length); - } - finally - { - Lock.ExitReadLock(); - } - } - - public async Task CopyToAsync(Stream stream, CancellationToken cancellation) - { - //can't get the write lock from inside the read lock - SequenceBuilder sequenceBuilder = GetSequenceBuilder(); - Lock.EnterReadLock(); - try - { - await sequenceBuilder.CopyToAsync(stream, cancellation).ConfigureAwait(false); - } - finally - { - Lock.ExitReadLock(); - } - } - - public void Dispose() - { - Lock.EnterWriteLock(); - try - { - _sequenceBuilder?.Dispose(); - _sequenceBuilder = null; - } - finally - { - Lock.ExitWriteLock(); - } - } - - public BinaryData ToBinaryData() - { - //can't get the write lock from inside the read lock - SequenceBuilder sequenceBuilder = GetSequenceBuilder(); - Lock.EnterReadLock(); - try - { - bool gotLength = sequenceBuilder.TryComputeLength(out long length); - Debug.Assert(gotLength); - using var stream = new MemoryStream((int)length); - sequenceBuilder.CopyTo(stream, default); - return new BinaryData(stream.GetBuffer().AsMemory(0, (int)stream.Position)); - } - finally - { - Lock.ExitReadLock(); - } - } - } -} diff --git a/sdk/core/Azure.Core/src/RequestContent.cs b/sdk/core/Azure.Core/src/RequestContent.cs index 3f2ea21bbdce..f9b4d60cd233 100644 --- a/sdk/core/Azure.Core/src/RequestContent.cs +++ b/sdk/core/Azure.Core/src/RequestContent.cs @@ -8,9 +8,7 @@ using System.Text.Json; using System.Threading; using System.Threading.Tasks; -using System.Xml; using Azure.Core.Buffers; -using Azure.Core.Internal; using Azure.Core.Serialization; namespace Azure.Core diff --git a/sdk/core/Azure.Core/src/Serialization/ModelSerializer.cs b/sdk/core/Azure.Core/src/Serialization/ModelSerializer.cs index 001a0ed87f77..bd7338a5d63f 100644 --- a/sdk/core/Azure.Core/src/Serialization/ModelSerializer.cs +++ b/sdk/core/Azure.Core/src/Serialization/ModelSerializer.cs @@ -3,7 +3,6 @@ using System; using System.Linq; -using Azure.Core.Internal; namespace Azure.Core.Serialization { @@ -120,28 +119,6 @@ public static object Deserialize(BinaryData data, Type returnType, ModelSerializ public static object Deserialize(BinaryData data, Type returnType, ModelSerializerFormat format) => Deserialize(data, returnType, ModelSerializerOptions.GetOptions(format)); - /// - /// Converts an into a . - /// - /// The model to convert. - /// The to use. - /// A binary representation of the serialized model. - public static BinaryData ConvertToBinaryData(IModelJsonSerializable model, ModelSerializerOptions? options = default) - { - options ??= ModelSerializerOptions.DefaultWireOptions; - using var writer = new ModelWriter(model, options); - return writer.ToBinaryData(); - } - - /// - /// Converts an into a . - /// - /// The model to convert. - /// The to use. - /// A binary representation of the serialized model. - public static BinaryData ConvertToBinaryData(IModelJsonSerializable model, ModelSerializerFormat format) - => ConvertToBinaryData(model, ModelSerializerOptions.GetOptions(format)); - private static IModelSerializable GetInstance(Type returnType) { var model = GetObjectInstance(returnType) as IModelSerializable; diff --git a/sdk/core/Azure.Core/src/Internal/ModelWriter.SequenceBuilder.cs b/sdk/core/Azure.Core/src/Serialization/ModelWriter.SequenceBuilder.cs similarity index 98% rename from sdk/core/Azure.Core/src/Internal/ModelWriter.SequenceBuilder.cs rename to sdk/core/Azure.Core/src/Serialization/ModelWriter.SequenceBuilder.cs index e3c33fd08154..3a063504be4e 100644 --- a/sdk/core/Azure.Core/src/Internal/ModelWriter.SequenceBuilder.cs +++ b/sdk/core/Azure.Core/src/Serialization/ModelWriter.SequenceBuilder.cs @@ -7,9 +7,9 @@ using System.Threading; using System.Threading.Tasks; -namespace Azure.Core.Internal +namespace Azure.Core.Serialization { - internal sealed partial class ModelWriter : IDisposable + public sealed partial class ModelWriter : IDisposable { private sealed class SequenceBuilder : IBufferWriter, IDisposable { diff --git a/sdk/core/Azure.Core/src/Serialization/ModelWriter.cs b/sdk/core/Azure.Core/src/Serialization/ModelWriter.cs new file mode 100644 index 000000000000..9d899b25226e --- /dev/null +++ b/sdk/core/Azure.Core/src/Serialization/ModelWriter.cs @@ -0,0 +1,191 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.CompilerServices; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; + +namespace Azure.Core.Serialization +{ + /// + /// Provides an efficient way to serialize into a using multiple pooled buffers. + /// + public sealed partial class ModelWriter : IDisposable + { + private readonly IModelJsonSerializable _model; + private readonly ModelSerializerOptions _options; + + private readonly object _writeLock = new object(); + private readonly object _readLock = new object(); + + private volatile SequenceBuilder? _sequenceBuilder; + private volatile bool _isDisposed; + + private volatile int _readCount; + + private ManualResetEvent? _readersFinished; + private ManualResetEvent ReadersFinished => _readersFinished ??= new ManualResetEvent(true); + + /// + /// Initializes a new instance of . + /// + /// The model to serialize. + /// The to use. + public ModelWriter(IModelJsonSerializable model, ModelSerializerOptions options) + { + _model = model; + _options = options; + } + + private SequenceBuilder GetSequenceBuilder() + { + if (_sequenceBuilder is null) + { + lock (_writeLock) + { + if (_isDisposed) + { + throw new ObjectDisposedException(nameof(ModelWriter)); + } + + if (_sequenceBuilder is null) + { + SequenceBuilder sequenceBuilder = new SequenceBuilder(); + using var jsonWriter = new Utf8JsonWriter(sequenceBuilder); + _model.Serialize(jsonWriter, _options); + jsonWriter.Flush(); + _sequenceBuilder = sequenceBuilder; + } + } + } + return _sequenceBuilder; + } + + internal void CopyTo(Stream stream, CancellationToken cancellation) + { + SequenceBuilder builder = GetSequenceBuilder(); + IncrementRead(); + try + { + builder.CopyTo(stream, cancellation); + } + finally + { + DecrementRead(); + } + } + + internal bool TryComputeLength(out long length) + { + SequenceBuilder builder = GetSequenceBuilder(); + IncrementRead(); + try + { + return builder.TryComputeLength(out length); + } + finally + { + DecrementRead(); + } + } + + internal async Task CopyToAsync(Stream stream, CancellationToken cancellation) + { + SequenceBuilder builder = GetSequenceBuilder(); + IncrementRead(); + try + { + await builder.CopyToAsync(stream, cancellation).ConfigureAwait(false); + } + finally + { + DecrementRead(); + } + } + + /// + /// Converts the to a . + /// + /// A representation of the serialized in JSON format. + public BinaryData ToBinaryData() + { + SequenceBuilder builder = GetSequenceBuilder(); + IncrementRead(); + try + { + bool gotLength = builder.TryComputeLength(out long length); + Debug.Assert(gotLength); + using var stream = new MemoryStream((int)length); + builder.CopyTo(stream, default); + return new BinaryData(stream.GetBuffer().AsMemory(0, (int)stream.Position)); + } + finally + { + DecrementRead(); + } + } + + /// + public void Dispose() + { + if (!_isDisposed) + { + lock (_writeLock) + { + if (!_isDisposed) + { + _isDisposed = true; + + if (_readersFinished is null || _readersFinished.WaitOne()) + { + //only dispose if no readers ever happened or if all readers are done + _sequenceBuilder?.Dispose(); + } + + _sequenceBuilder = null; + _readersFinished?.Dispose(); + _readersFinished = null; + } + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void IncrementRead() + { + if (_isDisposed) + { + throw new ObjectDisposedException(nameof(ModelWriter)); + } + + lock (_readLock) + { + Interlocked.Increment(ref _readCount); + ReadersFinished.Reset(); + } + + if (_isDisposed) + { + DecrementRead(); + throw new ObjectDisposedException(nameof(ModelWriter)); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private void DecrementRead() + { + lock (_readLock) + { + if (Interlocked.Decrement(ref _readCount) == 0) + { + // notify we reached zero readers in case dispose is waiting + ReadersFinished.Set(); + } + } + } + } +} diff --git a/sdk/core/Azure.Core/tests/Azure.Core.Tests.csproj b/sdk/core/Azure.Core/tests/Azure.Core.Tests.csproj index 2ade083928f5..400e7b683124 100644 --- a/sdk/core/Azure.Core/tests/Azure.Core.Tests.csproj +++ b/sdk/core/Azure.Core/tests/Azure.Core.Tests.csproj @@ -24,6 +24,7 @@ + @@ -54,7 +55,7 @@ - + diff --git a/sdk/core/Azure.Core/tests/ModelSerializationContentTests.cs b/sdk/core/Azure.Core/tests/ModelSerialization/ModelSerializationContentTests.cs similarity index 75% rename from sdk/core/Azure.Core/tests/ModelSerializationContentTests.cs rename to sdk/core/Azure.Core/tests/ModelSerialization/ModelSerializationContentTests.cs index c34fd68ed7b8..774ab89c6ecf 100644 --- a/sdk/core/Azure.Core/tests/ModelSerializationContentTests.cs +++ b/sdk/core/Azure.Core/tests/ModelSerialization/ModelSerializationContentTests.cs @@ -2,30 +2,34 @@ // Licensed under the MIT License. using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; using Azure.Core.Serialization; using Azure.Core.Tests.Public.ModelSerializationTests.Models; using NUnit.Framework; -namespace Azure.Core.Tests +namespace Azure.Core.Tests.ModelSerialization { public class ModelSerializationContentTests { + private const string json = "{\"kind\":\"X\",\"name\":\"Name\",\"xProperty\":100}"; + private ModelX _modelX; + + [OneTimeSetUp] + public void OneTimeSetUp() + { + _modelX = ModelSerializer.Deserialize(BinaryData.FromString(json)); + } + [Test] public void CanCalculateLength() { - ModelX modelX = new ModelX("X", "Name", 100, new Dictionary()); - //use IModelSerializable - var content = RequestContent.Create((IModelSerializable)modelX); + var content = RequestContent.Create((IModelSerializable)_modelX); Assert.AreEqual("ModelSerializableContent", content.GetType().Name); content.TryComputeLength(out long lengthNonJson); Assert.Greater(lengthNonJson, 0); //use IModelJsonSerializable - var jsonContent = RequestContent.Create((IModelJsonSerializable)modelX); + var jsonContent = RequestContent.Create((IModelJsonSerializable)_modelX); Assert.AreEqual("ModelJsonSerializableContent", jsonContent.GetType().Name); content.TryComputeLength(out long lengthJson); Assert.Greater(lengthJson, 0); @@ -33,7 +37,7 @@ public void CanCalculateLength() Assert.AreEqual(lengthNonJson, lengthJson); //use default - jsonContent = RequestContent.Create(modelX); + jsonContent = RequestContent.Create(_modelX); Assert.AreEqual("ModelJsonSerializableContent", jsonContent.GetType().Name); content.TryComputeLength(out lengthJson); Assert.Greater(lengthJson, 0); @@ -44,7 +48,7 @@ public void CanCalculateLength() [Test] public void ValidatePrivateClassType() { - IModelSerializable modelX = new ModelX("X", "Name", 100, new Dictionary()); + IModelSerializable modelX = _modelX; RequestContent content = RequestContent.Create(modelX); Assert.AreEqual("ModelSerializableContent", content.GetType().Name); diff --git a/sdk/core/Azure.Core/tests/ModelSerializerOptionsTests.cs b/sdk/core/Azure.Core/tests/ModelSerialization/ModelSerializerOptionsTests.cs similarity index 98% rename from sdk/core/Azure.Core/tests/ModelSerializerOptionsTests.cs rename to sdk/core/Azure.Core/tests/ModelSerialization/ModelSerializerOptionsTests.cs index 12e2048a104b..8af0ae85e93b 100644 --- a/sdk/core/Azure.Core/tests/ModelSerializerOptionsTests.cs +++ b/sdk/core/Azure.Core/tests/ModelSerialization/ModelSerializerOptionsTests.cs @@ -7,7 +7,7 @@ using Azure.Core.Serialization; using NUnit.Framework; -namespace Azure.Core.Tests +namespace Azure.Core.Tests.ModelSerialization { internal class ModelSerializerOptionsTests { diff --git a/sdk/core/Azure.Core/tests/ModelSerializerTests.cs b/sdk/core/Azure.Core/tests/ModelSerialization/ModelSerializerTests.cs similarity index 98% rename from sdk/core/Azure.Core/tests/ModelSerializerTests.cs rename to sdk/core/Azure.Core/tests/ModelSerialization/ModelSerializerTests.cs index 1ead9a4b089b..faa97e044244 100644 --- a/sdk/core/Azure.Core/tests/ModelSerializerTests.cs +++ b/sdk/core/Azure.Core/tests/ModelSerialization/ModelSerializerTests.cs @@ -6,7 +6,7 @@ using Azure.Core.Serialization; using NUnit.Framework; -namespace Azure.Core.Tests.ModelSerializationTests +namespace Azure.Core.Tests.ModelSerialization { public class ModelSerializerTests { diff --git a/sdk/core/Azure.Core/tests/ModelSerialization/ModelWriterTests.cs b/sdk/core/Azure.Core/tests/ModelSerialization/ModelWriterTests.cs new file mode 100644 index 000000000000..f67685b90a83 --- /dev/null +++ b/sdk/core/Azure.Core/tests/ModelSerialization/ModelWriterTests.cs @@ -0,0 +1,329 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System; +using System.IO; +using System.Reflection; +using System.Text.Json; +using System.Threading; +using System.Threading.Tasks; +using Azure.Core.Serialization; +using Azure.Core.Tests.Common; +using Azure.Core.Tests.ResourceManager.Resources; +using NUnit.Framework; + +namespace Azure.Core.Tests.ModelSerialization +{ + /// + /// Happy path tests are in the public test project in the ModelTests class using the JsonInterfaceStrategy. + /// This class is used for testing the internal properties of ModelWriter. + /// + public class ModelWriterTests + { + private const int _modelSize = 156000; + private static readonly string _json = File.ReadAllText(TestData.GetLocation("ResourceProviderData.json")); + private static readonly ResourceProviderData _resourceProviderData = ModelSerializer.Deserialize(BinaryData.FromString(_json)); + + [Test] + public async Task HappyPath() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + Assert.IsTrue(writer.TryComputeLength(out var length)); + Assert.AreEqual(_modelSize, length); + + MemoryStream stream1 = new MemoryStream((int)length); + writer.CopyTo(stream1, default); + Assert.AreEqual(_modelSize, stream1.Length); + + MemoryStream stream2 = new MemoryStream((int)length); + await writer.CopyToAsync(stream2, default); + Assert.AreEqual(_modelSize, stream2.Length); + + CollectionAssert.AreEqual(stream1.ToArray(), stream2.ToArray()); + } + + [Test] + public async Task DisposeWhileConvertToBinaryData() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + FieldInfo sequenceField = writer.GetType().GetField("_sequenceBuilder", BindingFlags.NonPublic | BindingFlags.Instance); + object sequenceBuilder = sequenceField.GetValue(writer); + Assert.IsNull(sequenceBuilder); + + bool taskStarted = false; + Task result = Task.Factory.StartNew(() => + { + Parallel.For(0, 100000, i => + { + taskStarted = true; + BinaryData data = null; + try + { + data = writer.ToBinaryData(); + Assert.AreEqual(_modelSize, data.ToMemory().Length); + } + catch (ObjectDisposedException) + { + Assert.IsNull(data); + } + }); + }); + + while (!taskStarted) + { + Thread.Sleep(1); + } + + await DisposeAfterStart(writer, sequenceField, result); + } + + [Test] + public async Task DisposeWhileCopyAsync() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + FieldInfo sequenceField = writer.GetType().GetField("_sequenceBuilder", BindingFlags.NonPublic | BindingFlags.Instance); + object sequenceBuilder = sequenceField.GetValue(writer); + Assert.IsNull(sequenceBuilder); + + bool taskStarted = false; + Task result = Task.Factory.StartNew(() => + { + Parallel.For(0, 100000, async i => + { + taskStarted = true; + using MemoryStream stream = new MemoryStream(); + try + { + await writer.CopyToAsync(stream, default); + Assert.AreEqual(_modelSize, stream.Length); + } + catch (ObjectDisposedException) + { + Assert.AreEqual(0, stream.Length); + } + }); + }); + + while (!taskStarted) + { + Thread.Sleep(1); + } + + await DisposeAfterStart(writer, sequenceField, result); + } + + private static async Task DisposeAfterStart(ModelWriter writer, FieldInfo sequenceField, Task result) + { + writer.Dispose(); + object sequenceBuilder = sequenceField.GetValue(writer); + Assert.IsNull(sequenceBuilder); + + await result; + + sequenceBuilder = sequenceField.GetValue(writer); + Assert.IsNull(sequenceBuilder); + } + + [Test] + public async Task DisposeWhileCopy() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + FieldInfo sequenceField = writer.GetType().GetField("_sequenceBuilder", BindingFlags.NonPublic | BindingFlags.Instance); + object sequenceBuilder = sequenceField.GetValue(writer); + Assert.IsNull(sequenceBuilder); + + bool taskStarted = false; + Task result = Task.Factory.StartNew(() => + { + Parallel.For(0, 100000, i => + { + taskStarted = true; + using MemoryStream stream = new MemoryStream(); + try + { + writer.CopyTo(stream, default); + Assert.AreEqual(_modelSize, stream.Length); + } + catch (ObjectDisposedException) + { + Assert.AreEqual(0, stream.Length); + } + }); + }); + + while (!taskStarted) + { + Thread.Sleep(1); + } + + await DisposeAfterStart(writer, sequenceField, result); + } + + [Test] + public async Task DisposeWhileGettingLength() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + FieldInfo sequenceField = writer.GetType().GetField("_sequenceBuilder", BindingFlags.NonPublic | BindingFlags.Instance); + object sequenceBuilder = sequenceField.GetValue(writer); + Assert.IsNull(sequenceBuilder); + + long length = 0; + bool taskStarted = false; + Task result = Task.Factory.StartNew(() => + { + Parallel.For(0, 100000, i => + { + taskStarted = true; + try + { + Assert.IsTrue(writer.TryComputeLength(out var length)); + Assert.AreEqual(_modelSize, length); + } + catch (ObjectDisposedException) + { + Assert.AreEqual(0, length); + } + }); + }); + + while (!taskStarted) + { + Thread.Sleep(1); + } + + await DisposeAfterStart(writer, sequenceField, result); + } + + private static void Validate(ModelWriter writer, FieldInfo sequenceField, bool exceptionThrown, long length) + { + // sequenceBuilder should be null because the writer was disposed + object sequenceBuilder = sequenceField.GetValue(writer); + Assert.IsNull(sequenceBuilder); + + // The dispose should wait for the serialization to finish + // because of thread timing the dispose might happen before the readCount is incremented + // In this case the length of the stream will be 0 otherwise the length will be the size of the model + // Both cases are expected and valid the idea being that the dispose should wait for the serialization to finish if it starts second + // and if it starts first then the original thread should get an ObjectDisposedException + Assert.AreEqual(exceptionThrown ? 0 : _modelSize, length); + } + + [Test] + public void UseAfterDispose() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + writer.Dispose(); + + Assert.Throws(() => writer.TryComputeLength(out var length)); + Assert.Throws(() => writer.CopyTo(new MemoryStream(), default)); + Assert.ThrowsAsync(async () => await writer.CopyToAsync(new MemoryStream(), default)); + Assert.Throws(() => writer.ToBinaryData()); + Assert.DoesNotThrow(() => writer.Dispose()); + } + + [Test] + public void DisposeWithLoad() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + writer.TryComputeLength(out var length); + Assert.AreEqual(_modelSize, length); + + object sequenceBuilder = writer.GetType().GetField("_sequenceBuilder", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(writer); + Assert.IsNotNull(sequenceBuilder); + + writer.Dispose(); + + // sequenceBuilder should be null because the writer was disposed + sequenceBuilder = writer.GetType().GetField("_sequenceBuilder", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(writer); + Assert.IsNull(sequenceBuilder); + } + + [Test] + public void DisposeWithoutLoad() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + + writer.Dispose(); + + // sequenceBuilder should be null because the writer was disposed + object sequenceBuilder = writer.GetType().GetField("_sequenceBuilder", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(writer); + Assert.IsNull(sequenceBuilder); + } + + [TestCase("J")] + [TestCase("W")] + public void ExceptionsAreBubbledUp(string format) + { + ExplodingModel model = new ExplodingModel(); + ModelSerializerOptions options = new ModelSerializerOptions(format); + MemoryStream stream = new MemoryStream(); + + using ModelWriter writer = new ModelWriter(model, options); + Assert.Throws(() => writer.TryComputeLength(out var length)); + Assert.Throws(() => writer.CopyTo(stream, default)); + Assert.ThrowsAsync(async () => await writer.CopyToAsync(stream, default)); + Assert.Throws(() => writer.ToBinaryData()); + } + + [Test] + public void ParallelComputLength() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + + Parallel.For(0, 1000000, i => + { + Assert.IsTrue(writer.TryComputeLength(out var length)); + Assert.AreEqual(_modelSize, length); + }); + } + + [Test] + public void ParallelCopy() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + + Parallel.For(0, 10000, i => + { + using MemoryStream stream = new MemoryStream(_modelSize); + writer.CopyTo(stream, default); + Assert.AreEqual(_modelSize, stream.Length); + }); + } + + [Test] + public void ParallelCopyAsync() + { + ModelWriter writer = new ModelWriter(_resourceProviderData, ModelSerializerOptions.DefaultWireOptions); + + Parallel.For(0, 10000, async i => + { + using MemoryStream stream = new MemoryStream(_modelSize); + await writer.CopyToAsync(stream, default); + Assert.AreEqual(_modelSize, stream.Length); + }); + } + + private class ExplodingModel : IModelJsonSerializable + { + ExplodingModel IModelJsonSerializable.Deserialize(ref Utf8JsonReader reader, ModelSerializerOptions options) + { + throw new NotImplementedException(); + } + + ExplodingModel IModelSerializable.Deserialize(BinaryData data, ModelSerializerOptions options) + { + throw new NotImplementedException(); + } + + void IModelJsonSerializable.Serialize(Utf8JsonWriter writer, ModelSerializerOptions options) + { + throw new NotImplementedException(); + } + + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/sdk/core/Azure.Core/tests/common/Azure.Core.Tests.Common.csproj b/sdk/core/Azure.Core/tests/common/Azure.Core.Tests.Common.csproj new file mode 100644 index 000000000000..cb8e22f45568 --- /dev/null +++ b/sdk/core/Azure.Core/tests/common/Azure.Core.Tests.Common.csproj @@ -0,0 +1,38 @@ + + + $(RequiredTargetFrameworks) + true + true + true + + + + + + + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + + diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs similarity index 87% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs index ae7a3b127dc9..2438d21e0bce 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/BaseModel.cs @@ -10,6 +10,8 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests.Models { public abstract class BaseModel : IUtf8JsonSerializable, IModelJsonSerializable { + private Dictionary _rawData; + public static implicit operator RequestContent(BaseModel baseModel) { return RequestContent.Create(baseModel, ModelSerializerOptions.DefaultWireOptions); @@ -21,11 +23,28 @@ public static explicit operator BaseModel(Response response) return DeserializeBaseModel(jsonDocument.RootElement, ModelSerializerOptions.DefaultWireOptions); } - private Dictionary RawData { get; set; } = new Dictionary(); + protected internal BaseModel(Dictionary rawData) + { + _rawData = rawData ?? new Dictionary(); + } public string Kind { get; internal set; } public string Name { get; set; } + protected internal void SerializeRawData(Utf8JsonWriter writer) + { + //write out the raw data + foreach (var property in _rawData) + { + writer.WritePropertyName(property.Key); +#if NET6_0_OR_GREATER + writer.WriteRawValue(property.Value); +#else + JsonSerializer.Serialize(writer, JsonDocument.Parse(property.Value.ToString()).RootElement); +#endif + } + } + void IUtf8JsonSerializable.Write(Utf8JsonWriter writer) => ((IModelJsonSerializable)this).Serialize(writer, ModelSerializerOptions.DefaultWireOptions); void IModelJsonSerializable.Serialize(Utf8JsonWriter writer, ModelSerializerOptions options) @@ -47,16 +66,7 @@ private void Serialize(Utf8JsonWriter writer, ModelSerializerOptions options) } if (options.Format == ModelSerializerFormat.Json) { - //write out the raw data - foreach (var property in RawData) - { - writer.WritePropertyName(property.Key); -#if NET6_0_OR_GREATER - writer.WriteRawValue(property.Value); -#else - JsonSerializer.Serialize(writer, JsonDocument.Parse(property.Value.ToString()).RootElement); -#endif - } + SerializeRawData(writer); } writer.WriteEndObject(); } @@ -127,7 +137,8 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions option { ModelSerializerHelper.ValidateFormat(this, options.Format); - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs similarity index 88% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs index 7c38293509e1..c7fc000296f6 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/ModelX.cs @@ -10,19 +10,18 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests.Models { public class ModelX : BaseModel, IUtf8JsonSerializable, IModelJsonSerializable { - private Dictionary RawData { get; set; } = new Dictionary(); - public ModelX() + : base(null) { Kind = "X"; } internal ModelX(string kind, string name, int xProperty, Dictionary rawData) + : base(rawData) { Kind = kind; Name = name; XProperty = xProperty; - RawData = rawData; } public int XProperty { get; private set; } @@ -64,16 +63,7 @@ private void Serialize(Utf8JsonWriter writer, ModelSerializerOptions options) } if (options.Format == ModelSerializerFormat.Json) { - //write out the raw data - foreach (var property in RawData) - { - writer.WritePropertyName(property.Key); -#if NET6_0_OR_GREATER - writer.WriteRawValue(property.Value); -#else - JsonSerializer.Serialize(writer, JsonDocument.Parse(property.Value.ToString()).RootElement); -#endif - } + SerializeRawData(writer); } writer.WriteEndObject(); } @@ -141,7 +131,8 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) { ModelSerializerHelper.ValidateFormat(this, options.Format); - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs similarity index 86% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs index 5742370181fb..8c08f7805f98 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/ModelY.cs @@ -10,19 +10,18 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests.Models { public class ModelY : BaseModel, IUtf8JsonSerializable, IModelJsonSerializable { - private Dictionary RawData { get; set; } = new Dictionary(); - public ModelY() + : base(null) { Kind = "Y"; } internal ModelY(string kind, string name, string yProperty, Dictionary rawData) + : base(rawData) { Kind = kind; Name = name; YProperty = yProperty; - RawData = rawData; } public string YProperty { get; private set; } @@ -48,16 +47,7 @@ private void Serialize(Utf8JsonWriter writer, ModelSerializerOptions options) } if (options.Format == ModelSerializerFormat.Json) { - //write out the raw data - foreach (var property in RawData) - { - writer.WritePropertyName(property.Key); -#if NET6_0_OR_GREATER - writer.WriteRawValue(property.Value); -#else - JsonSerializer.Serialize(writer, JsonDocument.Parse(property.Value.ToString()).RootElement); -#endif - } + SerializeRawData(writer); } writer.WriteEndObject(); } @@ -111,6 +101,12 @@ ModelY IModelJsonSerializable.Deserialize(ref Utf8JsonReader reader, Mod return DeserializeModelY(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs similarity index 80% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs index f2dc1d0311cb..f9acf226839c 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/Models/DiscriminatorSet/UnknownBaseModel.cs @@ -10,18 +10,17 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests.Models { internal class UnknownBaseModel : BaseModel, IUtf8JsonSerializable, IModelJsonSerializable { - private Dictionary RawData { get; set; } = new Dictionary(); - public UnknownBaseModel() + : base(null) { Kind = "Unknown"; } internal UnknownBaseModel(string kind, string name, Dictionary rawData) + : base(rawData) { Kind = kind; Name = name; - RawData = rawData; } void IUtf8JsonSerializable.Write(Utf8JsonWriter writer) => Serialize(writer, ModelSerializerOptions.DefaultWireOptions); @@ -45,16 +44,7 @@ private void Serialize(Utf8JsonWriter writer, ModelSerializerOptions options) } if (options.Format == ModelSerializerFormat.Json) { - //write out the raw data - foreach (var property in RawData) - { - writer.WritePropertyName(property.Key); -#if NET6_0_OR_GREATER - writer.WriteRawValue(property.Value); -#else - JsonSerializer.Serialize(writer, JsonDocument.Parse(property.Value.ToString()).RootElement); -#endif - } + SerializeRawData(writer); } writer.WriteEndObject(); } @@ -80,7 +70,8 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions option { ModelSerializerHelper.ValidateFormat(this, options.Format); - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ApiProfile.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ApiProfile.Serialization.cs similarity index 92% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ApiProfile.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ApiProfile.Serialization.cs index f8f0c0a039a3..7dc81ee7ec6e 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ApiProfile.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ApiProfile.Serialization.cs @@ -6,13 +6,10 @@ #nullable disable using System; -using System.IO; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -using Azure.Core.Tests.Public.ModelSerializationTests.Models; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { public partial class ApiProfile : IUtf8JsonSerializable, IModelJsonSerializable { @@ -99,6 +96,12 @@ ApiProfile IModelSerializable.Deserialize(BinaryData data, ModelSeri return DeserializeApiProfile(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ApiProfile.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ApiProfile.cs similarity index 93% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ApiProfile.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ApiProfile.cs index 1c39af00a962..2b5e44d73549 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ApiProfile.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ApiProfile.cs @@ -5,7 +5,7 @@ #nullable disable -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The ApiProfile. public partial class ApiProfile diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/AvailabilitySetData.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/AvailabilitySetData.Serialization.cs similarity index 97% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/AvailabilitySetData.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/AvailabilitySetData.Serialization.cs index 0f144d4fe526..7f40120d46a1 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/AvailabilitySetData.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/AvailabilitySetData.Serialization.cs @@ -9,11 +9,11 @@ using System.Collections.Generic; using System.Text.Json; using Azure.Core.Serialization; -using Azure.Core.Tests.Public.ResourceManager.Compute.Models; -using Azure.Core.Tests.Public.ResourceManager.Models; -using Azure.Core.Tests.Public.ResourceManager.Resources.Models; +using Azure.Core.Tests.ResourceManager.Compute.Models; +using Azure.Core.Tests.ResourceManager.Models; +using Azure.Core.Tests.ResourceManager.Resources.Models; -namespace Azure.Core.Tests.Public.ResourceManager.Compute +namespace Azure.Core.Tests.ResourceManager.Compute { public partial class AvailabilitySetData : IUtf8JsonSerializable, IModelJsonSerializable { @@ -277,7 +277,8 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOpti { ModelSerializerHelper.ValidateFormat(this, options.Format); - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/AvailabilitySetData.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/AvailabilitySetData.cs similarity index 95% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/AvailabilitySetData.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/AvailabilitySetData.cs index 4e7bb606cfed..34734cef7260 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/AvailabilitySetData.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/AvailabilitySetData.cs @@ -7,13 +7,12 @@ using System.Collections.Generic; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -using Azure.Core.Tests.Public.ResourceManager.Compute.Models; -using Azure.Core.Tests.Public.ResourceManager.Models; -using Azure.Core.Tests.Public.ResourceManager.Resources.Models; +using Azure.Core.Tests.ResourceManager.Compute.Models; +using Azure.Core.Tests.ResourceManager.Models; +using Azure.Core.Tests.ResourceManager.Resources.Models; -namespace Azure.Core.Tests.Public.ResourceManager.Compute +namespace Azure.Core.Tests.ResourceManager.Compute { /// /// A class representing the AvailabilitySet data model. diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeSku.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeSku.Serialization.cs similarity index 94% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeSku.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeSku.Serialization.cs index 1c3ddfd67b3d..d7474e8b1b57 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeSku.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeSku.Serialization.cs @@ -8,10 +8,9 @@ using System; using System.Linq; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Compute.Models +namespace Azure.Core.Tests.ResourceManager.Compute.Models { public partial class ComputeSku : IUtf8JsonSerializable, IModelJsonSerializable { @@ -121,6 +120,12 @@ ComputeSku IModelSerializable.Deserialize(BinaryData data, ModelSeri return DeserializeComputeSku(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeSku.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeSku.cs similarity index 96% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeSku.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeSku.cs index 6cac54af6d39..ae8ec908b7e1 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeSku.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeSku.cs @@ -5,7 +5,7 @@ #nullable disable -namespace Azure.Core.Tests.Public.ResourceManager.Compute.Models +namespace Azure.Core.Tests.ResourceManager.Compute.Models { /// Describes a virtual machine scale set sku. NOTE: If the new VM SKU is not supported on the hardware the scale set is currently on, you need to deallocate the VMs in the scale set before you modify the SKU name. public partial class ComputeSku diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.Serialization.cs similarity index 94% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.Serialization.cs index b6887869d02a..879117da9755 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.Serialization.cs @@ -7,7 +7,7 @@ using System; -namespace Azure.Core.Tests.Public.ResourceManager.Compute.Models +namespace Azure.Core.Tests.ResourceManager.Compute.Models { internal static partial class ComputeStatusLevelTypeExtensions { diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.cs similarity index 86% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.cs index 9b5ffecea2a4..196fb7183671 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ComputeStatusLevelType.cs @@ -5,7 +5,7 @@ #nullable disable -namespace Azure.Core.Tests.Public.ResourceManager.Compute.Models +namespace Azure.Core.Tests.ResourceManager.Compute.Models { /// The level code. public enum ComputeStatusLevelType diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/CreatedByType.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/CreatedByType.cs similarity index 97% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/CreatedByType.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/CreatedByType.cs index d7b423adc162..ce682d85bea6 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/CreatedByType.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/CreatedByType.cs @@ -8,7 +8,7 @@ using System; using System.ComponentModel; -namespace Azure.Core.Tests.Public.ResourceManager.Models +namespace Azure.Core.Tests.ResourceManager.Models { /// The type of identity that created the resource. public readonly partial struct CreatedByType : IEquatable diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/InstanceViewStatus.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/InstanceViewStatus.Serialization.cs similarity index 95% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/InstanceViewStatus.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/InstanceViewStatus.Serialization.cs index c2ebb5cbdc86..3384bd405953 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/InstanceViewStatus.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/InstanceViewStatus.Serialization.cs @@ -7,12 +7,10 @@ using System; using System.Globalization; -using System.Reflection.Emit; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Compute.Models +namespace Azure.Core.Tests.ResourceManager.Compute.Models { public partial class InstanceViewStatus : IUtf8JsonSerializable, IModelJsonSerializable { @@ -164,6 +162,12 @@ InstanceViewStatus IModelSerializable.Deserialize(BinaryData return DeserializeInstanceViewStatus(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/InstanceViewStatus.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/InstanceViewStatus.cs similarity index 96% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/InstanceViewStatus.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/InstanceViewStatus.cs index b1b72f27c854..66891bc6032b 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/InstanceViewStatus.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/InstanceViewStatus.cs @@ -7,7 +7,7 @@ using System; -namespace Azure.Core.Tests.Public.ResourceManager.Compute.Models +namespace Azure.Core.Tests.ResourceManager.Compute.Models { /// Instance view status. public partial class InstanceViewStatus diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderAuthorizationConsentState.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderAuthorizationConsentState.cs similarity index 97% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderAuthorizationConsentState.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderAuthorizationConsentState.cs index bbd451764eb2..6268124cb3f6 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderAuthorizationConsentState.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderAuthorizationConsentState.cs @@ -8,7 +8,7 @@ using System; using System.ComponentModel; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The provider authorization consent state. public readonly partial struct ProviderAuthorizationConsentState : IEquatable diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.Serialization.cs similarity index 93% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.Serialization.cs index 42c517be569d..331e0c376b43 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.Serialization.cs @@ -8,10 +8,9 @@ using System; using System.Collections.Generic; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { public partial class ProviderExtendedLocation : IUtf8JsonSerializable, IModelJsonSerializable { @@ -109,6 +108,12 @@ ProviderExtendedLocation IModelSerializable.Deserializ return DeserializeProviderExtendedLocation(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.cs similarity index 94% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.cs index 365c3b07e864..bcbb99a520d3 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderExtendedLocation.cs @@ -6,9 +6,8 @@ #nullable disable using System.Collections.Generic; -using Azure.Core; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The provider extended location. public partial class ProviderExtendedLocation diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderResourceType.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderResourceType.Serialization.cs similarity index 97% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderResourceType.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderResourceType.Serialization.cs index cf4c8fa568e3..56b7ab12c493 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderResourceType.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderResourceType.Serialization.cs @@ -7,12 +7,10 @@ using System; using System.Collections.Generic; -using System.Security.AccessControl; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { public partial class ProviderResourceType : IUtf8JsonSerializable, IModelJsonSerializable { @@ -275,6 +273,12 @@ ProviderResourceType IModelSerializable.Deserialize(Binary return DeserializeProviderResourceType(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderResourceType.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderResourceType.cs similarity index 97% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderResourceType.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderResourceType.cs index 89a6ecb9e9fa..af95577c5916 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ProviderResourceType.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ProviderResourceType.cs @@ -6,9 +6,8 @@ #nullable disable using System.Collections.Generic; -using Azure.Core; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// Resource type managed by the resource provider. public partial class ProviderResourceType diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceData.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceData.cs similarity index 96% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceData.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceData.cs index d642db96d26e..488468d0d5d7 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceData.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceData.cs @@ -3,9 +3,7 @@ #nullable disable -using Azure.Core; - -namespace Azure.Core.Tests.Public.ResourceManager.Models +namespace Azure.Core.Tests.ResourceManager.Models { /// Common fields that are returned in the response for all Azure Resource Manager resources. public abstract partial class ResourceData diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceProviderData.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceProviderData.Serialization.cs similarity index 95% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceProviderData.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceProviderData.Serialization.cs index 3551aebf7bff..e5993224f4fa 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceProviderData.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceProviderData.Serialization.cs @@ -7,15 +7,11 @@ using System; using System.Collections.Generic; -using System.IO; -using System.Security.AccessControl; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -using Azure.Core.Tests.Public.ResourceManager.Resources.Models; -using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure; +using Azure.Core.Tests.ResourceManager.Resources.Models; -namespace Azure.Core.Tests.Public.ResourceManager.Resources +namespace Azure.Core.Tests.ResourceManager.Resources { public partial class ResourceProviderData : IUtf8JsonSerializable, IModelJsonSerializable { @@ -169,7 +165,8 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOpt { ModelSerializerHelper.ValidateFormat(this, options.Format); - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceProviderData.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceProviderData.cs similarity index 94% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceProviderData.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceProviderData.cs index 1bb9625235ff..45360e864f3f 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceProviderData.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceProviderData.cs @@ -5,15 +5,12 @@ #nullable disable -using System; using System.Collections.Generic; -using System.Text.Json.Serialization; using System.Text.Json; -using Azure.Core; -using Azure.Core.Tests.Public.ResourceManager.Resources.Models; using Azure.Core.Serialization; +using Azure.Core.Tests.ResourceManager.Resources.Models; -namespace Azure.Core.Tests.Public.ResourceManager.Resources +namespace Azure.Core.Tests.ResourceManager.Resources { /// /// A class representing the ResourceProvider data model. diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAlias.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAlias.Serialization.cs similarity index 95% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAlias.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAlias.Serialization.cs index b37cd2275dc2..89c54d8818be 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAlias.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAlias.Serialization.cs @@ -7,12 +7,10 @@ using System; using System.Collections.Generic; -using System.IO; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { public partial class ResourceTypeAlias : IUtf8JsonSerializable, IModelJsonSerializable { @@ -154,6 +152,12 @@ ResourceTypeAlias IModelSerializable.Deserialize(BinaryData d return DeserializeResourceTypeAlias(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAlias.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAlias.cs similarity index 96% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAlias.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAlias.cs index 6002b848e3c2..50d7c42be0c7 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAlias.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAlias.cs @@ -6,9 +6,8 @@ #nullable disable using System.Collections.Generic; -using Azure.Core; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The alias type. public partial class ResourceTypeAlias diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.Serialization.cs similarity index 94% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.Serialization.cs index 6f8099687561..de3bf725f446 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.Serialization.cs @@ -7,12 +7,10 @@ using System; using System.Collections.Generic; -using System.IO; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { public partial class ResourceTypeAliasPath : IUtf8JsonSerializable, IModelJsonSerializable { @@ -126,6 +124,12 @@ ResourceTypeAliasPath IModelSerializable.Deserialize(Bina return DeserializeResourceTypeAliasPath(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.cs similarity index 95% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.cs index 598ec7979720..7fb205533f33 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPath.cs @@ -6,9 +6,8 @@ #nullable disable using System.Collections.Generic; -using Azure.Core; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The type of the paths for alias. public partial class ResourceTypeAliasPath diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathAttributes.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathAttributes.cs similarity index 97% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathAttributes.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathAttributes.cs index cf6b04b3aca8..f9a82274f61e 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathAttributes.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathAttributes.cs @@ -8,7 +8,7 @@ using System; using System.ComponentModel; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The attributes of the token that the alias path is referring to. public readonly partial struct ResourceTypeAliasPathAttributes : IEquatable diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs similarity index 93% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs index bcd89e14e41d..b052e87708b9 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.Serialization.cs @@ -6,13 +6,10 @@ #nullable disable using System; -using System.IO; using System.Text.Json; -using System.Xml.Linq; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { public partial class ResourceTypeAliasPathMetadata : IUtf8JsonSerializable, IModelJsonSerializable { @@ -107,6 +104,12 @@ ResourceTypeAliasPathMetadata IModelSerializable. return DeserializeResourceTypeAliasPathMetadata(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.cs similarity index 95% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.cs index 579c7ed3095b..7b965b6ce2b9 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathMetadata.cs @@ -5,7 +5,7 @@ #nullable disable -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The ResourceTypeAliasPathMetadata. public partial class ResourceTypeAliasPathMetadata diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathTokenType.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathTokenType.cs similarity index 98% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathTokenType.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathTokenType.cs index b565085b808d..8b26cdb95a68 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathTokenType.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPathTokenType.cs @@ -8,7 +8,7 @@ using System; using System.ComponentModel; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The type of the token that the alias path is referring to. public readonly partial struct ResourceTypeAliasPathTokenType : IEquatable diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.Serialization.cs similarity index 94% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.Serialization.cs index ffe9e63e19c2..78c6f7062428 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.Serialization.cs @@ -7,10 +7,9 @@ using System; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { public partial class ResourceTypeAliasPattern : IUtf8JsonSerializable, IModelJsonSerializable { @@ -120,6 +119,12 @@ ResourceTypeAliasPattern IModelSerializable.Deserializ return DeserializeResourceTypeAliasPattern(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.cs similarity index 95% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.cs index 1e4c23c9e606..5e0c3d71cf69 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPattern.cs @@ -5,7 +5,7 @@ #nullable disable -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The type of the pattern for an alias path. public partial class ResourceTypeAliasPattern diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs similarity index 94% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs index 2a37a2428dac..b6993ddc0de8 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.Serialization.cs @@ -7,7 +7,7 @@ using System; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { internal static partial class ResourceTypeAliasPatternTypeExtensions { diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.cs similarity index 86% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.cs index 5e63dd139268..d54d8e5afe88 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasPatternType.cs @@ -5,7 +5,7 @@ #nullable disable -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The type of alias pattern. public enum ResourceTypeAliasPatternType diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.Serialization.cs similarity index 94% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.Serialization.cs index f147fdd11862..39d50246fe50 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.Serialization.cs @@ -7,7 +7,7 @@ using System; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { internal static partial class ResourceTypeAliasTypeExtensions { diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.cs similarity index 88% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.cs index fb101269ad68..c3fc8585f237 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ResourceTypeAliasType.cs @@ -5,7 +5,7 @@ #nullable disable -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The type of the alias. public enum ResourceTypeAliasType diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/SystemData.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/SystemData.Serialization.cs similarity index 96% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/SystemData.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/SystemData.Serialization.cs index dac445e290bb..e6658dae1022 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/SystemData.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/SystemData.Serialization.cs @@ -7,13 +7,11 @@ using System; using System.Globalization; -using System.Text; using System.Text.Json; using System.Text.Json.Serialization; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Models +namespace Azure.Core.Tests.ResourceManager.Models { [JsonConverter(typeof(SystemDataConverter))] public partial class SystemData : IUtf8JsonSerializable, IModelJsonSerializable @@ -176,6 +174,12 @@ public override SystemData Read(ref Utf8JsonReader reader, Type typeToConvert, J } } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/SystemData.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/SystemData.cs similarity index 96% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/SystemData.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/SystemData.cs index f54c02c39f5a..7df008ba04fe 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/SystemData.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/SystemData.cs @@ -6,9 +6,8 @@ #nullable disable using System; -using Azure.Core; -namespace Azure.Core.Tests.Public.ResourceManager.Models +namespace Azure.Core.Tests.ResourceManager.Models { /// Metadata pertaining to creation and last modification of the resource. public partial class SystemData diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/TrackedResourceData.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/TrackedResourceData.cs similarity index 96% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/TrackedResourceData.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/TrackedResourceData.cs index 185956511930..73899a3ea3f7 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/TrackedResourceData.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/TrackedResourceData.cs @@ -4,9 +4,8 @@ #nullable disable using System.Collections.Generic; -using Azure.Core; -namespace Azure.Core.Tests.Public.ResourceManager.Models +namespace Azure.Core.Tests.ResourceManager.Models { /// The resource model definition for an Azure Resource Manager tracked top level resource which has 'tags' and a 'location'. public abstract partial class TrackedResourceData : ResourceData diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/WritableSubResource.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/WritableSubResource.Serialization.cs similarity index 93% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/WritableSubResource.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/WritableSubResource.Serialization.cs index 63af5ca13b4e..0e73ed34b8d6 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/WritableSubResource.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/WritableSubResource.Serialization.cs @@ -2,13 +2,11 @@ // Licensed under the MIT License. using System; -using System.Globalization; using System.Text.Json; using System.Text.Json.Serialization; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// /// A class representing a sub-resource that contains only the ID. @@ -107,6 +105,12 @@ public override WritableSubResource Read(ref Utf8JsonReader reader, Type typeToC } } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/WritableSubResource.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/WritableSubResource.cs similarity index 93% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/WritableSubResource.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/WritableSubResource.cs index 7ef35f24b26b..2267f1e23685 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/WritableSubResource.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/WritableSubResource.cs @@ -3,7 +3,7 @@ using Azure.Core; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// /// A class representing a sub-resource that contains only the ID. diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ZoneMapping.Serialization.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ZoneMapping.Serialization.cs similarity index 92% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ZoneMapping.Serialization.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ZoneMapping.Serialization.cs index 05fd9e3ac202..1a3270e45335 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ZoneMapping.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ZoneMapping.Serialization.cs @@ -7,12 +7,10 @@ using System; using System.Collections.Generic; -using System.IO; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { public partial class ZoneMapping : IUtf8JsonSerializable, IModelJsonSerializable { @@ -98,6 +96,12 @@ ZoneMapping IModelSerializable.Deserialize(BinaryData data, ModelSe return DeserializeZoneMapping(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ZoneMapping.cs b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ZoneMapping.cs similarity index 92% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ZoneMapping.cs rename to sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ZoneMapping.cs index 2a2261078b54..40f58aaf7f9f 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ServiceModels/ZoneMapping.cs +++ b/sdk/core/Azure.Core/tests/common/ModelSerializationTests/ServiceModels/ZoneMapping.cs @@ -6,9 +6,8 @@ #nullable disable using System.Collections.Generic; -using Azure.Core; -namespace Azure.Core.Tests.Public.ResourceManager.Resources.Models +namespace Azure.Core.Tests.ResourceManager.Resources.Models { /// The ZoneMapping. public partial class ZoneMapping diff --git a/sdk/core/Azure.Core/tests/TestClients/LowLevelClient/LowLevelClientModels/Pet.Serialization.cs b/sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/LowLevelClientModels/Pet.Serialization.cs similarity index 98% rename from sdk/core/Azure.Core/tests/TestClients/LowLevelClient/LowLevelClientModels/Pet.Serialization.cs rename to sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/LowLevelClientModels/Pet.Serialization.cs index 0f4335399d5e..628110e52d1a 100644 --- a/sdk/core/Azure.Core/tests/TestClients/LowLevelClient/LowLevelClientModels/Pet.Serialization.cs +++ b/sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/LowLevelClientModels/Pet.Serialization.cs @@ -4,7 +4,6 @@ #nullable disable using System.Text.Json; -using Azure.Core; namespace Azure.Core.Experimental.Tests.Models { diff --git a/sdk/core/Azure.Core/tests/TestClients/LowLevelClient/LowLevelClientModels/Pet.cs b/sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/LowLevelClientModels/Pet.cs similarity index 92% rename from sdk/core/Azure.Core/tests/TestClients/LowLevelClient/LowLevelClientModels/Pet.cs rename to sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/LowLevelClientModels/Pet.cs index 86ed1ec831ea..f15a3f2a0a20 100644 --- a/sdk/core/Azure.Core/tests/TestClients/LowLevelClient/LowLevelClientModels/Pet.cs +++ b/sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/LowLevelClientModels/Pet.cs @@ -3,9 +3,7 @@ #nullable disable -using System; using System.Text.Json; -using Azure.Core.Pipeline; namespace Azure.Core.Experimental.Tests.Models { @@ -13,14 +11,14 @@ namespace Azure.Core.Experimental.Tests.Models public partial class Pet { /// Initializes a new instance of Pet. - internal Pet() + public Pet() { } /// Initializes a new instance of Pet. /// /// - internal Pet(string name, string species) + public Pet(string name, string species) { Name = name; Species = species; diff --git a/sdk/core/Azure.Core/tests/TestClients/LowLevelClient/LowLevelClientModels/SerializationHelpers.cs b/sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/LowLevelClientModels/SerializationHelpers.cs similarity index 91% rename from sdk/core/Azure.Core/tests/TestClients/LowLevelClient/LowLevelClientModels/SerializationHelpers.cs rename to sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/LowLevelClientModels/SerializationHelpers.cs index 27c5033cccd4..7a0d5720a2b1 100644 --- a/sdk/core/Azure.Core/tests/TestClients/LowLevelClient/LowLevelClientModels/SerializationHelpers.cs +++ b/sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/LowLevelClientModels/SerializationHelpers.cs @@ -2,11 +2,10 @@ // Licensed under the MIT License. using System.Text.Json; -using Azure.Core; namespace Azure.Core.Experimental.Tests.Models { - internal class SerializationHelpers + public class SerializationHelpers { public delegate void SerializerFunc(ref Utf8JsonWriter writer, T t); diff --git a/sdk/core/Azure.Core/tests/TestClients/LowLevelClient/PetStoreClient.cs b/sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/PetStoreClient.cs similarity index 100% rename from sdk/core/Azure.Core/tests/TestClients/LowLevelClient/PetStoreClient.cs rename to sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/PetStoreClient.cs diff --git a/sdk/core/Azure.Core/tests/TestClients/LowLevelClient/PetStoreClientOptions.cs b/sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/PetStoreClientOptions.cs similarity index 98% rename from sdk/core/Azure.Core/tests/TestClients/LowLevelClient/PetStoreClientOptions.cs rename to sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/PetStoreClientOptions.cs index f400dd2b82a6..8e83c9c437f9 100644 --- a/sdk/core/Azure.Core/tests/TestClients/LowLevelClient/PetStoreClientOptions.cs +++ b/sdk/core/Azure.Core/tests/common/TestClients/LowLevelClient/PetStoreClientOptions.cs @@ -4,7 +4,6 @@ #nullable disable using System; -using Azure.Core; namespace Azure.Core.Experimental.Tests { diff --git a/sdk/core/Azure.Core/tests/common/TestData.cs b/sdk/core/Azure.Core/tests/common/TestData.cs new file mode 100644 index 000000000000..cac2d67c5614 --- /dev/null +++ b/sdk/core/Azure.Core/tests/common/TestData.cs @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +using System.IO; +using System.Text; + +namespace Azure.Core.Tests.Common +{ + public static class TestData + { + public static string GetLocation(string fileName) + { + string testsLocation = Directory.GetParent(typeof(TestData).Assembly.Location).FullName; + StringBuilder builder = new StringBuilder(); + int indexAfter = testsLocation.IndexOf(".Tests") + 6; + builder.Append(testsLocation.Substring(0, indexAfter)); + builder.Append(".Common"); + if (testsLocation[indexAfter] == Path.DirectorySeparatorChar) + { + builder.Append(testsLocation.Substring(indexAfter)); + } + else + { + int dirSeparatorIndex = testsLocation.IndexOf(Path.DirectorySeparatorChar, indexAfter); + builder.Append(testsLocation.Substring(dirSeparatorIndex)); + } + return Path.Combine(builder.ToString(), "TestData", fileName); + } + } +} diff --git a/sdk/core/Azure.Core/perf/TestData/AvailabilitySetData.json b/sdk/core/Azure.Core/tests/common/TestData/AvailabilitySetData.json similarity index 100% rename from sdk/core/Azure.Core/perf/TestData/AvailabilitySetData.json rename to sdk/core/Azure.Core/tests/common/TestData/AvailabilitySetData.json diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/TestData/ModelXml.xml b/sdk/core/Azure.Core/tests/common/TestData/ModelXml.xml similarity index 100% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/TestData/ModelXml.xml rename to sdk/core/Azure.Core/tests/common/TestData/ModelXml.xml diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/TestData/ModelXmlX.xml b/sdk/core/Azure.Core/tests/common/TestData/ModelXmlX.xml similarity index 100% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/TestData/ModelXmlX.xml rename to sdk/core/Azure.Core/tests/common/TestData/ModelXmlX.xml diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/TestData/ResourceProviderData.json b/sdk/core/Azure.Core/tests/common/TestData/ResourceProviderData-Collapsed.json similarity index 100% rename from sdk/core/Azure.Core/tests/public/ModelSerializationTests/TestData/ResourceProviderData.json rename to sdk/core/Azure.Core/tests/common/TestData/ResourceProviderData-Collapsed.json diff --git a/sdk/core/Azure.Core/perf/TestData/ResourceProviderData.json b/sdk/core/Azure.Core/tests/common/TestData/ResourceProviderData.json similarity index 100% rename from sdk/core/Azure.Core/perf/TestData/ResourceProviderData.json rename to sdk/core/Azure.Core/tests/common/TestData/ResourceProviderData.json diff --git a/sdk/core/Azure.Core/tests/public/Azure.Core.Tests.Public.csproj b/sdk/core/Azure.Core/tests/public/Azure.Core.Tests.Public.csproj index c19c703bf130..dd5cf6cebc4f 100644 --- a/sdk/core/Azure.Core/tests/public/Azure.Core.Tests.Public.csproj +++ b/sdk/core/Azure.Core/tests/public/Azure.Core.Tests.Public.csproj @@ -17,6 +17,7 @@ + @@ -25,21 +26,4 @@ - - - - - - - - Always - - - Always - - - Always - - - diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/AvailabilitySetDataTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/AvailabilitySetDataTests.cs index d4c2924faa38..9031c8e0c7dc 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/AvailabilitySetDataTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/AvailabilitySetDataTests.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using Azure.Core.Serialization; -using Azure.Core.Tests.Public.ResourceManager.Compute; +using Azure.Core.Tests.ResourceManager.Compute; using NUnit.Framework; namespace Azure.Core.Tests.Public.ModelSerializationTests diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/BaseModelTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/BaseModelTests.cs index 59c52fc7948e..969c44906c6d 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/BaseModelTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/BaseModelTests.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Linq; using Azure.Core.Serialization; using Azure.Core.Tests.Public.ModelSerializationTests.Models; using NUnit.Framework; @@ -12,7 +13,8 @@ internal class BaseModelTests : ModelTests { protected override BaseModel GetModelInstance() { - return new UnknownBaseModel(); + var typeToActivate = typeof(BaseModel).Assembly.GetTypes().FirstOrDefault(t => t.Name == $"Unknown{typeof(BaseModel).Name}"); + return Activator.CreateInstance(typeToActivate, true) as BaseModel; } protected override string JsonPayload => WirePayload; diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelJsonConverterTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelJsonConverterTests.cs deleted file mode 100644 index d87a471da98b..000000000000 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelJsonConverterTests.cs +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.Json; -using System.Threading.Tasks; -using Azure.Core.Serialization; -using Azure.Core.Tests.Public.ModelSerializationTests.Models; -using NUnit.Framework; - -namespace Azure.Core.Tests.Public.ModelSerializationTests -{ - public class ModelJsonConverterTests - { - [TestCase("J")] - [TestCase("W")] - public void SerializeTest(string format) - { - JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter(format)); - - string expected = "{"; - if (format == ModelSerializerFormat.Json) - expected += "\"latinName\":\"Animalia\","; - expected += "\"name\":\"Doggo\",\"isHungry\":false,"; - expected += "\"weight\":1.5,"; - expected += "\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"]}"; - var dog = new DogListProperty - { - Name = "Doggo", - IsHungry = false, - Weight = 1.5, - FoodConsumed = { "kibble", "egg", "peanut butter" }, - }; - var actual = JsonSerializer.Serialize(dog, options); - Assert.AreEqual(expected, actual); - } - - [TestCase("J")] - [TestCase("W")] - public void DeserializeTest(string format) - { - string serviceResponse = "{\"latinName\":\"Animalia\",\"weight\":1.5,\"name\":\"Doggo\",\"isHungry\":false,\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"],\"numberOfLegs\":4}"; - - JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter(format)); - - var dog = JsonSerializer.Deserialize(serviceResponse, options); - - Assert.AreEqual("Doggo", dog.Name); - Assert.AreEqual(false, dog.IsHungry); - Assert.AreEqual(1.5, dog.Weight); - CollectionAssert.AreEquivalent(new List { "kibble", "egg", "peanut butter" }, dog.FoodConsumed); - Assert.AreEqual("Animalia", dog.LatinName); - - var additionalProperties = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(dog) as Dictionary; - Assert.IsNotNull(additionalProperties); - Assert.AreEqual(format == ModelSerializerFormat.Json, additionalProperties.ContainsKey("numberOfLegs")); - if (format == ModelSerializerFormat.Json) - Assert.AreEqual("4", additionalProperties["numberOfLegs"].ToString()); - - string expected = "{"; - if (format == ModelSerializerFormat.Json) - expected += "\"latinName\":\"Animalia\","; - expected += "\"name\":\"Doggo\",\"isHungry\":false,"; - expected += "\"weight\":1.5,"; - expected += "\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"]"; - if (format == ModelSerializerFormat.Json) - { - expected += ",\"numberOfLegs\":4,\"DogListPropertyConverterMarker\":true"; //validate marker exists to ensure we are using the class converter if it exists - } - expected += "}"; - - var actual = JsonSerializer.Serialize(dog, options); - Assert.AreEqual(expected, actual); - } - - [Test] - public void UsesMoreConcreteConverter() - { - string serviceResponse = "{\"latinName\":\"Animalia\",\"weight\":1.5,\"name\":\"Doggo\",\"isHungry\":false,\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"],\"numberOfLegs\":4}"; - - JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter()); - options.Converters.Add(new DogListPropertyBlankConverter()); - - //the more concrete converter should be used so we will validate the default values are used - var dog = JsonSerializer.Deserialize(serviceResponse, options); - - var additionalProperties = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(dog) as Dictionary; - Assert.IsNotNull(additionalProperties); - //since this falls back to the converter defined on DogListProperty it will use the default behavior and ignore additional properties - Assert.IsFalse(additionalProperties.ContainsKey("DogListPropertyConverterMarker")); - - var actual = JsonSerializer.Serialize(dog, options); - Assert.AreEqual("", actual); - } - - [TestCase("J")] - [TestCase("W")] - public void CanSerializeDerivedModel(string format) - { - string serviceResponse = "{\"kind\":\"X\",\"name\":\"xmodel\",\"xProperty\":100,\"extra\":\"stuff\"}"; - - JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter(format)); - - var modelX = JsonSerializer.Deserialize(serviceResponse, options); - Assert.AreEqual("xmodel", modelX.Name); - Assert.AreEqual(100, modelX.XProperty); - Assert.AreEqual("X", modelX.Kind); - var additionalProperties = typeof(ModelX).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(modelX) as Dictionary; - Assert.IsNotNull(additionalProperties); - Assert.AreEqual(format == ModelSerializerFormat.Json, additionalProperties.ContainsKey("extra")); - if (format == ModelSerializerFormat.Json) - Assert.AreEqual("\"stuff\"", additionalProperties["extra"].ToString()); - - string expected = "{\"kind\":\"X\",\"name\":\"xmodel\""; - if (format == ModelSerializerFormat.Json) - expected += ",\"xProperty\":100"; - if (format == ModelSerializerFormat.Json) - expected += ",\"extra\":\"stuff\""; - expected += "}"; - var actual = JsonSerializer.Serialize(modelX, options); - Assert.AreEqual(expected, actual); - } - - [TestCase("J")] - [TestCase("W")] - public void CanSerializeBaseModel(string format) - { - string serviceResponse = "{\"kind\":\"X\",\"name\":\"xmodel\",\"xProperty\":100,\"extra\":\"stuff\"}"; - - JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter(format)); - - var baseModel = JsonSerializer.Deserialize(serviceResponse, options); - var modelX = baseModel as ModelX; - Assert.IsNotNull(modelX); - Assert.AreEqual("xmodel", modelX.Name); - Assert.AreEqual(100, modelX.XProperty); - Assert.AreEqual("X", modelX.Kind); - var additionalProperties = typeof(ModelX).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(modelX) as Dictionary; - Assert.IsNotNull(additionalProperties); - Assert.AreEqual(format == ModelSerializerFormat.Json, additionalProperties.ContainsKey("extra")); - if (format == ModelSerializerFormat.Json) - Assert.AreEqual("\"stuff\"", additionalProperties["extra"].ToString()); - - string expected = "{\"kind\":\"X\",\"name\":\"xmodel\""; - if (format == ModelSerializerFormat.Json) - { - expected += ",\"xProperty\":100"; - expected += ",\"extra\":\"stuff\""; - } - expected += "}"; - var actual = JsonSerializer.Serialize(baseModel, options); - Assert.AreEqual(expected, actual); - } - - [TestCase("J")] - [TestCase("W")] - public void CanSerializeUnknown(string format) - { - string serviceResponse = "{\"kind\":\"Z\",\"name\":\"zmodel\",\"zProperty\":1.5,\"extra\":\"stuff\"}"; - - JsonSerializerOptions options = new JsonSerializerOptions(); - options.Converters.Add(new ModelJsonConverter(format)); - - var baseModel = JsonSerializer.Deserialize(serviceResponse, options); - var unknownBaseModel = baseModel as UnknownBaseModel; - Assert.IsNotNull(unknownBaseModel); - Assert.AreEqual("zmodel", baseModel.Name); - Assert.AreEqual("Z", baseModel.Kind); - var additionalProperties = typeof(UnknownBaseModel).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(baseModel) as Dictionary; - Assert.IsNotNull(additionalProperties); - Assert.AreEqual(format == ModelSerializerFormat.Json, additionalProperties.ContainsKey("extra")); - Assert.AreEqual(format == ModelSerializerFormat.Json, additionalProperties.ContainsKey("zProperty")); - if (format == ModelSerializerFormat.Json) - { - Assert.AreEqual("\"stuff\"", additionalProperties["extra"].ToString()); - Assert.AreEqual("1.5", additionalProperties["zProperty"].ToString()); - } - - string expected = "{\"kind\":\"Z\",\"name\":\"zmodel\""; - if (format == ModelSerializerFormat.Json) - { - expected += ",\"zProperty\":1.5"; - expected += ",\"extra\":\"stuff\""; - } - expected += "}"; - var actual = JsonSerializer.Serialize(baseModel, options); - Assert.AreEqual(expected, actual); - } - - [Test] - public void ShouldThrowIfWrongDiscriminatorType() - { - } - } -} diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelTests.cs index a5d4f0bd2560..55344f0c6df9 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelTests.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.IO; using System.Text.Json; -using System.Xml; using Azure.Core.Serialization; using NUnit.Framework; @@ -96,18 +95,10 @@ public void RoundTripWithJsonInterfaceUtf8ReaderNonGeneric(string format) [TestCase("J")] [TestCase("W")] - public void RoundTripWithJsonInterfaceSequenceWriter(string format) + public void RoundTripWithModelJsonConverter(string format) { if (ModelInstance is IModelJsonSerializable) - RoundTripTest(format, new JsonInterfaceSequenceWriterStrategy()); - } - - [TestCase("J")] - [TestCase("W")] - public void RoundTripWithJsonInterfaceSequenceNonGenericWriter(string format) - { - if (ModelInstance is IModelJsonSerializable) - RoundTripTest(format, new JsonInterfaceSequenceWriterNonGenericStrategy()); + RoundTripTest(format, new ModelJsonConverterStrategy()); } [Test] @@ -130,9 +121,22 @@ protected void RoundTripTest(ModelSerializerFormat format, RoundTripStrategy if (IsXmlWireFormat && (strategy.IsExplicitJsonDeserialize || strategy.IsExplicitJsonSerialize) && format == ModelSerializerFormat.Wire) { if (strategy.IsExplicitJsonDeserialize) - Assert.Throws(() => { T model = strategy.Deserialize(serviceResponse, ModelInstance, options) as T; }); + { + if (strategy is ModelJsonConverterStrategy) + { + //we never get to the interface implementation because JsonSerializer errors before that + Assert.Throws(() => { T model = strategy.Deserialize(serviceResponse, ModelInstance, options) as T; }); + } + else + { + Assert.Throws(() => { T model = strategy.Deserialize(serviceResponse, ModelInstance, options) as T; }); + } + } + if (strategy.IsExplicitJsonSerialize) + { Assert.Throws(() => { var data = strategy.Serialize(ModelInstance, options); }); + } } else if (ModelInstance is not IModelJsonSerializable && format == ModelSerializerFormat.Json) { @@ -154,9 +158,14 @@ protected void RoundTripTest(ModelSerializerFormat format, RoundTripStrategy } } - protected Dictionary GetRawData(object model) + internal static Dictionary GetRawData(object model) { - var propertyInfo = model.GetType().GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); + Type modelType = model.GetType(); + while (modelType.BaseType != typeof(object)) + { + modelType = modelType.BaseType; + } + var propertyInfo = modelType.GetField("_rawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); return propertyInfo.GetValue(model) as Dictionary; } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlCrossLibraryTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlCrossLibraryTests.cs index 37c42607c3ef..0d69e2b6d4bd 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlCrossLibraryTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlCrossLibraryTests.cs @@ -1,21 +1,21 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; using System.IO; using System.Text; -using NUnit.Framework; -using Azure.Core.Tests.Public.ModelSerializationTests.Models; -using Azure.Core.Serialization; -using System; using System.Text.Json; using System.Xml; -using System.Reflection; +using Azure.Core.Serialization; +using Azure.Core.Tests.Common; +using Azure.Core.Tests.Public.ModelSerializationTests.Models; +using NUnit.Framework; namespace Azure.Core.Tests.Public.ModelSerializationTests { internal class ModelXmlCrossLibraryTests : ModelTests { - protected override string WirePayload => File.ReadAllText(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, "ModelSerializationTests", "TestData", "ModelXmlX.xml")).TrimEnd(); + protected override string WirePayload => File.ReadAllText(TestData.GetLocation("ModelXmlX.xml")).TrimEnd(); protected override string JsonPayload => "{\"key\":\"Color\",\"value\":\"Red\",\"readOnlyProperty\":\"ReadOnly\",\"childTag\":{\"childValue\":\"ChildRed\",\"childReadOnlyProperty\":\"ChildReadOnly\"}}"; diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlOnlyTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlOnlyTests.cs index 98a06f8a0a43..257b73244a1d 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlOnlyTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlOnlyTests.cs @@ -1,21 +1,18 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; using System.IO; -using System.Text; -using NUnit.Framework; -using Azure.Core.Tests.Public.ModelSerializationTests.Models; using Azure.Core.Serialization; -using System; -using System.Text.Json; -using System.Xml; -using System.Reflection; +using Azure.Core.Tests.Common; +using Azure.Core.Tests.Public.ModelSerializationTests.Models; +using NUnit.Framework; namespace Azure.Core.Tests.Public.ModelSerializationTests { internal class ModelXmlOnlyTests : ModelTests { - protected override string WirePayload => File.ReadAllText(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, "ModelSerializationTests", "TestData", "ModelXml.xml")).TrimEnd(); + protected override string WirePayload => File.ReadAllText(TestData.GetLocation("ModelXml.xml")).TrimEnd(); protected override string JsonPayload => string.Empty; diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlTests.cs index a53ce7110c7c..23f2d31c05e1 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ModelXmlTests.cs @@ -1,21 +1,21 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; using System.IO; using System.Text; -using NUnit.Framework; -using Azure.Core.Tests.Public.ModelSerializationTests.Models; -using Azure.Core.Serialization; -using System; using System.Text.Json; using System.Xml; -using System.Reflection; +using Azure.Core.Serialization; +using Azure.Core.Tests.Common; +using Azure.Core.Tests.Public.ModelSerializationTests.Models; +using NUnit.Framework; namespace Azure.Core.Tests.Public.ModelSerializationTests { internal class ModelXmlTests : ModelTests { - protected override string WirePayload => File.ReadAllText(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, "ModelSerializationTests", "TestData", "ModelXml.xml")).TrimEnd(); + protected override string WirePayload => File.ReadAllText(TestData.GetLocation("ModelXml.xml")).TrimEnd(); protected override string JsonPayload => "{\"key\":\"Color\",\"value\":\"Red\",\"readOnlyProperty\":\"ReadOnly\",\"renamedChildModelXml\":{\"childValue\":\"ChildRed\",\"childReadOnlyProperty\":\"ChildReadOnly\"}}"; diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Animal.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Animal.cs index 315b70c49685..ea2e86e9ce82 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Animal.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Animal.cs @@ -3,11 +3,8 @@ using System; using System.Collections.Generic; -using System.IO; using System.Text.Json; -using Azure.Core; using Azure.Core.Serialization; -using Azure.Core.Tests.Public.ModelSerializationTests.Models; namespace Azure.Core.Tests.Public.ModelSerializationTests { @@ -138,7 +135,13 @@ Animal IModelJsonSerializable.Deserialize(ref Utf8JsonReader reader, Mod return DeserializeAnimal(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } #endregion } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/CatReadOnlyProperty.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/CatReadOnlyProperty.cs index e80bf6d71d18..b88b9bfef8e9 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/CatReadOnlyProperty.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/CatReadOnlyProperty.cs @@ -126,7 +126,13 @@ CatReadOnlyProperty IModelJsonSerializable.Deserialize(ref return DeserializeCatReadOnlyProperty(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } #endregion } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ChildModelXml.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ChildModelXml.cs index 06ad07441a77..fda8cb0d209b 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ChildModelXml.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ChildModelXml.cs @@ -115,7 +115,8 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions op if (options.Format == ModelSerializerFormat.Json) { - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } else { diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DogListProperty.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DogListProperty.cs index 7c9fe340125f..c268ea8105fc 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DogListProperty.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/DogListProperty.cs @@ -3,12 +3,10 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text.Json; using System.Text.Json.Serialization; using Azure.Core.Serialization; -using Azure.Core.Tests.Public.ModelSerializationTests.Models; namespace Azure.Core.Tests.Public.ModelSerializationTests { @@ -178,6 +176,12 @@ DogListProperty IModelJsonSerializable.Deserialize(ref Utf8Json return DeserializeDogListProperty(doc.RootElement, options); } - BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Envelope.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Envelope.cs index 0c698821f14f..2bdeef03b1a7 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Envelope.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/Envelope.cs @@ -169,7 +169,8 @@ BinaryData IModelSerializable>.Serialize(ModelSerializerOptions opti { ModelSerializerHelper.ValidateFormat(this, options.Format); - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } #endregion } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/JsonModelForCombinedInterface.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/JsonModelForCombinedInterface.cs index 840c78c57e68..47e56d03f0a9 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/JsonModelForCombinedInterface.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/JsonModelForCombinedInterface.cs @@ -2,12 +2,9 @@ // Licensed under the MIT License. using System; -using Azure.Core.Serialization; -using NUnit.Framework; -using System.Text.Json; -using System.IO; -using System.Xml; using System.Collections.Generic; +using System.Text.Json; +using Azure.Core.Serialization; namespace Azure.Core.Tests.Public.ModelSerializationTests.Models { @@ -123,6 +120,12 @@ JsonModelForCombinedInterface IModelJsonSerializable.Serialize(ModelSerializerOptions options) => ModelSerializer.ConvertToBinaryData(this, options); + BinaryData IModelSerializable.Serialize(ModelSerializerOptions options) + { + ModelSerializerHelper.ValidateFormat(this, options.Format); + + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); + } } } diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXml.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXml.cs index 56e28ce01f84..a9d1b041822f 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXml.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXml.cs @@ -127,7 +127,8 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOptions options if (options.Format == ModelSerializerFormat.Json) { - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } else { diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXmlCrossLibrary.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXmlCrossLibrary.cs index a978e4230ce5..f4ed46ee72db 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXmlCrossLibrary.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/ModelXmlCrossLibrary.cs @@ -134,7 +134,8 @@ BinaryData IModelSerializable.Serialize(ModelSerializerOpt if (options.Format == ModelSerializerFormat.Json) { - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } else { diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/XmlModelForCombinedInterface.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/XmlModelForCombinedInterface.cs index 6fd7e8ee1c18..76b34afb86bc 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/XmlModelForCombinedInterface.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/Models/XmlModelForCombinedInterface.cs @@ -115,7 +115,8 @@ BinaryData IModelSerializable.Serialize(ModelSeria if (options.Format == ModelSerializerFormat.Json) { - return ModelSerializer.ConvertToBinaryData(this, options); + using var writer = new ModelWriter(this, options); + return writer.ToBinaryData(); } else { diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ResourceProviderDataTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ResourceProviderDataTests.cs index ccfef24771bc..b5ce13f3bbd4 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ResourceProviderDataTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/ResourceProviderDataTests.cs @@ -3,9 +3,9 @@ using System; using System.IO; -using System.Reflection; using Azure.Core.Serialization; -using Azure.Core.Tests.Public.ResourceManager.Resources; +using Azure.Core.Tests.Common; +using Azure.Core.Tests.ResourceManager.Resources; using NUnit.Framework; namespace Azure.Core.Tests.Public.ModelSerializationTests @@ -14,7 +14,7 @@ internal class ResourceProviderDataTests : ModelTests { protected override string JsonPayload => WirePayload; - protected override string WirePayload => File.ReadAllText(Path.Combine(Directory.GetParent(Assembly.GetExecutingAssembly().Location).FullName, "ModelSerializationTests", "TestData", "ResourceProviderData.json")).TrimEnd(); + protected override string WirePayload => File.ReadAllText(TestData.GetLocation("ResourceProviderData-Collapsed.json")).TrimEnd(); protected override Func ToRequestContent => model => model; diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/RoundTripStrategy.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/RoundTripStrategy.cs index 63a8b08ffd1e..e63d42089603 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/RoundTripStrategy.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/RoundTripStrategy.cs @@ -2,14 +2,9 @@ // Licensed under the MIT License. using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; using System.Text.Json; -using System.Threading.Tasks; -using System.Xml; -using System.Xml.Linq; using Azure.Core.Serialization; using Azure.Core.TestFramework; @@ -109,7 +104,8 @@ public class JsonInterfaceStrategy : RoundTripStrategy where T : class, IM public override BinaryData Serialize(T model, ModelSerializerOptions options) { - return ModelSerializer.ConvertToBinaryData((IModelJsonSerializable)model, options); + using var writer = new ModelWriter((IModelJsonSerializable)model, options); + return writer.ToBinaryData(); } public override object Deserialize(string payload, object model, ModelSerializerOptions options) @@ -125,7 +121,8 @@ public class JsonInterfaceNonGenericStrategy : RoundTripStrategy where T : public override BinaryData Serialize(T model, ModelSerializerOptions options) { - return ModelSerializer.ConvertToBinaryData((IModelJsonSerializable)model, options); + using var writer = new ModelWriter((IModelJsonSerializable)model, options); + return writer.ToBinaryData(); } public override object Deserialize(string payload, object model, ModelSerializerOptions options) @@ -141,7 +138,8 @@ public class JsonInterfaceUtf8ReaderStrategy : RoundTripStrategy where T : public override BinaryData Serialize(T model, ModelSerializerOptions options) { - return ModelSerializer.ConvertToBinaryData((IModelJsonSerializable)model, options); + using var writer = new ModelWriter((IModelJsonSerializable)model, options); + return writer.ToBinaryData(); } public override object Deserialize(string payload, object model, ModelSerializerOptions options) @@ -151,38 +149,6 @@ public override object Deserialize(string payload, object model, ModelSerializer } } - public class JsonInterfaceSequenceWriterStrategy : RoundTripStrategy where T : class, IModelSerializable - { - public override bool IsExplicitJsonSerialize => true; - public override bool IsExplicitJsonDeserialize => false; - - public override BinaryData Serialize(T model, ModelSerializerOptions options) - { - return ModelSerializer.ConvertToBinaryData((IModelJsonSerializable)model, options); - } - - public override object Deserialize(string payload, object model, ModelSerializerOptions options) - { - return ((IModelJsonSerializable)model).Deserialize(new BinaryData(Encoding.UTF8.GetBytes(payload)), options); - } - } - - public class JsonInterfaceSequenceWriterNonGenericStrategy : RoundTripStrategy where T : class, IModelSerializable - { - public override bool IsExplicitJsonSerialize => true; - public override bool IsExplicitJsonDeserialize => false; - - public override BinaryData Serialize(T model, ModelSerializerOptions options) - { - return ModelSerializer.ConvertToBinaryData((IModelJsonSerializable)model, options); - } - - public override object Deserialize(string payload, object model, ModelSerializerOptions options) - { - return ((IModelJsonSerializable)model).Deserialize(new BinaryData(Encoding.UTF8.GetBytes(payload)), options); - } - } - public class JsonInterfaceUtf8ReaderNonGenericStrategy : RoundTripStrategy where T : class, IModelSerializable { public override bool IsExplicitJsonSerialize => true; @@ -190,7 +156,8 @@ public class JsonInterfaceUtf8ReaderNonGenericStrategy : RoundTripStrategy public override BinaryData Serialize(T model, ModelSerializerOptions options) { - return ModelSerializer.ConvertToBinaryData((IModelJsonSerializable)model, options); + using var writer = new ModelWriter((IModelJsonSerializable)model, options); + return writer.ToBinaryData(); } public override object Deserialize(string payload, object model, ModelSerializerOptions options) @@ -230,5 +197,24 @@ public override object Deserialize(string payload, object model, ModelSerializer return _fromResponse(response); } } + + public class ModelJsonConverterStrategy : RoundTripStrategy where T : class, IModelSerializable + { + public override bool IsExplicitJsonSerialize => true; + public override bool IsExplicitJsonDeserialize => true; + + public override BinaryData Serialize(T model, ModelSerializerOptions options) + { + JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions(); + jsonSerializerOptions.Converters.Add(new ModelJsonConverter(options)); + return BinaryData.FromString(JsonSerializer.Serialize(model, jsonSerializerOptions)); + } + public override object Deserialize(string payload, object model, ModelSerializerOptions options) + { + JsonSerializerOptions jsonSerializerOptions = new JsonSerializerOptions(); + jsonSerializerOptions.Converters.Add(new ModelJsonConverter(options)); + return JsonSerializer.Deserialize(payload, jsonSerializerOptions); + } + } } #pragma warning restore SA1402 // File may only contain a single type diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UnknownBaseModelTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UnknownBaseModelTests.cs index e72df3ea4e9f..8b0ae4378c0b 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UnknownBaseModelTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UnknownBaseModelTests.cs @@ -2,10 +2,7 @@ // Licensed under the MIT License. using System; -using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Threading.Tasks; using Azure.Core.Serialization; using Azure.Core.Tests.Public.ModelSerializationTests.Models; using NUnit.Framework; @@ -16,7 +13,8 @@ internal class UnknownBaseModelTests : ModelTests { protected override BaseModel GetModelInstance() { - return new UnknownBaseModel(); + var typeToActivate = typeof(BaseModel).Assembly.GetTypes().FirstOrDefault(t => t.Name == $"Unknown{typeof(BaseModel).Name}"); + return Activator.CreateInstance(typeToActivate, true) as BaseModel; } protected override string JsonPayload => WirePayload; @@ -29,8 +27,8 @@ protected override BaseModel GetModelInstance() protected override void CompareModels(BaseModel model, BaseModel model2, ModelSerializerFormat format) { - Assert.IsTrue(model is UnknownBaseModel); - Assert.IsTrue(model2 is UnknownBaseModel); + Assert.AreEqual("UnknownBaseModel", model.GetType().Name); + Assert.AreEqual("UnknownBaseModel", model2.GetType().Name); Assert.AreEqual(model.Kind, model2.Kind); Assert.AreEqual(model.Name, model2.Name); var rawData = GetRawData(model); @@ -56,7 +54,7 @@ protected override string GetExpectedResult(ModelSerializerFormat format) protected override void VerifyModel(BaseModel model, ModelSerializerFormat format) { - Assert.IsTrue(model is UnknownBaseModel); + Assert.AreEqual("UnknownBaseModel", model.GetType().Name); Assert.AreEqual("Z", model.Kind); Assert.AreEqual("zmodel", model.Name); var rawData = GetRawData(model); diff --git a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UsingJsonSerializerTests.cs b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UsingJsonSerializerTests.cs index deccebb73e27..918b14bc66d3 100644 --- a/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UsingJsonSerializerTests.cs +++ b/sdk/core/Azure.Core/tests/public/ModelSerializationTests/UsingJsonSerializerTests.cs @@ -1,8 +1,6 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -using System; -using System.Collections.Generic; using System.Text.Json; using Azure.Core.Serialization; using Azure.Core.Tests.Public.ModelSerializationTests.Models; @@ -12,68 +10,6 @@ namespace Azure.Core.Tests.Public.ModelSerializationTests { public class UsingJsonSerializerTests { - [TestCase(true)] - [TestCase(false)] - public void SerializeTest(bool ignoreReadonlyProperties) - { - string expected = "{"; - expected += "\"name\":\"Doggo\",\"isHungry\":false,"; -#if NETFRAMEWORK - expected += "\"weight\":1.1000000000000001,"; -#else - expected += "\"weight\":1.1,"; -#endif - expected += "\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"]}"; - var dog = new DogListProperty - { - Name = "Doggo", - IsHungry = false, - Weight = 1.1, - FoodConsumed = { "kibble", "egg", "peanut butter" }, - }; - var options = new JsonSerializerOptions() - { - IgnoreReadOnlyProperties = ignoreReadonlyProperties - }; - var actual = JsonSerializer.Serialize(dog, options); - Assert.AreEqual(expected, actual); - } - - [TestCase(true)] - [TestCase(false)] - public void DeserializeTest(bool ignoreReadonlyProperties) - { - string serviceResponse = "{\"latinName\":\"Animalia\",\"weight\":1.1,\"name\":\"Doggo\",\"isHungry\":false,\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"],\"numberOfLegs\":4}"; - - var options = new JsonSerializerOptions() - { - IgnoreReadOnlyProperties = ignoreReadonlyProperties - }; - var dog = JsonSerializer.Deserialize(serviceResponse, options); - - Assert.AreEqual("Doggo", dog.Name); - Assert.AreEqual(false, dog.IsHungry); - Assert.AreEqual(1.1, dog.Weight); - CollectionAssert.AreEquivalent(new List { "kibble", "egg", "peanut butter" }, dog.FoodConsumed); - Assert.AreEqual("Animalia", dog.LatinName); - - var additionalProperties = typeof(Animal).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(dog) as Dictionary; - Assert.IsNotNull(additionalProperties); - Assert.IsFalse(additionalProperties.ContainsKey("numberOfLegs")); - - string expected = "{"; - expected += "\"name\":\"Doggo\",\"isHungry\":false,"; -#if NETFRAMEWORK - expected += "\"weight\":1.1000000000000001,"; -#else - expected += "\"weight\":1.1,"; -#endif - expected += "\"foodConsumed\":[\"kibble\",\"egg\",\"peanut butter\"]}"; - - var actual = JsonSerializer.Serialize(dog, options); - Assert.AreEqual(expected, actual); - } - [TestCase("J")] [TestCase("W")] public void CanSerializeTwoModelsWithSameConverter(string format) @@ -90,7 +26,7 @@ public void CanSerializeTwoModelsWithSameConverter(string format) if (format == ModelSerializerFormat.Json) Assert.AreEqual("100", modelY.YProperty); - var additionalProperties = typeof(ModelY).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(modelY) as Dictionary; + var additionalProperties = ModelTests.GetRawData(modelY); Assert.IsNotNull(additionalProperties); if (format == ModelSerializerFormat.Json) Assert.AreEqual("stuff", additionalProperties["extra"].ToObjectFromJson()); @@ -111,7 +47,7 @@ public void CanSerializeTwoModelsWithSameConverter(string format) if (format == ModelSerializerFormat.Json) Assert.AreEqual(100, modelX.XProperty); - additionalProperties = typeof(ModelX).GetProperty("RawData", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).GetValue(modelX) as Dictionary; + additionalProperties = ModelTests.GetRawData(modelX); Assert.IsNotNull(additionalProperties); if (format == ModelSerializerFormat.Json) Assert.AreEqual("stuff", additionalProperties["extra"].ToObjectFromJson());