From 0741f1e139817e3cd9b4fb03a8325f59666db6f6 Mon Sep 17 00:00:00 2001 From: Alexander Chirlin Date: Sun, 23 Dec 2018 17:56:18 +0200 Subject: [PATCH 01/21] #80260, upgrade to 4.7.2 including code changes made in 4.7.1 --- .../Gigya.Microdot.Configuration.csproj | 28 +- .../Gigya.Microdot.Fakes.csproj | 8 +- .../Gigya.Microdot.Hosting.csproj | 29 +- Gigya.Microdot.Hosting/app.config | 4 +- .../Gigya.Microdot.Interfaces.csproj | 4 +- .../Gigya.Microdot.Logging.NLog.csproj | 7 +- Gigya.Microdot.Ninject.Host/App.config | 10 +- .../Gigya.Microdot.Ninject.Host.csproj | 19 +- .../Gigya.Microdot.Ninject.csproj | 21 +- .../Gigya.Microdot.Orleans.Hosting.csproj | 348 +++++++++++++++-- ...Gigya.Microdot.Orleans.Ninject.Host.csproj | 52 +-- .../app.config | 5 +- .../Gigya.Microdot.ServiceDiscovery.csproj | 28 +- .../Gigya.Microdot.ServiceProxy.csproj | 28 +- .../ServiceProxyProvider.cs | 8 +- .../Gigya.Microdot.SharedLogic.csproj | 20 +- Gigya.Microdot.Testing.Shared/App.config | 7 +- .../Gigya.Microdot.Testing.Shared.csproj | 40 +- .../Gigya.Microdot.Testing.csproj | 33 +- Sample/CalculatorService.Client/App.config | 14 +- .../CalculatorService.Client.csproj | 12 +- .../CalculatorService.Interface.csproj | 6 +- Sample/CalculatorService.Orleans/App.config | 4 +- .../CalculatorService.Orleans.csproj | 326 +++++++++++++++- Sample/CalculatorService/App.config | 14 +- .../CalculatorService.csproj | 8 +- paket.dependencies | 30 +- paket.lock | 109 +++++- .../Gigya.Microdot.Hosting.UnitTests.csproj | 351 +++++++++++++++-- .../app.config | 9 +- ....Microdot.Orleans.Hosting.UnitTests.csproj | 357 ++++++++++++++++-- .../app.config | 9 +- ....Microdot.ServiceContract.UnitTests.csproj | 14 +- .../app.config | 8 +- .../Gigya.Microdot.UnitTests.csproj | 66 ++-- .../AbstractServiceProxyTest.cs | 2 +- tests/Gigya.Microdot.UnitTests/app.config | 14 +- 37 files changed, 1686 insertions(+), 366 deletions(-) diff --git a/Gigya.Microdot.Configuration/Gigya.Microdot.Configuration.csproj b/Gigya.Microdot.Configuration/Gigya.Microdot.Configuration.csproj index de87f29f..9a265689 100644 --- a/Gigya.Microdot.Configuration/Gigya.Microdot.Configuration.csproj +++ b/Gigya.Microdot.Configuration/Gigya.Microdot.Configuration.csproj @@ -9,7 +9,7 @@ Properties Gigya.Microdot.Configuration Gigya.Microdot.Configuration - v4.5.1 + v4.7.2 512 @@ -94,7 +94,7 @@ --> - + True @@ -111,7 +111,7 @@ - + ..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -122,7 +122,7 @@ - + ..\packages\Metrics.NET\lib\net45\Metrics.dll @@ -133,7 +133,7 @@ - + ..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -144,10 +144,24 @@ - + + + + True + + + ..\packages\System.ComponentModel.Annotations\lib\net461\System.ComponentModel.Annotations.dll + True + True + + + + + + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True diff --git a/Gigya.Microdot.Fakes/Gigya.Microdot.Fakes.csproj b/Gigya.Microdot.Fakes/Gigya.Microdot.Fakes.csproj index ebd36b1f..3a6f1a35 100644 --- a/Gigya.Microdot.Fakes/Gigya.Microdot.Fakes.csproj +++ b/Gigya.Microdot.Fakes/Gigya.Microdot.Fakes.csproj @@ -9,7 +9,7 @@ Properties Gigya.Microdot.Fakes Gigya.Microdot.Fakes - v4.5.1 + v4.7.2 512 @@ -96,7 +96,7 @@ --> - + ..\packages\Metrics.NET\lib\net45\Metrics.dll @@ -107,10 +107,10 @@ - + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True diff --git a/Gigya.Microdot.Hosting/Gigya.Microdot.Hosting.csproj b/Gigya.Microdot.Hosting/Gigya.Microdot.Hosting.csproj index e3a15e35..311007d7 100644 --- a/Gigya.Microdot.Hosting/Gigya.Microdot.Hosting.csproj +++ b/Gigya.Microdot.Hosting/Gigya.Microdot.Hosting.csproj @@ -9,7 +9,7 @@ Properties Gigya.Microdot.Hosting Gigya.Microdot.Hosting - v4.5.1 + v4.7.2 512 ..\ @@ -90,7 +90,9 @@ - + + Designer + Designer @@ -126,7 +128,7 @@ --> - + True @@ -152,7 +154,7 @@ - + ..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -163,7 +165,7 @@ - + ..\packages\Metrics.NET\lib\net45\Metrics.dll @@ -174,7 +176,7 @@ - + ..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -185,10 +187,10 @@ - + - ..\packages\System.Collections.Immutable\lib\netstandard1.0\System.Collections.Immutable.dll + ..\packages\System.Collections.Immutable\lib\netstandard2.0\System.Collections.Immutable.dll True True @@ -196,10 +198,10 @@ - + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True @@ -207,10 +209,13 @@ - + + + True + - ..\packages\System.ValueTuple\lib\netstandard1.0\System.ValueTuple.dll + ..\packages\System.ValueTuple\lib\net47\System.ValueTuple.dll True True diff --git a/Gigya.Microdot.Hosting/app.config b/Gigya.Microdot.Hosting/app.config index b588bc72..4e15c3f7 100644 --- a/Gigya.Microdot.Hosting/app.config +++ b/Gigya.Microdot.Hosting/app.config @@ -1,3 +1,3 @@ - + - + diff --git a/Gigya.Microdot.Interfaces/Gigya.Microdot.Interfaces.csproj b/Gigya.Microdot.Interfaces/Gigya.Microdot.Interfaces.csproj index 10f2ac3b..c9e80948 100644 --- a/Gigya.Microdot.Interfaces/Gigya.Microdot.Interfaces.csproj +++ b/Gigya.Microdot.Interfaces/Gigya.Microdot.Interfaces.csproj @@ -9,7 +9,7 @@ Properties Gigya.Microdot.Interfaces Gigya.Microdot.Interfaces - v4.5.1 + v4.7.2 512 @@ -82,7 +82,7 @@ --> - + ..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll diff --git a/Gigya.Microdot.Logging.NLog/Gigya.Microdot.Logging.NLog.csproj b/Gigya.Microdot.Logging.NLog/Gigya.Microdot.Logging.NLog.csproj index b8488849..4773fefa 100644 --- a/Gigya.Microdot.Logging.NLog/Gigya.Microdot.Logging.NLog.csproj +++ b/Gigya.Microdot.Logging.NLog/Gigya.Microdot.Logging.NLog.csproj @@ -9,8 +9,9 @@ Properties Gigya.Microdot.Logging.NLog Gigya.Microdot.Logging.NLog - v4.5.1 + v4.7.2 512 + true @@ -66,7 +67,7 @@ - + ..\packages\Ninject\lib\net45\Ninject.dll @@ -77,7 +78,7 @@ - + True diff --git a/Gigya.Microdot.Ninject.Host/App.config b/Gigya.Microdot.Ninject.Host/App.config index 33677514..2906cd41 100644 --- a/Gigya.Microdot.Ninject.Host/App.config +++ b/Gigya.Microdot.Ninject.Host/App.config @@ -1,12 +1,12 @@ - + - + True - - + + - \ No newline at end of file + diff --git a/Gigya.Microdot.Ninject.Host/Gigya.Microdot.Ninject.Host.csproj b/Gigya.Microdot.Ninject.Host/Gigya.Microdot.Ninject.Host.csproj index 22b6dccf..95402d07 100644 --- a/Gigya.Microdot.Ninject.Host/Gigya.Microdot.Ninject.Host.csproj +++ b/Gigya.Microdot.Ninject.Host/Gigya.Microdot.Ninject.Host.csproj @@ -8,9 +8,10 @@ Library Gigya.Microdot.Ninject.Host Gigya.Microdot.Ninject.Host - v4.5.1 + v4.7.2 512 true + AnyCPU @@ -52,7 +53,9 @@ - + + Designer + @@ -80,7 +83,7 @@ - + True @@ -94,7 +97,7 @@ - + ..\packages\Ninject\lib\net45\Ninject.dll @@ -105,7 +108,7 @@ - + ..\packages\Ninject.Extensions.Conventions\lib\net45\Ninject.Extensions.Conventions.dll @@ -116,7 +119,7 @@ - + ..\packages\Ninject.Extensions.Factory\lib\net45\Ninject.Extensions.Factory.dll @@ -127,10 +130,10 @@ - + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True diff --git a/Gigya.Microdot.Ninject/Gigya.Microdot.Ninject.csproj b/Gigya.Microdot.Ninject/Gigya.Microdot.Ninject.csproj index 5a98aa41..af005913 100644 --- a/Gigya.Microdot.Ninject/Gigya.Microdot.Ninject.csproj +++ b/Gigya.Microdot.Ninject/Gigya.Microdot.Ninject.csproj @@ -9,8 +9,9 @@ Properties Gigya.Microdot.Ninject Gigya.Microdot.Ninject - v4.5.1 + v4.7.2 512 + true @@ -87,7 +88,7 @@ - + True @@ -101,7 +102,7 @@ - + ..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -112,7 +113,7 @@ - + ..\packages\Metrics.NET\lib\net45\Metrics.dll @@ -123,7 +124,7 @@ - + ..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -134,7 +135,7 @@ - + ..\packages\Ninject\lib\net45\Ninject.dll @@ -145,7 +146,7 @@ - + ..\packages\Ninject.Extensions.Conventions\lib\net45\Ninject.Extensions.Conventions.dll @@ -156,7 +157,7 @@ - + ..\packages\Ninject.Extensions.Factory\lib\net45\Ninject.Extensions.Factory.dll @@ -167,10 +168,10 @@ - + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True diff --git a/Gigya.Microdot.Orleans.Hosting/Gigya.Microdot.Orleans.Hosting.csproj b/Gigya.Microdot.Orleans.Hosting/Gigya.Microdot.Orleans.Hosting.csproj index 69258aad..801abaf5 100644 --- a/Gigya.Microdot.Orleans.Hosting/Gigya.Microdot.Orleans.Hosting.csproj +++ b/Gigya.Microdot.Orleans.Hosting/Gigya.Microdot.Orleans.Hosting.csproj @@ -9,7 +9,7 @@ Properties Gigya.Microdot.Orleans.Hosting Gigya.Microdot.Orleans.Hosting - v4.5.1 + v4.7.2 512 @@ -69,6 +69,13 @@ + + + + <__paket__NETStandard_Library_targets>netstandard2.0\NETStandard.Library + + + - + ..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -141,7 +142,7 @@ - + ..\packages\Metrics.NET\lib\net45\Metrics.dll @@ -152,7 +153,7 @@ - + True @@ -176,7 +177,7 @@ - + ..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -187,7 +188,7 @@ - + ..\packages\Nito.AsyncEx\lib\net45\Nito.AsyncEx.dll @@ -208,10 +209,10 @@ - + - ..\packages\System.Collections.Immutable\lib\netstandard1.0\System.Collections.Immutable.dll + ..\packages\System.Collections.Immutable\lib\netstandard2.0\System.Collections.Immutable.dll True True @@ -219,10 +220,10 @@ - + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True @@ -230,10 +231,13 @@ - + + + True + - ..\packages\System.ValueTuple\lib\netstandard1.0\System.ValueTuple.dll + ..\packages\System.ValueTuple\lib\net47\System.ValueTuple.dll True True diff --git a/Gigya.Microdot.ServiceProxy/Gigya.Microdot.ServiceProxy.csproj b/Gigya.Microdot.ServiceProxy/Gigya.Microdot.ServiceProxy.csproj index 3d6106f7..1e54caa3 100644 --- a/Gigya.Microdot.ServiceProxy/Gigya.Microdot.ServiceProxy.csproj +++ b/Gigya.Microdot.ServiceProxy/Gigya.Microdot.ServiceProxy.csproj @@ -9,8 +9,9 @@ Properties Gigya.Microdot.ServiceProxy Gigya.Microdot.ServiceProxy - v4.5.1 + v4.7.2 512 + true @@ -105,7 +106,7 @@ --> - + ..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -116,7 +117,7 @@ - + ..\packages\Metrics.NET\lib\net45\Metrics.dll @@ -127,7 +128,7 @@ - + True @@ -151,7 +152,7 @@ - + ..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -162,7 +163,7 @@ - + ..\packages\Nito.AsyncEx\lib\net45\Nito.AsyncEx.dll @@ -183,10 +184,10 @@ - + - ..\packages\System.Collections.Immutable\lib\netstandard1.0\System.Collections.Immutable.dll + ..\packages\System.Collections.Immutable\lib\netstandard2.0\System.Collections.Immutable.dll True True @@ -194,10 +195,10 @@ - + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True @@ -205,10 +206,13 @@ - + + + True + - ..\packages\System.ValueTuple\lib\netstandard1.0\System.ValueTuple.dll + ..\packages\System.ValueTuple\lib\net47\System.ValueTuple.dll True True diff --git a/Gigya.Microdot.ServiceProxy/ServiceProxyProvider.cs b/Gigya.Microdot.ServiceProxy/ServiceProxyProvider.cs index 2c98c816..2cef0322 100644 --- a/Gigya.Microdot.ServiceProxy/ServiceProxyProvider.cs +++ b/Gigya.Microdot.ServiceProxy/ServiceProxyProvider.cs @@ -104,7 +104,7 @@ public class ServiceProxyProvider : IDisposable, IServiceProxyProvider private readonly Counter _hostFailureCounter; private readonly Counter _applicationExceptionCounter; - private HttpMessageHandler _httpMessageHandler = new WebRequestHandler(); + private HttpMessageHandler _httpMessageHandler = new HttpClientHandler(); protected internal HttpMessageHandler HttpMessageHandler { @@ -210,9 +210,9 @@ private HttpClient GetHttpClient(ServiceDiscoveryConfig config) private void InitHttps(string securityRole) { if (HttpMessageHandler == null) - HttpMessageHandler = new WebRequestHandler(); + HttpMessageHandler = new HttpClientHandler(); - var wrh = HttpMessageHandler as WebRequestHandler; + var wrh = HttpMessageHandler as HttpClientHandler; if (wrh == null) throw new ProgrammaticException("When using HTTPS in ServiceProxy, only WebRequestHandler is supported.", unencrypted: new Tags { { "HandlerType", HttpMessageHandler.GetType().FullName } }); @@ -222,7 +222,7 @@ private void InitHttps(string securityRole) wrh.ClientCertificates.Add(clientCert); - wrh.ServerCertificateValidationCallback = (sender, serverCertificate, serverChain, errors) => + wrh.ServerCertificateCustomValidationCallback = (sender, serverCertificate, serverChain, errors) => { switch (errors) { diff --git a/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj b/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj index 882555a8..da31c4ec 100644 --- a/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj +++ b/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj @@ -9,8 +9,9 @@ Properties Gigya.Microdot.SharedLogic Gigya.Microdot.SharedLogic - v4.5.1 + v4.7.2 512 + true @@ -125,7 +126,7 @@ --> - + ..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -136,7 +137,7 @@ - + ..\packages\Metrics.NET\lib\net45\Metrics.dll @@ -147,7 +148,7 @@ - + ..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -158,10 +159,10 @@ - + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True @@ -169,10 +170,13 @@ - + + + True + - ..\packages\System.ValueTuple\lib\netstandard1.0\System.ValueTuple.dll + ..\packages\System.ValueTuple\lib\net47\System.ValueTuple.dll True True diff --git a/Gigya.Microdot.Testing.Shared/App.config b/Gigya.Microdot.Testing.Shared/App.config index 24d5172e..9ec5d083 100644 --- a/Gigya.Microdot.Testing.Shared/App.config +++ b/Gigya.Microdot.Testing.Shared/App.config @@ -34,11 +34,6 @@ - - True - - - True @@ -47,6 +42,6 @@ True - + \ No newline at end of file diff --git a/Gigya.Microdot.Testing.Shared/Gigya.Microdot.Testing.Shared.csproj b/Gigya.Microdot.Testing.Shared/Gigya.Microdot.Testing.Shared.csproj index 5a97f39e..4fb7aae1 100644 --- a/Gigya.Microdot.Testing.Shared/Gigya.Microdot.Testing.Shared.csproj +++ b/Gigya.Microdot.Testing.Shared/Gigya.Microdot.Testing.Shared.csproj @@ -8,9 +8,10 @@ Library Gigya.Microdot.Testing.Shared Gigya.Microdot.Testing.Shared - v4.5.1 + v4.7.2 512 true + AnyCPU @@ -104,7 +105,7 @@ - + True @@ -118,7 +119,7 @@ - + ..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -129,7 +130,7 @@ - + ..\packages\Microsoft.Orleans.Core\lib\net451\Orleans.dll @@ -140,7 +141,7 @@ - + ..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -151,7 +152,7 @@ - + ..\packages\Ninject\lib\net45\Ninject.dll @@ -162,10 +163,10 @@ - + - ..\packages\NSubstitute\lib\net45\NSubstitute.dll + ..\packages\NSubstitute\lib\net46\NSubstitute.dll True True @@ -173,10 +174,10 @@ - + - ..\packages\System.Collections.Immutable\lib\netstandard1.0\System.Collections.Immutable.dll + ..\packages\System.Collections.Immutable\lib\netstandard2.0\System.Collections.Immutable.dll True True @@ -184,10 +185,10 @@ - + - ..\packages\System.Runtime.CompilerServices.Unsafe\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll + ..\packages\System.Runtime.CompilerServices.Unsafe\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll True True @@ -195,10 +196,10 @@ - + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True @@ -206,10 +207,10 @@ - + - ..\packages\System.Threading.Tasks.Extensions\lib\netstandard1.0\System.Threading.Tasks.Extensions.dll + ..\packages\System.Threading.Tasks.Extensions\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll True True @@ -217,10 +218,13 @@ - + + + True + - ..\packages\System.ValueTuple\lib\netstandard1.0\System.ValueTuple.dll + ..\packages\System.ValueTuple\lib\net47\System.ValueTuple.dll True True diff --git a/Gigya.Microdot.Testing/Gigya.Microdot.Testing.csproj b/Gigya.Microdot.Testing/Gigya.Microdot.Testing.csproj index b076cb15..93ee4ec8 100644 --- a/Gigya.Microdot.Testing/Gigya.Microdot.Testing.csproj +++ b/Gigya.Microdot.Testing/Gigya.Microdot.Testing.csproj @@ -8,9 +8,10 @@ Library Gigya.Microdot.Testing Gigya.Microdot.Testing - v4.5.1 + v4.7.2 512 true + AnyCPU @@ -106,7 +107,7 @@ - + True @@ -120,7 +121,7 @@ - + ..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -131,7 +132,7 @@ - + ..\packages\Microsoft.Orleans.Core\lib\net451\Orleans.dll @@ -142,7 +143,7 @@ - + ..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -153,7 +154,7 @@ - + ..\packages\Ninject\lib\net45\Ninject.dll @@ -164,10 +165,10 @@ - + - ..\packages\NSubstitute\lib\net45\NSubstitute.dll + ..\packages\NSubstitute\lib\net46\NSubstitute.dll True True @@ -175,10 +176,10 @@ - + - ..\packages\System.Collections.Immutable\lib\netstandard1.0\System.Collections.Immutable.dll + ..\packages\System.Collections.Immutable\lib\netstandard2.0\System.Collections.Immutable.dll True True @@ -186,10 +187,10 @@ - + - ..\packages\System.Runtime.CompilerServices.Unsafe\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll + ..\packages\System.Runtime.CompilerServices.Unsafe\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll True True @@ -197,10 +198,10 @@ - + - ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + ..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True @@ -208,10 +209,10 @@ - + - ..\packages\System.Threading.Tasks.Extensions\lib\netstandard1.0\System.Threading.Tasks.Extensions.dll + ..\packages\System.Threading.Tasks.Extensions\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll True True diff --git a/Sample/CalculatorService.Client/App.config b/Sample/CalculatorService.Client/App.config index 8757362b..135cff08 100644 --- a/Sample/CalculatorService.Client/App.config +++ b/Sample/CalculatorService.Client/App.config @@ -1,23 +1,23 @@ - + -
+
- + - + - + True - - + + diff --git a/Sample/CalculatorService.Client/CalculatorService.Client.csproj b/Sample/CalculatorService.Client/CalculatorService.Client.csproj index a2f63c00..06fb8101 100644 --- a/Sample/CalculatorService.Client/CalculatorService.Client.csproj +++ b/Sample/CalculatorService.Client/CalculatorService.Client.csproj @@ -8,7 +8,7 @@ Exe CalculatorService.Client CalculatorService.Client - v4.5.1 + v4.7.2 512 true @@ -38,7 +38,9 @@ - + + Designer + PreserveNewest @@ -83,7 +85,7 @@ - + True @@ -97,7 +99,7 @@ - + ..\..\packages\Ninject\lib\net45\Ninject.dll @@ -108,7 +110,7 @@ - + ..\..\packages\Ninject.Extensions.Factory\lib\net45\Ninject.Extensions.Factory.dll diff --git a/Sample/CalculatorService.Interface/CalculatorService.Interface.csproj b/Sample/CalculatorService.Interface/CalculatorService.Interface.csproj index 44c918cf..fbb41364 100644 --- a/Sample/CalculatorService.Interface/CalculatorService.Interface.csproj +++ b/Sample/CalculatorService.Interface/CalculatorService.Interface.csproj @@ -9,7 +9,7 @@ Properties CalculatorService.Interface CalculatorService.Interface - v4.5.1 + v4.7.2 512 @@ -41,7 +41,7 @@ - + ..\..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -52,7 +52,7 @@ - + ..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll diff --git a/Sample/CalculatorService.Orleans/App.config b/Sample/CalculatorService.Orleans/App.config index a0337589..2d350b27 100644 --- a/Sample/CalculatorService.Orleans/App.config +++ b/Sample/CalculatorService.Orleans/App.config @@ -4,7 +4,7 @@
- + @@ -52,7 +52,7 @@ True - + diff --git a/Sample/CalculatorService.Orleans/CalculatorService.Orleans.csproj b/Sample/CalculatorService.Orleans/CalculatorService.Orleans.csproj index 865d52d6..14670bdc 100644 --- a/Sample/CalculatorService.Orleans/CalculatorService.Orleans.csproj +++ b/Sample/CalculatorService.Orleans/CalculatorService.Orleans.csproj @@ -8,7 +8,7 @@ Exe CalculatorService.Orleans CalculatorService.Orleans - v4.5.1 + v4.7.2 512 true @@ -42,7 +42,9 @@ - + + Designer + PreserveNewest @@ -84,7 +86,7 @@ - + ..\..\packages\Microsoft.CodeAnalysis.Common\lib\net45\Microsoft.CodeAnalysis.dll @@ -95,7 +97,7 @@ - + ..\..\packages\Microsoft.CodeAnalysis.CSharp\lib\net45\Microsoft.CodeAnalysis.CSharp.dll @@ -106,7 +108,7 @@ - + ..\..\packages\Microsoft.Orleans.Core\lib\net451\Orleans.dll @@ -117,7 +119,7 @@ - + ..\..\packages\Microsoft.Orleans.OrleansCodeGenerator\lib\net451\OrleansCodeGenerator.dll @@ -128,7 +130,7 @@ - + ..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -139,7 +141,7 @@ - + ..\..\packages\Ninject\lib\net45\Ninject.dll @@ -150,10 +152,121 @@ - + + + + True + + + ..\..\packages\System.AppContext\lib\net463\System.AppContext.dll + True + True + + + + + + + + + True + + + + + + - ..\..\packages\System.Collections.Immutable\lib\netstandard1.0\System.Collections.Immutable.dll + ..\..\packages\System.Collections.Immutable\lib\netstandard2.0\System.Collections.Immutable.dll + True + True + + + + + + + + + ..\..\packages\System.Console\lib\net46\System.Console.dll + True + True + + + + + + + + + ..\..\packages\System.Diagnostics.FileVersionInfo\lib\net46\System.Diagnostics.FileVersionInfo.dll + True + True + + + + + + + + + ..\..\packages\System.Diagnostics.StackTrace\lib\net46\System.Diagnostics.StackTrace.dll + True + True + + + + + + + + + ..\..\packages\System.IO\lib\net462\System.IO.dll + True + True + + + + + + + + + ..\..\packages\System.IO.FileSystem\lib\net46\System.IO.FileSystem.dll + True + True + + + + + + + + + ..\..\packages\System.IO.FileSystem.Primitives\lib\net46\System.IO.FileSystem.Primitives.dll + True + True + + + + + + + + + ..\..\packages\System.Linq\lib\net463\System.Linq.dll + True + True + + + + + + + + + ..\..\packages\System.Linq.Expressions\lib\net463\System.Linq.Expressions.dll True True @@ -161,10 +274,199 @@ - + + + + ..\..\packages\System.Reflection\lib\net462\System.Reflection.dll + True + True + + + + + + - ..\..\packages\System.Reflection.Metadata\lib\netstandard1.1\System.Reflection.Metadata.dll + ..\..\packages\System.Reflection.Metadata\lib\netstandard2.0\System.Reflection.Metadata.dll + True + True + + + + + + + + + True + + + ..\..\packages\System.Runtime\lib\net462\System.Runtime.dll + True + True + + + + + + + + + ..\..\packages\System.Runtime.CompilerServices.Unsafe\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + True + True + + + + + + + + + ..\..\packages\System.Runtime.Extensions\lib\net462\System.Runtime.Extensions.dll + True + True + + + + + + + + + ..\..\packages\System.Runtime.InteropServices\lib\net463\System.Runtime.InteropServices.dll + True + True + + + + + + + + + True + + + + + + + + + ..\..\packages\System.Security.Cryptography.Algorithms\lib\net463\System.Security.Cryptography.Algorithms.dll + True + True + + + + + + + + + ..\..\packages\System.Security.Cryptography.Encoding\lib\net46\System.Security.Cryptography.Encoding.dll + True + True + + + + + + + + + ..\..\packages\System.Security.Cryptography.Primitives\lib\net46\System.Security.Cryptography.Primitives.dll + True + True + + + + + + + + + ..\..\packages\System.Security.Cryptography.X509Certificates\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + True + + + + + + + + + ..\..\packages\System.Text.Encoding.CodePages\lib\net461\System.Text.Encoding.CodePages.dll + True + True + + + + + + + + + ..\..\packages\System.Threading.Thread\lib\net46\System.Threading.Thread.dll + True + True + + + + + + + + + True + + + ..\..\packages\System.Xml.ReaderWriter\lib\net46\System.Xml.ReaderWriter.dll + True + True + + + + + + + + + True + + + + + + + + + ..\..\packages\System.Xml.XmlDocument\lib\net46\System.Xml.XmlDocument.dll + True + True + + + + + + + + + ..\..\packages\System.Xml.XPath\lib\net46\System.Xml.XPath.dll + True + True + + + + + + + + + ..\..\packages\System.Xml.XPath.XDocument\lib\net46\System.Xml.XPath.XDocument.dll True True diff --git a/Sample/CalculatorService/App.config b/Sample/CalculatorService/App.config index 2e28582d..43e313c7 100644 --- a/Sample/CalculatorService/App.config +++ b/Sample/CalculatorService/App.config @@ -1,23 +1,23 @@ - + -
+
- + - + - + True - - + + diff --git a/Sample/CalculatorService/CalculatorService.csproj b/Sample/CalculatorService/CalculatorService.csproj index 94573a48..a0db8532 100644 --- a/Sample/CalculatorService/CalculatorService.csproj +++ b/Sample/CalculatorService/CalculatorService.csproj @@ -8,7 +8,7 @@ Exe CalculatorService CalculatorService - v4.5.1 + v4.7.2 512 true @@ -61,7 +61,9 @@ - + + Designer + PreserveNewest @@ -118,7 +120,7 @@ - + ..\..\packages\Ninject\lib\net45\Ninject.dll diff --git a/paket.dependencies b/paket.dependencies index be27d5a9..a0161ea0 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -1,6 +1,6 @@ source https://api.nuget.org/v3/index.json -framework: net451 +framework: net472 redirects: on content: once copy_content_to_output_dir: always @@ -17,7 +17,6 @@ nuget Nito.AsyncEx ~> 4.0 nuget System.Threading.Tasks.Dataflow ~> 4.0 nuget ZooKeeperNetEx ~> 3.4 >= 3.4.7.1 nuget System.ComponentModel.Annotations ~> 4.0 -nuget System.Collections.Immutable ~> 1.0 nuget DataAnnotationsValidator ~> 2.1.0 # Orleans @@ -48,4 +47,29 @@ nuget FluentAssertions nuget Nuget.CommandLine nuget Shouldly -nuget NLog ~> 4.0 \ No newline at end of file +nuget NLog ~> 4.0 + + +#To support .NET framework 4.7.2 +nuget System.Collections.Immutable ~> 1.0 # have to be redirected, else failing to load Microsoft.CodeAnalysis.CSharp +nuget System.Diagnostics.FileVersionInfo redirects: off +nuget System.IO redirects: off +nuget System.IO.Compression redirects: off +nuget System.IO.FileSystem redirects: off +nuget System.IO.FileSystem.Primitives redirects: off +nuget System.Linq redirects: off +nuget System.Linq.Expressions redirects: off +nuget System.Net.Http redirects: off +nuget System.Reflection redirects: off +nuget System.Reflection.Metadata +nuget System.Runtime redirects: off +nuget System.Runtime.Extensions redirects: off +nuget System.Runtime.InteropServices redirects: off +nuget System.Security.Cryptography.Algorithms redirects: off +nuget System.Security.Cryptography.Primitives redirects: off +nuget System.Text.Encoding.CodePages redirects: off +nuget System.Xml.XPath.XDocument redirects: off +nuget System.Numerics.Vectors redirects: off +nuget System.Xml.ReaderWriter redirects: off +nuget System.Net.NameResolution redirects: off +nuget System.Diagnostics.TraceSource redirects: off diff --git a/paket.lock b/paket.lock index 569d0130..6a7ce3cd 100644 --- a/paket.lock +++ b/paket.lock @@ -1,13 +1,12 @@ REDIRECTS: ON COPY-CONTENT-TO-OUTPUT-DIR: ALWAYS CONTENT: ONCE -RESTRICTION: == net451 +RESTRICTION: == net472 NUGET remote: https://api.nuget.org/v3/index.json Castle.Core (4.3.1) DataAnnotationsValidator (2.1) FluentAssertions (5.5.3) - System.ValueTuple (>= 4.4) Gigya.ServiceContract (2.6) Newtonsoft.Json (>= 9.0.1) Metrics.NET (0.5.5) @@ -19,8 +18,44 @@ NUGET Microsoft.CodeAnalysis.Analyzers (2.6.2) Microsoft.CodeAnalysis.Common (1.3.2) Microsoft.CodeAnalysis.Analyzers (>= 1.1) - System.Collections.Immutable (>= 1.1.37) - System.Reflection.Metadata (>= 1.2) + System.AppContext (>= 4.1) + System.Collections (>= 4.0.11) + System.Collections.Concurrent (>= 4.0.12) + System.Collections.Immutable (>= 1.2) + System.Console (>= 4.0) + System.Diagnostics.Debug (>= 4.0.11) + System.Diagnostics.FileVersionInfo (>= 4.0) + System.Diagnostics.StackTrace (>= 4.0.1) + System.Diagnostics.Tools (>= 4.0.1) + System.Dynamic.Runtime (>= 4.0.11) + System.Globalization (>= 4.0.11) + System.IO.FileSystem (>= 4.0.1) + System.IO.FileSystem.Primitives (>= 4.0.1) + System.Linq (>= 4.1) + System.Linq.Expressions (>= 4.1) + System.Reflection (>= 4.1) + System.Reflection.Metadata (>= 1.3) + System.Reflection.Primitives (>= 4.0.1) + System.Resources.ResourceManager (>= 4.0.1) + System.Runtime (>= 4.1) + System.Runtime.Extensions (>= 4.1) + System.Runtime.Handles (>= 4.0.1) + System.Runtime.InteropServices (>= 4.1) + System.Runtime.Numerics (>= 4.0.1) + System.Security.Cryptography.Algorithms (>= 4.2) + System.Security.Cryptography.Encoding (>= 4.0) + System.Security.Cryptography.X509Certificates (>= 4.1) + System.Text.Encoding (>= 4.0.11) + System.Text.Encoding.CodePages (>= 4.0.1) + System.Text.Encoding.Extensions (>= 4.0.11) + System.Threading (>= 4.0.11) + System.Threading.Tasks (>= 4.0.11) + System.Threading.Tasks.Parallel (>= 4.0.1) + System.Threading.Thread (>= 4.0) + System.Xml.ReaderWriter (>= 4.0.11) + System.Xml.XDocument (>= 4.0.11) + System.Xml.XmlDocument (>= 4.0.1) + System.Xml.XPath.XDocument (>= 4.0.1) Microsoft.CodeAnalysis.CSharp (1.3.2) Microsoft.CodeAnalysis.Common (1.3.2) Microsoft.Extensions.DependencyInjection (1.1.1) @@ -57,7 +92,6 @@ NUGET Microsoft.Orleans.OrleansRuntime (>= 1.3.1) NETStandard.Library (2.0.3) Microsoft.NETCore.Platforms (>= 1.1) - System.Runtime.InteropServices.RuntimeInformation (>= 4.3) Newtonsoft.Json (9.0.1) Ninject (3.3.4) Ninject.Extensions.Conventions (3.3) @@ -73,19 +107,76 @@ NUGET NSubstitute (3.1) Castle.Core (>= 4.2) System.Threading.Tasks.Extensions (>= 4.3) - Nuget.CommandLine (4.7.1) + Nuget.CommandLine (4.9.2) NUnit (3.11) RichardSzalay.MockHttp (5.0) Shouldly (3.0.2) + System.AppContext (4.3) + System.Collections (4.3) + System.Collections.Concurrent (4.3) System.Collections.Immutable (1.5) System.ComponentModel (4.3) System.ComponentModel.Annotations (4.5) + System.Console (4.3.1) + System.Diagnostics.Debug (4.3) + System.Diagnostics.FileVersionInfo (4.3) - redirects: off + System.Diagnostics.StackTrace (4.3) + System.Diagnostics.Tools (4.3) + System.Diagnostics.TraceSource (4.3) - redirects: off + System.Dynamic.Runtime (4.3) + System.Globalization (4.3) + System.IO (4.3) - redirects: off + System.IO.Compression (4.3) - redirects: off + System.IO.FileSystem (4.3) - redirects: off + System.IO.FileSystem.Primitives (>= 4.3) + System.IO.FileSystem.Primitives (4.3) - redirects: off + System.Linq (4.3) - redirects: off + System.Linq.Expressions (4.3) - redirects: off + System.Net.Http (4.3.4) - redirects: off + System.Security.Cryptography.X509Certificates (>= 4.3) + System.Net.NameResolution (4.3) - redirects: off + System.Numerics.Vectors (4.5) - redirects: off + System.Reflection (4.3) - redirects: off System.Reflection.Metadata (1.6) System.Collections.Immutable (>= 1.5) - System.Runtime.CompilerServices.Unsafe (4.5.2) - System.Runtime.InteropServices.RuntimeInformation (4.3) + System.Reflection.Primitives (4.3) + System.Resources.ResourceManager (4.3) + System.Runtime (4.3) - redirects: off + System.Runtime.CompilerServices.Unsafe (4.5.2) - redirects: off + System.Runtime.Extensions (4.3) - redirects: off + System.Runtime.Handles (4.3) + System.Runtime.InteropServices (4.3) - redirects: off + System.Runtime (>= 4.3) + System.Runtime.Numerics (4.3) + System.Security.Cryptography.Algorithms (4.3.1) - redirects: off + System.IO (>= 4.3) + System.Runtime (>= 4.3) + System.Security.Cryptography.Encoding (>= 4.3) + System.Security.Cryptography.Primitives (>= 4.3) + System.Security.Cryptography.Encoding (4.3) - redirects: off + System.Security.Cryptography.Primitives (4.3) - redirects: off + System.Security.Cryptography.X509Certificates (4.3.2) - redirects: off + System.Security.Cryptography.Algorithms (>= 4.3) + System.Security.Cryptography.Encoding (>= 4.3) + System.Text.Encoding (4.3) + System.Text.Encoding.CodePages (4.5) - redirects: off + System.Runtime.CompilerServices.Unsafe (>= 4.5) + System.Text.Encoding.Extensions (4.3) + System.Threading (4.3) + System.Threading.Tasks (4.3) System.Threading.Tasks.Dataflow (4.9) System.Threading.Tasks.Extensions (4.5.1) System.Runtime.CompilerServices.Unsafe (>= 4.5) + System.Threading.Tasks.Parallel (4.3) + System.Threading.Thread (4.3) System.ValueTuple (4.5) - ZooKeeperNetEx (3.4.12) + System.Xml.ReaderWriter (4.3.1) - redirects: off + System.Xml.XDocument (4.3) + System.Xml.XmlDocument (4.3) + System.Xml.XPath (4.3) - redirects: off + System.Xml.XPath.XDocument (4.3) - redirects: off + System.Xml.XPath (>= 4.3) + ZooKeeperNetEx (3.4.12.1) + NETStandard.Library (>= 1.6.1) + System.Diagnostics.TraceSource (>= 4.3) + System.Net.NameResolution (>= 4.3) diff --git a/tests/Gigya.Microdot.Hosting.UnitTests/Gigya.Microdot.Hosting.UnitTests.csproj b/tests/Gigya.Microdot.Hosting.UnitTests/Gigya.Microdot.Hosting.UnitTests.csproj index 8e338f0a..2b399fe7 100644 --- a/tests/Gigya.Microdot.Hosting.UnitTests/Gigya.Microdot.Hosting.UnitTests.csproj +++ b/tests/Gigya.Microdot.Hosting.UnitTests/Gigya.Microdot.Hosting.UnitTests.csproj @@ -10,7 +10,7 @@ Properties Gigya.Microdot.Hosting.UnitTests Gigya.Microdot.Hosting.UnitTests - v4.5.1 + v4.7.2 512 true @@ -52,10 +52,19 @@ - + + Designer + + + + + <__paket__NETStandard_Library_targets>netstandard2.0\NETStandard.Library + + + - + ..\..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -77,7 +79,7 @@ - + ..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -88,7 +90,7 @@ - + ..\..\packages\NUnit\lib\net45\nunit.framework.dll @@ -99,7 +101,7 @@ - + True diff --git a/tests/Gigya.Microdot.ServiceContract.UnitTests/app.config b/tests/Gigya.Microdot.ServiceContract.UnitTests/app.config index f4a16408..535fdb59 100644 --- a/tests/Gigya.Microdot.ServiceContract.UnitTests/app.config +++ b/tests/Gigya.Microdot.ServiceContract.UnitTests/app.config @@ -1,9 +1,9 @@ - + - + True - - + + diff --git a/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj b/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj index 034c4f19..4ca6fcca 100644 --- a/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj +++ b/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj @@ -10,9 +10,10 @@ Properties Gigya.Microdot.UnitTests Gigya.Microdot.UnitTests - v4.5.1 + v4.7.2 512 true + true @@ -118,7 +119,9 @@ - + + Designer + PreserveNewest @@ -205,7 +208,7 @@ - + True @@ -219,7 +222,7 @@ - + True @@ -233,10 +236,10 @@ - + - ..\..\packages\FluentAssertions\lib\net45\FluentAssertions.dll + ..\..\packages\FluentAssertions\lib\net47\FluentAssertions.dll True True @@ -244,7 +247,7 @@ - + ..\..\packages\Gigya.ServiceContract\lib\net451\Gigya.ServiceContract.dll @@ -255,7 +258,7 @@ - + ..\..\packages\Metrics.NET\lib\net45\Metrics.dll @@ -266,7 +269,7 @@ - + ..\..\packages\Microsoft.Orleans.Core\lib\net451\Orleans.dll @@ -277,7 +280,7 @@ - + ..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll @@ -288,7 +291,7 @@ - + ..\..\packages\Ninject\lib\net45\Ninject.dll @@ -299,10 +302,10 @@ - + - ..\..\packages\NSubstitute\lib\net45\NSubstitute.dll + ..\..\packages\NSubstitute\lib\net46\NSubstitute.dll True True @@ -310,7 +313,7 @@ - + ..\..\packages\NUnit\lib\net45\nunit.framework.dll @@ -321,7 +324,7 @@ - + ..\..\packages\RichardSzalay.MockHttp\lib\net45\RichardSzalay.MockHttp.dll @@ -332,7 +335,7 @@ - + ..\..\packages\Shouldly\lib\net451\Shouldly.dll @@ -343,10 +346,10 @@ - + - ..\..\packages\System.Collections.Immutable\lib\netstandard1.0\System.Collections.Immutable.dll + ..\..\packages\System.Collections.Immutable\lib\netstandard2.0\System.Collections.Immutable.dll True True @@ -354,10 +357,13 @@ - + - - ..\..\packages\System.Runtime.CompilerServices.Unsafe\lib\netstandard1.0\System.Runtime.CompilerServices.Unsafe.dll + + True + + + ..\..\packages\System.ComponentModel.Annotations\lib\net461\System.ComponentModel.Annotations.dll True True @@ -365,10 +371,10 @@ - + - - ..\..\packages\System.Threading.Tasks.Dataflow\lib\netstandard1.1\System.Threading.Tasks.Dataflow.dll + + ..\..\packages\System.Runtime.CompilerServices.Unsafe\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll True True @@ -376,10 +382,10 @@ - + - - ..\..\packages\System.Threading.Tasks.Extensions\lib\netstandard1.0\System.Threading.Tasks.Extensions.dll + + ..\..\packages\System.Threading.Tasks.Dataflow\lib\netstandard2.0\System.Threading.Tasks.Dataflow.dll True True @@ -387,10 +393,10 @@ - + - - ..\..\packages\System.ValueTuple\lib\netstandard1.0\System.ValueTuple.dll + + ..\..\packages\System.Threading.Tasks.Extensions\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll True True diff --git a/tests/Gigya.Microdot.UnitTests/ServiceProxyTests/AbstractServiceProxyTest.cs b/tests/Gigya.Microdot.UnitTests/ServiceProxyTests/AbstractServiceProxyTest.cs index 2e385f6e..f19b6b82 100644 --- a/tests/Gigya.Microdot.UnitTests/ServiceProxyTests/AbstractServiceProxyTest.cs +++ b/tests/Gigya.Microdot.UnitTests/ServiceProxyTests/AbstractServiceProxyTest.cs @@ -49,7 +49,7 @@ public virtual void TearDown() protected IDemoService CreateClient(HttpMessageHandler mockHttpMessageHandler = null) { return unitTesting - .Get>(new ConstructorArgument("httpMessageHandler", mockHttpMessageHandler ?? new WebRequestHandler())) + .Get>(new ConstructorArgument("httpMessageHandler", mockHttpMessageHandler ?? new HttpClientHandler())) .Client; } } diff --git a/tests/Gigya.Microdot.UnitTests/app.config b/tests/Gigya.Microdot.UnitTests/app.config index ae058b20..8ef2a969 100644 --- a/tests/Gigya.Microdot.UnitTests/app.config +++ b/tests/Gigya.Microdot.UnitTests/app.config @@ -1,6 +1,6 @@  - + True @@ -36,24 +36,14 @@ - - True - - - True - - True - - - True - + From c1c6c3d8a9eadb45a4652129f033a047d1bdf33e Mon Sep 17 00:00:00 2001 From: Alexander Chirlin Date: Tue, 25 Dec 2018 20:05:51 +0200 Subject: [PATCH 02/21] #82260, 1.14.0.0 --- SolutionVersion.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SolutionVersion.cs b/SolutionVersion.cs index a4e3452f..9e319aae 100644 --- a/SolutionVersion.cs +++ b/SolutionVersion.cs @@ -28,9 +28,9 @@ [assembly: AssemblyCopyright("© 2018 Gigya Inc.")] [assembly: AssemblyDescription("Microdot Framework")] -[assembly: AssemblyVersion("1.13.1.0")] -[assembly: AssemblyFileVersion("1.13.1.0")] -[assembly: AssemblyInformationalVersion("1.13.1.0")] +[assembly: AssemblyVersion("1.14.0.0")] +[assembly: AssemblyFileVersion("1.14.0.0")] +[assembly: AssemblyInformationalVersion("1.14.0.0")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from From 1e0447f5712b863ecc49b846f7a56bfe6e21d7c0 Mon Sep 17 00:00:00 2001 From: Sami Saul Date: Thu, 3 Jan 2019 11:05:26 +0200 Subject: [PATCH 03/21] rebind correction for NodeMonitoringState and test --- Gigya.Microdot.Ninject/MicrodotModule.cs | 1 + .../Discovery/Rewrite/LoadBalancerTests.cs | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/Gigya.Microdot.Ninject/MicrodotModule.cs b/Gigya.Microdot.Ninject/MicrodotModule.cs index 0bdd7352..794d355d 100644 --- a/Gigya.Microdot.Ninject/MicrodotModule.cs +++ b/Gigya.Microdot.Ninject/MicrodotModule.cs @@ -93,6 +93,7 @@ public override void Load() Bind().To().InTransientScope(); Rebind().To().InTransientScope(); + Rebind().ToSelf().InTransientScope(); Bind().To().InSingletonScope(); Rebind() diff --git a/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs b/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs index 857b13cd..4e1cf079 100644 --- a/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs +++ b/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs @@ -197,6 +197,46 @@ public async Task GetNode_AfterNodeReportedUnreachable_NodeWillNotBeReturned() } } + [Test] + [Repeat(Repeat)] + public async Task GetNode_TwoNodesUnreachable_OneBecomesReachable_ReturnOnlyReachableNodes() + { + Node nodeToBeUnreachable = null; + + _reachabilityCheck = async (n, c) => + { + if (n == nodeToBeUnreachable) throw new Exception("This node is still unreachable"); + }; + CreateLoadBalancer(); + + var allNodes = new[] { Node1, Node2, Node3 }; + SetupSourceNodes(allNodes); + + nodeToBeUnreachable = await _loadBalancer.TryGetNode(); + var nodeToBeReachable = await GetDifferentNode(nodeToBeUnreachable); + + _loadBalancer.ReportUnreachable(nodeToBeReachable); + _loadBalancer.ReportUnreachable(nodeToBeUnreachable); + + var nodes = await Get20Nodes(); + foreach (var node in allNodes) + { + if (node.Equals(nodeToBeUnreachable)) + nodes.ShouldNotContain(node); + else + nodes.ShouldContain(node); + } + } + + private async Task GetDifferentNode(Node nodeToCompare) + { + var differentNode = nodeToCompare; + while (differentNode == nodeToCompare) + differentNode = await _loadBalancer.TryGetNode(); + + return differentNode; + } + [Test] [Repeat(Repeat)] public async Task GetNode_NodeIsReachableAgain_NodeWillBeReturned() From b8bd102b99610b4e730011a603a43c304d3b259a Mon Sep 17 00:00:00 2001 From: Sami Saul Date: Thu, 3 Jan 2019 14:25:39 +0200 Subject: [PATCH 04/21] Add delay --- .../Discovery/Rewrite/LoadBalancerTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs b/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs index 4e1cf079..548beb43 100644 --- a/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs +++ b/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs @@ -218,6 +218,8 @@ public async Task GetNode_TwoNodesUnreachable_OneBecomesReachable_ReturnOnlyReac _loadBalancer.ReportUnreachable(nodeToBeReachable); _loadBalancer.ReportUnreachable(nodeToBeUnreachable); + await Task.Delay(1000); + var nodes = await Get20Nodes(); foreach (var node in allNodes) { From 54d5fded085a31f296e7c44c04a409a9d44665e9 Mon Sep 17 00:00:00 2001 From: Sami Saul Date: Thu, 3 Jan 2019 14:57:33 +0200 Subject: [PATCH 05/21] cosmetics --- .../Discovery/Rewrite/LoadBalancerTests.cs | 88 +++++++++---------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs b/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs index 548beb43..478a845a 100644 --- a/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs +++ b/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/LoadBalancerTests.cs @@ -21,7 +21,6 @@ #endregion using System; -using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Gigya.Common.Contracts.Exceptions; @@ -29,7 +28,6 @@ using Gigya.Microdot.Interfaces.Logging; using Gigya.Microdot.Interfaces.SystemWrappers; using Gigya.Microdot.ServiceDiscovery; -using Gigya.Microdot.ServiceDiscovery.HostManagement; using Gigya.Microdot.ServiceDiscovery.Rewrite; using Gigya.Microdot.SharedLogic.Monitor; using Gigya.Microdot.SharedLogic.Rewrite; @@ -59,12 +57,12 @@ public class LoadBalancerTests private IDiscovery _discovery; - private Node Node1 = new Node("Host1", 111); - private Node Node2 = new Node("Host2", 222); - private Node Node3 = new Node("Host3", 333); - private Node Node4 = new Node("Host4", 444); - private Node Node5 = new Node("Host5", 555); - private Node Node6 = new Node("Host6", 666); + private readonly Node _node1 = new Node("Host1", 111); + private readonly Node _node2 = new Node("Host2", 222); + private readonly Node _node3 = new Node("Host3", 333); + private readonly Node _node4 = new Node("Host4", 444); + private readonly Node _node5 = new Node("Host5", 555); + private readonly Node _node6 = new Node("Host6", 666); private Func _getSourceNodes = () => new Node[0]; private IEnvironment _environment; @@ -112,10 +110,10 @@ public async Task GetNode_RoutingTrafficRoundRobin_GetDiffenent3NodesAfterExactl { CreateLoadBalancer(TrafficRoutingStrategy.RoundRobin); SetupDefaultNodes(); - var allEndpoints = await GetNodes(times:3); - allEndpoints.ShouldContain(Node1); - allEndpoints.ShouldContain(Node2); - allEndpoints.ShouldContain(Node3); + var allEndpoints = await GetNodes(3); + allEndpoints.ShouldContain(_node1); + allEndpoints.ShouldContain(_node2); + allEndpoints.ShouldContain(_node3); } [Test] @@ -126,7 +124,7 @@ public async Task GetNode_ThreeNodes_ReturnsAllThree() var allEndpoints = await Get20Nodes(); - new[] { Node1, Node2, Node3 }.ShouldBeSubsetOf(allEndpoints); + new[] { _node1, _node2, _node3 }.ShouldBeSubsetOf(allEndpoints); } [Test] @@ -145,14 +143,14 @@ public void GetNode_ThreeNodes_ShouldBeHealthy() public async Task GetNode_NodesChanged_ReturnsNewNodes() { CreateLoadBalancer(); - SetupSourceNodes(Node1,Node2,Node3); + SetupSourceNodes(_node1,_node2,_node3); Get20Nodes(); - SetupSourceNodes(Node4, Node5, Node6); + SetupSourceNodes(_node4, _node5, _node6); var res = await Get20Nodes(); res.Distinct() - .ShouldBe(new[] { Node4, Node5, Node6 }, true); + .ShouldBe(new[] { _node4, _node5, _node6 }, true); } [Test] @@ -181,7 +179,7 @@ public void GetNode_NodesListBecomesEmpty_Throws() public async Task GetNode_AfterNodeReportedUnreachable_NodeWillNotBeReturned() { CreateLoadBalancer(); - var allNodes = new[] {Node1, Node2, Node3}; + var allNodes = new[] {_node1, _node2, _node3}; SetupSourceNodes(allNodes); var unreachableNode = await _loadBalancer.TryGetNode(); @@ -199,17 +197,18 @@ public async Task GetNode_AfterNodeReportedUnreachable_NodeWillNotBeReturned() [Test] [Repeat(Repeat)] - public async Task GetNode_TwoNodesUnreachable_OneBecomesReachable_ReturnOnlyReachableNodes() + public async Task GetNode_TwoNodesUnreachable_OneBecomesReachable_ReturnOnlyReachableNode() { Node nodeToBeUnreachable = null; _reachabilityCheck = async (n, c) => { - if (n == nodeToBeUnreachable) throw new Exception("This node is still unreachable"); + // ReSharper disable once AccessToModifiedClosure + if (Equals(n, nodeToBeUnreachable)) throw new Exception("This node is still unreachable"); }; CreateLoadBalancer(); - var allNodes = new[] { Node1, Node2, Node3 }; + var allNodes = new[] { _node1, _node2, _node3 }; SetupSourceNodes(allNodes); nodeToBeUnreachable = await _loadBalancer.TryGetNode(); @@ -233,7 +232,7 @@ public async Task GetNode_TwoNodesUnreachable_OneBecomesReachable_ReturnOnlyReac private async Task GetDifferentNode(Node nodeToCompare) { var differentNode = nodeToCompare; - while (differentNode == nodeToCompare) + while (Equals(differentNode, nodeToCompare)) differentNode = await _loadBalancer.TryGetNode(); return differentNode; @@ -264,21 +263,21 @@ public async Task GetNode_OnlyOneNodeUnreachable_ShouldStillBeHealthy() CreateLoadBalancer(); SetupDefaultNodes(); - await Run20times(node => + await Run20Times(node => { - if (node.Equals(Node2)) + if (node.Equals(_node2)) _loadBalancer.ReportUnreachable(node); }); var healthResult = GetHealthStatus(); healthResult.IsHealthy.ShouldBeTrue(); - healthResult.Message.ShouldContain(Node2.ToString()); + healthResult.Message.ShouldContain(_node2.ToString()); } - private async Task Run20times(Action act) + private async Task Run20Times(Action act) { - for (int i = 0; i < 20; i++) + for (var i = 0; i < 20; i++) { try { @@ -287,6 +286,7 @@ private async Task Run20times(Action act) } catch { + // ignored } } } @@ -321,17 +321,17 @@ public async Task GetNode_NodeUnreachableThenReturnsInBackground_NodeShouldBeRet public async Task GetNode_AllNodesUnreachable_ThrowsException() { CreateLoadBalancer(); - SetupSourceNodes(Node1,Node2,Node3); + SetupSourceNodes(_node1,_node2,_node3); - await Run20times(node =>_loadBalancer.ReportUnreachable(node)); + await Run20Times(node =>_loadBalancer.ReportUnreachable(node)); Should.Throw(() => _loadBalancer.TryGetNode()); var healthStatus = GetHealthStatus(); healthStatus.IsHealthy.ShouldBeFalse(healthStatus.Message); healthStatus.Message.ShouldContain("All 3 Nodes are unreachable"); - healthStatus.Message.ShouldContain(Node1.ToString()); - healthStatus.Message.ShouldContain(Node2.ToString()); - healthStatus.Message.ShouldContain(Node3.ToString()); + healthStatus.Message.ShouldContain(_node1.ToString()); + healthStatus.Message.ShouldContain(_node2.ToString()); + healthStatus.Message.ShouldContain(_node3.ToString()); } [Test] @@ -339,8 +339,8 @@ public async Task GetNode_AllNodesUnreachable_ThrowsException() public async Task GetNode_AllNodesUnreachableThenAllNodesReachable_ReturnsAllNodes() { CreateLoadBalancer(); - SetupSourceNodes(Node1,Node2,Node3); - await Run20times(node => _loadBalancer.ReportUnreachable(node)); + SetupSourceNodes(_node1, _node2, _node3); + await Run20Times(node => _loadBalancer.ReportUnreachable(node)); Should.Throw(() => _loadBalancer.TryGetNode()); @@ -349,9 +349,9 @@ public async Task GetNode_AllNodesUnreachableThenAllNodesReachable_ReturnsAllNod await Task.Delay(1000); var nodes = await Get20Nodes(); - nodes.ShouldContain(Node1); - nodes.ShouldContain(Node2); - nodes.ShouldContain(Node3); + nodes.ShouldContain(_node1); + nodes.ShouldContain(_node2); + nodes.ShouldContain(_node3); } @@ -363,8 +363,8 @@ public async Task GetNode_NodesUnreachableButReachabilityCheckThrows_ErrorIsLogg SetupDefaultNodes(); var reachabilityException = new Exception("Simulated error while running reachability check"); - _reachabilityCheck = (_,__) => { throw reachabilityException; }; - await Run20times(node => _loadBalancer.ReportUnreachable(node)); + _reachabilityCheck = (_,__) => throw reachabilityException; + await Run20Times(node => _loadBalancer.ReportUnreachable(node)); await Task.Delay(1500); @@ -398,17 +398,18 @@ private void SetupErrorGettingNodes(Exception ex) private void SetupDefaultNodes() { - SetupSourceNodes(Node1, Node2, Node3); + SetupSourceNodes(_node1, _node2, _node3); } - async Task GetNodes(int times) + private async Task GetNodes(int times) { var tasks = Enumerable.Repeat(1, times).Select(_ => _loadBalancer.TryGetNode()); - await Task.WhenAll(tasks); - return tasks.Select(t => t.Result).ToArray(); + var enumerable = tasks as Task[] ?? tasks.ToArray(); + await Task.WhenAll(enumerable); + return enumerable.Select(t => t.Result).ToArray(); } - Task Get20Nodes() + private Task Get20Nodes() { return GetNodes(20); } @@ -419,5 +420,4 @@ private HealthCheckResult GetHealthStatus() return healthMonitor.Monitors[ServiceName].Invoke(); } } - } From c3ad6e9e4dc1e3e49a888d0782e08a184210c515 Mon Sep 17 00:00:00 2001 From: David Bronshtein Date: Thu, 3 Jan 2019 16:34:11 +0200 Subject: [PATCH 06/21] update Discovery diagrams --- .../Rewrite/_diagram.png | Bin 202849 -> 82055 bytes .../Rewrite/_diagram_from_draw.io.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Gigya.Microdot.ServiceDiscovery/Rewrite/_diagram.png b/Gigya.Microdot.ServiceDiscovery/Rewrite/_diagram.png index f50969aec174d9a0ce0beb342d4bb297ee41c84c..7f305dc491e0a96ca76b1429dd07c7c806e6cd67 100644 GIT binary patch literal 82055 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%0D51g^ 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 H>6`xz0NRG~ diff --git a/Gigya.Microdot.ServiceDiscovery/Rewrite/_diagram_from_draw.io.xml b/Gigya.Microdot.ServiceDiscovery/Rewrite/_diagram_from_draw.io.xml index 8de5324b..291c19ed 100644 --- a/Gigya.Microdot.ServiceDiscovery/Rewrite/_diagram_from_draw.io.xml +++ b/Gigya.Microdot.ServiceDiscovery/Rewrite/_diagram_from_draw.io.xml @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file From 91bd0ef2d2e5d9060f26e6b1a3dd048bf0edd74c Mon Sep 17 00:00:00 2001 From: Yevgeny Kaplan Date: Tue, 15 Jan 2019 11:50:12 +0200 Subject: [PATCH 07/21] warmup exception fix --- .../GrainsWarmup.cs | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs b/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs index 26f6db94..1a2ab60d 100644 --- a/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs +++ b/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs @@ -21,11 +21,14 @@ #endregion using System; -using System.Threading.Tasks; +using System.Collections.Generic; +using System.Linq; using Gigya.Microdot.Hosting.HttpService; using Gigya.Microdot.Interfaces.Logging; -using Gigya.Microdot.Orleans.Hosting; using Ninject; +using Orleans; +using Orleans.Core; +using Orleans.Runtime; namespace Gigya.Microdot.Orleans.Ninject.Host { @@ -34,12 +37,18 @@ public class GrainsWarmup : IWarmup private IServiceInterfaceMapper _orleansMapper; private IKernel _kernel; private ILog _log; + private List _orleansInternalTypes = new List(); public GrainsWarmup(IServiceInterfaceMapper orleansMapper, IKernel kernel, ILog log) { _orleansMapper = orleansMapper; _kernel = kernel; _log = log; + + _orleansInternalTypes.Add(typeof(IGrainFactory)); + _orleansInternalTypes.Add(typeof(IGrainState)); + _orleansInternalTypes.Add(typeof(IGrainIdentity)); + _orleansInternalTypes.Add(typeof(IGrainRuntime)); } public void Warmup() @@ -50,15 +59,45 @@ public void Warmup() // these grains, their non-transient dependencies will already be registered in Ninject, saving startup time. try { + List failedWarmupWarn = new List(); foreach (Type serviceClass in _orleansMapper.ServiceClassesTypes) { - _kernel.Get(serviceClass); + try + { + foreach (Type parameterType in serviceClass.GetConstructors().SelectMany(ctor => ctor.GetParameters().Select(p => p.ParameterType)).Distinct()) + { + if (_kernel.CanResolve(parameterType)) + { + try + { + _kernel.Get(parameterType); + continue; + } + catch //No exception handling needed. We try to warmup all constructor types. In case of failure, write the warning for non orleans types and go to the next type + { + } + } + + if (!_orleansInternalTypes.Contains(parameterType)) + { + failedWarmupWarn.Add($"Type {parameterType} of grain {serviceClass}"); + } + } + } + catch (Exception e) + { + _log.Warn($"Failed to warmup grain {serviceClass}", e); + } + } + + if (failedWarmupWarn.Count > 0) + { + _log.Warn($"Fail to warmup the following types:\n{string.Join("\n", failedWarmupWarn)}"); } } catch(Exception ex) { - _log.Error("Failed to warmup grains", ex); - throw; + _log.Warn("Failed to warmup grains", ex); } } } From 12aac77b5407cc2afe15991d3a9691b8754a54ae Mon Sep 17 00:00:00 2001 From: Yevgeny Kaplan Date: Tue, 15 Jan 2019 11:50:12 +0200 Subject: [PATCH 08/21] warmup exception fix --- .../GrainsWarmup.cs | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs b/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs index 815d8d77..1a2ab60d 100644 --- a/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs +++ b/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs @@ -60,7 +60,6 @@ public void Warmup() try { List failedWarmupWarn = new List(); - List failedWarmupInfo = new List(); foreach (Type serviceClass in _orleansMapper.ServiceClassesTypes) { try @@ -69,15 +68,17 @@ public void Warmup() { if (_kernel.CanResolve(parameterType)) { - _kernel.Get(parameterType); - continue; + try + { + _kernel.Get(parameterType); + continue; + } + catch //No exception handling needed. We try to warmup all constructor types. In case of failure, write the warning for non orleans types and go to the next type + { + } } - if (_orleansInternalTypes.Contains(parameterType)) - { - failedWarmupInfo.Add($"Type {parameterType} of grain {serviceClass}"); - } - else + if (!_orleansInternalTypes.Contains(parameterType)) { failedWarmupWarn.Add($"Type {parameterType} of grain {serviceClass}"); } @@ -88,12 +89,7 @@ public void Warmup() _log.Warn($"Failed to warmup grain {serviceClass}", e); } } - - if (failedWarmupInfo.Count > 0) - { - _log.Info(l => l($"Can't warmup the following types:\n{string.Join("\n", failedWarmupInfo)}")); - } - + if (failedWarmupWarn.Count > 0) { _log.Warn($"Fail to warmup the following types:\n{string.Join("\n", failedWarmupWarn)}"); From c74e3a24a2d1e28e78fdc27487a0eb16d68c25d2 Mon Sep 17 00:00:00 2001 From: Yevgeny Kaplan Date: Tue, 15 Jan 2019 12:26:51 +0200 Subject: [PATCH 09/21] code fix --- .../GrainsWarmup.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs b/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs index 1a2ab60d..19173d3a 100644 --- a/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs +++ b/Gigya.Microdot.Orleans.Ninject.Host/GrainsWarmup.cs @@ -66,21 +66,16 @@ public void Warmup() { foreach (Type parameterType in serviceClass.GetConstructors().SelectMany(ctor => ctor.GetParameters().Select(p => p.ParameterType)).Distinct()) { - if (_kernel.CanResolve(parameterType)) + try { - try - { - _kernel.Get(parameterType); - continue; - } - catch //No exception handling needed. We try to warmup all constructor types. In case of failure, write the warning for non orleans types and go to the next type - { - } + _kernel.Get(parameterType); } - - if (!_orleansInternalTypes.Contains(parameterType)) + catch //No exception handling needed. We try to warmup all constructor types. In case of failure, write the warning for non orleans types and go to the next type { - failedWarmupWarn.Add($"Type {parameterType} of grain {serviceClass}"); + if (!_orleansInternalTypes.Contains(parameterType)) + { + failedWarmupWarn.Add($"Type {parameterType} of grain {serviceClass}"); + } } } } From a2ed00d730fc722076ccaeed178bc6d75b6e0224 Mon Sep 17 00:00:00 2001 From: Guy Rozenblat Date: Wed, 30 Jan 2019 12:46:12 +0200 Subject: [PATCH 10/21] Fix csproj that have multiple references --- .paket/Paket.Restore.targets | 179 ++++++++++++++---- ....Microdot.ServiceContract.UnitTests.csproj | 10 - 2 files changed, 147 insertions(+), 42 deletions(-) diff --git a/.paket/Paket.Restore.targets b/.paket/Paket.Restore.targets index e7c1bc0c..52f41c60 100644 --- a/.paket/Paket.Restore.targets +++ b/.paket/Paket.Restore.targets @@ -11,23 +11,49 @@ $(MSBuildThisFileDirectory)..\ $(PaketRootPath)paket-files\paket.restore.cached $(PaketRootPath)paket.lock + classic + proj + assembly + native /Library/Frameworks/Mono.framework/Commands/mono mono - - $(PaketRootPath)paket.exe - $(PaketToolsPath)paket.exe - "$(PaketExePath)" - $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" - + + $(PaketRootPath)paket.bootstrapper.exe + $(PaketToolsPath)paket.bootstrapper.exe + $([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\ + + + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + $(PaketToolsPath)paket.exe + $(_PaketBootStrapperExeDir)paket.exe + paket.exe + + + $(PaketRootPath)paket + $(PaketToolsPath)paket + $(PaketToolsPath)paket + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + + + $(PaketBootStrapperExeDir)paket.exe + + + paket + + <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)")) - dotnet "$(PaketExePath)" + dotnet "$(PaketExePath)" + $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" + "$(PaketExePath)" - - "$(PaketExePath)" - $(PaketRootPath)paket.bootstrapper.exe - $(PaketToolsPath)paket.bootstrapper.exe "$(PaketBootStrapperExePath)" $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)" @@ -36,30 +62,40 @@ true true + + + True - + + + + + true - $(NoWarn);NU1603 + $(NoWarn);NU1603;NU1604;NU1605;NU1608 - /usr/bin/shasum $(PaketRestoreCacheFile) | /usr/bin/awk '{ print $1 }' - /usr/bin/shasum $(PaketLockFilePath) | /usr/bin/awk '{ print $1 }' + /usr/bin/shasum "$(PaketRestoreCacheFile)" | /usr/bin/awk '{ print $1 }' + /usr/bin/shasum "$(PaketLockFilePath)" | /usr/bin/awk '{ print $1 }' - + - + + + + $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)')) @@ -69,11 +105,26 @@ true + + + true + + - + + + + + + + + $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached @@ -82,7 +133,9 @@ $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references $(MSBuildProjectDirectory)\paket.references - $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).$(TargetFramework).paket.resolved + + false + true true references-file-or-cache-not-found @@ -101,32 +154,43 @@ - + true - target-framework '$(TargetFramework)' + target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths) - + + - + + false + true + + - + - + + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',').Length) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[5]) %(PaketReferencesFileLinesInfo.PackageVersion) - All + All + runtime + runtime + true + true @@ -158,19 +222,27 @@ false + $(MSBuildVersion) + 15.8.0 <_NuspecFilesNewLocation Include="$(BaseIntermediateOutputPath)$(Configuration)\*.nuspec"/> + + $(MSBuildProjectDirectory)/$(MSBuildProjectFile) true - false - true + false + true + false + true + false + true $(BaseIntermediateOutputPath)$(Configuration) $(BaseIntermediateOutputPath) @@ -183,11 +255,54 @@ - - + - + + - - - - {db6d3561-835e-40d5-b9d4-83951cf426df} - Gigya.ServiceContract - - - {db6d3561-835e-40d5-b9d4-83951cf426df} - Gigya.ServiceContract - - ", path.Reverse())}' that is marked as [Sensitive] or [NonSensitive], but the method parameter is not marked with [LogFields]"); - else if (path.Count > 1) + else if (!isGenericPayload && path.Count > 1) throw new ProgrammaticException($"The method '{methodName}' parameter '{paramName}' has a member '{string.Join(" --> ", path.Reverse())}' that is marked as [Sensitive] or [NonSensitive], but only root-level members can be marked as such."); Type memberType = memberInfo is PropertyInfo propertyInfo ? propertyInfo.PropertyType : ((FieldInfo)memberInfo).FieldType; - VerifyMisplacedSensitiveAttribute(logFieldExists, methodName, paramName, memberType, path); + var isGeneric = typeArguments != null && typeArguments.Contains(memberType); + VerifyMisplacedSensitiveAttribute(logFieldExists, methodName, paramName, memberType, path, isGeneric); path.Pop(); } diff --git a/Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs b/Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs index defeb354..deb52821 100644 --- a/Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs +++ b/Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs @@ -38,9 +38,10 @@ public class ReflectionMetadataInfo public string Name { get; set; } public Func ValueExtractor { get; set; } public Sensitivity? Sensitivity { get; set; } + public ReflectionMetadataInfo[] InnerFields { get; set; } } - public interface IPropertiesMetadataPropertiesCache + public interface IMembersMetadataCache { IEnumerable ParseIntoParams(object instance); } @@ -54,62 +55,74 @@ public class MetadataCacheParam } - public class PropertiesMetadataPropertiesCache : IPropertiesMetadataPropertiesCache + public class MembersMetadataCache : IMembersMetadataCache { private readonly ILog _log; - private readonly ConcurrentDictionary _propertyMetadataCache; + private readonly ConcurrentDictionary _membersMetadataCache; - public PropertiesMetadataPropertiesCache(ILog log) + public MembersMetadataCache(ILog log) { _log = log; - _propertyMetadataCache = new ConcurrentDictionary(); + _membersMetadataCache = new ConcurrentDictionary(); } public IEnumerable ParseIntoParams(object instance) { var type = instance.GetType(); - var result = ExtracParams(instance, type); + var propertiesMetadata = _membersMetadataCache.GetOrAdd(type, x => ExtracMemberMetadata(type).ToArray()); - return result; + return ExtractParams(instance, propertiesMetadata); } - private IEnumerable ExtracParams(object instance, Type type) + private IEnumerable ExtractParams(object instance, IEnumerable membersMetadata, string containingName = null) { - var propertyMetadata = _propertyMetadataCache.GetOrAdd(type, x => ExtracMemberMetadata(instance, type).ToArray()); - - foreach (var item in propertyMetadata) + foreach (var memberMetadata in membersMetadata) { object value; try { - value = item.ValueExtractor(instance); + value = memberMetadata.ValueExtractor(instance); } catch (Exception ex) { - _log.Warn("This property is invalid", unencryptedTags: new { propertyName = item.Name }, exception: ex); + _log.Warn("This member is invalid", unencryptedTags: new { propertyName = memberMetadata.Name }, exception: ex); continue; } - yield return new MetadataCacheParam + if (memberMetadata.InnerFields != null && memberMetadata.InnerFields.Length > 0) + { + foreach (var metadataCacheParam in ExtractParams(value, memberMetadata.InnerFields, memberMetadata.Name)) yield return metadataCacheParam; + } + else { - Name = item.Name, - Value = value, - Sensitivity = item.Sensitivity - }; + yield return new MetadataCacheParam + { + Name = containingName == null ? memberMetadata.Name : $"{containingName}_{memberMetadata.Name}", + Value = value, + Sensitivity = memberMetadata.Sensitivity + }; + } } } - internal static IEnumerable ExtracMemberMetadata(object instance, Type type) - { + private const int MaxRecursionDepth = 1; + internal static IEnumerable ExtracMemberMetadata(Type type, int recursionDepth = 0) + { var list = new List(); var members = type.FindMembers(MemberTypes.Property | MemberTypes.Field, BindingFlags.Public | BindingFlags.Instance, null, null) .Where(x => x is FieldInfo || ((x is PropertyInfo propertyInfo) && propertyInfo.CanRead)); - foreach (var member in members) + Type[] typeArguments = null; + if (recursionDepth <= MaxRecursionDepth && type.IsGenericType) { + typeArguments = type.GetGenericArguments(); + } + + foreach (var member in members) + { var instanceParameter = Expression.Parameter(typeof(object), "target"); MemberExpression memberExpression = null; @@ -121,14 +134,35 @@ internal static IEnumerable ExtracMemberMetadata(object var converter = Expression.Convert(memberExpression, typeof(object)); var lambda = Expression.Lambda>(converter, instanceParameter); + var memberType = GetMemberUnderlyingType(member); + ReflectionMetadataInfo[] innerFields = null; + if (typeArguments != null && typeArguments.Contains(memberType)) + { + innerFields = ExtracMemberMetadata(memberType, recursionDepth + 1).ToArray(); + } + list.Add(new ReflectionMetadataInfo { Name = member.Name, ValueExtractor = lambda.Compile(), - Sensitivity = ExtractSensitivity(member) - }); + Sensitivity = ExtractSensitivity(member), + InnerFields = innerFields + }); } return list; + } + + private static Type GetMemberUnderlyingType(MemberInfo member) + { + switch (member.MemberType) + { + case MemberTypes.Field: + return ((FieldInfo)member).FieldType; + case MemberTypes.Property: + return ((PropertyInfo)member).PropertyType; + default: + throw new ArgumentException("MemberInfo must be of type FieldInfo or PropertyInfo", "member"); + } } internal static Sensitivity? ExtractSensitivity(MemberInfo memberInfo) diff --git a/SolutionVersion.cs b/SolutionVersion.cs index b199cc20..138a60f9 100644 --- a/SolutionVersion.cs +++ b/SolutionVersion.cs @@ -28,9 +28,9 @@ [assembly: AssemblyCopyright("© 2018 Gigya Inc.")] [assembly: AssemblyDescription("Microdot Framework")] -[assembly: AssemblyVersion("1.13.2.0")] -[assembly: AssemblyFileVersion("1.13.2.0")] -[assembly: AssemblyInformationalVersion("1.13.2.0")] +[assembly: AssemblyVersion("1.14.2.0")] +[assembly: AssemblyFileVersion("1.14.2.0")] +[assembly: AssemblyInformationalVersion("1.14.2.0")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/ReflectionMetaDataExtensionTests.cs b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/ReflectionMetaDataExtensionTests.cs index 531f5fca..e03575ab 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/ReflectionMetaDataExtensionTests.cs +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/ReflectionMetaDataExtensionTests.cs @@ -56,7 +56,7 @@ public void ExtracPropertiesSensitivity_ExtractSensitivity_ShouldBeEquivilent(st { var expectedSensitiveProperty = typeof(PersonMockData).GetProperty(actualValue); - PropertiesMetadataPropertiesCache.ExtractSensitivity(expectedSensitiveProperty).ShouldBe(expected); + MembersMetadataCache.ExtractSensitivity(expectedSensitiveProperty).ShouldBe(expected); } [Test] @@ -67,7 +67,7 @@ public void ExtracFieldsSensitivity_ExtractSensitivity_ShouldBeEquivilent(string { var field = typeof(PersonMockData).GetField(actualValue); - PropertiesMetadataPropertiesCache.ExtractSensitivity(field).ShouldBe(expected); + MembersMetadataCache.ExtractSensitivity(field).ShouldBe(expected); } @@ -77,7 +77,7 @@ public void ExtracMembersValues_ExtractDataFromObject_ShouldBeEquivilent() const int numberOfPrivatePropertiesAndFields = 8; var mock = new PersonMockData(); - var reflectionMetadataInfos = PropertiesMetadataPropertiesCache.ExtracMemberMetadata(mock, mock.GetType()).ToDictionary(x => x.Name); + var reflectionMetadataInfos = MembersMetadataCache.ExtracMemberMetadata(mock.GetType()).ToDictionary(x => x.Name); reflectionMetadataInfos[nameof(PersonMockData.FieldNonSensitive)].ValueExtractor(mock).ShouldBe(mock.FieldNonSensitive); reflectionMetadataInfos[nameof(PersonMockData.FieldSensitive)].ValueExtractor(mock).ShouldBe(mock.FieldSensitive); @@ -98,7 +98,7 @@ public void ExtracPropertiesAndFieldsValues_ExtractDataFromObject_ShouldBeEquivi const int numberOfPrivatePropertiesAndFields = 8; var mock = new PersonMockData(); - var reflectionMetadataInfos = PropertiesMetadataPropertiesCache.ExtracMemberMetadata(mock, mock.GetType()).ToDictionary(x => x.Name); + var reflectionMetadataInfos = MembersMetadataCache.ExtracMemberMetadata(mock.GetType()).ToDictionary(x => x.Name); var dissectParams = DissectPropertyInfoMetadata.GetMembers(mock); var numberProperties = dissectParams.Count(); @@ -121,7 +121,7 @@ public void ExtracPropertiesAndFieldsValues_ExtractDataFromObject_ShouldBeEquivi public void ExtracPropertiesValues_ExtractSensitiveAndCryptic_ShouldBeEquivilent() { var mock = new PersonMockData(); - var cache = new PropertiesMetadataPropertiesCache(_logMocked); + var cache = new MembersMetadataCache(_logMocked); var metadataCacheParams = cache.ParseIntoParams(mock); @@ -138,7 +138,7 @@ public void ExtracPropertiesValues_ExtractSensitiveAndCryptic_ShouldBeEquivilent public void ExtracPropertiesValues_ExtractSensitiveAndCrypticWithInheritenceAndException_ShouldBeEquivilent() { var mock = new TeacherWithExceptionMock(); - var cache = new PropertiesMetadataPropertiesCache(_logMocked); + var cache = new MembersMetadataCache(_logMocked); var dissectedParams = DissectPropertyInfoMetadata.GetMemberWithSensitivity(mock).ToDictionary(x => x.Name); @@ -156,11 +156,10 @@ public void ExtracPropertiesValues_ExtractSensitiveAndCrypticWithInheritenceAndE [Test] public void ExtracPropertiesValues_SendTwoPeople_ShouldBeEquivilent() { - var cache = new PropertiesMetadataPropertiesCache(_logMocked); + var cache = new MembersMetadataCache(_logMocked); var person = new PersonMockData(); var teacher = new TeacherWithExceptionMock(); - var teacherArguments = cache.ParseIntoParams(teacher); var personArguments = cache.ParseIntoParams(person); @@ -180,10 +179,41 @@ public void ExtracPropertiesValues_SendTwoPeople_ShouldBeEquivilent() _logMocked.Received().Warn(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()); } + [Test] + public void ExtractPropertiesValues_TypeWithGeneric_MembersExtractedCorrectly() + { + var cache = new MembersMetadataCache(_logMocked); + var genericMockData = new GenericMockData(new MockData()); + + var genericArguments = cache.ParseIntoParams(genericMockData); + + _logMocked.DidNotReceive().Warn(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()); + genericArguments.Count().ShouldBe(3); + genericArguments.ShouldContain(x => x.Name == "FieldNonSensitive" && x.Value.ToString() == "FieldNonSensitiveValue" && x.Sensitivity == Sensitivity.NonSensitive); + genericArguments.ShouldContain(x => x.Name == "GenericType_GenericPropertySensitive" && x.Value.ToString() == "GenericPropertySensitiveValue" && x.Sensitivity == Sensitivity.Sensitive); + genericArguments.ShouldContain(x => x.Name == "GenericType_GenericFieldSecretive" && x.Value.ToString() == "GenericFieldSecretiveValue" && x.Sensitivity == Sensitivity.Secretive); + } + + [Test] + public void ExtractPropertiesValues_GenericWithInheritance_MembersExtractedCorrectly() + { + var cache = new MembersMetadataCache(_logMocked); + var genericWithInheritance = new GenericWithInheritance(new DerivedMockData()); + + var genericWithInheritanceArguments = cache.ParseIntoParams(genericWithInheritance); + + _logMocked.DidNotReceive().Warn(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()); + genericWithInheritanceArguments.Count().ShouldBe(4); + genericWithInheritanceArguments.ShouldContain(x => x.Name == "GenericType_DerivedPropertySensitive" && x.Value.ToString() == "DerivedPropertySensitiveValue" && x.Sensitivity == Sensitivity.Sensitive); + genericWithInheritanceArguments.ShouldContain(x => x.Name == "GenericType_GenericPropertySensitive" && x.Value.ToString() == "GenericPropertySensitiveValue" && x.Sensitivity == Sensitivity.Sensitive); + genericWithInheritanceArguments.ShouldContain(x => x.Name == "GenericType_GenericFieldSecretive" && x.Value.ToString() == "GenericFieldSecretiveValue" && x.Sensitivity == Sensitivity.Secretive); + genericWithInheritanceArguments.ShouldContain(x => x.Name == "GenericWithInheritancePropertySensitive" && x.Value.ToString() == "GenericWithInheritancePropertySensitiveValue" && x.Sensitivity == Sensitivity.Sensitive); + } + [Test] public void LoadTest() { - var cache = new PropertiesMetadataPropertiesCache(_logMocked); + var cache = new MembersMetadataCache(_logMocked); var people = GeneratePeople(10000).ToList(); var numOfProperties = DissectPropertyInfoMetadata.GetMemberWithSensitivity(new PersonMockData()); var stopWatch = new Stopwatch(); @@ -236,7 +266,7 @@ private class PersonMockData [Sensitive(Secretive = true)] - private string PrivateFieldCryptic = "PrivateFieldCryptic"; + private string PrivateFieldCryptic = "PrivateFieldCryptic"; #endregion #region Log Fields @@ -250,7 +280,7 @@ private class PersonMockData [Sensitive(Secretive = true)] - public string FieldCryptic = "FieldCryptic"; + public string FieldCryptic = "FieldCryptic"; #endregion #region PUBLIC Properties @@ -268,7 +298,7 @@ private class PersonMockData [Sensitive(Secretive = true)] - public bool Cryptic { get; set; } = true; + public bool Cryptic { get; set; } = true; #endregion #region Ignored Properties - Should be Ignored @@ -294,8 +324,8 @@ private class PersonMockData [NonSensitive] public string PublicWithoutGet { - set => value = "Mocky"; - } + set => value = "Mocky"; + } //Redundant Members - Should be Ignored public void ShouldBeIgnoreMetho() @@ -305,6 +335,28 @@ public void ShouldBeIgnoreMetho() } + private class GenericMockData + { + public GenericMockData(T genericType) + { + GenericType = genericType; + } + + public T GenericType; + + [NonSensitive] + public string FieldNonSensitive = "FieldNonSensitiveValue"; + } + + private class MockData + { + [Sensitive] + public string GenericPropertySensitive { get; set; } = "GenericPropertySensitiveValue"; + + [Sensitive(Secretive = true)] + public string GenericFieldSecretive = "GenericFieldSecretiveValue"; + } + private class TeacherWithExceptionMock : PersonMockData { public string GetError => throw new Exception("ddsfsdfasd"); @@ -312,7 +364,27 @@ private class TeacherWithExceptionMock : PersonMockData [NonSensitive] public int Years { get; set; } } - #endregion + + private class GenericWithInheritance where T : MockData + { + public GenericWithInheritance(T generic) + { + GenericType = generic; + } + + public T GenericType; + + [Sensitive] + public string GenericWithInheritancePropertySensitive { get; set; } = "GenericWithInheritancePropertySensitiveValue"; + } + + private class DerivedMockData : MockData + { + [Sensitive] + public string DerivedPropertySensitive { get; set; } = "DerivedPropertySensitiveValue"; + } + + #endregion } } diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs index b1951beb..313a16c1 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs @@ -21,6 +21,7 @@ #endregion using System; +using System.Threading; using System.Threading.Tasks; using Gigya.Common.Contracts.Exceptions; using Gigya.Common.Contracts.HttpService; @@ -76,7 +77,7 @@ public void ValidationShouldFail(Type typeToValidate) [TestCase(typeof(IValidMock))] [TestCase(typeof(IComplexParameterValidation))] - + [TestCase(typeof(IValidGeneric))] public void ValidationShouldSucceed(Type typeToValidate) { _typesToValidate = new[] { typeToValidate }; @@ -270,6 +271,11 @@ private interface IInvalidRecursionDepth100 Task Verification([NonSensitive]OuterStub stub); } + private interface IValidGeneric + { + Task Verification([LogFields]GenericWrapper stub); + } + public class OuterStub { public string Name { get; set; } @@ -277,5 +283,24 @@ public class OuterStub public OuterStub InnerStub { get; set; } } + + public class GenericWrapper + { + public GenericWrapper(T genericType) + { + GenericType = genericType; + } + + [NonSensitive] + public string Name { get; set; } + + public T GenericType { get; set; } + } + + public class GenericPayload + { + [Sensitive] + public string FamilyName { get; set; } + } } } \ No newline at end of file From 31c21a9d3603673a8c7ace55a5d2a2d16809213d Mon Sep 17 00:00:00 2001 From: Guy Rozenblat Date: Sun, 3 Feb 2019 12:35:55 +0200 Subject: [PATCH 12/21] Fix version --- SolutionVersion.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SolutionVersion.cs b/SolutionVersion.cs index 138a60f9..9e319aae 100644 --- a/SolutionVersion.cs +++ b/SolutionVersion.cs @@ -28,9 +28,9 @@ [assembly: AssemblyCopyright("© 2018 Gigya Inc.")] [assembly: AssemblyDescription("Microdot Framework")] -[assembly: AssemblyVersion("1.14.2.0")] -[assembly: AssemblyFileVersion("1.14.2.0")] -[assembly: AssemblyInformationalVersion("1.14.2.0")] +[assembly: AssemblyVersion("1.14.0.0")] +[assembly: AssemblyFileVersion("1.14.0.0")] +[assembly: AssemblyInformationalVersion("1.14.0.0")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from From 9f342780a733f7fea6d13c89955e7b68a946da7e Mon Sep 17 00:00:00 2001 From: Sami Saul Date: Tue, 5 Feb 2019 14:23:23 +0200 Subject: [PATCH 13/21] #83282 add consul 1/16 timeout --- Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs b/Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs index ad10d801..f796714f 100644 --- a/Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs +++ b/Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs @@ -25,6 +25,11 @@ public class ConsulConfig : IConfigObject /// public TimeSpan HttpTimeout { get; set; } = TimeSpan.FromMinutes(2); + /// + /// Absout timeout to be added to HttpTaskTimeout + /// + public TimeSpan HttpTimeoutAdditionalDelay { get; set; } = TimeSpan.FromSeconds(6); + /// /// Time to wait for http response from Consul. /// When LongPolling=true, defines the maximum time to wait on long-polling. @@ -33,7 +38,9 @@ public class ConsulConfig : IConfigObject /// risk of getting task cancelled exceptions before Consul gracefully timed out, /// due to network latency or the process being overloaded. /// - public TimeSpan HttpTaskTimeout => HttpTimeout.Add(TimeSpan.FromSeconds(5)); + public TimeSpan HttpTaskTimeout => HttpTimeout + .Add(TimeSpan.FromSeconds((int) (HttpTimeout.TotalSeconds / 16.0))) + .Add(HttpTimeoutAdditionalDelay); /// /// Interval for retrying access to Consul after an error has occured From 0406868245bd76339db1c3774d4b2d4aa158a2c6 Mon Sep 17 00:00:00 2001 From: Sami Saul Date: Tue, 5 Feb 2019 16:29:50 +0200 Subject: [PATCH 14/21] Milliseconds --- Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs b/Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs index f796714f..14e0c6b3 100644 --- a/Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs +++ b/Gigya.Microdot.ServiceDiscovery/Config/ConsulConfig.cs @@ -39,7 +39,7 @@ public class ConsulConfig : IConfigObject /// due to network latency or the process being overloaded. /// public TimeSpan HttpTaskTimeout => HttpTimeout - .Add(TimeSpan.FromSeconds((int) (HttpTimeout.TotalSeconds / 16.0))) + .Add(TimeSpan.FromMilliseconds((HttpTimeout.TotalMilliseconds / 16))) .Add(HttpTimeoutAdditionalDelay); /// From 6caf650db8e7f1ff25376f6510d17755a79c58c6 Mon Sep 17 00:00:00 2001 From: Guy Rozenblat Date: Thu, 7 Feb 2019 14:06:09 +0200 Subject: [PATCH 15/21] CR fixes --- .../HttpService/ServerRequestPublisher.cs | 8 +- .../SensitivityAttributesValidator.cs | 14 +- .../Events/MetadataPropertiesCache.cs | 82 +++++----- ....Microdot.Orleans.Hosting.UnitTests.csproj | 2 +- ...Tests.cs => MembersToLogExtractorTests.cs} | 149 ++++++++++++++---- .../SensitivityAttributesValidatorTests.cs | 26 ++- 6 files changed, 194 insertions(+), 87 deletions(-) rename tests/Gigya.Microdot.Orleans.Hosting.UnitTests/{ReflectionMetaDataExtensionTests.cs => MembersToLogExtractorTests.cs} (70%) diff --git a/Gigya.Microdot.Hosting/HttpService/ServerRequestPublisher.cs b/Gigya.Microdot.Hosting/HttpService/ServerRequestPublisher.cs index 9cbae494..7e0fc51d 100644 --- a/Gigya.Microdot.Hosting/HttpService/ServerRequestPublisher.cs +++ b/Gigya.Microdot.Hosting/HttpService/ServerRequestPublisher.cs @@ -18,15 +18,15 @@ public interface IServerRequestPublisher public class ServerRequestPublisher : IServerRequestPublisher { private readonly IEventPublisher _eventPublisher; - private readonly IMembersMetadataCache _membersMetadataCache; + private readonly IMembersToLogExtractor _membersToLogExtractor; private readonly IServiceEndPointDefinition _serviceEndPointDefinition; public ServerRequestPublisher(IEventPublisher eventPublisher, - IMembersMetadataCache membersMetadataCache, + IMembersToLogExtractor membersToLogExtractor, IServiceEndPointDefinition serviceEndPointDefinition) { _eventPublisher = eventPublisher; - _membersMetadataCache = membersMetadataCache; + _membersToLogExtractor = membersToLogExtractor; _serviceEndPointDefinition = serviceEndPointDefinition; } @@ -58,7 +58,7 @@ public void TryPublish(ServiceCallEvent callEvent, IEnumerable var type = pair.Value?.GetType(); if (type?.IsClass==true) { - var metaParams = _membersMetadataCache.ParseIntoParams(pair.Value); + var metaParams = _membersToLogExtractor.ExtractMembersToLog(pair.Value); foreach (var metaParam in metaParams) { diff --git a/Gigya.Microdot.Hosting/Validators/SensitivityAttributesValidator.cs b/Gigya.Microdot.Hosting/Validators/SensitivityAttributesValidator.cs index ff83ebd3..f6ecc536 100644 --- a/Gigya.Microdot.Hosting/Validators/SensitivityAttributesValidator.cs +++ b/Gigya.Microdot.Hosting/Validators/SensitivityAttributesValidator.cs @@ -56,7 +56,7 @@ public void Validate() } var logFieldExists = Attribute.IsDefined(parameter, typeof(LogFieldsAttribute)); - VerifyMisplacedSensitiveAttribute(logFieldExists, method.Name, parameter.Name, parameter.ParameterType, new Stack(), false); + VerifyMisplacedSensitiveAttribute(logFieldExists, method.Name, parameter.Name, parameter.ParameterType, new Stack()); } } } @@ -73,7 +73,7 @@ private bool IsIrrelevantTypes(Type type) return false; } - private void VerifyMisplacedSensitiveAttribute(bool logFieldExists, string methodName, string paramName, Type type, Stack path, bool isGenericPayload) + private void VerifyMisplacedSensitiveAttribute(bool logFieldExists, string methodName, string paramName, Type type, Stack path, bool isGenericPayload = false) { if (type.IsClass == false || IsIrrelevantTypes(type)) return; @@ -93,7 +93,7 @@ private void VerifyMisplacedSensitiveAttribute(bool logFieldExists, string metho if (memberInfo.GetCustomAttribute(typeof(SensitiveAttribute)) != null || memberInfo.GetCustomAttribute(typeof(NonSensitiveAttribute)) != null) if (!logFieldExists) throw new ProgrammaticException($"The method '{methodName}' parameter '{paramName}' has a member '{string.Join(" --> ", path.Reverse())}' that is marked as [Sensitive] or [NonSensitive], but the method parameter is not marked with [LogFields]"); - else if (!isGenericPayload && path.Count > 1) + else if (IsInvalidAttributeLevelPlacement(isGenericPayload, path.Count)) throw new ProgrammaticException($"The method '{methodName}' parameter '{paramName}' has a member '{string.Join(" --> ", path.Reverse())}' that is marked as [Sensitive] or [NonSensitive], but only root-level members can be marked as such."); Type memberType = memberInfo is PropertyInfo propertyInfo ? propertyInfo.PropertyType : ((FieldInfo)memberInfo).FieldType; @@ -103,5 +103,13 @@ private void VerifyMisplacedSensitiveAttribute(bool logFieldExists, string metho path.Pop(); } } + + private bool IsInvalidAttributeLevelPlacement(bool isGenericPayload, int pathCount) + { + if (isGenericPayload) + return pathCount > 2; //Allow only attributes on one level of generic payload + else + return pathCount > 1; //Allow only attributes on root level + } } } \ No newline at end of file diff --git a/Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs b/Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs index deb52821..0afd4d4e 100644 --- a/Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs +++ b/Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs @@ -32,18 +32,17 @@ namespace Gigya.Microdot.SharedLogic.Events { - public class ReflectionMetadataInfo { public string Name { get; set; } public Func ValueExtractor { get; set; } public Sensitivity? Sensitivity { get; set; } - public ReflectionMetadataInfo[] InnerFields { get; set; } + public ReflectionMetadataInfo[] InnerMembers { get; set; } } - public interface IMembersMetadataCache + public interface IMembersToLogExtractor { - IEnumerable ParseIntoParams(object instance); + IEnumerable ExtractMembersToLog(object instance); } public class MetadataCacheParam @@ -54,28 +53,26 @@ public class MetadataCacheParam } - - public class MembersMetadataCache : IMembersMetadataCache + public class MembersToLogExtractor : IMembersToLogExtractor { private readonly ILog _log; private readonly ConcurrentDictionary _membersMetadataCache; - public MembersMetadataCache(ILog log) + public MembersToLogExtractor(ILog log) { _log = log; _membersMetadataCache = new ConcurrentDictionary(); - } - public IEnumerable ParseIntoParams(object instance) + public IEnumerable ExtractMembersToLog(object instance) { var type = instance.GetType(); - var propertiesMetadata = _membersMetadataCache.GetOrAdd(type, x => ExtracMemberMetadata(type).ToArray()); + var propertiesMetadata = _membersMetadataCache.GetOrAdd(type, x => ExtractMemberMetadata(type).ToArray()); - return ExtractParams(instance, propertiesMetadata); + return ExtractMembers(instance, propertiesMetadata); } - private IEnumerable ExtractParams(object instance, IEnumerable membersMetadata, string containingName = null) + private IEnumerable ExtractMembers(object instance, IEnumerable membersMetadata, string containingName = null) { foreach (var memberMetadata in membersMetadata) { @@ -91,15 +88,16 @@ private IEnumerable ExtractParams(object instance, IEnumerab continue; } - if (memberMetadata.InnerFields != null && memberMetadata.InnerFields.Length > 0) - { - foreach (var metadataCacheParam in ExtractParams(value, memberMetadata.InnerFields, memberMetadata.Name)) yield return metadataCacheParam; - } - else + var memberName = containingName == null ? memberMetadata.Name : $"{containingName}_{memberMetadata.Name}"; + + if (memberMetadata.InnerMembers != null && memberMetadata.InnerMembers.Length > 0) + foreach (var metadataCacheParam in ExtractMembers(value, memberMetadata.InnerMembers, memberName)) yield return metadataCacheParam; + else //In case the if flow was executed, we don't want to return the current item + //because it's a generic payload (class) and not a member { yield return new MetadataCacheParam { - Name = containingName == null ? memberMetadata.Name : $"{containingName}_{memberMetadata.Name}", + Name = memberName, Value = value, Sensitivity = memberMetadata.Sensitivity }; @@ -108,51 +106,51 @@ private IEnumerable ExtractParams(object instance, IEnumerab } private const int MaxRecursionDepth = 1; - internal static IEnumerable ExtracMemberMetadata(Type type, int recursionDepth = 0) + + internal IEnumerable ExtractMemberMetadata(Type type, int recursionDepth = 0, + Sensitivity? parentSensitivity = null) { - var list = new List(); var members = type.FindMembers(MemberTypes.Property | MemberTypes.Field, BindingFlags.Public | BindingFlags.Instance, null, null) .Where(x => x is FieldInfo || ((x is PropertyInfo propertyInfo) && propertyInfo.CanRead)); - Type[] typeArguments = null; - if (recursionDepth <= MaxRecursionDepth && type.IsGenericType) - { - typeArguments = type.GetGenericArguments(); - } + var typeArguments = recursionDepth <= MaxRecursionDepth && type.IsGenericType + ? type.GetGenericArguments() + : null; - foreach (var member in members) - { + foreach (var member in members) + { var instanceParameter = Expression.Parameter(typeof(object), "target"); MemberExpression memberExpression = null; if (member.MemberType == MemberTypes.Property) - memberExpression = Expression.Property(Expression.Convert(instanceParameter, member.DeclaringType), (PropertyInfo)member); + memberExpression = Expression.Property(Expression.Convert(instanceParameter, member.DeclaringType), + (PropertyInfo) member); else if (member.MemberType == MemberTypes.Field) - memberExpression = Expression.Field(Expression.Convert(instanceParameter, member.DeclaringType), (FieldInfo)member); + memberExpression = Expression.Field(Expression.Convert(instanceParameter, member.DeclaringType), + (FieldInfo) member); var converter = Expression.Convert(memberExpression, typeof(object)); var lambda = Expression.Lambda>(converter, instanceParameter); - var memberType = GetMemberUnderlyingType(member); - ReflectionMetadataInfo[] innerFields = null; - if (typeArguments != null && typeArguments.Contains(memberType)) - { - innerFields = ExtracMemberMetadata(memberType, recursionDepth + 1).ToArray(); - } + var memberSensitivity = ExtractSensitivity(member) ?? parentSensitivity; + + var memberType = GetMemberUnderlyingType(member); + var hasInnerMembers = typeArguments != null && typeArguments.Contains(memberType); - list.Add(new ReflectionMetadataInfo + yield return new ReflectionMetadataInfo { Name = member.Name, ValueExtractor = lambda.Compile(), - Sensitivity = ExtractSensitivity(member), - InnerFields = innerFields - }); + Sensitivity = memberSensitivity, + InnerMembers = hasInnerMembers + ? ExtractMemberMetadata(memberType, recursionDepth + 1, memberSensitivity).ToArray() + : null + }; } - return list; } - private static Type GetMemberUnderlyingType(MemberInfo member) + private Type GetMemberUnderlyingType(MemberInfo member) { switch (member.MemberType) { @@ -165,7 +163,7 @@ private static Type GetMemberUnderlyingType(MemberInfo member) } } - internal static Sensitivity? ExtractSensitivity(MemberInfo memberInfo) + internal Sensitivity? ExtractSensitivity(MemberInfo memberInfo) { var attribute = memberInfo.GetCustomAttributes() .FirstOrDefault(x => x is SensitiveAttribute || x is NonSensitiveAttribute); diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj index ef27e896..31f4e17e 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj @@ -68,7 +68,7 @@ - + diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/ReflectionMetaDataExtensionTests.cs b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/MembersToLogExtractorTests.cs similarity index 70% rename from tests/Gigya.Microdot.Orleans.Hosting.UnitTests/ReflectionMetaDataExtensionTests.cs rename to tests/Gigya.Microdot.Orleans.Hosting.UnitTests/MembersToLogExtractorTests.cs index e03575ab..d5101805 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/ReflectionMetaDataExtensionTests.cs +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/MembersToLogExtractorTests.cs @@ -36,14 +36,16 @@ namespace Gigya.Microdot.Orleans.Hosting.UnitTests { [TestFixture] - public class ReflectionMetaDataExtensionTests + public class MembersToLogExtractorTests { private ILog _logMocked; + private MembersToLogExtractor _extractor; [SetUp] public void OneTimeSetup() { _logMocked = Substitute.For(); + _extractor = new MembersToLogExtractor(_logMocked); } @@ -52,32 +54,32 @@ public void OneTimeSetup() [TestCase(nameof(PersonMockData.Cryptic), Sensitivity.Secretive)] [TestCase(nameof(PersonMockData.Name), Sensitivity.NonSensitive)] [TestCase(nameof(PersonMockData.ID), null)] - public void ExtracPropertiesSensitivity_ExtractSensitivity_ShouldBeEquivilent(string actualValue, Sensitivity? expected) + public void ExtractPropertiesSensitivity_ExtractSensitivity_ShouldBeEquivilent(string actualValue, Sensitivity? expected) { var expectedSensitiveProperty = typeof(PersonMockData).GetProperty(actualValue); - MembersMetadataCache.ExtractSensitivity(expectedSensitiveProperty).ShouldBe(expected); + _extractor.ExtractSensitivity(expectedSensitiveProperty).ShouldBe(expected); } [Test] [TestCase(nameof(PersonMockData.FieldNonSensitive), Sensitivity.NonSensitive)] [TestCase(nameof(PersonMockData.FieldSensitive), Sensitivity.Sensitive)] [TestCase(nameof(PersonMockData.FieldCryptic), Sensitivity.Secretive)] - public void ExtracFieldsSensitivity_ExtractSensitivity_ShouldBeEquivilent(string actualValue, Sensitivity? expected) + public void ExtractFieldsSensitivity_ExtractSensitivity_ShouldBeEquivilent(string actualValue, Sensitivity? expected) { var field = typeof(PersonMockData).GetField(actualValue); - MembersMetadataCache.ExtractSensitivity(field).ShouldBe(expected); + _extractor.ExtractSensitivity(field).ShouldBe(expected); } [Test] - public void ExtracMembersValues_ExtractDataFromObject_ShouldBeEquivilent() + public void ExtractMembersValues_ExtractDataFromObject_ShouldBeEquivilent() { const int numberOfPrivatePropertiesAndFields = 8; var mock = new PersonMockData(); - var reflectionMetadataInfos = MembersMetadataCache.ExtracMemberMetadata(mock.GetType()).ToDictionary(x => x.Name); + var reflectionMetadataInfos = _extractor.ExtractMemberMetadata(mock.GetType()).ToDictionary(x => x.Name); reflectionMetadataInfos[nameof(PersonMockData.FieldNonSensitive)].ValueExtractor(mock).ShouldBe(mock.FieldNonSensitive); reflectionMetadataInfos[nameof(PersonMockData.FieldSensitive)].ValueExtractor(mock).ShouldBe(mock.FieldSensitive); @@ -93,12 +95,12 @@ public void ExtracMembersValues_ExtractDataFromObject_ShouldBeEquivilent() } [Test] - public void ExtracPropertiesAndFieldsValues_ExtractDataFromObject_ShouldBeEquivilent() + public void ExtractPropertiesAndFieldsValues_ExtractDataFromObject_ShouldBeEquivilent() { const int numberOfPrivatePropertiesAndFields = 8; var mock = new PersonMockData(); - var reflectionMetadataInfos = MembersMetadataCache.ExtracMemberMetadata(mock.GetType()).ToDictionary(x => x.Name); + var reflectionMetadataInfos = _extractor.ExtractMemberMetadata(mock.GetType()).ToDictionary(x => x.Name); var dissectParams = DissectPropertyInfoMetadata.GetMembers(mock); var numberProperties = dissectParams.Count(); @@ -118,13 +120,11 @@ public void ExtracPropertiesAndFieldsValues_ExtractDataFromObject_ShouldBeEquivi } [Test] - public void ExtracPropertiesValues_ExtractSensitiveAndCryptic_ShouldBeEquivilent() + public void ExtractMembersToLog_ExtractSensitiveAndCryptic_ShouldBeEquivilent() { var mock = new PersonMockData(); - var cache = new MembersMetadataCache(_logMocked); - - var metadataCacheParams = cache.ParseIntoParams(mock); + var metadataCacheParams = _extractor.ExtractMembersToLog(mock); var dissectedParams = DissectPropertyInfoMetadata.GetMemberWithSensitivity(mock).ToDictionary(x => x.Name); int count = AssertBetweenCacheParamAndDissectParams(metadataCacheParams, dissectedParams); @@ -135,16 +135,13 @@ public void ExtracPropertiesValues_ExtractSensitiveAndCryptic_ShouldBeEquivilent } [Test] - public void ExtracPropertiesValues_ExtractSensitiveAndCrypticWithInheritenceAndException_ShouldBeEquivilent() + public void ExtractMembersToLog_ExtractSensitiveAndCrypticWithInheritenceAndException_ShouldBeEquivilent() { var mock = new TeacherWithExceptionMock(); - var cache = new MembersMetadataCache(_logMocked); - var dissectedParams = DissectPropertyInfoMetadata.GetMemberWithSensitivity(mock).ToDictionary(x => x.Name); - - var parseParams = cache.ParseIntoParams(mock); + var parseParams = _extractor.ExtractMembersToLog(mock); int count = AssertBetweenCacheParamAndDissectParams(parseParams, dissectedParams); parseParams.Count().ShouldBe(dissectedParams.Count - 1); @@ -154,14 +151,13 @@ public void ExtracPropertiesValues_ExtractSensitiveAndCrypticWithInheritenceAndE } [Test] - public void ExtracPropertiesValues_SendTwoPeople_ShouldBeEquivilent() - { - var cache = new MembersMetadataCache(_logMocked); + public void ExtractMembersToLog_SendTwoPeople_ShouldBeEquivilent() + { var person = new PersonMockData(); var teacher = new TeacherWithExceptionMock(); - var teacherArguments = cache.ParseIntoParams(teacher); - var personArguments = cache.ParseIntoParams(person); + var teacherArguments = _extractor.ExtractMembersToLog(teacher); + var personArguments = _extractor.ExtractMembersToLog(person); var personDissect = DissectPropertyInfoMetadata.GetMemberWithSensitivity(person).ToDictionary(x => x.Name); @@ -180,12 +176,11 @@ public void ExtracPropertiesValues_SendTwoPeople_ShouldBeEquivilent() } [Test] - public void ExtractPropertiesValues_TypeWithGeneric_MembersExtractedCorrectly() + public void ExtractMembersToLog_TypeWithGeneric_MembersExtractedCorrectly() { - var cache = new MembersMetadataCache(_logMocked); var genericMockData = new GenericMockData(new MockData()); - var genericArguments = cache.ParseIntoParams(genericMockData); + var genericArguments = _extractor.ExtractMembersToLog(genericMockData); _logMocked.DidNotReceive().Warn(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()); genericArguments.Count().ShouldBe(3); @@ -195,12 +190,11 @@ public void ExtractPropertiesValues_TypeWithGeneric_MembersExtractedCorrectly() } [Test] - public void ExtractPropertiesValues_GenericWithInheritance_MembersExtractedCorrectly() + public void ExtractMembersToLog_GenericWithInheritance_MembersExtractedCorrectly() { - var cache = new MembersMetadataCache(_logMocked); var genericWithInheritance = new GenericWithInheritance(new DerivedMockData()); - var genericWithInheritanceArguments = cache.ParseIntoParams(genericWithInheritance); + var genericWithInheritanceArguments = _extractor.ExtractMembersToLog(genericWithInheritance); _logMocked.DidNotReceive().Warn(Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any(), Arg.Any()); genericWithInheritanceArguments.Count().ShouldBe(4); @@ -210,10 +204,22 @@ public void ExtractPropertiesValues_GenericWithInheritance_MembersExtractedCorre genericWithInheritanceArguments.ShouldContain(x => x.Name == "GenericWithInheritancePropertySensitive" && x.Value.ToString() == "GenericWithInheritancePropertySensitiveValue" && x.Sensitivity == Sensitivity.Sensitive); } + [Test] + public void ExtractMembersToLog_CheckMemberNameWithDepth_ShouldExtractNameCorrectly() + { + var depthDegree3Generic = new GenericMockData>(new GenericMockData(new MockData())); + + var extractedMembers = _extractor.ExtractMembersToLog(depthDegree3Generic); + + extractedMembers.ShouldContain(x => x.Name == "GenericType_GenericType_GenericPropertySensitive"); + extractedMembers.ShouldContain(x => x.Name == "GenericType_GenericType_GenericFieldSecretive"); + extractedMembers.ShouldContain(x => x.Name == "GenericType_FieldNonSensitive"); + extractedMembers.ShouldContain(x => x.Name == "FieldNonSensitive"); + } + [Test] public void LoadTest() { - var cache = new MembersMetadataCache(_logMocked); var people = GeneratePeople(10000).ToList(); var numOfProperties = DissectPropertyInfoMetadata.GetMemberWithSensitivity(new PersonMockData()); var stopWatch = new Stopwatch(); @@ -222,12 +228,56 @@ public void LoadTest() foreach (var person in people) { - var tmpParams = cache.ParseIntoParams(person); + var tmpParams = _extractor.ExtractMembersToLog(person); tmpParams.Count().ShouldBe(numOfProperties.Count()); } stopWatch.Stop(); } + #region Non/Sensitive attribute Hierarchy Tests + + [Test] + public void ExtractMembersToLog_SensitiveGenericNonSensitivePayload_NonSensitive() + { + var genericWithInheritance = new SensitiveGeneric(new NonSensitivePayload()); + + var extractedMembers = _extractor.ExtractMembersToLog(genericWithInheritance); + + extractedMembers.ShouldContain(x => x.Name == "GenericType_NonSensitiveField" && x.Value.ToString() == "NonSensitiveFieldValue" && x.Sensitivity == Sensitivity.NonSensitive); + } + + [Test] + public void ExtractMembersToLog_SensitiveGenericSensitivePayload_Sensitive() + { + var genericWithInheritance = new SensitiveGeneric(new SensitivePayload()); + + var extractedMembers = _extractor.ExtractMembersToLog(genericWithInheritance); + + extractedMembers.ShouldContain(x => x.Name == "GenericType_SensitiveField" && x.Value.ToString() == "SensitiveFieldValue" && x.Sensitivity == Sensitivity.Sensitive); + } + + [Test] + public void ExtractMembersToLog_NonSensitiveGenericSensitivePayload_Sensitive() + { + var genericWithInheritance = new NonSensitiveGeneric(new SensitivePayload()); + + var extractedMembers = _extractor.ExtractMembersToLog(genericWithInheritance); + + extractedMembers.ShouldContain(x => x.Name == "GenericType_SensitiveField" && x.Value.ToString() == "SensitiveFieldValue" && x.Sensitivity == Sensitivity.Sensitive); + } + + [Test] + public void ExtractMembersToLog_NonSensitiveGenericNonSensitivePayload_NonSensitive() + { + var genericWithInheritance = new NonSensitiveGeneric(new NonSensitivePayload()); + + var extractedMembers = _extractor.ExtractMembersToLog(genericWithInheritance); + + extractedMembers.ShouldContain(x => x.Name == "GenericType_NonSensitiveField" && x.Value.ToString() == "NonSensitiveFieldValue" && x.Sensitivity == Sensitivity.NonSensitive); + } + + #endregion + private static int AssertBetweenCacheParamAndDissectParams(IEnumerable @params, Dictionary actual) { int count = 0; @@ -365,13 +415,14 @@ private class TeacherWithExceptionMock : PersonMockData public int Years { get; set; } } + private class GenericWithInheritance where T : MockData { public GenericWithInheritance(T generic) { GenericType = generic; } - + public T GenericType; [Sensitive] @@ -384,7 +435,39 @@ private class DerivedMockData : MockData public string DerivedPropertySensitive { get; set; } = "DerivedPropertySensitiveValue"; } - #endregion + private class SensitiveGeneric + { + public SensitiveGeneric(T generic) + { + GenericType = generic; + } + + [Sensitive] + public T GenericType; + } + + private class NonSensitiveGeneric + { + public NonSensitiveGeneric(T generic) + { + GenericType = generic; + } + + [NonSensitive] + public T GenericType; + } + + private class SensitivePayload + { + [Sensitive] public string SensitiveField = "SensitiveFieldValue"; + } + + private class NonSensitivePayload + { + [NonSensitive] public string NonSensitiveField = "NonSensitiveFieldValue"; + } + + #endregion } } diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs index 313a16c1..2b7ff892 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs @@ -68,7 +68,7 @@ public void Teardown() [TestCase(typeof(IInvalid_WithoutLogFieldAndWithSensitivityOnProperty))] [TestCase(typeof(IInvalid_WithoutLogFieldAndWithinNestedSensitivity))] [TestCase(typeof(IInvalid_WithLogFieldAndWithSensitivityOnField))] - + [TestCase(typeof(IInvalidGeneric))] public void ValidationShouldFail(Type typeToValidate) { _typesToValidate = new[] { typeToValidate }; @@ -77,7 +77,7 @@ public void ValidationShouldFail(Type typeToValidate) [TestCase(typeof(IValidMock))] [TestCase(typeof(IComplexParameterValidation))] - [TestCase(typeof(IValidGeneric))] + [TestCase(typeof(IValidGeneric))] public void ValidationShouldSucceed(Type typeToValidate) { _typesToValidate = new[] { typeToValidate }; @@ -273,7 +273,12 @@ private interface IInvalidRecursionDepth100 private interface IValidGeneric { - Task Verification([LogFields]GenericWrapper stub); + Task Verification([LogFields]GenericWrapper stub); + } + + private interface IInvalidGeneric + { + Task Verification([LogFields]GenericWrapper> stub); } public class OuterStub @@ -297,10 +302,23 @@ public GenericWrapper(T genericType) public T GenericType { get; set; } } - public class GenericPayload + public class Payload { [Sensitive] public string FamilyName { get; set; } } + + public class GenericPayload + { + public GenericPayload(T genericType) + { + GenericType = genericType; + } + + [Sensitive] + public string FamilyName { get; set; } + + public T GenericType { get; set; } + } } } \ No newline at end of file From 76d7426eb79ed3d49339e23e2135e2b518791468 Mon Sep 17 00:00:00 2001 From: Guy Rozenblat Date: Thu, 7 Feb 2019 14:07:29 +0200 Subject: [PATCH 16/21] File rename --- .../{MetadataPropertiesCache.cs => MembersToLogExtractor.cs} | 0 Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename Gigya.Microdot.SharedLogic/Events/{MetadataPropertiesCache.cs => MembersToLogExtractor.cs} (100%) diff --git a/Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs b/Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs similarity index 100% rename from Gigya.Microdot.SharedLogic/Events/MetadataPropertiesCache.cs rename to Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs diff --git a/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj b/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj index 882555a8..e1394c89 100644 --- a/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj +++ b/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj @@ -47,7 +47,7 @@ - + From 381342e770d8222616767d2b87ddc85f602d3e11 Mon Sep 17 00:00:00 2001 From: Daniel Lamberger Date: Thu, 7 Feb 2019 15:12:29 +0200 Subject: [PATCH 17/21] review --- .../Events/MembersToLogExtractor.cs | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs b/Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs index 0afd4d4e..9379a6d7 100644 --- a/Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs +++ b/Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs @@ -163,27 +163,19 @@ private Type GetMemberUnderlyingType(MemberInfo member) } } + internal Sensitivity? ExtractSensitivity(MemberInfo memberInfo) { - var attribute = memberInfo.GetCustomAttributes() - .FirstOrDefault(x => x is SensitiveAttribute || x is NonSensitiveAttribute); + if (memberInfo.GetCustomAttribute()?.Secretive == true) + return Sensitivity.Secretive; - if (attribute != null) - { - if (attribute is SensitiveAttribute sensitiveAttibute) - { - if (sensitiveAttibute.Secretive) - { - return Sensitivity.Secretive; - } + else if (memberInfo.GetCustomAttribute()?.Secretive == false) + return Sensitivity.Sensitive; - return Sensitivity.Sensitive; - - } + else if (memberInfo.GetCustomAttribute() != null) return Sensitivity.NonSensitive; - } - return null; + else return null; } } } From bc1d2aff7cdcd0628acc41e6e4f3b473e401401d Mon Sep 17 00:00:00 2001 From: Guy Rozenblat Date: Thu, 7 Feb 2019 17:40:22 +0200 Subject: [PATCH 18/21] Add circular test --- .../SensitivityAttributesValidatorTests.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs index 2b7ff892..3946fa86 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Validation/SensitivityAttributesValidatorTests.cs @@ -69,6 +69,7 @@ public void Teardown() [TestCase(typeof(IInvalid_WithoutLogFieldAndWithinNestedSensitivity))] [TestCase(typeof(IInvalid_WithLogFieldAndWithSensitivityOnField))] [TestCase(typeof(IInvalidGeneric))] + [TestCase(typeof(IInvalidCircularGeneric))] public void ValidationShouldFail(Type typeToValidate) { _typesToValidate = new[] { typeToValidate }; @@ -281,6 +282,11 @@ private interface IInvalidGeneric Task Verification([LogFields]GenericWrapper> stub); } + private interface IInvalidCircularGeneric + { + Task Verification([LogFields]GenericWrapper stub); + } + public class OuterStub { public string Name { get; set; } @@ -308,6 +314,15 @@ public class Payload public string FamilyName { get; set; } } + public class CircularPayload + { + [Sensitive] + public string FamilyName { get; set; } + + [Sensitive] + public CircularPayload Circular { get; set; } + } + public class GenericPayload { public GenericPayload(T genericType) From eef4990d265168e783f03b606b4e5a1d32701ca0 Mon Sep 17 00:00:00 2001 From: Guy Rozenblat Date: Thu, 7 Feb 2019 18:03:54 +0200 Subject: [PATCH 19/21] Fix recursion depth --- Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs | 2 +- .../MembersToLogExtractorTests.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs b/Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs index 9379a6d7..a692f050 100644 --- a/Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs +++ b/Gigya.Microdot.SharedLogic/Events/MembersToLogExtractor.cs @@ -114,7 +114,7 @@ internal IEnumerable ExtractMemberMetadata(Type type, in BindingFlags.Public | BindingFlags.Instance, null, null) .Where(x => x is FieldInfo || ((x is PropertyInfo propertyInfo) && propertyInfo.CanRead)); - var typeArguments = recursionDepth <= MaxRecursionDepth && type.IsGenericType + var typeArguments = recursionDepth < MaxRecursionDepth && type.IsGenericType ? type.GetGenericArguments() : null; diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/MembersToLogExtractorTests.cs b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/MembersToLogExtractorTests.cs index d5101805..68f83c8f 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/MembersToLogExtractorTests.cs +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/MembersToLogExtractorTests.cs @@ -210,9 +210,9 @@ public void ExtractMembersToLog_CheckMemberNameWithDepth_ShouldExtractNameCorrec var depthDegree3Generic = new GenericMockData>(new GenericMockData(new MockData())); var extractedMembers = _extractor.ExtractMembersToLog(depthDegree3Generic); + extractedMembers.Count().ShouldBe(3); - extractedMembers.ShouldContain(x => x.Name == "GenericType_GenericType_GenericPropertySensitive"); - extractedMembers.ShouldContain(x => x.Name == "GenericType_GenericType_GenericFieldSecretive"); + extractedMembers.ShouldContain(x => x.Name == "GenericType_GenericType"); extractedMembers.ShouldContain(x => x.Name == "GenericType_FieldNonSensitive"); extractedMembers.ShouldContain(x => x.Name == "FieldNonSensitive"); } From 632e071fc7a15627712f5328ca58cc3d72bb3735 Mon Sep 17 00:00:00 2001 From: Yevgeny Kaplan Date: Wed, 13 Feb 2019 09:36:43 +0200 Subject: [PATCH 20/21] new test --- ...rviceDiscoveryPreferredEnvironmentTests.cs | 2 + .../Gigya.Microdot.UnitTests.csproj | 1 + .../RequestOverridesTests.cs | 39 +++++++++++++++++++ 3 files changed, 42 insertions(+) create mode 100644 tests/Gigya.Microdot.UnitTests/RequestOverridesTests.cs diff --git a/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/MultiEnvironmentServiceDiscoveryPreferredEnvironmentTests.cs b/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/MultiEnvironmentServiceDiscoveryPreferredEnvironmentTests.cs index 5a16f4ad..62ba9d73 100644 --- a/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/MultiEnvironmentServiceDiscoveryPreferredEnvironmentTests.cs +++ b/tests/Gigya.Microdot.UnitTests/Discovery/Rewrite/MultiEnvironmentServiceDiscoveryPreferredEnvironmentTests.cs @@ -71,6 +71,8 @@ public async Task Setup() public void TearDown() { _unitTestingKernel.Dispose(); + _loadBalancerByEnvironment.Clear(); + _serviceDiscovery = null; } [Test] diff --git a/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj b/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj index 034c4f19..de8733d8 100644 --- a/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj +++ b/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj @@ -94,6 +94,7 @@ + diff --git a/tests/Gigya.Microdot.UnitTests/RequestOverridesTests.cs b/tests/Gigya.Microdot.UnitTests/RequestOverridesTests.cs new file mode 100644 index 00000000..04838cd3 --- /dev/null +++ b/tests/Gigya.Microdot.UnitTests/RequestOverridesTests.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; +using System.Linq; +using Gigya.Microdot.SharedLogic.HttpService; +using NUnit.Framework; + +namespace Gigya.Microdot.UnitTests +{ + [TestFixture()] + public class RequestOverridesTests + { + [Test] + public void CheckRequestOverridesShallowClone() + { + RequestOverrides ro = new RequestOverrides(); + HostOverride ho1 = new HostOverride{Host = "testHost1", Port = 1234, ServiceName = "testService1"}; + ho1.AdditionalProperties = new Dictionary(); + ho1.AdditionalProperties.Add("ho1Key", "ho1Value"); + + HostOverride ho2 = new HostOverride{ Host = "testHost2", Port = 1235, ServiceName = "testService2"}; + ho2.AdditionalProperties = new Dictionary(); + ho2.AdditionalProperties.Add("ho2Key", "ho2Value"); + + ro.Hosts = new List(new []{ho1, ho2}); + ro.PreferredEnvironment = "pe1"; + ro.AdditionalProperties = new Dictionary(); + ro.AdditionalProperties.Add("roKey", "roValue"); + + RequestOverrides roResult = ro.ShallowCloneWithDifferentPreferredEnvironment("pe2"); + + Assert.AreEqual(ro.Hosts.Count, roResult.Hosts.Count); + Assert.AreEqual(ro.Hosts.Join(roResult.Hosts, h => new {h.Host, h.Port, h.ServiceName}, hr => new {hr.Host, hr.Port, hr.ServiceName}, (h, hr) => hr).Count(), roResult.Hosts.Count); + Assert.AreEqual(roResult.Hosts[0].AdditionalProperties["ho1Key"], "ho1Value"); + Assert.AreEqual(roResult.Hosts[1].AdditionalProperties["ho2Key"], "ho2Value"); + Assert.AreEqual(roResult.AdditionalProperties["roKey"], "roValue"); + Assert.AreEqual(ro.PreferredEnvironment, "pe1"); + Assert.AreEqual(roResult.PreferredEnvironment, "pe2"); + } + } +} From bb2bba1b483a2f504e812e06dc07a2a217d403af Mon Sep 17 00:00:00 2001 From: Alexander Chirlin Date: Thu, 14 Feb 2019 16:32:25 +0200 Subject: [PATCH 21/21] #80260, avoid redirect warnings, add required redirects --- .paket/Paket.Restore.targets | 179 ++++++++++++++---- .../Gigya.Microdot.Configuration.csproj | 7 +- .../Gigya.Microdot.Fakes.csproj | 5 +- .../Gigya.Microdot.Hosting.csproj | 3 +- .../Gigya.Microdot.Interfaces.csproj | 3 +- .../Gigya.Microdot.Logging.NLog.csproj | 2 +- .../Gigya.Microdot.Ninject.Host.csproj | 2 +- .../Gigya.Microdot.Ninject.csproj | 2 +- .../Gigya.Microdot.Orleans.Hosting.csproj | 27 +-- ...Gigya.Microdot.Orleans.Ninject.Host.csproj | 2 +- .../app.config | 2 +- .../Gigya.Microdot.ServiceDiscovery.csproj | 2 +- .../Gigya.Microdot.ServiceProxy.csproj | 2 +- .../Gigya.Microdot.SharedLogic.csproj | 2 +- Gigya.Microdot.Testing.Shared/App.config | 2 +- .../Gigya.Microdot.Testing.Shared.csproj | 2 +- .../Gigya.Microdot.Testing.csproj | 2 +- .../CalculatorService.Client.csproj | 2 +- .../CalculatorService.Interface.csproj | 2 +- Sample/CalculatorService.Orleans/App.config | 2 +- .../CalculatorService.Orleans.csproj | 3 +- .../CalculatorService.csproj | 2 +- paket.dependencies | 22 +-- paket.lock | 49 ++--- .../Gigya.Microdot.Hosting.UnitTests.csproj | 27 +-- .../app.config | 2 +- ....Microdot.Orleans.Hosting.UnitTests.csproj | 27 +-- .../app.config | 2 +- ....Microdot.ServiceContract.UnitTests.csproj | 1 + .../Gigya.Microdot.UnitTests.csproj | 2 +- tests/Gigya.Microdot.UnitTests/app.config | 2 +- 31 files changed, 217 insertions(+), 174 deletions(-) diff --git a/.paket/Paket.Restore.targets b/.paket/Paket.Restore.targets index e7c1bc0c..52f41c60 100644 --- a/.paket/Paket.Restore.targets +++ b/.paket/Paket.Restore.targets @@ -11,23 +11,49 @@ $(MSBuildThisFileDirectory)..\ $(PaketRootPath)paket-files\paket.restore.cached $(PaketRootPath)paket.lock + classic + proj + assembly + native /Library/Frameworks/Mono.framework/Commands/mono mono - - $(PaketRootPath)paket.exe - $(PaketToolsPath)paket.exe - "$(PaketExePath)" - $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" - + + $(PaketRootPath)paket.bootstrapper.exe + $(PaketToolsPath)paket.bootstrapper.exe + $([System.IO.Path]::GetDirectoryName("$(PaketBootStrapperExePath)"))\ + + + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + $(PaketToolsPath)paket.exe + $(_PaketBootStrapperExeDir)paket.exe + paket.exe + + + $(PaketRootPath)paket + $(PaketToolsPath)paket + $(PaketToolsPath)paket + + + $(PaketRootPath)paket.exe + $(PaketToolsPath)paket.exe + + + $(PaketBootStrapperExeDir)paket.exe + + + paket + + <_PaketExeExtension>$([System.IO.Path]::GetExtension("$(PaketExePath)")) - dotnet "$(PaketExePath)" + dotnet "$(PaketExePath)" + $(MonoPath) --runtime=v4.0.30319 "$(PaketExePath)" + "$(PaketExePath)" - - "$(PaketExePath)" - $(PaketRootPath)paket.bootstrapper.exe - $(PaketToolsPath)paket.bootstrapper.exe "$(PaketBootStrapperExePath)" $(MonoPath) --runtime=v4.0.30319 "$(PaketBootStrapperExePath)" @@ -36,30 +62,40 @@ true true + + + True - + + + + + true - $(NoWarn);NU1603 + $(NoWarn);NU1603;NU1604;NU1605;NU1608 - /usr/bin/shasum $(PaketRestoreCacheFile) | /usr/bin/awk '{ print $1 }' - /usr/bin/shasum $(PaketLockFilePath) | /usr/bin/awk '{ print $1 }' + /usr/bin/shasum "$(PaketRestoreCacheFile)" | /usr/bin/awk '{ print $1 }' + /usr/bin/shasum "$(PaketLockFilePath)" | /usr/bin/awk '{ print $1 }' - + - + + + + $([System.IO.File]::ReadAllText('$(PaketRestoreCacheFile)')) @@ -69,11 +105,26 @@ true + + + true + + - + + + + + + + + $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).paket.references.cached @@ -82,7 +133,9 @@ $(MSBuildProjectDirectory)\$(MSBuildProjectName).paket.references $(MSBuildProjectDirectory)\paket.references - $(MSBuildProjectDirectory)\obj\$(MSBuildProjectFile).$(TargetFramework).paket.resolved + + false + true true references-file-or-cache-not-found @@ -101,32 +154,43 @@ - + true - target-framework '$(TargetFramework)' + target-framework '$(TargetFramework)' or '$(TargetFrameworks)' files @(PaketResolvedFilePaths) - + + - + + false + true + + - + - + + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',').Length) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[0]) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[1]) $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[4]) + $([System.String]::Copy('%(PaketReferencesFileLines.Identity)').Split(',')[5]) %(PaketReferencesFileLinesInfo.PackageVersion) - All + All + runtime + runtime + true + true @@ -158,19 +222,27 @@ false + $(MSBuildVersion) + 15.8.0 <_NuspecFilesNewLocation Include="$(BaseIntermediateOutputPath)$(Configuration)\*.nuspec"/> + + $(MSBuildProjectDirectory)/$(MSBuildProjectFile) true - false - true + false + true + false + true + false + true $(BaseIntermediateOutputPath)$(Configuration) $(BaseIntermediateOutputPath) @@ -183,11 +255,54 @@ - - + - + + - bin\Debug\ DEBUG;TRACE prompt - 4 + 3 false bin\Debug\Gigya.Microdot.Configuration.xml + + pdbonly @@ -32,6 +34,9 @@ prompt 4 + + true + diff --git a/Gigya.Microdot.Fakes/Gigya.Microdot.Fakes.csproj b/Gigya.Microdot.Fakes/Gigya.Microdot.Fakes.csproj index 3a6f1a35..850df21c 100644 --- a/Gigya.Microdot.Fakes/Gigya.Microdot.Fakes.csproj +++ b/Gigya.Microdot.Fakes/Gigya.Microdot.Fakes.csproj @@ -20,9 +20,10 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.Fakes.xml - 1591;1573 + + true diff --git a/Gigya.Microdot.Hosting/Gigya.Microdot.Hosting.csproj b/Gigya.Microdot.Hosting/Gigya.Microdot.Hosting.csproj index 311007d7..db7a3e0d 100644 --- a/Gigya.Microdot.Hosting/Gigya.Microdot.Hosting.csproj +++ b/Gigya.Microdot.Hosting/Gigya.Microdot.Hosting.csproj @@ -25,7 +25,8 @@ true prompt MinimumRecommendedRules.ruleset - 1591;1573;1587 + 1587 + 3 bin\Release\ diff --git a/Gigya.Microdot.Interfaces/Gigya.Microdot.Interfaces.csproj b/Gigya.Microdot.Interfaces/Gigya.Microdot.Interfaces.csproj index c9e80948..972514fc 100644 --- a/Gigya.Microdot.Interfaces/Gigya.Microdot.Interfaces.csproj +++ b/Gigya.Microdot.Interfaces/Gigya.Microdot.Interfaces.csproj @@ -20,8 +20,9 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.Interfaces.xml + 1591 pdbonly diff --git a/Gigya.Microdot.Logging.NLog/Gigya.Microdot.Logging.NLog.csproj b/Gigya.Microdot.Logging.NLog/Gigya.Microdot.Logging.NLog.csproj index 4773fefa..7e71bd72 100644 --- a/Gigya.Microdot.Logging.NLog/Gigya.Microdot.Logging.NLog.csproj +++ b/Gigya.Microdot.Logging.NLog/Gigya.Microdot.Logging.NLog.csproj @@ -20,7 +20,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.Logging.NLog.xml diff --git a/Gigya.Microdot.Ninject.Host/Gigya.Microdot.Ninject.Host.csproj b/Gigya.Microdot.Ninject.Host/Gigya.Microdot.Ninject.Host.csproj index 95402d07..96b9267d 100644 --- a/Gigya.Microdot.Ninject.Host/Gigya.Microdot.Ninject.Host.csproj +++ b/Gigya.Microdot.Ninject.Host/Gigya.Microdot.Ninject.Host.csproj @@ -21,7 +21,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.Ninject.Host.xml diff --git a/Gigya.Microdot.Ninject/Gigya.Microdot.Ninject.csproj b/Gigya.Microdot.Ninject/Gigya.Microdot.Ninject.csproj index af005913..d98c4e87 100644 --- a/Gigya.Microdot.Ninject/Gigya.Microdot.Ninject.csproj +++ b/Gigya.Microdot.Ninject/Gigya.Microdot.Ninject.csproj @@ -20,7 +20,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.Ninject.xml diff --git a/Gigya.Microdot.Orleans.Hosting/Gigya.Microdot.Orleans.Hosting.csproj b/Gigya.Microdot.Orleans.Hosting/Gigya.Microdot.Orleans.Hosting.csproj index 801abaf5..378b8c61 100644 --- a/Gigya.Microdot.Orleans.Hosting/Gigya.Microdot.Orleans.Hosting.csproj +++ b/Gigya.Microdot.Orleans.Hosting/Gigya.Microdot.Orleans.Hosting.csproj @@ -1,5 +1,6 @@  + Debug @@ -20,7 +21,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.Orleans.Hosting.xml @@ -306,17 +307,6 @@ - - - - - ..\packages\System.Diagnostics.TraceSource\lib\net46\System.Diagnostics.TraceSource.dll - True - True - - - - @@ -372,17 +362,6 @@ - - - - - ..\packages\System.Net.NameResolution\lib\net46\System.Net.NameResolution.dll - True - True - - - - @@ -586,7 +565,7 @@ - ..\packages\ZooKeeperNetEx\lib\netstandard1.3\ZooKeeperNetEx.dll + ..\packages\ZooKeeperNetEx\lib\net45\ZooKeeperNetEx.dll True True diff --git a/Gigya.Microdot.Orleans.Ninject.Host/Gigya.Microdot.Orleans.Ninject.Host.csproj b/Gigya.Microdot.Orleans.Ninject.Host/Gigya.Microdot.Orleans.Ninject.Host.csproj index b5514084..4f0cdb47 100644 --- a/Gigya.Microdot.Orleans.Ninject.Host/Gigya.Microdot.Orleans.Ninject.Host.csproj +++ b/Gigya.Microdot.Orleans.Ninject.Host/Gigya.Microdot.Orleans.Ninject.Host.csproj @@ -21,7 +21,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.Orleans.Ninject.Host.xml diff --git a/Gigya.Microdot.Orleans.Ninject.Host/app.config b/Gigya.Microdot.Orleans.Ninject.Host/app.config index 74e855cd..e7c50a31 100644 --- a/Gigya.Microdot.Orleans.Ninject.Host/app.config +++ b/Gigya.Microdot.Orleans.Ninject.Host/app.config @@ -40,6 +40,6 @@ True - + diff --git a/Gigya.Microdot.ServiceDiscovery/Gigya.Microdot.ServiceDiscovery.csproj b/Gigya.Microdot.ServiceDiscovery/Gigya.Microdot.ServiceDiscovery.csproj index aa616673..95361eac 100644 --- a/Gigya.Microdot.ServiceDiscovery/Gigya.Microdot.ServiceDiscovery.csproj +++ b/Gigya.Microdot.ServiceDiscovery/Gigya.Microdot.ServiceDiscovery.csproj @@ -20,7 +20,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.ServiceDiscovery.xml MinimumRecommendedRules.ruleset diff --git a/Gigya.Microdot.ServiceProxy/Gigya.Microdot.ServiceProxy.csproj b/Gigya.Microdot.ServiceProxy/Gigya.Microdot.ServiceProxy.csproj index 1e54caa3..aeecd6a1 100644 --- a/Gigya.Microdot.ServiceProxy/Gigya.Microdot.ServiceProxy.csproj +++ b/Gigya.Microdot.ServiceProxy/Gigya.Microdot.ServiceProxy.csproj @@ -20,7 +20,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.ServiceProxy.xml 1591;1573 true diff --git a/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj b/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj index da31c4ec..75855277 100644 --- a/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj +++ b/Gigya.Microdot.SharedLogic/Gigya.Microdot.SharedLogic.csproj @@ -20,7 +20,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.SharedLogic.xml 1591;1573 true diff --git a/Gigya.Microdot.Testing.Shared/App.config b/Gigya.Microdot.Testing.Shared/App.config index 9ec5d083..1e59c434 100644 --- a/Gigya.Microdot.Testing.Shared/App.config +++ b/Gigya.Microdot.Testing.Shared/App.config @@ -42,6 +42,6 @@ True - + \ No newline at end of file diff --git a/Gigya.Microdot.Testing.Shared/Gigya.Microdot.Testing.Shared.csproj b/Gigya.Microdot.Testing.Shared/Gigya.Microdot.Testing.Shared.csproj index 4fb7aae1..d4581759 100644 --- a/Gigya.Microdot.Testing.Shared/Gigya.Microdot.Testing.Shared.csproj +++ b/Gigya.Microdot.Testing.Shared/Gigya.Microdot.Testing.Shared.csproj @@ -21,7 +21,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.Testing.Shared.xml diff --git a/Gigya.Microdot.Testing/Gigya.Microdot.Testing.csproj b/Gigya.Microdot.Testing/Gigya.Microdot.Testing.csproj index 93ee4ec8..e7d598cc 100644 --- a/Gigya.Microdot.Testing/Gigya.Microdot.Testing.csproj +++ b/Gigya.Microdot.Testing/Gigya.Microdot.Testing.csproj @@ -21,7 +21,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 bin\Debug\Gigya.Microdot.Testing.xml diff --git a/Sample/CalculatorService.Client/CalculatorService.Client.csproj b/Sample/CalculatorService.Client/CalculatorService.Client.csproj index 06fb8101..5d52506b 100644 --- a/Sample/CalculatorService.Client/CalculatorService.Client.csproj +++ b/Sample/CalculatorService.Client/CalculatorService.Client.csproj @@ -21,7 +21,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 false diff --git a/Sample/CalculatorService.Interface/CalculatorService.Interface.csproj b/Sample/CalculatorService.Interface/CalculatorService.Interface.csproj index fbb41364..3ceb3a0a 100644 --- a/Sample/CalculatorService.Interface/CalculatorService.Interface.csproj +++ b/Sample/CalculatorService.Interface/CalculatorService.Interface.csproj @@ -20,7 +20,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 pdbonly diff --git a/Sample/CalculatorService.Orleans/App.config b/Sample/CalculatorService.Orleans/App.config index 2d350b27..af5d680a 100644 --- a/Sample/CalculatorService.Orleans/App.config +++ b/Sample/CalculatorService.Orleans/App.config @@ -52,7 +52,7 @@ True - + diff --git a/Sample/CalculatorService.Orleans/CalculatorService.Orleans.csproj b/Sample/CalculatorService.Orleans/CalculatorService.Orleans.csproj index 14670bdc..5ef238f0 100644 --- a/Sample/CalculatorService.Orleans/CalculatorService.Orleans.csproj +++ b/Sample/CalculatorService.Orleans/CalculatorService.Orleans.csproj @@ -1,5 +1,6 @@  + Debug @@ -21,7 +22,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 false diff --git a/Sample/CalculatorService/CalculatorService.csproj b/Sample/CalculatorService/CalculatorService.csproj index a0db8532..0aaa39c9 100644 --- a/Sample/CalculatorService/CalculatorService.csproj +++ b/Sample/CalculatorService/CalculatorService.csproj @@ -36,7 +36,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 false diff --git a/paket.dependencies b/paket.dependencies index a0161ea0..586514dc 100644 --- a/paket.dependencies +++ b/paket.dependencies @@ -15,7 +15,7 @@ nuget Metrics.NET ~> 0.0 nuget Newtonsoft.Json >= 9 lowest_matching: true nuget Nito.AsyncEx ~> 4.0 nuget System.Threading.Tasks.Dataflow ~> 4.0 -nuget ZooKeeperNetEx ~> 3.4 >= 3.4.7.1 +nuget ZooKeeperNetEx 3.4.12.0 # We have an issue with 3.4.12.1 nuget System.ComponentModel.Annotations ~> 4.0 nuget DataAnnotationsValidator ~> 2.1.0 @@ -42,34 +42,22 @@ nuget Castle.Core ~> 4.0 #Tests only dependencies nuget NUnit ~> 3.0 nuget RichardSzalay.MockHttp -nuget NSubstitute +nuget NSubstitute nuget FluentAssertions nuget Nuget.CommandLine nuget Shouldly - nuget NLog ~> 4.0 - -#To support .NET framework 4.7.2 -nuget System.Collections.Immutable ~> 1.0 # have to be redirected, else failing to load Microsoft.CodeAnalysis.CSharp -nuget System.Diagnostics.FileVersionInfo redirects: off +#To support .NET framework 4.7.2 (Please don't modify) nuget System.IO redirects: off nuget System.IO.Compression redirects: off nuget System.IO.FileSystem redirects: off -nuget System.IO.FileSystem.Primitives redirects: off nuget System.Linq redirects: off nuget System.Linq.Expressions redirects: off -nuget System.Net.Http redirects: off nuget System.Reflection redirects: off -nuget System.Reflection.Metadata nuget System.Runtime redirects: off nuget System.Runtime.Extensions redirects: off nuget System.Runtime.InteropServices redirects: off -nuget System.Security.Cryptography.Algorithms redirects: off -nuget System.Security.Cryptography.Primitives redirects: off -nuget System.Text.Encoding.CodePages redirects: off -nuget System.Xml.XPath.XDocument redirects: off -nuget System.Numerics.Vectors redirects: off +nuget System.Runtime.InteropServices.RuntimeInformation redirects: off nuget System.Xml.ReaderWriter redirects: off -nuget System.Net.NameResolution redirects: off -nuget System.Diagnostics.TraceSource redirects: off +#End of fragment diff --git a/paket.lock b/paket.lock index 6a7ce3cd..a6c1d653 100644 --- a/paket.lock +++ b/paket.lock @@ -6,8 +6,8 @@ NUGET remote: https://api.nuget.org/v3/index.json Castle.Core (4.3.1) DataAnnotationsValidator (2.1) - FluentAssertions (5.5.3) - Gigya.ServiceContract (2.6) + FluentAssertions (5.6) + Gigya.ServiceContract (2.7.1) Newtonsoft.Json (>= 9.0.1) Metrics.NET (0.5.5) Microsoft.Bcl (1.1.10) @@ -15,7 +15,7 @@ NUGET Microsoft.Bcl.Async (1.0.168) Microsoft.Bcl (>= 1.1.8) Microsoft.Bcl.Build (1.0.21) - import_targets: false - Microsoft.CodeAnalysis.Analyzers (2.6.2) + Microsoft.CodeAnalysis.Analyzers (2.6.3) Microsoft.CodeAnalysis.Common (1.3.2) Microsoft.CodeAnalysis.Analyzers (>= 1.1) System.AppContext (>= 4.1) @@ -64,7 +64,7 @@ NUGET Microsoft.Extensions.DependencyInjection.Abstractions (1.1.1) NETStandard.Library (>= 1.6.1) System.ComponentModel (>= 4.3) - Microsoft.NETCore.Platforms (2.1.2) + Microsoft.NETCore.Platforms (2.2) Microsoft.Orleans.Core (1.3.1) Newtonsoft.Json (>= 7.0.1) System.Collections.Immutable (>= 1.1.37) @@ -104,8 +104,8 @@ NUGET Microsoft.Bcl.Async (>= 1.0.168) Microsoft.Bcl.Build (>= 1.0.21) NLog (4.5.11) - NSubstitute (3.1) - Castle.Core (>= 4.2) + NSubstitute (4.0) + Castle.Core (>= 4.3.1) System.Threading.Tasks.Extensions (>= 4.3) Nuget.CommandLine (4.9.2) NUnit (3.11) @@ -119,10 +119,9 @@ NUGET System.ComponentModel.Annotations (4.5) System.Console (4.3.1) System.Diagnostics.Debug (4.3) - System.Diagnostics.FileVersionInfo (4.3) - redirects: off + System.Diagnostics.FileVersionInfo (4.3) System.Diagnostics.StackTrace (4.3) System.Diagnostics.Tools (4.3) - System.Diagnostics.TraceSource (4.3) - redirects: off System.Dynamic.Runtime (4.3) System.Globalization (4.3) System.IO (4.3) - redirects: off @@ -132,51 +131,45 @@ NUGET System.IO.FileSystem.Primitives (4.3) - redirects: off System.Linq (4.3) - redirects: off System.Linq.Expressions (4.3) - redirects: off - System.Net.Http (4.3.4) - redirects: off - System.Security.Cryptography.X509Certificates (>= 4.3) - System.Net.NameResolution (4.3) - redirects: off - System.Numerics.Vectors (4.5) - redirects: off System.Reflection (4.3) - redirects: off System.Reflection.Metadata (1.6) System.Collections.Immutable (>= 1.5) System.Reflection.Primitives (4.3) System.Resources.ResourceManager (4.3) - System.Runtime (4.3) - redirects: off - System.Runtime.CompilerServices.Unsafe (4.5.2) - redirects: off + System.Runtime (4.3.1) - redirects: off + System.Runtime.CompilerServices.Unsafe (4.5.2) System.Runtime.Extensions (4.3) - redirects: off System.Runtime.Handles (4.3) System.Runtime.InteropServices (4.3) - redirects: off System.Runtime (>= 4.3) + System.Runtime.InteropServices.RuntimeInformation (4.3) - redirects: off System.Runtime.Numerics (4.3) - System.Security.Cryptography.Algorithms (4.3.1) - redirects: off + System.Security.Cryptography.Algorithms (4.3.1) System.IO (>= 4.3) System.Runtime (>= 4.3) System.Security.Cryptography.Encoding (>= 4.3) System.Security.Cryptography.Primitives (>= 4.3) - System.Security.Cryptography.Encoding (4.3) - redirects: off - System.Security.Cryptography.Primitives (4.3) - redirects: off - System.Security.Cryptography.X509Certificates (4.3.2) - redirects: off + System.Security.Cryptography.Encoding (4.3) + System.Security.Cryptography.Primitives (4.3) + System.Security.Cryptography.X509Certificates (4.3.2) System.Security.Cryptography.Algorithms (>= 4.3) System.Security.Cryptography.Encoding (>= 4.3) System.Text.Encoding (4.3) - System.Text.Encoding.CodePages (4.5) - redirects: off - System.Runtime.CompilerServices.Unsafe (>= 4.5) + System.Text.Encoding.CodePages (4.5.1) + System.Runtime.CompilerServices.Unsafe (>= 4.5.2) System.Text.Encoding.Extensions (4.3) System.Threading (4.3) System.Threading.Tasks (4.3) System.Threading.Tasks.Dataflow (4.9) - System.Threading.Tasks.Extensions (4.5.1) - System.Runtime.CompilerServices.Unsafe (>= 4.5) + System.Threading.Tasks.Extensions (4.5.2) + System.Runtime.CompilerServices.Unsafe (>= 4.5.2) System.Threading.Tasks.Parallel (4.3) System.Threading.Thread (4.3) System.ValueTuple (4.5) System.Xml.ReaderWriter (4.3.1) - redirects: off System.Xml.XDocument (4.3) System.Xml.XmlDocument (4.3) - System.Xml.XPath (4.3) - redirects: off - System.Xml.XPath.XDocument (4.3) - redirects: off + System.Xml.XPath (4.3) + System.Xml.XPath.XDocument (4.3) System.Xml.XPath (>= 4.3) - ZooKeeperNetEx (3.4.12.1) - NETStandard.Library (>= 1.6.1) - System.Diagnostics.TraceSource (>= 4.3) - System.Net.NameResolution (>= 4.3) + ZooKeeperNetEx (3.4.12) diff --git a/tests/Gigya.Microdot.Hosting.UnitTests/Gigya.Microdot.Hosting.UnitTests.csproj b/tests/Gigya.Microdot.Hosting.UnitTests/Gigya.Microdot.Hosting.UnitTests.csproj index 2b399fe7..99101626 100644 --- a/tests/Gigya.Microdot.Hosting.UnitTests/Gigya.Microdot.Hosting.UnitTests.csproj +++ b/tests/Gigya.Microdot.Hosting.UnitTests/Gigya.Microdot.Hosting.UnitTests.csproj @@ -1,6 +1,7 @@  + Debug @@ -22,7 +23,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 CS1998 @@ -337,17 +338,6 @@ - - - - - ..\..\packages\System.Diagnostics.TraceSource\lib\net46\System.Diagnostics.TraceSource.dll - True - True - - - - @@ -403,17 +393,6 @@ - - - - - ..\..\packages\System.Net.NameResolution\lib\net46\System.Net.NameResolution.dll - True - True - - - - @@ -628,7 +607,7 @@ - ..\..\packages\ZooKeeperNetEx\lib\netstandard1.3\ZooKeeperNetEx.dll + ..\..\packages\ZooKeeperNetEx\lib\net45\ZooKeeperNetEx.dll True True diff --git a/tests/Gigya.Microdot.Hosting.UnitTests/app.config b/tests/Gigya.Microdot.Hosting.UnitTests/app.config index 78d3856a..d376cbe6 100644 --- a/tests/Gigya.Microdot.Hosting.UnitTests/app.config +++ b/tests/Gigya.Microdot.Hosting.UnitTests/app.config @@ -49,6 +49,6 @@ True - + diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj index 228bb9e1..87d8bed1 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/Gigya.Microdot.Orleans.Hosting.UnitTests.csproj @@ -1,6 +1,7 @@  + Debug @@ -22,7 +23,7 @@ bin\Debug\ DEBUG;TRACE prompt - 4 + 3 CS1998 @@ -376,17 +377,6 @@ - - - - - ..\..\packages\System.Diagnostics.TraceSource\lib\net46\System.Diagnostics.TraceSource.dll - True - True - - - - @@ -442,17 +432,6 @@ - - - - - ..\..\packages\System.Net.NameResolution\lib\net46\System.Net.NameResolution.dll - True - True - - - - @@ -678,7 +657,7 @@ - ..\..\packages\ZooKeeperNetEx\lib\netstandard1.3\ZooKeeperNetEx.dll + ..\..\packages\ZooKeeperNetEx\lib\net45\ZooKeeperNetEx.dll True True diff --git a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/app.config b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/app.config index 78d3856a..d376cbe6 100644 --- a/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/app.config +++ b/tests/Gigya.Microdot.Orleans.Hosting.UnitTests/app.config @@ -49,6 +49,6 @@ True - + diff --git a/tests/Gigya.Microdot.ServiceContract.UnitTests/Gigya.Microdot.ServiceContract.UnitTests.csproj b/tests/Gigya.Microdot.ServiceContract.UnitTests/Gigya.Microdot.ServiceContract.UnitTests.csproj index 6240ca08..8d585347 100644 --- a/tests/Gigya.Microdot.ServiceContract.UnitTests/Gigya.Microdot.ServiceContract.UnitTests.csproj +++ b/tests/Gigya.Microdot.ServiceContract.UnitTests/Gigya.Microdot.ServiceContract.UnitTests.csproj @@ -25,6 +25,7 @@ prompt MinimumRecommendedRules.ruleset CS1998 + 3 bin\Release\ diff --git a/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj b/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj index 4ca6fcca..1f162b9e 100644 --- a/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj +++ b/tests/Gigya.Microdot.UnitTests/Gigya.Microdot.UnitTests.csproj @@ -22,7 +22,7 @@ bin\Debug\ TRACE;DEBUG prompt - 4 + 3 CS4014;CS1998; diff --git a/tests/Gigya.Microdot.UnitTests/app.config b/tests/Gigya.Microdot.UnitTests/app.config index 8ef2a969..f5776235 100644 --- a/tests/Gigya.Microdot.UnitTests/app.config +++ b/tests/Gigya.Microdot.UnitTests/app.config @@ -44,6 +44,6 @@ True - +