From 85a5188d0251229cf3a3663aac6773752eddd494 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Habinshuti?= Date: Thu, 11 Jan 2024 11:44:07 +0300 Subject: [PATCH] Add flag to skip property verification in `ODataResource` (#2812) * Add flag to skip property verificaiton in ODataResourceBase * Add tests * Add to PublicAPI --- src/Microsoft.OData.Core/ODataResource.cs | 15 +++++++- .../PublicAPI/net45/PublicAPI.Unshipped.txt | 2 + .../netcoreapp3.1/PublicAPI.Unshipped.txt | 2 + .../netstandard1.1/PublicAPI.Unshipped.txt | 2 + .../netstandard2.0/PublicAPI.Unshipped.txt | 2 + .../ODataResourceTests.cs | 37 +++++++++++++++++++ .../Microsoft.OData.PublicApi.net45.bsl | 1 + ...crosoft.OData.PublicApi.netstandard1.1.bsl | 1 + ...crosoft.OData.PublicApi.netstandard2.0.bsl | 1 + 9 files changed, 62 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.OData.Core/ODataResource.cs b/src/Microsoft.OData.Core/ODataResource.cs index 57033b60ed..ed8f775824 100644 --- a/src/Microsoft.OData.Core/ODataResource.cs +++ b/src/Microsoft.OData.Core/ODataResource.cs @@ -176,6 +176,15 @@ public IEnumerable Functions get { return this.MetadataBuilder.GetFunctions(); } } + /// + /// Gets or sets whether to skip property verification. When set to false (default behaviour), + /// the properties collection will be verified to ensure it doesn't contain invalid values. + /// When set to true, it's the caller's responsibility to ensure the property values are valid + /// before setting the property. This can be a useful optimization + /// in hot paths when you're sure property values are valid. + /// + public bool SkipPropertyVerification { get; set; } + /// Gets or sets the resource properties. /// The resource properties. /// @@ -190,7 +199,11 @@ public IEnumerable Properties set { - VerifyProperties(value); + if (!this.SkipPropertyVerification) + { + VerifyProperties(value); + } + this.properties = value; } } diff --git a/src/Microsoft.OData.Core/PublicAPI/net45/PublicAPI.Unshipped.txt b/src/Microsoft.OData.Core/PublicAPI/net45/PublicAPI.Unshipped.txt index e69de29bb2..3dae324235 100644 --- a/src/Microsoft.OData.Core/PublicAPI/net45/PublicAPI.Unshipped.txt +++ b/src/Microsoft.OData.Core/PublicAPI/net45/PublicAPI.Unshipped.txt @@ -0,0 +1,2 @@ +Microsoft.OData.ODataResourceBase.SkipPropertyVerification.get -> bool +Microsoft.OData.ODataResourceBase.SkipPropertyVerification.set -> void \ No newline at end of file diff --git a/src/Microsoft.OData.Core/PublicAPI/netcoreapp3.1/PublicAPI.Unshipped.txt b/src/Microsoft.OData.Core/PublicAPI/netcoreapp3.1/PublicAPI.Unshipped.txt index e69de29bb2..3dae324235 100644 --- a/src/Microsoft.OData.Core/PublicAPI/netcoreapp3.1/PublicAPI.Unshipped.txt +++ b/src/Microsoft.OData.Core/PublicAPI/netcoreapp3.1/PublicAPI.Unshipped.txt @@ -0,0 +1,2 @@ +Microsoft.OData.ODataResourceBase.SkipPropertyVerification.get -> bool +Microsoft.OData.ODataResourceBase.SkipPropertyVerification.set -> void \ No newline at end of file diff --git a/src/Microsoft.OData.Core/PublicAPI/netstandard1.1/PublicAPI.Unshipped.txt b/src/Microsoft.OData.Core/PublicAPI/netstandard1.1/PublicAPI.Unshipped.txt index e69de29bb2..3dae324235 100644 --- a/src/Microsoft.OData.Core/PublicAPI/netstandard1.1/PublicAPI.Unshipped.txt +++ b/src/Microsoft.OData.Core/PublicAPI/netstandard1.1/PublicAPI.Unshipped.txt @@ -0,0 +1,2 @@ +Microsoft.OData.ODataResourceBase.SkipPropertyVerification.get -> bool +Microsoft.OData.ODataResourceBase.SkipPropertyVerification.set -> void \ No newline at end of file diff --git a/src/Microsoft.OData.Core/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/Microsoft.OData.Core/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt index e69de29bb2..3dae324235 100644 --- a/src/Microsoft.OData.Core/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt +++ b/src/Microsoft.OData.Core/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt @@ -0,0 +1,2 @@ +Microsoft.OData.ODataResourceBase.SkipPropertyVerification.get -> bool +Microsoft.OData.ODataResourceBase.SkipPropertyVerification.set -> void \ No newline at end of file diff --git a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTests.cs b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTests.cs index 2248878476..df22cb300e 100644 --- a/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTests.cs +++ b/test/FunctionalTests/Microsoft.OData.Core.Tests/ODataResourceTests.cs @@ -316,5 +316,42 @@ public void ODataResourcePropertyWithCollectionODataResourceValueThrows() var exception = Assert.Throws(test); Assert.Equal(Strings.ODataResource_PropertyValueCannotBeODataResourceValue("CollectionProperty"), exception.Message); } + + [Fact] + public void WhenSkipPropertyVerificatonIsTrue_ODataResourcePropertyWithODataResourceValue_DoesNotThrow() + { + ODataResource resource = new ODataResource + { + TypeName = "NS.Resource", + SkipPropertyVerification = true + }; + + resource.Properties = new[] + { + new ODataProperty { Name = "ResourceProperty", Value = new ODataResourceValue() } + }; + } + + [Fact] + public void WhenSkipPropertyVerificatonIsTrue_ODataResourcePropertyWithCollectionODataResourceValue_DoesNotThrow() + { + ODataResource resource = new ODataResource + { + TypeName = "NS.Resource", + SkipPropertyVerification = true + }; + + resource.Properties = new[] + { + new ODataProperty + { + Name = "CollectionProperty", + Value = new ODataCollectionValue + { + Items = new [] { new ODataResourceValue() } + } + } + }; + } } } diff --git a/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.net45.bsl b/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.net45.bsl index 17476d67fb..fd85dd37bc 100644 --- a/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.net45.bsl +++ b/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.net45.bsl @@ -4857,6 +4857,7 @@ public abstract class Microsoft.OData.ODataResourceBase : Microsoft.OData.ODataI Microsoft.OData.ODataStreamReferenceValue MediaResource { public get; public set; } System.Collections.Generic.IEnumerable`1[[Microsoft.OData.ODataProperty]] Properties { public get; public set; } System.Uri ReadLink { public get; public set; } + bool SkipPropertyVerification { public get; public set; } string TypeName { public get; public set; } public void AddAction (Microsoft.OData.ODataAction action) diff --git a/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.netstandard1.1.bsl b/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.netstandard1.1.bsl index d588bdf4ee..79f11cb3b8 100644 --- a/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.netstandard1.1.bsl +++ b/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.netstandard1.1.bsl @@ -4857,6 +4857,7 @@ public abstract class Microsoft.OData.ODataResourceBase : Microsoft.OData.ODataI Microsoft.OData.ODataStreamReferenceValue MediaResource { public get; public set; } System.Collections.Generic.IEnumerable`1[[Microsoft.OData.ODataProperty]] Properties { public get; public set; } System.Uri ReadLink { public get; public set; } + bool SkipPropertyVerification { public get; public set; } string TypeName { public get; public set; } public void AddAction (Microsoft.OData.ODataAction action) diff --git a/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.netstandard2.0.bsl b/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.netstandard2.0.bsl index 17476d67fb..fd85dd37bc 100644 --- a/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.netstandard2.0.bsl +++ b/test/PublicApiTests/BaseLine/Microsoft.OData.PublicApi.netstandard2.0.bsl @@ -4857,6 +4857,7 @@ public abstract class Microsoft.OData.ODataResourceBase : Microsoft.OData.ODataI Microsoft.OData.ODataStreamReferenceValue MediaResource { public get; public set; } System.Collections.Generic.IEnumerable`1[[Microsoft.OData.ODataProperty]] Properties { public get; public set; } System.Uri ReadLink { public get; public set; } + bool SkipPropertyVerification { public get; public set; } string TypeName { public get; public set; } public void AddAction (Microsoft.OData.ODataAction action)