aspnetcore/src/Microsoft.AspNet.TestHost/TestServer.cs

125 lines
4.1 KiB
C#

// Copyright (c) Microsoft Open Technologies, Inc. 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.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Hosting.Server;
using Microsoft.Framework.ConfigurationModel;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.DependencyInjection.Fallback;
using Microsoft.Framework.Runtime;
using Microsoft.Framework.Runtime.Infrastructure;
namespace Microsoft.AspNet.TestHost
{
public class TestServer : IServerFactory, IDisposable
{
private static readonly string ServerName = typeof(TestServer).FullName;
private static readonly ServerInformation ServerInfo = new ServerInformation();
private Func<object, Task> _appDelegate;
private IDisposable _appInstance;
private bool _disposed = false;
public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action<IBuilder> appStartup)
{
var env = serviceProvider.GetService<IApplicationEnvironment>();
if (env == null)
{
throw new ArgumentException("IApplicationEnvironment couldn't be resolved.", "serviceProvider");
}
HostingContext hostContext = new HostingContext()
{
ApplicationName = env.ApplicationName,
Configuration = config,
ServerFactory = this,
Services = serviceProvider,
ApplicationStartup = appStartup
};
var engine = serviceProvider.GetService<IHostingEngine>();
_appInstance = engine.Start(hostContext);
}
public static TestServer Create(Action<IBuilder> app)
{
return Create(provider: CallContextServiceLocator.Locator.ServiceProvider, app: app);
}
public static TestServer Create(IServiceProvider provider, Action<IBuilder> app)
{
var collection = new ServiceCollection();
var hostingServices = HostingServices.GetDefaultServices();
var config = new Configuration();
collection.Add(hostingServices);
var serviceProvider = collection.BuildServiceProvider(provider);
return new TestServer(config, serviceProvider, app);
}
public HttpMessageHandler CreateHandler()
{
return new ClientHandler(Invoke);
}
public HttpClient CreateClient()
{
return new HttpClient(CreateHandler()) { BaseAddress = new Uri("http://localhost/") };
}
/// <summary>
/// Begins constructing a request message for submission.
/// </summary>
/// <param name="path"></param>
/// <returns><see cref="RequestBuilder"/> to use in constructing additional request details.</returns>
public RequestBuilder CreateRequest(string path)
{
return new RequestBuilder(this, path);
}
public IServerInformation Initialize(IConfiguration configuration)
{
return ServerInfo;
}
public IDisposable Start(IServerInformation serverInformation, Func<object, Task> application)
{
if (!(serverInformation.GetType() == typeof(ServerInformation)))
{
throw new ArgumentException(string.Format("The server must be {0}", ServerName), "serverInformation");
}
_appDelegate = application;
return this;
}
public Task Invoke(object env)
{
if (_disposed)
{
throw new ObjectDisposedException(GetType().FullName);
}
return _appDelegate(env);
}
public void Dispose()
{
_disposed = true;
_appInstance.Dispose();
}
private class ServerInformation : IServerInformation
{
public string Name
{
get { return TestServer.ServerName; }
}
}
}
}