diff --git a/IISIntegration.sln b/IISIntegration.sln index 0e158af734..edde20aced 100644 --- a/IISIntegration.sln +++ b/IISIntegration.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26228.10 +VisualStudioVersion = 15.0.26405.2 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{04B1EDB6-E967-4D25-89B9-E6F8304038CD}" EndProject @@ -30,34 +30,78 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{7E80C58E build\repo.props = build\repo.props EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FunctionalTests", "test\FunctionalTests\FunctionalTests.csproj", "{A2F7598B-85E1-4F53-B307-55F2A21D39A2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IISIntegration.FunctionalTests", "test\IISIntegration.FunctionalTests\IISIntegration.FunctionalTests.csproj", "{4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x64.ActiveCfg = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x64.Build.0 = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x86.ActiveCfg = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x86.Build.0 = Debug|Any CPU {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|Any CPU.ActiveCfg = Release|Any CPU {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|Any CPU.Build.0 = Release|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x64.ActiveCfg = Release|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x64.Build.0 = Release|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x86.ActiveCfg = Release|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x86.Build.0 = Release|Any CPU {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x64.ActiveCfg = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x64.Build.0 = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x86.ActiveCfg = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x86.Build.0 = Debug|Any CPU {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|Any CPU.ActiveCfg = Release|Any CPU {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|Any CPU.Build.0 = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x64.ActiveCfg = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x64.Build.0 = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x86.ActiveCfg = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x86.Build.0 = Release|Any CPU {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x64.ActiveCfg = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x64.Build.0 = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x86.ActiveCfg = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x86.Build.0 = Debug|Any CPU {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|Any CPU.ActiveCfg = Release|Any CPU {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|Any CPU.Build.0 = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x64.ActiveCfg = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x64.Build.0 = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x86.ActiveCfg = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x86.Build.0 = Release|Any CPU {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x64.ActiveCfg = Debug|Any CPU + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x64.Build.0 = Debug|Any CPU + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x86.ActiveCfg = Debug|Any CPU + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x86.Build.0 = Debug|Any CPU {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|Any CPU.ActiveCfg = Release|Any CPU {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|Any CPU.Build.0 = Release|Any CPU - {A2F7598B-85E1-4F53-B307-55F2A21D39A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2F7598B-85E1-4F53-B307-55F2A21D39A2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2F7598B-85E1-4F53-B307-55F2A21D39A2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2F7598B-85E1-4F53-B307-55F2A21D39A2}.Release|Any CPU.Build.0 = Release|Any CPU + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x64.ActiveCfg = Release|Any CPU + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x64.Build.0 = Release|Any CPU + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x86.ActiveCfg = Release|Any CPU + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x86.Build.0 = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x64.Build.0 = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x86.Build.0 = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|Any CPU.Build.0 = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x64.ActiveCfg = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x64.Build.0 = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x86.ActiveCfg = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -67,6 +111,6 @@ Global {8B3446E8-E6A8-4591-AA63-A95837C6E97C} = {04B1EDB6-E967-4D25-89B9-E6F8304038CD} {4106DB10-E09F-480E-9CE6-B39235512EE6} = {EF30B533-D715-421A-92B7-92FEF460AC9C} {F54715C3-88D8-49E3-A291-C13570FE81FC} = {EF30B533-D715-421A-92B7-92FEF460AC9C} - {A2F7598B-85E1-4F53-B307-55F2A21D39A2} = {EF30B533-D715-421A-92B7-92FEF460AC9C} + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA} = {EF30B533-D715-421A-92B7-92FEF460AC9C} EndGlobalSection EndGlobal diff --git a/test/FunctionalTests/HelloWorldTest.cs b/test/IISIntegration.FunctionalTests/HelloWorldTest.cs similarity index 81% rename from test/FunctionalTests/HelloWorldTest.cs rename to test/IISIntegration.FunctionalTests/HelloWorldTest.cs index 6911525fbb..ac9b449c14 100644 --- a/test/FunctionalTests/HelloWorldTest.cs +++ b/test/IISIntegration.FunctionalTests/HelloWorldTest.cs @@ -1,26 +1,23 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.IO; -using System.Net.Http; -using System.Threading.Tasks; using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.xunit; using Microsoft.AspNetCore.Testing.xunit; using Microsoft.Extensions.Logging; +using System; +using System.IO; +using System.Threading.Tasks; using Xunit; using Xunit.Abstractions; using Xunit.Sdk; namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests { - public class HelloWorldTests + public class HelloWorldTests : LoggedTest { - private readonly ITestOutputHelper _output; - - public HelloWorldTests(ITestOutputHelper output) + public HelloWorldTests(ITestOutputHelper output) : base(output) { - _output = output; } [ConditionalTheory] @@ -58,13 +55,11 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests public async Task HelloWorld(ServerType serverType, RuntimeFlavor runtimeFlavor, RuntimeArchitecture architecture, ApplicationType applicationType) { - var loggerFactory = new LoggerFactory() - .AddXunit(_output) - .AddDebug(); - var logger = loggerFactory.CreateLogger($"HelloWorld:{serverType}:{runtimeFlavor}:{architecture}"); - - using (logger.BeginScope("HelloWorldTest")) + var testName = $"HelloWorld_{serverType}_{runtimeFlavor}_{architecture}"; + using (StartLog(out var loggerFactory, testName)) { + var logger = loggerFactory.CreateLogger("HelloWorldTest"); + var deploymentParameters = new DeploymentParameters(Helpers.GetTestSitesPath(), serverType, runtimeFlavor, architecture) { EnvironmentName = "HelloWorld", // Will pick the Start class named 'StartupHelloWorld', @@ -77,17 +72,12 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests using (var deployer = ApplicationDeployerFactory.Create(deploymentParameters, loggerFactory)) { var deploymentResult = await deployer.DeployAsync(); - var httpClientHandler = new HttpClientHandler(); - var httpClient = new HttpClient(httpClientHandler) - { - BaseAddress = new Uri(deploymentResult.ApplicationBaseUri), - Timeout = TimeSpan.FromSeconds(5), - }; + deploymentResult.HttpClient.Timeout = TimeSpan.FromSeconds(5); // Request to base address and check if various parts of the body are rendered & measure the cold startup time. var response = await RetryHelper.RetryRequest(() => { - return httpClient.GetAsync(string.Empty); + return deploymentResult.HttpClient.GetAsync(string.Empty); }, logger, deploymentResult.HostShutdownToken, retryCount: 30); var responseText = await response.Content.ReadAsStringAsync(); @@ -95,11 +85,11 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests { Assert.Equal("Hello World", responseText); - response = await httpClient.GetAsync("/Path%3F%3F?query"); + response = await deploymentResult.HttpClient.GetAsync("/Path%3F%3F?query"); responseText = await response.Content.ReadAsStringAsync(); Assert.Equal("/Path??", responseText); - response = await httpClient.GetAsync("/Query%3FPath?query?"); + response = await deploymentResult.HttpClient.GetAsync("/Query%3FPath?query?"); responseText = await response.Content.ReadAsStringAsync(); Assert.Equal("?query?", responseText); } diff --git a/test/FunctionalTests/Helpers.cs b/test/IISIntegration.FunctionalTests/Helpers.cs similarity index 100% rename from test/FunctionalTests/Helpers.cs rename to test/IISIntegration.FunctionalTests/Helpers.cs diff --git a/test/FunctionalTests/Http.config b/test/IISIntegration.FunctionalTests/Http.config similarity index 100% rename from test/FunctionalTests/Http.config rename to test/IISIntegration.FunctionalTests/Http.config diff --git a/test/FunctionalTests/Https.config b/test/IISIntegration.FunctionalTests/Https.config similarity index 100% rename from test/FunctionalTests/Https.config rename to test/IISIntegration.FunctionalTests/Https.config diff --git a/test/FunctionalTests/HttpsTest.cs b/test/IISIntegration.FunctionalTests/HttpsTest.cs similarity index 91% rename from test/FunctionalTests/HttpsTest.cs rename to test/IISIntegration.FunctionalTests/HttpsTest.cs index 9d8ab47e85..aa89c8e997 100644 --- a/test/FunctionalTests/HttpsTest.cs +++ b/test/IISIntegration.FunctionalTests/HttpsTest.cs @@ -12,19 +12,17 @@ using Microsoft.Extensions.Logging; using Xunit; using Xunit.Abstractions; using Xunit.Sdk; +using Microsoft.AspNetCore.Server.IntegrationTesting.xunit; namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests { // IIS Express preregisteres 44300-44399 ports with SSL bindings. // So these tests always have to use ports in this range, and we can't rely on OS-allocated ports without a whole lot of ceremony around // creating self-signed certificates and registering SSL bindings with HTTP.sys - public class HttpsTest + public class HttpsTest : LoggedTest { - private readonly ITestOutputHelper _output; - - public HttpsTest(ITestOutputHelper output) + public HttpsTest(ITestOutputHelper output) : base(output) { - _output = output; } [ConditionalTheory] @@ -49,13 +47,11 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests public async Task HttpsHelloWorld(ServerType serverType, RuntimeFlavor runtimeFlavor, RuntimeArchitecture architecture, string applicationBaseUrl, ApplicationType applicationType) { - var loggerFactory = new LoggerFactory() - .AddConsole() - .AddDebug(); - var logger = loggerFactory.CreateLogger($"HttpsHelloWorld:{serverType}:{runtimeFlavor}:{architecture}"); - - using (logger.BeginScope("HttpsHelloWorldTest")) + var testName = $"HttpsHelloWorld_{serverType}_{runtimeFlavor}_{architecture}"; + using (StartLog(out var loggerFactory, testName)) { + var logger = loggerFactory.CreateLogger("HttpsHelloWorldTest"); + var deploymentParameters = new DeploymentParameters(Helpers.GetTestSitesPath(), serverType, runtimeFlavor, architecture) { ApplicationBaseUriHint = applicationBaseUrl, @@ -71,11 +67,8 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests var deploymentResult = await deployer.DeployAsync(); var handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = (a, b, c, d) => true; - var httpClient = new HttpClient(handler) - { - BaseAddress = new Uri(deploymentResult.ApplicationBaseUri), - Timeout = TimeSpan.FromSeconds(5), - }; + var httpClient = deploymentResult.CreateHttpClient(handler); + httpClient.Timeout = TimeSpan.FromSeconds(5); // Request to base address and check if various parts of the body are rendered & measure the cold startup time. var response = await RetryHelper.RetryRequest(() => @@ -138,13 +131,11 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests public async Task HttpsHelloWorldCerts(ServerType serverType, RuntimeFlavor runtimeFlavor, RuntimeArchitecture architecture, string applicationBaseUrl, ApplicationType applicationType, bool sendClientCert) { - var loggerFactory = new LoggerFactory() - .AddXunit(_output) - .AddDebug(); - var logger = loggerFactory.CreateLogger($"HttpsHelloWorldCerts:{serverType}:{runtimeFlavor}:{architecture}"); - - using (logger.BeginScope("HttpsHelloWorldTest")) + var testName = $"HttpsHelloWorldCerts_{serverType}_{runtimeFlavor}_{architecture}"; + using (StartLog(out var loggerFactory, testName)) { + var logger = loggerFactory.CreateLogger("HttpsHelloWorldTest"); + var deploymentParameters = new DeploymentParameters(Helpers.GetTestSitesPath(), serverType, runtimeFlavor, architecture) { ApplicationBaseUriHint = applicationBaseUrl, @@ -167,7 +158,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests Assert.NotNull(clientCert); handler.ClientCertificates.Add(clientCert); } - var httpClient = new HttpClient(handler) { BaseAddress = new Uri(deploymentResult.ApplicationBaseUri) }; + var httpClient = deploymentResult.CreateHttpClient(handler); // Request to base address and check if various parts of the body are rendered & measure the cold startup time. var response = await RetryHelper.RetryRequest(() => diff --git a/test/FunctionalTests/FunctionalTests.csproj b/test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj similarity index 100% rename from test/FunctionalTests/FunctionalTests.csproj rename to test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj diff --git a/test/FunctionalTests/NtlmAuthentation.config b/test/IISIntegration.FunctionalTests/NtlmAuthentation.config similarity index 100% rename from test/FunctionalTests/NtlmAuthentation.config rename to test/IISIntegration.FunctionalTests/NtlmAuthentation.config diff --git a/test/FunctionalTests/NtlmAuthentationTest.cs b/test/IISIntegration.FunctionalTests/NtlmAuthentationTest.cs similarity index 86% rename from test/FunctionalTests/NtlmAuthentationTest.cs rename to test/IISIntegration.FunctionalTests/NtlmAuthentationTest.cs index cf4995a2fe..5509e14f8f 100644 --- a/test/FunctionalTests/NtlmAuthentationTest.cs +++ b/test/IISIntegration.FunctionalTests/NtlmAuthentationTest.cs @@ -13,16 +13,14 @@ using Microsoft.Extensions.Logging; using Xunit; using Xunit.Sdk; using Xunit.Abstractions; +using Microsoft.AspNetCore.Server.IntegrationTesting.xunit; namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests { - public class NtlmAuthenticationTests + public class NtlmAuthenticationTests : LoggedTest { - private readonly ITestOutputHelper _output; - - public NtlmAuthenticationTests(ITestOutputHelper output) + public NtlmAuthenticationTests(ITestOutputHelper output) : base(output) { - _output = output; } [ConditionalTheory] @@ -47,13 +45,11 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests public async Task NtlmAuthentication(ServerType serverType, RuntimeFlavor runtimeFlavor, RuntimeArchitecture architecture, ApplicationType applicationType) { - var loggerFactory = new LoggerFactory() - .AddXunit(_output) - .AddDebug(); - var logger = loggerFactory.CreateLogger($"NtlmAuthentication:{serverType}:{runtimeFlavor}:{architecture}"); - - using (logger.BeginScope("NtlmAuthenticationTest")) + var testName = $"NtlmAuthentication_{serverType}_{runtimeFlavor}_{architecture}"; + using (StartLog(out var loggerFactory, testName)) { + var logger = loggerFactory.CreateLogger("NtlmAuthenticationTest"); + var windowsRid = architecture == RuntimeArchitecture.x64 ? "win7-x64" : "win7-x86"; @@ -73,12 +69,8 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests using (var deployer = ApplicationDeployerFactory.Create(deploymentParameters, loggerFactory)) { var deploymentResult = await deployer.DeployAsync(); - var httpClientHandler = new HttpClientHandler(); - var httpClient = new HttpClient(httpClientHandler) - { - BaseAddress = new Uri(deploymentResult.ApplicationBaseUri), - Timeout = TimeSpan.FromSeconds(5), - }; + var httpClient = deploymentResult.HttpClient; + httpClient.Timeout = TimeSpan.FromSeconds(5); // Request to base address and check if various parts of the body are rendered & measure the cold startup time. var response = await RetryHelper.RetryRequest(() => @@ -114,8 +106,8 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests responseText = await response.Content.ReadAsStringAsync(); Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode); - httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true }; - httpClient = new HttpClient(httpClientHandler) { BaseAddress = new Uri(deploymentResult.ApplicationBaseUri) }; + var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true }; + httpClient = deploymentResult.CreateHttpClient(httpClientHandler); response = await httpClient.GetAsync("/Anonymous"); responseText = await response.Content.ReadAsStringAsync(); diff --git a/test/FunctionalTests/Properties/AssemblyInfo.cs b/test/IISIntegration.FunctionalTests/Properties/AssemblyInfo.cs similarity index 100% rename from test/FunctionalTests/Properties/AssemblyInfo.cs rename to test/IISIntegration.FunctionalTests/Properties/AssemblyInfo.cs