// 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 _appDelegate; private IDisposable _appInstance; private bool _disposed = false; public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) { var env = serviceProvider.GetService(); 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(); _appInstance = engine.Start(hostContext); } public static TestServer Create(Action app) { return Create(provider: CallContextServiceLocator.Locator.ServiceProvider, app: app); } public static TestServer Create(IServiceProvider provider, Action 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/") }; } /// /// Begins constructing a request message for submission. /// /// /// to use in constructing additional request details. public RequestBuilder CreateRequest(string path) { return new RequestBuilder(this, path); } public IServerInformation Initialize(IConfiguration configuration) { return ServerInfo; } public IDisposable Start(IServerInformation serverInformation, Func 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; } } } } }