// 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.Linq; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNetCore.TestHost { public static class WebHostBuilderExtensions { public static IWebHostBuilder ConfigureTestServices(this IWebHostBuilder webHostBuilder, Action servicesConfiguration) { if (webHostBuilder == null) { throw new ArgumentNullException(nameof(webHostBuilder)); } if (servicesConfiguration == null) { throw new ArgumentNullException(nameof(servicesConfiguration)); } webHostBuilder.ConfigureServices( s => s.AddSingleton( new ConfigureTestServicesStartupConfigureServicesFilter(servicesConfiguration))); return webHostBuilder; } public static IWebHostBuilder ConfigureTestContainer(this IWebHostBuilder webHostBuilder, Action servicesConfiguration) { if (webHostBuilder == null) { throw new ArgumentNullException(nameof(webHostBuilder)); } if (servicesConfiguration == null) { throw new ArgumentNullException(nameof(servicesConfiguration)); } webHostBuilder.ConfigureServices( s => s.AddSingleton>( new ConfigureTestServicesStartupConfigureContainerFilter(servicesConfiguration))); return webHostBuilder; } public static IWebHostBuilder UseSolutionRelativeContentRoot( this IWebHostBuilder builder, string solutionRelativePath, string solutionName = "*.sln") { return builder.UseSolutionRelativeContentRoot(solutionRelativePath, AppContext.BaseDirectory, solutionName); } public static IWebHostBuilder UseSolutionRelativeContentRoot( this IWebHostBuilder builder, string solutionRelativePath, string applicationBasePath, string solutionName = "*.sln") { if (solutionRelativePath == null) { throw new ArgumentNullException(nameof(solutionRelativePath)); } if (applicationBasePath == null) { throw new ArgumentNullException(nameof(applicationBasePath)); } var directoryInfo = new DirectoryInfo(applicationBasePath); do { var solutionPath = Directory.EnumerateFiles(directoryInfo.FullName, solutionName).FirstOrDefault(); if (solutionPath != null) { builder.UseContentRoot(Path.GetFullPath(Path.Combine(directoryInfo.FullName, solutionRelativePath))); return builder; } directoryInfo = directoryInfo.Parent; } while (directoryInfo.Parent != null); throw new InvalidOperationException($"Solution root could not be located using application root {applicationBasePath}."); } private class ConfigureTestServicesStartupConfigureServicesFilter : IStartupConfigureServicesFilter { private readonly Action _servicesConfiguration; public ConfigureTestServicesStartupConfigureServicesFilter(Action servicesConfiguration) { if (servicesConfiguration == null) { throw new ArgumentNullException(nameof(servicesConfiguration)); } _servicesConfiguration = servicesConfiguration; } public Action ConfigureServices(Action next) => serviceCollection => { next(serviceCollection); _servicesConfiguration(serviceCollection); }; } private class ConfigureTestServicesStartupConfigureContainerFilter : IStartupConfigureContainerFilter { private readonly Action _servicesConfiguration; public ConfigureTestServicesStartupConfigureContainerFilter(Action containerConfiguration) { if (containerConfiguration == null) { throw new ArgumentNullException(nameof(containerConfiguration)); } _servicesConfiguration = containerConfiguration; } public Action ConfigureContainer(Action next) => containerBuilder => { next(containerBuilder); _servicesConfiguration(containerBuilder); }; } } }