diff --git a/src/Umbraco.Core/Profiling/ProfilingViewEngine.cs b/src/Umbraco.Core/Profiling/ProfilingViewEngine.cs index 5df2b6f811..5daceb34e1 100644 --- a/src/Umbraco.Core/Profiling/ProfilingViewEngine.cs +++ b/src/Umbraco.Core/Profiling/ProfilingViewEngine.cs @@ -4,12 +4,12 @@ namespace Umbraco.Core.Profiling { public class ProfilingViewEngine: IViewEngine { - private readonly IViewEngine _inner; + internal readonly IViewEngine Inner; private readonly string _name; public ProfilingViewEngine(IViewEngine inner) { - _inner = inner; + Inner = inner; _name = inner.GetType().Name; } @@ -17,7 +17,7 @@ namespace Umbraco.Core.Profiling { using (ProfilerResolver.Current.Profiler.Step(string.Format("{0}.FindPartialView, {1}, {2}", _name, partialViewName, useCache))) { - return WrapResult(_inner.FindPartialView(controllerContext, partialViewName, useCache)); + return WrapResult(Inner.FindPartialView(controllerContext, partialViewName, useCache)); } } @@ -25,7 +25,7 @@ namespace Umbraco.Core.Profiling { using (ProfilerResolver.Current.Profiler.Step(string.Format("{0}.FindView, {1}, {2}, {3}", _name, viewName, masterName, useCache))) { - return WrapResult(_inner.FindView(controllerContext, viewName, masterName, useCache)); + return WrapResult(Inner.FindView(controllerContext, viewName, masterName, useCache)); } } @@ -41,7 +41,7 @@ namespace Umbraco.Core.Profiling { using (ProfilerResolver.Current.Profiler.Step(string.Format("{0}.ReleaseView, {1}", _name, view.GetType().Name))) { - _inner.ReleaseView(controllerContext, view); + Inner.ReleaseView(controllerContext, view); } } } diff --git a/src/Umbraco.Tests/BootManagers/WebBootManagerTester.cs b/src/Umbraco.Tests/BootManagers/WebBootManagerTester.cs new file mode 100644 index 0000000000..b3c02a058b --- /dev/null +++ b/src/Umbraco.Tests/BootManagers/WebBootManagerTester.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; +using System.Web.Mvc; +using Microsoft.Web.Mvc; +using NUnit.Framework; +using Umbraco.Core.Profiling; +using Umbraco.Web; +using Umbraco.Web.Mvc; + +namespace Umbraco.Tests.BootManagers +{ + [TestFixture] + public class WebBootManagerTester + { + [Test] + public void WrapViewEngines_HasEngines_WrapsAll() + { + IList engines = new List + { + new FixedWebFormViewEngine(), + new FixedRazorViewEngine(), + new RenderViewEngine(), + new PluginViewEngine() + }; + + WebBootManager.WrapViewEngines(engines); + + Assert.That(engines.Count, Is.EqualTo(4)); + Assert.That(engines[0], Is.InstanceOf()); + Assert.That(engines[1], Is.InstanceOf()); + Assert.That(engines[2], Is.InstanceOf()); + Assert.That(engines[3], Is.InstanceOf()); + } + + [Test] + public void WrapViewEngines_HasEngines_KeepsSortOrder() + { + IList engines = new List + { + new FixedWebFormViewEngine(), + new FixedRazorViewEngine(), + new RenderViewEngine(), + new PluginViewEngine() + }; + + WebBootManager.WrapViewEngines(engines); + + Assert.That(engines.Count, Is.EqualTo(4)); + Assert.That(((ProfilingViewEngine)engines[0]).Inner, Is.InstanceOf()); + Assert.That(((ProfilingViewEngine)engines[1]).Inner, Is.InstanceOf()); + Assert.That(((ProfilingViewEngine)engines[2]).Inner, Is.InstanceOf()); + Assert.That(((ProfilingViewEngine)engines[3]).Inner, Is.InstanceOf()); + } + + + [Test] + public void WrapViewEngines_HasProfiledEngine_AddsSameInstance() + { + var profiledEngine = new ProfilingViewEngine(new FixedRazorViewEngine()); + IList engines = new List + { + profiledEngine + }; + + WebBootManager.WrapViewEngines(engines); + + Assert.That(engines[0], Is.SameAs(profiledEngine)); + } + + [Test] + public void WrapViewEngines_CollectionIsNull_DoesNotThrow() + { + IList engines = null; + Assert.DoesNotThrow(() => WebBootManager.WrapViewEngines(engines)); + Assert.That(engines, Is.Null); + } + + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 469caa926c..0354a7a322 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -68,6 +68,10 @@ True ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll + + False + ..\Umbraco.Web.UI\bin\Microsoft.Web.Mvc.FixedDisplayModes.dll + ..\packages\Moq.4.1.1309.1617\lib\net40\Moq.dll @@ -146,6 +150,7 @@ + diff --git a/src/Umbraco.Web/WebBootManager.cs b/src/Umbraco.Web/WebBootManager.cs index 4c9757fe95..e908d5618c 100644 --- a/src/Umbraco.Web/WebBootManager.cs +++ b/src/Umbraco.Web/WebBootManager.cs @@ -128,13 +128,7 @@ namespace Umbraco.Web public override IBootManager Complete(Action afterComplete) { //Wrap viewengines in the profiling engine - IViewEngine[] engines = ViewEngines.Engines.Select(e => e).ToArray(); - ViewEngines.Engines.Clear(); - foreach (var engine in engines) - { - var wrappedEngine = engine is ProfilingViewEngine ? engine : new ProfilingViewEngine(engine); - ViewEngines.Engines.Add(wrappedEngine); - } + WrapViewEngines(ViewEngines.Engines); //set routes CreateRoutes(); @@ -147,7 +141,20 @@ namespace Umbraco.Web return this; } - /// + internal static void WrapViewEngines(IList viewEngines) + { + if (viewEngines == null || viewEngines.Count == 0) return; + + var origninaleEngines = viewEngines.Select(e => e).ToArray(); + viewEngines.Clear(); + foreach (var engine in origninaleEngines) + { + var wrappedEngine = engine is ProfilingViewEngine ? engine : new ProfilingViewEngine(engine); + viewEngines.Add(wrappedEngine); + } + } + + /// /// Creates the routes /// protected internal void CreateRoutes()