From b019c711f14d48f41c0abcdb094894b25a2cc04e Mon Sep 17 00:00:00 2001 From: Renato Golia Date: Wed, 19 May 2021 17:14:28 +0200 Subject: [PATCH 1/3] Added Grpc.Server package --- AutoFixtureExtensions.sln | 352 ++++++++++-------- .../Properties/launchSettings.json | 27 ++ .../Services/GreeterService.cs | 2 +- src/Grpc.Server/Grpc.Server.csproj | 18 + .../GrpcServerFixtureExtensions.cs | 28 ++ .../Internal/GrpcClientSpecimenBuilder.cs | 61 +++ .../Internal/GrpcServerCustomization.cs | 28 ++ .../CustomAutoDataAttributes.cs | 39 ++ .../GrpcServerFixtureExtensionsTests.cs | 26 ++ .../Integration/IntegrationTests.cs | 54 +++ .../GrpcClientSpecimenBuilderTests.cs | 61 +++ .../Internal/GrpcServerCustomizationTests.cs | 44 +++ .../Tests.Grpc.Server.csproj | 25 ++ 13 files changed, 603 insertions(+), 162 deletions(-) create mode 100644 helpers/Grpc/TestGrpcService/Properties/launchSettings.json create mode 100644 src/Grpc.Server/Grpc.Server.csproj create mode 100644 src/Grpc.Server/GrpcServerFixtureExtensions.cs create mode 100644 src/Grpc.Server/Internal/GrpcClientSpecimenBuilder.cs create mode 100644 src/Grpc.Server/Internal/GrpcServerCustomization.cs create mode 100644 tests/Tests.Grpc.Server/CustomAutoDataAttributes.cs create mode 100644 tests/Tests.Grpc.Server/GrpcServerFixtureExtensionsTests.cs create mode 100644 tests/Tests.Grpc.Server/Integration/IntegrationTests.cs create mode 100644 tests/Tests.Grpc.Server/Internal/GrpcClientSpecimenBuilderTests.cs create mode 100644 tests/Tests.Grpc.Server/Internal/GrpcServerCustomizationTests.cs create mode 100644 tests/Tests.Grpc.Server/Tests.Grpc.Server.csproj diff --git a/AutoFixtureExtensions.sln b/AutoFixtureExtensions.sln index d4217c8..26f90de 100644 --- a/AutoFixtureExtensions.sln +++ b/AutoFixtureExtensions.sln @@ -3,37 +3,41 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.6.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "helpers", "helpers", "{18DABDB0-C415-4075-BDC1-53DF4088FA42}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "helpers", "helpers", "{C09E3C79-19D5-4FA3-B857-C0F1DD9AD5F5}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AspNetCore", "AspNetCore", "{9058A266-F629-4774-B1F5-1FF74084F16A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AspNetCore", "AspNetCore", "{FEAEEA74-CCCB-45CC-ABDD-F5F029921B78}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestWebSite", "helpers\AspNetCore\TestWebSite\TestWebSite.csproj", "{2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestWebSite", "helpers\AspNetCore\TestWebSite\TestWebSite.csproj", "{92AEABA0-55AF-4F9E-84D7-E877D72E6A54}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{D42DA67B-AF61-478D-8B88-7C0733222FA8}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{DF531D7F-8261-41F1-8D08-F81050524EE6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestGrpcClient", "helpers\Grpc\TestGrpcClient\TestGrpcClient.csproj", "{D51501A1-9ABC-40D5-B906-F8CE4EA954A7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestGrpcClient", "helpers\Grpc\TestGrpcClient\TestGrpcClient.csproj", "{802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestGrpcService", "helpers\Grpc\TestGrpcService\TestGrpcService.csproj", "{2416EDC1-EBCA-4B1E-AEDB-0304B4882489}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestGrpcService", "helpers\Grpc\TestGrpcService\TestGrpcService.csproj", "{F8D0D503-16E4-4509-A5AE-E259A28F8247}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A8A865D0-D8D6-44BD-B20E-4E80425F1596}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{0460A521-3A1A-4C23-BE5B-E33B966BA8A6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCore.WebApplicationFactory", "src\AspNetCore.WebApplicationFactory\AspNetCore.WebApplicationFactory.csproj", "{3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AspNetCore.WebApplicationFactory", "src\AspNetCore.WebApplicationFactory\AspNetCore.WebApplicationFactory.csproj", "{FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Grpc", "src\Grpc\Grpc.csproj", "{DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Grpc", "src\Grpc\Grpc.csproj", "{29C9840C-71F2-4879-ABDE-FF34F97CFA36}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockHttp", "src\MockHttp\MockHttp.csproj", "{46240EF7-3462-4E35-9D27-5DBE3CFE26CB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Grpc.Server", "src\Grpc.Server\Grpc.Server.csproj", "{C5C682C5-6165-4CF3-8E32-B2461853C147}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{E7145B79-E211-400B-AA20-9445C38DDA8D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MockHttp", "src\MockHttp\MockHttp.csproj", "{2A156071-027A-41BE-86E3-9DBE3426E23B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.AspNetCore.WebApplicationFactory", "tests\Tests.AspNetCore.WebApplicationFactory\Tests.AspNetCore.WebApplicationFactory.csproj", "{9B22DFBB-0B23-4013-B8FD-5DA92351F381}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{360767A6-F98F-4FF7-811E-7A31B27CCCEC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Grpc", "tests\Tests.Grpc\Tests.Grpc.csproj", "{80F58E13-9AEB-46E1-B900-7328B61B85CB}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.AspNetCore.WebApplicationFactory", "tests\Tests.AspNetCore.WebApplicationFactory\Tests.AspNetCore.WebApplicationFactory.csproj", "{83D6ABD0-F661-4F9E-9E71-528764C40EB4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Grpc.Integration.Client", "tests\Tests.Grpc.Integration.Client\Tests.Grpc.Integration.Client.csproj", "{BFC69C10-4D8E-4A4F-909A-73BEDC55E121}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Grpc", "tests\Tests.Grpc\Tests.Grpc.csproj", "{3C2D4536-7921-471C-B80C-4223FE95403D}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Grpc.Integration.Service", "tests\Tests.Grpc.Integration.Service\Tests.Grpc.Integration.Service.csproj", "{5F189362-3EE6-4720-A14F-3DDB150EAB6E}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Grpc.Integration.Client", "tests\Tests.Grpc.Integration.Client\Tests.Grpc.Integration.Client.csproj", "{C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.MockHttp", "tests\Tests.MockHttp\Tests.MockHttp.csproj", "{01EC83AE-4341-4C80-A648-4E28C517FF3D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Grpc.Integration.Service", "tests\Tests.Grpc.Integration.Service\Tests.Grpc.Integration.Service.csproj", "{9C5264FD-98DD-4576-B2B8-EDA1A2E23580}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.Grpc.Server", "tests\Tests.Grpc.Server\Tests.Grpc.Server.csproj", "{97F7804D-9A38-4389-8616-C198EFC1730A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests.MockHttp", "tests\Tests.MockHttp\Tests.MockHttp.csproj", "{CE910F99-ABF6-4302-ACF3-9F48C82244F9}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -48,152 +52,178 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Debug|x64.ActiveCfg = Debug|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Debug|x64.Build.0 = Debug|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Debug|x86.ActiveCfg = Debug|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Debug|x86.Build.0 = Debug|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Release|Any CPU.Build.0 = Release|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Release|x64.ActiveCfg = Release|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Release|x64.Build.0 = Release|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Release|x86.ActiveCfg = Release|Any CPU - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B}.Release|x86.Build.0 = Release|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Debug|x64.ActiveCfg = Debug|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Debug|x64.Build.0 = Debug|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Debug|x86.ActiveCfg = Debug|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Debug|x86.Build.0 = Debug|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Release|Any CPU.Build.0 = Release|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Release|x64.ActiveCfg = Release|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Release|x64.Build.0 = Release|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Release|x86.ActiveCfg = Release|Any CPU - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7}.Release|x86.Build.0 = Release|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Debug|x64.ActiveCfg = Debug|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Debug|x64.Build.0 = Debug|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Debug|x86.ActiveCfg = Debug|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Debug|x86.Build.0 = Debug|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Release|Any CPU.Build.0 = Release|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Release|x64.ActiveCfg = Release|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Release|x64.Build.0 = Release|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Release|x86.ActiveCfg = Release|Any CPU - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489}.Release|x86.Build.0 = Release|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Debug|x64.ActiveCfg = Debug|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Debug|x64.Build.0 = Debug|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Debug|x86.ActiveCfg = Debug|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Debug|x86.Build.0 = Debug|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Release|Any CPU.Build.0 = Release|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Release|x64.ActiveCfg = Release|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Release|x64.Build.0 = Release|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Release|x86.ActiveCfg = Release|Any CPU - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE}.Release|x86.Build.0 = Release|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Debug|x64.ActiveCfg = Debug|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Debug|x64.Build.0 = Debug|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Debug|x86.ActiveCfg = Debug|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Debug|x86.Build.0 = Debug|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Release|Any CPU.Build.0 = Release|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Release|x64.ActiveCfg = Release|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Release|x64.Build.0 = Release|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Release|x86.ActiveCfg = Release|Any CPU - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56}.Release|x86.Build.0 = Release|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Debug|x64.ActiveCfg = Debug|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Debug|x64.Build.0 = Debug|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Debug|x86.ActiveCfg = Debug|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Debug|x86.Build.0 = Debug|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Release|Any CPU.Build.0 = Release|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Release|x64.ActiveCfg = Release|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Release|x64.Build.0 = Release|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Release|x86.ActiveCfg = Release|Any CPU - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB}.Release|x86.Build.0 = Release|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Debug|x64.ActiveCfg = Debug|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Debug|x64.Build.0 = Debug|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Debug|x86.ActiveCfg = Debug|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Debug|x86.Build.0 = Debug|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Release|Any CPU.Build.0 = Release|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Release|x64.ActiveCfg = Release|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Release|x64.Build.0 = Release|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Release|x86.ActiveCfg = Release|Any CPU - {9B22DFBB-0B23-4013-B8FD-5DA92351F381}.Release|x86.Build.0 = Release|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Debug|x64.ActiveCfg = Debug|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Debug|x64.Build.0 = Debug|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Debug|x86.ActiveCfg = Debug|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Debug|x86.Build.0 = Debug|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Release|Any CPU.Build.0 = Release|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Release|x64.ActiveCfg = Release|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Release|x64.Build.0 = Release|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Release|x86.ActiveCfg = Release|Any CPU - {80F58E13-9AEB-46E1-B900-7328B61B85CB}.Release|x86.Build.0 = Release|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Debug|x64.ActiveCfg = Debug|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Debug|x64.Build.0 = Debug|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Debug|x86.ActiveCfg = Debug|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Debug|x86.Build.0 = Debug|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Release|Any CPU.Build.0 = Release|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Release|x64.ActiveCfg = Release|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Release|x64.Build.0 = Release|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Release|x86.ActiveCfg = Release|Any CPU - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121}.Release|x86.Build.0 = Release|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Debug|x64.ActiveCfg = Debug|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Debug|x64.Build.0 = Debug|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Debug|x86.ActiveCfg = Debug|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Debug|x86.Build.0 = Debug|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Release|Any CPU.Build.0 = Release|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Release|x64.ActiveCfg = Release|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Release|x64.Build.0 = Release|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Release|x86.ActiveCfg = Release|Any CPU - {5F189362-3EE6-4720-A14F-3DDB150EAB6E}.Release|x86.Build.0 = Release|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Debug|x64.ActiveCfg = Debug|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Debug|x64.Build.0 = Debug|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Debug|x86.ActiveCfg = Debug|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Debug|x86.Build.0 = Debug|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Release|Any CPU.Build.0 = Release|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Release|x64.ActiveCfg = Release|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Release|x64.Build.0 = Release|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Release|x86.ActiveCfg = Release|Any CPU - {01EC83AE-4341-4C80-A648-4E28C517FF3D}.Release|x86.Build.0 = Release|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Debug|x64.ActiveCfg = Debug|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Debug|x64.Build.0 = Debug|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Debug|x86.ActiveCfg = Debug|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Debug|x86.Build.0 = Debug|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Release|Any CPU.Build.0 = Release|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Release|x64.ActiveCfg = Release|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Release|x64.Build.0 = Release|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Release|x86.ActiveCfg = Release|Any CPU + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54}.Release|x86.Build.0 = Release|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Debug|x64.ActiveCfg = Debug|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Debug|x64.Build.0 = Debug|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Debug|x86.ActiveCfg = Debug|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Debug|x86.Build.0 = Debug|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Release|Any CPU.Build.0 = Release|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Release|x64.ActiveCfg = Release|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Release|x64.Build.0 = Release|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Release|x86.ActiveCfg = Release|Any CPU + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5}.Release|x86.Build.0 = Release|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Debug|x64.ActiveCfg = Debug|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Debug|x64.Build.0 = Debug|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Debug|x86.ActiveCfg = Debug|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Debug|x86.Build.0 = Debug|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Release|Any CPU.Build.0 = Release|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Release|x64.ActiveCfg = Release|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Release|x64.Build.0 = Release|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Release|x86.ActiveCfg = Release|Any CPU + {F8D0D503-16E4-4509-A5AE-E259A28F8247}.Release|x86.Build.0 = Release|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Debug|x64.ActiveCfg = Debug|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Debug|x64.Build.0 = Debug|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Debug|x86.ActiveCfg = Debug|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Debug|x86.Build.0 = Debug|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Release|Any CPU.Build.0 = Release|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Release|x64.ActiveCfg = Release|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Release|x64.Build.0 = Release|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Release|x86.ActiveCfg = Release|Any CPU + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229}.Release|x86.Build.0 = Release|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Debug|x64.ActiveCfg = Debug|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Debug|x64.Build.0 = Debug|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Debug|x86.ActiveCfg = Debug|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Debug|x86.Build.0 = Debug|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Release|Any CPU.Build.0 = Release|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Release|x64.ActiveCfg = Release|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Release|x64.Build.0 = Release|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Release|x86.ActiveCfg = Release|Any CPU + {29C9840C-71F2-4879-ABDE-FF34F97CFA36}.Release|x86.Build.0 = Release|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Debug|x64.ActiveCfg = Debug|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Debug|x64.Build.0 = Debug|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Debug|x86.ActiveCfg = Debug|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Debug|x86.Build.0 = Debug|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Release|Any CPU.Build.0 = Release|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Release|x64.ActiveCfg = Release|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Release|x64.Build.0 = Release|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Release|x86.ActiveCfg = Release|Any CPU + {C5C682C5-6165-4CF3-8E32-B2461853C147}.Release|x86.Build.0 = Release|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Debug|x64.ActiveCfg = Debug|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Debug|x64.Build.0 = Debug|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Debug|x86.ActiveCfg = Debug|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Debug|x86.Build.0 = Debug|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Release|Any CPU.Build.0 = Release|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Release|x64.ActiveCfg = Release|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Release|x64.Build.0 = Release|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Release|x86.ActiveCfg = Release|Any CPU + {2A156071-027A-41BE-86E3-9DBE3426E23B}.Release|x86.Build.0 = Release|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Debug|x64.ActiveCfg = Debug|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Debug|x64.Build.0 = Debug|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Debug|x86.ActiveCfg = Debug|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Debug|x86.Build.0 = Debug|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Release|Any CPU.Build.0 = Release|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Release|x64.ActiveCfg = Release|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Release|x64.Build.0 = Release|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Release|x86.ActiveCfg = Release|Any CPU + {83D6ABD0-F661-4F9E-9E71-528764C40EB4}.Release|x86.Build.0 = Release|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Debug|x64.ActiveCfg = Debug|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Debug|x64.Build.0 = Debug|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Debug|x86.ActiveCfg = Debug|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Debug|x86.Build.0 = Debug|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Release|Any CPU.Build.0 = Release|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Release|x64.ActiveCfg = Release|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Release|x64.Build.0 = Release|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Release|x86.ActiveCfg = Release|Any CPU + {3C2D4536-7921-471C-B80C-4223FE95403D}.Release|x86.Build.0 = Release|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Debug|x64.ActiveCfg = Debug|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Debug|x64.Build.0 = Debug|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Debug|x86.ActiveCfg = Debug|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Debug|x86.Build.0 = Debug|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Release|Any CPU.Build.0 = Release|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Release|x64.ActiveCfg = Release|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Release|x64.Build.0 = Release|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Release|x86.ActiveCfg = Release|Any CPU + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE}.Release|x86.Build.0 = Release|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Debug|x64.ActiveCfg = Debug|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Debug|x64.Build.0 = Debug|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Debug|x86.Build.0 = Debug|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Release|Any CPU.Build.0 = Release|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Release|x64.ActiveCfg = Release|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Release|x64.Build.0 = Release|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Release|x86.ActiveCfg = Release|Any CPU + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580}.Release|x86.Build.0 = Release|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Debug|x64.ActiveCfg = Debug|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Debug|x64.Build.0 = Debug|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Debug|x86.ActiveCfg = Debug|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Debug|x86.Build.0 = Debug|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Release|Any CPU.Build.0 = Release|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Release|x64.ActiveCfg = Release|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Release|x64.Build.0 = Release|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Release|x86.ActiveCfg = Release|Any CPU + {97F7804D-9A38-4389-8616-C198EFC1730A}.Release|x86.Build.0 = Release|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Debug|x64.ActiveCfg = Debug|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Debug|x64.Build.0 = Debug|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Debug|x86.ActiveCfg = Debug|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Debug|x86.Build.0 = Debug|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Release|Any CPU.Build.0 = Release|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Release|x64.ActiveCfg = Release|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Release|x64.Build.0 = Release|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Release|x86.ActiveCfg = Release|Any CPU + {CE910F99-ABF6-4302-ACF3-9F48C82244F9}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution - {9058A266-F629-4774-B1F5-1FF74084F16A} = {18DABDB0-C415-4075-BDC1-53DF4088FA42} - {2CA87F1A-9036-4E0C-9764-CE7B37FC8D0B} = {9058A266-F629-4774-B1F5-1FF74084F16A} - {D42DA67B-AF61-478D-8B88-7C0733222FA8} = {18DABDB0-C415-4075-BDC1-53DF4088FA42} - {D51501A1-9ABC-40D5-B906-F8CE4EA954A7} = {D42DA67B-AF61-478D-8B88-7C0733222FA8} - {2416EDC1-EBCA-4B1E-AEDB-0304B4882489} = {D42DA67B-AF61-478D-8B88-7C0733222FA8} - {3A5D6EFD-86D6-4875-BBE3-D41FBBE53DBE} = {A8A865D0-D8D6-44BD-B20E-4E80425F1596} - {DB1B5377-9B4A-41A4-B797-6A11FAFA2E56} = {A8A865D0-D8D6-44BD-B20E-4E80425F1596} - {46240EF7-3462-4E35-9D27-5DBE3CFE26CB} = {A8A865D0-D8D6-44BD-B20E-4E80425F1596} - {9B22DFBB-0B23-4013-B8FD-5DA92351F381} = {E7145B79-E211-400B-AA20-9445C38DDA8D} - {80F58E13-9AEB-46E1-B900-7328B61B85CB} = {E7145B79-E211-400B-AA20-9445C38DDA8D} - {BFC69C10-4D8E-4A4F-909A-73BEDC55E121} = {E7145B79-E211-400B-AA20-9445C38DDA8D} - {5F189362-3EE6-4720-A14F-3DDB150EAB6E} = {E7145B79-E211-400B-AA20-9445C38DDA8D} - {01EC83AE-4341-4C80-A648-4E28C517FF3D} = {E7145B79-E211-400B-AA20-9445C38DDA8D} + {FEAEEA74-CCCB-45CC-ABDD-F5F029921B78} = {C09E3C79-19D5-4FA3-B857-C0F1DD9AD5F5} + {92AEABA0-55AF-4F9E-84D7-E877D72E6A54} = {FEAEEA74-CCCB-45CC-ABDD-F5F029921B78} + {DF531D7F-8261-41F1-8D08-F81050524EE6} = {C09E3C79-19D5-4FA3-B857-C0F1DD9AD5F5} + {802899CD-FD89-4C57-A4C4-0C4BD97BBDF5} = {DF531D7F-8261-41F1-8D08-F81050524EE6} + {F8D0D503-16E4-4509-A5AE-E259A28F8247} = {DF531D7F-8261-41F1-8D08-F81050524EE6} + {FDD34D25-AF55-4FF9-BFF6-E8CFB981B229} = {0460A521-3A1A-4C23-BE5B-E33B966BA8A6} + {29C9840C-71F2-4879-ABDE-FF34F97CFA36} = {0460A521-3A1A-4C23-BE5B-E33B966BA8A6} + {C5C682C5-6165-4CF3-8E32-B2461853C147} = {0460A521-3A1A-4C23-BE5B-E33B966BA8A6} + {2A156071-027A-41BE-86E3-9DBE3426E23B} = {0460A521-3A1A-4C23-BE5B-E33B966BA8A6} + {83D6ABD0-F661-4F9E-9E71-528764C40EB4} = {360767A6-F98F-4FF7-811E-7A31B27CCCEC} + {3C2D4536-7921-471C-B80C-4223FE95403D} = {360767A6-F98F-4FF7-811E-7A31B27CCCEC} + {C5FE86FE-C7C0-45FF-AE3E-683AD0BEC7BE} = {360767A6-F98F-4FF7-811E-7A31B27CCCEC} + {9C5264FD-98DD-4576-B2B8-EDA1A2E23580} = {360767A6-F98F-4FF7-811E-7A31B27CCCEC} + {97F7804D-9A38-4389-8616-C198EFC1730A} = {360767A6-F98F-4FF7-811E-7A31B27CCCEC} + {CE910F99-ABF6-4302-ACF3-9F48C82244F9} = {360767A6-F98F-4FF7-811E-7A31B27CCCEC} EndGlobalSection EndGlobal diff --git a/helpers/Grpc/TestGrpcService/Properties/launchSettings.json b/helpers/Grpc/TestGrpcService/Properties/launchSettings.json new file mode 100644 index 0000000..5359f38 --- /dev/null +++ b/helpers/Grpc/TestGrpcService/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:64589/", + "sslPort": 44377 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "TestGrpcService": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} \ No newline at end of file diff --git a/helpers/Grpc/TestGrpcService/Services/GreeterService.cs b/helpers/Grpc/TestGrpcService/Services/GreeterService.cs index 8789789..7e026f7 100644 --- a/helpers/Grpc/TestGrpcService/Services/GreeterService.cs +++ b/helpers/Grpc/TestGrpcService/Services/GreeterService.cs @@ -15,7 +15,7 @@ public GreeterService(ILogger logger) _logger = logger; } - static string FormatMessage(string name) => $"Hello {name}"; + public static string FormatMessage(string name) => $"Hello {name}"; public override Task SayHelloUnary(HelloRequest request, ServerCallContext context) { diff --git a/src/Grpc.Server/Grpc.Server.csproj b/src/Grpc.Server/Grpc.Server.csproj new file mode 100644 index 0000000..62ee3fa --- /dev/null +++ b/src/Grpc.Server/Grpc.Server.csproj @@ -0,0 +1,18 @@ + + + + net5.0 + + + + autofixture;unit testing;test;mock;grpc + An extension to AutoFixture to easily test ASP.NET Core applications hosting GRPC services. + + + + + + + + + \ No newline at end of file diff --git a/src/Grpc.Server/GrpcServerFixtureExtensions.cs b/src/Grpc.Server/GrpcServerFixtureExtensions.cs new file mode 100644 index 0000000..17008af --- /dev/null +++ b/src/Grpc.Server/GrpcServerFixtureExtensions.cs @@ -0,0 +1,28 @@ +using System; +using Grpc.Core; +using Kralizek.AutoFixture.Extensions.Internal; +using Microsoft.AspNetCore.Hosting; + +// ReSharper disable CheckNamespace + +namespace AutoFixture +{ + public static class GrpcServerFixtureExtensions + { + private static readonly Action EmptyAction = _ => { }; + + public static IFixture AddGrpcServerSupport(this IFixture fixture, Action? configuration = null) + where TEntryPoint : class + where TClient : ClientBase + { + if (fixture is null) + { + throw new ArgumentNullException(nameof(fixture)); + } + + fixture.Customize(new GrpcServerCustomization(configuration ?? EmptyAction)); + + return fixture; + } + } +} diff --git a/src/Grpc.Server/Internal/GrpcClientSpecimenBuilder.cs b/src/Grpc.Server/Internal/GrpcClientSpecimenBuilder.cs new file mode 100644 index 0000000..33fa1eb --- /dev/null +++ b/src/Grpc.Server/Internal/GrpcClientSpecimenBuilder.cs @@ -0,0 +1,61 @@ +using System; +using AutoFixture; +using AutoFixture.Kernel; +using Grpc.Core; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; + +namespace Kralizek.AutoFixture.Extensions.Internal +{ + public class GrpcClientSpecimenBuilder : ISpecimenBuilder + where TEntryPoint : class + where TClient : ClientBase + { + public IRequestSpecification RequestSpecification { get; } + + public GrpcClientSpecimenBuilder(IRequestSpecification requestSpecification) + { + RequestSpecification = requestSpecification ?? throw new ArgumentNullException(nameof(requestSpecification)); + } + + public GrpcClientSpecimenBuilder() : this(new GrpcClientRequestSpecification()) + { + } + + public object Create(object request, ISpecimenContext context) + { + if (request is null) + { + throw new ArgumentNullException(nameof(request)); + } + + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + + if (!RequestSpecification.IsSatisfiedBy(request)) + { + return new NoSpecimen(); + } + + var factory = context.Create>(); + + var services = new ServiceCollection(); + + services.AddGrpcClient(o => o.Address = factory.Server.BaseAddress) + .ConfigurePrimaryHttpMessageHandler(() => factory.Server.CreateHandler()); + + var provider = services.BuildServiceProvider(); + + var client = provider.GetRequiredService(); + + return client; + } + + public class GrpcClientRequestSpecification : IRequestSpecification + { + public bool IsSatisfiedBy(object request) => request is Type type && type == typeof(TClient); + } + } +} diff --git a/src/Grpc.Server/Internal/GrpcServerCustomization.cs b/src/Grpc.Server/Internal/GrpcServerCustomization.cs new file mode 100644 index 0000000..c3dc695 --- /dev/null +++ b/src/Grpc.Server/Internal/GrpcServerCustomization.cs @@ -0,0 +1,28 @@ +using System; +using AutoFixture; +using Grpc.Core; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Testing; + +namespace Kralizek.AutoFixture.Extensions.Internal +{ + public class GrpcServerCustomization : ICustomization + where TEntryPoint : class + where TClient : ClientBase + + { + private readonly Action _configuration; + + public GrpcServerCustomization(Action configuration) + { + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + } + + public void Customize(IFixture fixture) + { + fixture.Inject(new WebApplicationFactory().WithWebHostBuilder(_configuration)); + + fixture.Customizations.Add(new GrpcClientSpecimenBuilder()); + } + } +} diff --git a/tests/Tests.Grpc.Server/CustomAutoDataAttributes.cs b/tests/Tests.Grpc.Server/CustomAutoDataAttributes.cs new file mode 100644 index 0000000..f9e5de7 --- /dev/null +++ b/tests/Tests.Grpc.Server/CustomAutoDataAttributes.cs @@ -0,0 +1,39 @@ +using System; +using AutoFixture; +using AutoFixture.AutoMoq; +using AutoFixture.NUnit3; + +namespace Tests +{ + [AttributeUsage(AttributeTargets.Method)] + public class CustomAutoDataAttribute : AutoDataAttribute + { + public CustomAutoDataAttribute() : base(FixtureHelpers.CreateFixture) + { + } + } + + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + public class CustomInlineAutoDataAttribute : InlineAutoDataAttribute + { + public CustomInlineAutoDataAttribute(params object[] args) : base(FixtureHelpers.CreateFixture, args) + { + } + } + + internal static class FixtureHelpers + { + public static IFixture CreateFixture() + { + var fixture = new Fixture(); + + fixture.Customize(new AutoMoqCustomization + { + ConfigureMembers = true, + GenerateDelegates = true + }); + + return fixture; + } + } +} diff --git a/tests/Tests.Grpc.Server/GrpcServerFixtureExtensionsTests.cs b/tests/Tests.Grpc.Server/GrpcServerFixtureExtensionsTests.cs new file mode 100644 index 0000000..390d6be --- /dev/null +++ b/tests/Tests.Grpc.Server/GrpcServerFixtureExtensionsTests.cs @@ -0,0 +1,26 @@ +using System.Linq; +using AutoFixture; +using Kralizek.AutoFixture.Extensions.Internal; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.AspNetCore.TestHost; +using NUnit.Framework; +using Greeter = TestGrpc.Greeter; + +namespace Tests +{ + public class GrpcServerFixtureExtensionsTests + { + [Test, CustomAutoData] + public void AddGrpcServerSupport_registers_customization(IFixture fixture) + { + GrpcServerFixtureExtensions.AddGrpcServerSupport(fixture, b => b.UseSolutionRelativeContentRoot("helpers")); + + Assert.Multiple(() => + { + Assert.That(() => fixture.Create>(), Throws.Nothing); + + Assert.That(fixture.Customizations, Has.Exactly(1).InstanceOf>()); + }); + } + } +} \ No newline at end of file diff --git a/tests/Tests.Grpc.Server/Integration/IntegrationTests.cs b/tests/Tests.Grpc.Server/Integration/IntegrationTests.cs new file mode 100644 index 0000000..a5b91d3 --- /dev/null +++ b/tests/Tests.Grpc.Server/Integration/IntegrationTests.cs @@ -0,0 +1,54 @@ +using System; +using System.Threading.Tasks; +using AutoFixture; +using AutoFixture.NUnit3; +using Microsoft.AspNetCore.TestHost; +using NUnit.Framework; +using TestGrpc; + +namespace Tests.Integration +{ + [AttributeUsage(AttributeTargets.Method)] + public class TestAutoDataAttribute : AutoDataAttribute + { + public TestAutoDataAttribute() : base(() => new Fixture().AddGrpcServerSupport(b => b.UseSolutionRelativeContentRoot("helpers"))) { } + } + + [TestFixture] + public class IntegrationTests + { + [Test] + public async Task Should_work_with_no_auto_data_attribute() + { + var fixture = new Fixture().AddGrpcServerSupport(b => b.UseSolutionRelativeContentRoot("helpers")); + + var name = fixture.Create(); + + var client = fixture.Create(); + + var response = await client.SayHelloUnaryAsync(new HelloRequest { Name = name }); + + Assert.That(response.Message, Is.EqualTo(GreeterService.FormatMessage(name))); + } + + [Test, AutoData] + public async Task Should_work_with_basic_auto_data_attribute(IFixture fixture, string name) + { + fixture.AddGrpcServerSupport(b => b.UseSolutionRelativeContentRoot("helpers")); + + var client = fixture.Create(); + + var response = await client.SayHelloUnaryAsync(new HelloRequest { Name = name }); + + Assert.That(response.Message, Is.EqualTo(GreeterService.FormatMessage(name))); + } + + [Test, TestAutoData] + public async Task Should_work_with_custom_auto_data_attribute(Greeter.GreeterClient client, string name) + { + var response = await client.SayHelloUnaryAsync(new HelloRequest { Name = name }); + + Assert.That(response.Message, Is.EqualTo(GreeterService.FormatMessage(name))); + } + } +} diff --git a/tests/Tests.Grpc.Server/Internal/GrpcClientSpecimenBuilderTests.cs b/tests/Tests.Grpc.Server/Internal/GrpcClientSpecimenBuilderTests.cs new file mode 100644 index 0000000..037d5d6 --- /dev/null +++ b/tests/Tests.Grpc.Server/Internal/GrpcClientSpecimenBuilderTests.cs @@ -0,0 +1,61 @@ +using AutoFixture; +using AutoFixture.Idioms; +using AutoFixture.Kernel; +using Kralizek.AutoFixture.Extensions.Internal; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.AspNetCore.TestHost; +using NUnit.Framework; +using TestGrpc; + +namespace Tests.Internal +{ + [TestFixture] + public class GrpcClientSpecimenBuilderTests + { + [Test, CustomAutoData] + public void Constructor_is_guarded(GuardClauseAssertion assertion) + { + assertion.Verify(typeof(GrpcClientSpecimenBuilder).GetConstructors()); + } + + [Test, CustomAutoData] + public void RequestSpecification_exposes_passed_specification(IRequestSpecification requestSpecification) + { + var sut = new GrpcClientSpecimenBuilder(requestSpecification); + + Assert.That(sut.RequestSpecification, Is.SameAs(requestSpecification)); + } + + [Test, CustomAutoData] + public void Default_RequestSpecification_is_HttpClientRequestSpecification() + { + var sut = new GrpcClientSpecimenBuilder(); + + Assert.That(sut.RequestSpecification, Is.InstanceOf.GrpcClientRequestSpecification>()); + } + + [Test, CustomAutoData] + public void Create_is_guarded(GuardClauseAssertion assertion) + { + assertion.Verify(typeof(GrpcClientSpecimenBuilder).GetMethod(nameof(GrpcClientSpecimenBuilder.Create))); + } + + [Test, CustomAutoData] + public void Create_returns_HttpClient_if_requested(GrpcClientSpecimenBuilder sut, IFixture fixture) + { + fixture.Inject(new WebApplicationFactory().WithWebHostBuilder(b => b.UseSolutionRelativeContentRoot(""))); + + var result = sut.Create(typeof(Greeter.GreeterClient), fixture.Create()); + + Assert.That(result, Is.InstanceOf()); + } + + [Test, CustomAutoData] + public void Create_returns_NoSpecimen_if_request_is_invalid(GrpcClientSpecimenBuilder sut, SpecimenContext context) + { + var result = sut.Create(typeof(object), context); + + Assert.That(result, Is.InstanceOf()); + } + } +} diff --git a/tests/Tests.Grpc.Server/Internal/GrpcServerCustomizationTests.cs b/tests/Tests.Grpc.Server/Internal/GrpcServerCustomizationTests.cs new file mode 100644 index 0000000..cc173e9 --- /dev/null +++ b/tests/Tests.Grpc.Server/Internal/GrpcServerCustomizationTests.cs @@ -0,0 +1,44 @@ +using AutoFixture; +using AutoFixture.Idioms; +using Kralizek.AutoFixture.Extensions.Internal; +using Microsoft.AspNetCore.Mvc.Testing; +using NUnit.Framework; +using TestGrpc; + +namespace Tests.Internal +{ + [TestFixture] + public class GrpcServerCustomizationTests + { + [Test, CustomAutoData] + public void Constructor_does_not_accept_nulls(GuardClauseAssertion assertion) => assertion.Verify(typeof(GrpcServerCustomization)); + + [Test, CustomAutoData] + public void Customize_injects_instance_of_WebApplicationFactory(GrpcServerCustomization sut, IFixture fixture) + { + sut.Customize(fixture); + + Assert.That(() => fixture.Create>(), Throws.Nothing); + } + + [Test, CustomAutoData] + public void Multiple_requests_for_WebApplicationFactory_return_same_instance(GrpcServerCustomization sut, IFixture fixture) + { + sut.Customize(fixture); + + var first = fixture.Create>(); + + var second = fixture.Create>(); + + Assert.That(first, Is.SameAs(second)); + } + + [Test, CustomAutoData] + public void Customize_registers_GrpcClientSpecimenBuilder(GrpcServerCustomization sut, IFixture fixture) + { + sut.Customize(fixture); + + Assert.That(fixture.Customizations, Has.Exactly(1).InstanceOf>()); + } + } +} diff --git a/tests/Tests.Grpc.Server/Tests.Grpc.Server.csproj b/tests/Tests.Grpc.Server/Tests.Grpc.Server.csproj new file mode 100644 index 0000000..9e5af09 --- /dev/null +++ b/tests/Tests.Grpc.Server/Tests.Grpc.Server.csproj @@ -0,0 +1,25 @@ + + + + net5.0 + + false + + + + + + + + + + + + + + + + + + + From df876389c37238aebbb8b6cb5b2a866bc8f44636 Mon Sep 17 00:00:00 2001 From: Renato Golia Date: Wed, 19 May 2021 17:17:02 +0200 Subject: [PATCH 2/3] Fixed package tags --- src/Grpc.Server/Grpc.Server.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Grpc.Server/Grpc.Server.csproj b/src/Grpc.Server/Grpc.Server.csproj index 62ee3fa..223939f 100644 --- a/src/Grpc.Server/Grpc.Server.csproj +++ b/src/Grpc.Server/Grpc.Server.csproj @@ -5,7 +5,7 @@ - autofixture;unit testing;test;mock;grpc + autofixture;unit testing;test;mock;aspnetcore;grpc;grpc services An extension to AutoFixture to easily test ASP.NET Core applications hosting GRPC services. From 66bd792ddbb9c744a6ca5bb8ab707d6e0a6d0517 Mon Sep 17 00:00:00 2001 From: Renato Golia Date: Wed, 19 May 2021 17:22:15 +0200 Subject: [PATCH 3/3] Updated repo README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ec5fff1..b53abb6 100644 --- a/README.md +++ b/README.md @@ -13,5 +13,8 @@ The following packages are available: * **[Kralizek.AutoFixture.Extensions.Grpc](src/Grpc)**
An integration between AutoFixture and [Grpc.Core.Testing](https://www.nuget.org/packages/Grpc.Core.Testing/) to test GRPC services and components consuming GRPC clients. +* **[Kralizek.AutoFixture.Extensions.Grpc.Server](src/Grpc.Server)**
+ An integration between AutoFixture, [Grpc.Core.Testing](https://www.nuget.org/packages/Grpc.Core.Testing/) and [Microsoft.AspNetCore.Mvc.Testing](https://www.nuget.org/packages/Microsoft.AspNetCore.Mvc.Testing) to test GRPC services hosted by ASP.NET Core applications. + ## License The content of this repository is licensed under the [MIT license](https://github.com/Kralizek/AutoFixtureExtensions/blob/master/LICENSE.txt).