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/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).
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..223939f
--- /dev/null
+++ b/src/Grpc.Server/Grpc.Server.csproj
@@ -0,0 +1,18 @@
+
+
+
+ net5.0
+
+
+
+ autofixture;unit testing;test;mock;aspnetcore;grpc;grpc services
+ 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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+