// 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.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; using Microsoft.Dnx.Runtime; using Microsoft.Framework.WebEncoders; #if DNX451 using Moq; #endif using Xunit; namespace Microsoft.AspNet.Diagnostics.Tests { public class RuntimeInfoMiddlewareTest { private const string DefaultPath = "/runtimeinfo"; [Fact] public void DefaultPageOptions_HasDefaultPath() { // Arrange & act var options = new RuntimeInfoPageOptions(); // Assert Assert.Equal(DefaultPath, options.Path.Value); } #if DNX451 [Fact] public void CreateRuntimeInfoModel_GetsTheVersionAndAllPackages() { // Arrage var libraries = new [] { new Library("LibInfo1", string.Empty, "Path1", string.Empty, Enumerable.Empty(), Enumerable.Empty()), new Library("LibInfo2", string.Empty, "Path2", string.Empty, Enumerable.Empty(), Enumerable.Empty()) }; var libraryManagerMock = new Mock(MockBehavior.Strict); libraryManagerMock.Setup(l => l.GetLibraries()).Returns(libraries); var runtimeEnvironmentMock = new Mock(MockBehavior.Strict); runtimeEnvironmentMock.Setup(r => r.OperatingSystem).Returns("Windows"); runtimeEnvironmentMock.Setup(r => r.RuntimeArchitecture).Returns("x64"); runtimeEnvironmentMock.Setup(r => r.RuntimeType).Returns("clr"); runtimeEnvironmentMock.Setup(r => r.RuntimeVersion).Returns("1.0.0"); RequestDelegate next = _ => { return Task.FromResult(null); }; var middleware = new RuntimeInfoMiddleware( next, new RuntimeInfoPageOptions(), libraryManagerMock.Object, runtimeEnvironmentMock.Object); // Act var model = middleware.CreateRuntimeInfoModel(); // Assert Assert.Equal("1.0.0", model.Version); Assert.Equal("Windows", model.OperatingSystem); Assert.Equal("clr", model.RuntimeType); Assert.Equal("x64", model.RuntimeArchitecture); Assert.Same(libraries, model.References); } [Fact] public async void Invoke_WithNonMatchingPath_IgnoresRequest() { // Arrange var libraryManagerMock = new Mock(MockBehavior.Strict); var runtimeEnvironmentMock = new Mock(MockBehavior.Strict); RequestDelegate next = _ => { return Task.FromResult(null); }; var middleware = new RuntimeInfoMiddleware( next, new RuntimeInfoPageOptions(), libraryManagerMock.Object, runtimeEnvironmentMock.Object); var contextMock = new Mock(MockBehavior.Strict); contextMock .SetupGet(c => c.Request.Path) .Returns(new PathString("/nonmatchingpath")); // Act await middleware.Invoke(contextMock.Object); // Assert contextMock.VerifyGet(c => c.Request.Path, Times.Once()); } [Fact] public async void Invoke_WithMatchingPath_ReturnsInfoPage() { // Arrange var libraryManagerMock = new Mock(MockBehavior.Strict); libraryManagerMock.Setup(l => l.GetLibraries()).Returns(new [] { new Library("LibInfo1", "1.0.0-beta1", "Path1", string.Empty, Enumerable.Empty(), Enumerable.Empty()), new Library("LibInfo2", "1.0.0-beta2", "Path2", string.Empty, Enumerable.Empty(), Enumerable.Empty()) }); var runtimeEnvironmentMock = new Mock(MockBehavior.Strict); runtimeEnvironmentMock.Setup(r => r.OperatingSystem).Returns("Windows"); runtimeEnvironmentMock.Setup(r => r.RuntimeArchitecture).Returns("x64"); runtimeEnvironmentMock.Setup(r => r.RuntimeType).Returns("clr"); runtimeEnvironmentMock.Setup(r => r.RuntimeVersion).Returns("1.0.0"); RequestDelegate next = _ => { return Task.FromResult(null); }; var middleware = new RuntimeInfoMiddleware( next, new RuntimeInfoPageOptions(), libraryManagerMock.Object, runtimeEnvironmentMock.Object); var buffer = new byte[4096]; using (var responseStream = new MemoryStream(buffer)) { var contextMock = new Mock(MockBehavior.Strict); contextMock .SetupGet(c => c.Request.Path) .Returns(new PathString("/runtimeinfo")); contextMock .SetupGet(c => c.Response.Body) .Returns(responseStream); contextMock .SetupGet(c => c.ApplicationServices) .Returns(() => null); // Act await middleware.Invoke(contextMock.Object); // Assert string response = Encoding.UTF8.GetString(buffer); Assert.Contains("

Runtime Version: 1.0.0

", response); Assert.Contains("

Operating System: Windows

", response); Assert.Contains("

Runtime Architecture: x64

", response); Assert.Contains("

Runtime Type: clr

", response); Assert.Contains("LibInfo1", response); Assert.Contains("1.0.0-beta1", response); Assert.Contains("Path1", response); Assert.Contains("LibInfo2", response); Assert.Contains("1.0.0-beta2", response); Assert.Contains("Path2", response); } } [Fact] public async void Invoke_WithMatchingPath_ReturnsInfoPage_UsingCustomHtmlEncoder() { // Arrange var libraryManagerMock = new Mock(MockBehavior.Strict); libraryManagerMock.Setup(l => l.GetLibraries()).Returns(new [] { new Library("LibInfo1", "1.0.0-beta1", "Path1", string.Empty, Enumerable.Empty(), Enumerable.Empty()), }); var runtimeEnvironmentMock = new Mock(MockBehavior.Strict); runtimeEnvironmentMock.Setup(r => r.OperatingSystem).Returns("Windows"); runtimeEnvironmentMock.Setup(r => r.RuntimeArchitecture).Returns("x64"); runtimeEnvironmentMock.Setup(r => r.RuntimeType).Returns("clr"); runtimeEnvironmentMock.Setup(r => r.RuntimeVersion).Returns("1.0.0"); RequestDelegate next = _ => { return Task.FromResult(null); }; var middleware = new RuntimeInfoMiddleware( next, new RuntimeInfoPageOptions(), libraryManagerMock.Object, runtimeEnvironmentMock.Object); var buffer = new byte[4096]; using (var responseStream = new MemoryStream(buffer)) { var contextMock = new Mock(MockBehavior.Strict); contextMock .SetupGet(c => c.Request.Path) .Returns(new PathString("/runtimeinfo")); contextMock .SetupGet(c => c.Response.Body) .Returns(responseStream); contextMock .SetupGet(c => c.ApplicationServices) .Returns(new ServiceCollection(). AddInstance(new CustomHtmlEncoder()). BuildServiceProvider()); // Act await middleware.Invoke(contextMock.Object); // Assert string response = Encoding.UTF8.GetString(buffer); Assert.True(response.Contains("[LibInfo1]")); Assert.True(response.Contains("[1.0.0-beta1]")); Assert.True(response.Contains("[Path1]")); } } #endif private class CustomHtmlEncoder : IHtmlEncoder { public string HtmlEncode(string value) { return "[" + value + "]"; } public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) { throw new NotImplementedException(); } public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) { throw new NotImplementedException(); } } } }