// 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.Collections.Generic; using Microsoft.AspNet.Hosting.Fakes; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Runtime; using Xunit; namespace Microsoft.AspNet.Hosting.Tests { public class HostingServicesFacts { [Fact] public void CreateImportsServices() { // Arrange var fallbackServices = new ServiceCollection(); fallbackServices.AddSingleton(); var instance = new FakeService(); var factoryInstance = new FakeFactoryService(instance); fallbackServices.AddInstance(instance); fallbackServices.AddTransient(); fallbackServices.AddSingleton(serviceProvider => factoryInstance); fallbackServices.AddTransient(); // Don't register in manifest fallbackServices.AddInstance(new ServiceManifest( new Type[] { typeof(IFakeServiceInstance), typeof(IFakeService), typeof(IFakeSingletonService), typeof(IFactoryService), typeof(INonexistentService) })); var services = HostingServices.Create(fallbackServices.BuildServiceProvider()); // Act var provider = services.BuildServiceProvider(); var singleton = provider.GetRequiredService(); var transient = provider.GetRequiredService(); var factory = provider.GetRequiredService(); // Assert Assert.Same(singleton, provider.GetRequiredService()); Assert.NotSame(transient, provider.GetRequiredService()); Assert.Same(instance, provider.GetRequiredService()); Assert.Same(factoryInstance, factory); Assert.Same(factory.FakeService, instance); Assert.Null(provider.GetService()); Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services } [Fact] public void CanHideImportedServices() { // Arrange var fallbackServices = new ServiceCollection(); var fallbackInstance = new FakeService(); fallbackServices.AddInstance(fallbackInstance); fallbackServices.AddInstance(new ServiceManifest(new Type[] { typeof(IFakeService) })); var services = HostingServices.Create(fallbackServices.BuildServiceProvider()); var realInstance = new FakeService(); services.AddInstance(realInstance); // Act var provider = services.BuildServiceProvider(); // Assert Assert.Equal(realInstance, provider.GetRequiredService()); } [Fact] public void CreateThrowsWithNoManifest() { // Arrange var fallbackServices = new ServiceCollection(); fallbackServices.AddSingleton(); var instance = new FakeService(); fallbackServices.AddInstance(instance); fallbackServices.AddTransient(); // Act var exception = Assert.Throws(() => HostingServices.Create(fallbackServices.BuildServiceProvider())); // Assert Assert.Equal($"No service for type '{typeof(IServiceManifest).FullName}' has been registered.", exception.Message); } private class ServiceManifest : IServiceManifest { public ServiceManifest(IEnumerable services) { Services = services; } public IEnumerable Services { get; private set; } } private class FakeFactoryService : IFactoryService { public FakeFactoryService(FakeService service) { FakeService = service; } public IFakeService FakeService { get; private set; } public int Value { get; private set; } } } }