Move identity functional test website to generic host (#10974)
This commit is contained in:
parent
f7f80fdbaa
commit
5d091df908
|
|
@ -1,8 +1,10 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Data.Common;
|
using System.Data.Common;
|
||||||
|
using System.Linq;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Identity.DefaultUI.WebSite;
|
using Identity.DefaultUI.WebSite;
|
||||||
|
|
@ -12,16 +14,45 @@ using Microsoft.AspNetCore.Identity.UI.Services;
|
||||||
using Microsoft.AspNetCore.Mvc.Authorization;
|
using Microsoft.AspNetCore.Mvc.Authorization;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.EntityFrameworkCore.Diagnostics;
|
using Microsoft.EntityFrameworkCore.Diagnostics;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Identity.FunctionalTests
|
namespace Microsoft.AspNetCore.Identity.FunctionalTests
|
||||||
{
|
{
|
||||||
public static class FunctionalTestsServiceCollectionExtensions
|
public static class FunctionalTestsServiceCollectionExtensions
|
||||||
{
|
{
|
||||||
public static IServiceCollection SetupTestDatabase<TContext>(this IServiceCollection services, DbConnection connection) where TContext : DbContext =>
|
public static IServiceCollection SetupTestDatabase<TContext>(this IServiceCollection services, DbConnection connection) where TContext : DbContext
|
||||||
services.AddDbContext<TContext>(options =>
|
{
|
||||||
options.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning))
|
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<TContext>));
|
||||||
.UseSqlite(connection));
|
if (descriptor != null)
|
||||||
|
{
|
||||||
|
services.Remove(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
services.AddScoped(p =>
|
||||||
|
DbContextOptionsFactory<TContext>(
|
||||||
|
p,
|
||||||
|
(sp, options) => options
|
||||||
|
.ConfigureWarnings(b => b.Log(CoreEventId.ManyServiceProvidersCreatedWarning))
|
||||||
|
.UseSqlite(connection)));
|
||||||
|
|
||||||
|
return services;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static DbContextOptions<TContext> DbContextOptionsFactory<TContext>(
|
||||||
|
IServiceProvider applicationServiceProvider,
|
||||||
|
Action<IServiceProvider, DbContextOptionsBuilder> optionsAction)
|
||||||
|
where TContext : DbContext
|
||||||
|
{
|
||||||
|
var builder = new DbContextOptionsBuilder<TContext>(
|
||||||
|
new DbContextOptions<TContext>(new Dictionary<Type, IDbContextOptionsExtension>()));
|
||||||
|
|
||||||
|
builder.UseApplicationServiceProvider(applicationServiceProvider);
|
||||||
|
|
||||||
|
optionsAction?.Invoke(applicationServiceProvider, builder);
|
||||||
|
|
||||||
|
return builder.Options;
|
||||||
|
}
|
||||||
|
|
||||||
public static IServiceCollection SetupTestThirdPartyLogin(this IServiceCollection services) =>
|
public static IServiceCollection SetupTestThirdPartyLogin(this IServiceCollection services) =>
|
||||||
services.AddAuthentication()
|
services.AddAuthentication()
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using Identity.DefaultUI.WebSite;
|
||||||
using Microsoft.AspNetCore.Authentication;
|
using Microsoft.AspNetCore.Authentication;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc.Testing;
|
using Microsoft.AspNetCore.Mvc.Testing;
|
||||||
|
|
@ -9,6 +10,7 @@ using Microsoft.AspNetCore.TestHost;
|
||||||
using Microsoft.Data.Sqlite;
|
using Microsoft.Data.Sqlite;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Microsoft.Extensions.Hosting;
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Identity.FunctionalTests
|
namespace Microsoft.AspNetCore.Identity.FunctionalTests
|
||||||
{
|
{
|
||||||
|
|
@ -27,6 +29,12 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
|
||||||
ClientOptions.BaseAddress = new Uri("https://localhost");
|
ClientOptions.BaseAddress = new Uri("https://localhost");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected override IHostBuilder CreateHostBuilder()
|
||||||
|
{
|
||||||
|
Program.UseStartup = false;
|
||||||
|
return base.CreateHostBuilder();
|
||||||
|
}
|
||||||
|
|
||||||
protected override void ConfigureWebHost(IWebHostBuilder builder)
|
protected override void ConfigureWebHost(IWebHostBuilder builder)
|
||||||
{
|
{
|
||||||
base.ConfigureWebHost(builder);
|
base.ConfigureWebHost(builder);
|
||||||
|
|
@ -42,18 +50,25 @@ namespace Microsoft.AspNetCore.Identity.FunctionalTests
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override TestServer CreateServer(IWebHostBuilder builder)
|
protected override IHost CreateHost(IHostBuilder builder)
|
||||||
{
|
{
|
||||||
var result = base.CreateServer(builder);
|
var result = base.CreateHost(builder);
|
||||||
EnsureDatabaseCreated(result);
|
EnsureDatabaseCreated(result.Services);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void EnsureDatabaseCreated(TestServer server)
|
protected override TestServer CreateServer(IWebHostBuilder builder)
|
||||||
{
|
{
|
||||||
using (var scope = server.Host.Services.CreateScope())
|
var result = base.CreateServer(builder);
|
||||||
|
EnsureDatabaseCreated(result.Host.Services);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void EnsureDatabaseCreated(IServiceProvider services)
|
||||||
|
{
|
||||||
|
using (var scope = services.CreateScope())
|
||||||
{
|
{
|
||||||
scope.ServiceProvider.GetService<TContext>().Database.EnsureCreated();
|
scope.ServiceProvider.GetService<TContext>()?.Database?.EnsureCreated();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Reference Include="Microsoft.AspNetCore" />
|
||||||
<Reference Include="Microsoft.AspNetCore.Authentication.Cookies" />
|
<Reference Include="Microsoft.AspNetCore.Authentication.Cookies" />
|
||||||
<Reference Include="Microsoft.AspNetCore.Authentication.Facebook" />
|
<Reference Include="Microsoft.AspNetCore.Authentication.Facebook" />
|
||||||
<Reference Include="Microsoft.AspNetCore.Authentication.Google" />
|
<Reference Include="Microsoft.AspNetCore.Authentication.Google" />
|
||||||
|
|
@ -36,6 +37,7 @@
|
||||||
<Reference Include="Microsoft.Extensions.Configuration.CommandLine" />
|
<Reference Include="Microsoft.Extensions.Configuration.CommandLine" />
|
||||||
<Reference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" />
|
<Reference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" />
|
||||||
<Reference Include="Microsoft.Extensions.Configuration.UserSecrets" />
|
<Reference Include="Microsoft.Extensions.Configuration.UserSecrets" />
|
||||||
|
<Reference Include="Microsoft.Extensions.Hosting" />
|
||||||
<Reference Include="Microsoft.Extensions.Logging.Configuration" />
|
<Reference Include="Microsoft.Extensions.Logging.Configuration" />
|
||||||
<Reference Include="Microsoft.Extensions.Logging.Console" />
|
<Reference Include="Microsoft.Extensions.Logging.Console" />
|
||||||
<Reference Include="Microsoft.Extensions.Logging.Debug" />
|
<Reference Include="Microsoft.Extensions.Logging.Debug" />
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
|
|
||||||
|
|
@ -14,60 +14,19 @@ namespace Identity.DefaultUI.WebSite
|
||||||
{
|
{
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
CreateWebHostBuilder(args).Build().Run();
|
CreateHostBuilder(args).Build().Run();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
|
public static bool UseStartup { get; set; } = true;
|
||||||
{
|
|
||||||
var builder = new WebHostBuilder()
|
|
||||||
.UseKestrel((builderContext, options) =>
|
|
||||||
{
|
|
||||||
options.Configure(builderContext.Configuration.GetSection("Kestrel"));
|
|
||||||
})
|
|
||||||
.UseContentRoot(Directory.GetCurrentDirectory())
|
|
||||||
.ConfigureAppConfiguration((hostingContext, config) =>
|
|
||||||
{
|
|
||||||
var env = hostingContext.HostingEnvironment;
|
|
||||||
|
|
||||||
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
|
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||||
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: false);
|
Host.CreateDefaultBuilder(args)
|
||||||
|
.ConfigureWebHostDefaults(webBuilder =>
|
||||||
if (env.IsDevelopment())
|
{
|
||||||
|
if (UseStartup)
|
||||||
{
|
{
|
||||||
var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
|
webBuilder.UseStartup<Startup>();
|
||||||
if (appAssembly != null)
|
|
||||||
{
|
|
||||||
config.AddUserSecrets(appAssembly, optional: true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
config.AddEnvironmentVariables();
|
|
||||||
|
|
||||||
if (args != null)
|
|
||||||
{
|
|
||||||
config.AddCommandLine(args);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.ConfigureLogging((hostingContext, logging) =>
|
|
||||||
{
|
|
||||||
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
|
|
||||||
logging.AddConsole();
|
|
||||||
logging.AddDebug();
|
|
||||||
})
|
|
||||||
.UseIISIntegration()
|
|
||||||
.UseDefaultServiceProvider((context, options) =>
|
|
||||||
{
|
|
||||||
options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
if (args != null)
|
|
||||||
{
|
|
||||||
builder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());
|
|
||||||
}
|
|
||||||
|
|
||||||
builder.UseStartup<Startup>();
|
|
||||||
|
|
||||||
return builder;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
// 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.
|
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using Microsoft.AspNetCore.Builder;
|
using Microsoft.AspNetCore.Builder;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
|
|
@ -51,7 +53,6 @@ namespace Identity.DefaultUI.WebSite
|
||||||
.AddEntityFrameworkStores<TContext>();
|
.AddEntityFrameworkStores<TContext>();
|
||||||
|
|
||||||
services.AddMvc();
|
services.AddMvc();
|
||||||
|
|
||||||
services.AddSingleton<IFileVersionProvider, FileVersionProvider>();
|
services.AddSingleton<IFileVersionProvider, FileVersionProvider>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,7 +60,7 @@ namespace Identity.DefaultUI.WebSite
|
||||||
public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
public virtual void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||||
{
|
{
|
||||||
// This prevents running out of file watchers on some linux machines
|
// This prevents running out of file watchers on some linux machines
|
||||||
((PhysicalFileProvider)env.WebRootFileProvider).UseActivePolling = false;
|
DisableFilePolling(env);
|
||||||
|
|
||||||
if (env.IsDevelopment())
|
if (env.IsDevelopment())
|
||||||
{
|
{
|
||||||
|
|
@ -87,5 +88,36 @@ namespace Identity.DefaultUI.WebSite
|
||||||
endpoints.MapRazorPages();
|
endpoints.MapRazorPages();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static void DisableFilePolling(IWebHostEnvironment env)
|
||||||
|
{
|
||||||
|
var pendingProviders = new Stack<IFileProvider>();
|
||||||
|
pendingProviders.Push(env.WebRootFileProvider);
|
||||||
|
while (pendingProviders.TryPop(out var currentProvider))
|
||||||
|
{
|
||||||
|
switch (currentProvider)
|
||||||
|
{
|
||||||
|
case PhysicalFileProvider physical:
|
||||||
|
physical.UseActivePolling = false;
|
||||||
|
break;
|
||||||
|
case IFileProvider staticWebAssets when staticWebAssets.GetType().Name == "StaticWebAssetsFileProvider":
|
||||||
|
GetUnderlyingProvider(staticWebAssets).UseActivePolling = false;
|
||||||
|
break;
|
||||||
|
case CompositeFileProvider composite:
|
||||||
|
foreach (var childFileProvider in composite.FileProviders)
|
||||||
|
{
|
||||||
|
pendingProviders.Push(childFileProvider);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new InvalidOperationException("Unknown provider");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PhysicalFileProvider GetUnderlyingProvider(IFileProvider staticWebAssets)
|
||||||
|
{
|
||||||
|
return (PhysicalFileProvider) staticWebAssets.GetType().GetProperty("InnerProvider").GetValue(staticWebAssets);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ namespace Identity.DefaultUI.WebSite
|
||||||
public override void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
public override void Configure(IApplicationBuilder app, IWebHostEnvironment env)
|
||||||
{
|
{
|
||||||
// This prevents running out of file watchers on some linux machines
|
// This prevents running out of file watchers on some linux machines
|
||||||
((PhysicalFileProvider)env.WebRootFileProvider).UseActivePolling = false;
|
DisableFilePolling(env);
|
||||||
|
|
||||||
if (env.IsDevelopment())
|
if (env.IsDevelopment())
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue