diff --git a/src/Umbraco.Core/ApplicationContext.cs b/src/Umbraco.Core/ApplicationContext.cs index 8dae18b028..1bb34ba62e 100644 --- a/src/Umbraco.Core/ApplicationContext.cs +++ b/src/Umbraco.Core/ApplicationContext.cs @@ -216,14 +216,16 @@ namespace Umbraco.Core ResolverCollection.ResetAll(); //reset resolution itself (though this should be taken care of by resetting any of the resolvers above) Resolution.Reset(); - //reset the plugin manager - PluginManager.Current = null; - + //reset the instance objects this.ApplicationCache = null; + if (DatabaseContext != null) + { + DatabaseContext.Database.Dispose(); + } this.DatabaseContext = null; this.Services = null; - this.IsReady = false; + this._isReady = false; //set the internal field // Indicate that the instance has been disposed. _disposed = true; diff --git a/src/Umbraco.Core/TypeFinder.cs b/src/Umbraco.Core/TypeFinder.cs index 6b7627e257..b21913051d 100644 --- a/src/Umbraco.Core/TypeFinder.cs +++ b/src/Umbraco.Core/TypeFinder.cs @@ -62,7 +62,6 @@ namespace Umbraco.Core if (isHosted) { assemblies = new List(BuildManager.GetReferencedAssemblies().Cast()); - //_allAssemblies = new ReadOnlyCollection(BuildManager.GetReferencedAssemblies().Cast().ToList()); } } catch (InvalidOperationException e) @@ -71,8 +70,41 @@ namespace Umbraco.Core throw; } - assemblies = assemblies ?? new List(AppDomain.CurrentDomain.GetAssemblies().ToList()); - //_allAssemblies = _allAssemblies ?? new ReadOnlyCollection(AppDomain.CurrentDomain.GetAssemblies().ToList()); + + if (assemblies == null) + { + //NOTE: we cannot use AppDomain.CurrentDomain.GetAssemblies() because this only returns assemblies that have + // already been loaded in to the app domain, instead we will look directly into the bin folder and load each one. + var binFolder = Assembly.GetExecutingAssembly().GetAssemblyFile().Directory; + var binAssemblyFiles = Directory.GetFiles(binFolder.FullName, "*.dll", SearchOption.TopDirectoryOnly).ToList(); + assemblies = new List(); + foreach (var a in binAssemblyFiles) + { + try + { + var assName = AssemblyName.GetAssemblyName(a); + var ass = Assembly.Load(assName); + assemblies.Add(ass); + } + catch (Exception e) + { + if (e is SecurityException || e is BadImageFormatException) + { + //swallow these exceptions + } + else + { + throw; + } + } + } + } + + //if for some reason they are still no assemblies, then use the AppDomain to load in already loaded assemblies. + if (!assemblies.Any()) + { + assemblies.AddRange(AppDomain.CurrentDomain.GetAssemblies().ToList()); + } //here we are trying to get the App_Code assembly var fileExtensions = new[] {".cs", ".vb"}; //only vb and cs files are supported diff --git a/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs b/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs index 0272523fdc..647a8fd307 100644 --- a/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs +++ b/src/Umbraco.Tests/CodeFirst/CodeFirstTests.cs @@ -6,6 +6,7 @@ using Umbraco.Core; using Umbraco.Core.Configuration; using Umbraco.Core.IO; using Umbraco.Core.ObjectResolution; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Serialization; using Umbraco.Tests.CodeFirst.Definitions; using Umbraco.Tests.CodeFirst.TestModels; @@ -24,21 +25,7 @@ namespace Umbraco.Tests.CodeFirst public override void Initialize() { UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); - - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly, - typeof (ContentTypeBase).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + base.Initialize(); var serviceStackSerializer = new ServiceStackJsonSerializer(); @@ -230,17 +217,7 @@ namespace Umbraco.Tests.CodeFirst { base.TearDown(); - //reset the app context - DataTypesResolver.Reset(); - ApplicationContext.Current = null; - PluginManager.Current = null; - - string path = TestHelper.CurrentAssemblyDirectory; - AppDomain.CurrentDomain.SetData("DataDirectory", null); - SerializationService = null; - - UmbracoSettings.ResetSetters(); } } } \ No newline at end of file diff --git a/src/Umbraco.Tests/CodeFirst/TypeInheritanceTest.cs b/src/Umbraco.Tests/CodeFirst/TypeInheritanceTest.cs index e3248cf339..5973714649 100644 --- a/src/Umbraco.Tests/CodeFirst/TypeInheritanceTest.cs +++ b/src/Umbraco.Tests/CodeFirst/TypeInheritanceTest.cs @@ -24,9 +24,9 @@ namespace Umbraco.Tests.CodeFirst //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver PluginManager.Current.AssembliesToScan = new[] - { - typeof (ContentTypeBase).Assembly - }; + { + typeof (ContentTypeBase).Assembly + }; } [Test] diff --git a/src/Umbraco.Tests/LibraryTests.cs b/src/Umbraco.Tests/LibraryTests.cs index ef0d6a2aaa..38ea6da5f1 100644 --- a/src/Umbraco.Tests/LibraryTests.cs +++ b/src/Umbraco.Tests/LibraryTests.cs @@ -18,11 +18,7 @@ namespace Umbraco.Tests public class LibraryTests : BaseRoutingTest { public override void Initialize() - { - //set the current umbraco context and a published content store - PublishedContentStoreResolver.Current = new PublishedContentStoreResolver( - new DefaultPublishedContentStore()); - + { base.Initialize(); var routingContext = GetRoutingContext("/test", 1234); @@ -40,11 +36,19 @@ namespace Umbraco.Tests Core.Configuration.UmbracoSettings.SettingsFilePath = Core.IO.IOHelper.MapPath(Core.IO.SystemDirectories.Config + Path.DirectorySeparatorChar, false); } + protected override void FreezeResolution() + { + //set the current umbraco context and a published content store + PublishedContentStoreResolver.Current = new PublishedContentStoreResolver( + new DefaultPublishedContentStore()); + + base.FreezeResolution(); + } + public override void TearDown() { base.TearDown(); UmbracoContext.Current = null; - PublishedContentStoreResolver.Reset(); } protected override bool RequiresDbSetup diff --git a/src/Umbraco.Tests/Models/ContentXmlTest.cs b/src/Umbraco.Tests/Models/ContentXmlTest.cs index da20c0a9e0..b43545523f 100644 --- a/src/Umbraco.Tests/Models/ContentXmlTest.cs +++ b/src/Umbraco.Tests/Models/ContentXmlTest.cs @@ -17,34 +17,20 @@ namespace Umbraco.Tests.Models { [SetUp] public override void Initialize() - { - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - - UrlSegmentProviderResolver.Reset(); - UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(typeof(DefaultUrlSegmentProvider)); - + { base.Initialize(); } + protected override void FreezeResolution() + { + UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(typeof(DefaultUrlSegmentProvider)); + base.FreezeResolution(); + } + [TearDown] public override void TearDown() { base.TearDown(); - - //reset the app context - DataTypesResolver.Reset(); - UrlSegmentProviderResolver.Reset(); } [Test] public void Can_Generate_Xml_Representation_Of_Content() diff --git a/src/Umbraco.Tests/Models/MediaXmlTest.cs b/src/Umbraco.Tests/Models/MediaXmlTest.cs index f7ab0cd7ff..c2567d0535 100644 --- a/src/Umbraco.Tests/Models/MediaXmlTest.cs +++ b/src/Umbraco.Tests/Models/MediaXmlTest.cs @@ -17,38 +17,22 @@ namespace Umbraco.Tests.Models { [SetUp] public override void Initialize() - { - Resolution.Reset(); - - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Reset(); - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - - UrlSegmentProviderResolver.Reset(); - UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(typeof(DefaultUrlSegmentProvider)); - + { base.Initialize(); } + protected override void FreezeResolution() + { + UrlSegmentProviderResolver.Current = new UrlSegmentProviderResolver(typeof(DefaultUrlSegmentProvider)); + base.FreezeResolution(); + } + [TearDown] public override void TearDown() { base.TearDown(); - - //reset the app context - DataTypesResolver.Reset(); - UrlSegmentProviderResolver.Reset(); } + [Test] public void Can_Generate_Xml_Representation_Of_Media() { diff --git a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs index e85edb33f8..1c09e3f25c 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/ContentRepositoryTest.cs @@ -4,6 +4,7 @@ using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Models; using Umbraco.Core.Persistence; +using Umbraco.Core.Persistence.Mappers; using Umbraco.Core.Persistence.Querying; using Umbraco.Core.Persistence.Repositories; using Umbraco.Core.Persistence.UnitOfWork; @@ -20,20 +21,6 @@ namespace Umbraco.Tests.Persistence.Repositories [SetUp] public override void Initialize() { - //NOTE The DataTypesResolver is only necessary because we are using the Save method in the ContentService - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - base.Initialize(); CreateTestData(); @@ -42,9 +29,6 @@ namespace Umbraco.Tests.Persistence.Repositories [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - base.TearDown(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs index 12f9ab5b32..b022b0ff97 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/MediaRepositoryTest.cs @@ -20,21 +20,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [SetUp] public override void Initialize() - { - //NOTE The DataTypesResolver is only necessary because we are using the Save method in the MediaService - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + { base.Initialize(); CreateTestData(); @@ -305,9 +291,6 @@ namespace Umbraco.Tests.Persistence.Repositories [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - base.TearDown(); } diff --git a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs index f72b47f985..2250cdecf0 100644 --- a/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs +++ b/src/Umbraco.Tests/Persistence/Repositories/RelationRepositoryTest.cs @@ -19,21 +19,7 @@ namespace Umbraco.Tests.Persistence.Repositories { [SetUp] public override void Initialize() - { - //NOTE The DataTypesResolver is only necessary because we are using the Save method in the ContentService - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + { base.Initialize(); CreateTestData(); @@ -254,9 +240,6 @@ namespace Umbraco.Tests.Persistence.Repositories [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - base.TearDown(); } diff --git a/src/Umbraco.Tests/PublishedContent/DynamicNodeTests.cs b/src/Umbraco.Tests/PublishedContent/DynamicNodeTests.cs index 68bca138c2..3368dc7330 100644 --- a/src/Umbraco.Tests/PublishedContent/DynamicNodeTests.cs +++ b/src/Umbraco.Tests/PublishedContent/DynamicNodeTests.cs @@ -3,9 +3,9 @@ using System.IO; using NUnit.Framework; using Umbraco.Core; using Umbraco.Core.Configuration; +using Umbraco.Core.IO; using Umbraco.Tests.TestHelpers; using Umbraco.Web; -using umbraco.IO; using umbraco.MacroEngines; using umbraco.NodeFactory; using System.Linq; diff --git a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs index cb2f69de02..e8229d4f24 100644 --- a/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs +++ b/src/Umbraco.Tests/PublishedContent/PublishedContentTestBase.cs @@ -54,10 +54,7 @@ namespace Umbraco.Tests.PublishedContent public override void TearDown() { base.TearDown(); - - PropertyEditorValueConvertersResolver.Reset(); - PublishedContentStoreResolver.Reset(); - PublishedMediaStoreResolver.Reset(); + UmbracoContext.Current = null; } } diff --git a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs index 30292fb183..85b6ec9fd0 100644 --- a/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs +++ b/src/Umbraco.Tests/Publishing/PublishingStrategyTests.cs @@ -24,23 +24,9 @@ namespace Umbraco.Tests.Publishing [SetUp] public override void Initialize() { - UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); - - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - base.Initialize(); + UmbracoSettings.SettingsFilePath = IOHelper.MapPath(SystemDirectories.Config + Path.DirectorySeparatorChar, false); } [TearDown] @@ -49,19 +35,7 @@ namespace Umbraco.Tests.Publishing base.TearDown(); //ensure event handler is gone - PublishingStrategy.Publishing -= PublishingStrategyPublishing; - - //TestHelper.ClearDatabase(); - - //reset the app context - DataTypesResolver.Reset(); - RepositoryResolver.Reset(); - ApplicationContext.Current = null; - - string path = TestHelper.CurrentAssemblyDirectory; - AppDomain.CurrentDomain.SetData("DataDirectory", null); - - UmbracoSettings.ResetSetters(); + PublishingStrategy.Publishing -= PublishingStrategyPublishing; } private IContent _homePage; diff --git a/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs b/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs index 73d42a1d7d..9d61f315ce 100644 --- a/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs +++ b/src/Umbraco.Tests/Routing/NiceUrlProviderTests.cs @@ -26,12 +26,15 @@ namespace Umbraco.Tests.Routing true); SettingsForTests.SettingsFilePath = Core.IO.IOHelper.MapPath(Core.IO.SystemDirectories.Config + Path.DirectorySeparatorChar, false); - - SiteDomainHelperResolver.Reset(); - SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); - FreezeResolution(); } + protected override void FreezeResolution() + { + SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); + + base.FreezeResolution(); + } + internal override IRoutesCache GetRoutesCache() { return new DefaultRoutesCache(false); diff --git a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs index e899f930c9..6eb981fb22 100644 --- a/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs +++ b/src/Umbraco.Tests/Routing/NiceUrlsProviderWithDomainsTests.cs @@ -19,11 +19,13 @@ namespace Umbraco.Tests.Routing base.Initialize(); // ensure we can create them although the content is not in the database - TestHelper.DropForeignKeys("umbracoDomains"); + TestHelper.DropForeignKeys("umbracoDomains"); + } - SiteDomainHelperResolver.Reset(); + protected override void FreezeResolution() + { SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); - FreezeResolution(); + base.FreezeResolution(); } internal override IRoutesCache GetRoutesCache() diff --git a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs index 7cb29a0ff8..cbb8b161e9 100644 --- a/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs +++ b/src/Umbraco.Tests/Routing/RenderRouteHandlerTests.cs @@ -19,17 +19,7 @@ namespace Umbraco.Tests.Routing public class RenderRouteHandlerTests : BaseRoutingTest { public override void Initialize() - { - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - SurfaceControllerResolver.Current = new SurfaceControllerResolver( - PluginManager.Current.ResolveSurfaceControllers()); - UmbracoApiControllerResolver.Current = new UmbracoApiControllerResolver( - PluginManager.Current.ResolveUmbracoApiControllers()); - - ShortStringHelperResolver.Current = new ShortStringHelperResolver(new LegacyShortStringHelper()); - + { base.Initialize(); SettingsForTests.UmbracoPath = "~/umbraco"; @@ -41,15 +31,22 @@ namespace Umbraco.Tests.Routing webBoot.CreateRoutes(); } + protected override void FreezeResolution() + { + SurfaceControllerResolver.Current = new SurfaceControllerResolver( + PluginManager.Current.ResolveSurfaceControllers()); + UmbracoApiControllerResolver.Current = new UmbracoApiControllerResolver( + PluginManager.Current.ResolveUmbracoApiControllers()); + ShortStringHelperResolver.Current = new ShortStringHelperResolver(new LegacyShortStringHelper()); + + base.FreezeResolution(); + } + public override void TearDown() { base.TearDown(); UmbracoContext.Current = null; - RouteTable.Routes.Clear(); - SurfaceControllerResolver.Reset(); - UmbracoApiControllerResolver.Reset(); - ShortStringHelperResolver.Reset(); - PluginManager.Current = null; + RouteTable.Routes.Clear(); } Template CreateTemplate(string alias) diff --git a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs index bdfa78ae61..c12538a723 100644 --- a/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs +++ b/src/Umbraco.Tests/Routing/UmbracoModuleTests.cs @@ -25,9 +25,6 @@ namespace Umbraco.Tests.Routing { base.Initialize(); - //the module requires that the singleton is setup - ApplicationContext.Current = ApplicationContext; - //create the module _module = new UmbracoModule(); diff --git a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs index 5deee2f194..a329e0d4d3 100644 --- a/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs +++ b/src/Umbraco.Tests/Routing/UrlsWithNestedDomains.cs @@ -69,10 +69,12 @@ namespace Umbraco.Tests.Routing // ensure we can create them although the content is not in the database TestHelper.DropForeignKeys("umbracoDomains"); + } - SiteDomainHelperResolver.Reset(); + protected override void FreezeResolution() + { SiteDomainHelperResolver.Current = new SiteDomainHelperResolver(new SiteDomainHelper()); - FreezeResolution(); + base.FreezeResolution(); } internal override IRoutesCache GetRoutesCache() diff --git a/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs b/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs index 575f354429..52ef0a944b 100644 --- a/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs +++ b/src/Umbraco.Tests/Routing/uQueryGetNodeIdByUrlTests.cs @@ -51,6 +51,11 @@ namespace Umbraco.Tests.Routing Umbraco.Web.UmbracoContext.Current = routingContext.UmbracoContext; } + public override void TearDown() + { + Umbraco.Web.UmbracoContext.Current = null; + base.TearDown(); + } [TestCase(1046, "/home")] [TestCase(1173, "/home/sub1")] diff --git a/src/Umbraco.Tests/Services/BaseServiceTest.cs b/src/Umbraco.Tests/Services/BaseServiceTest.cs index 799309db75..56b94dcbf1 100644 --- a/src/Umbraco.Tests/Services/BaseServiceTest.cs +++ b/src/Umbraco.Tests/Services/BaseServiceTest.cs @@ -14,21 +14,7 @@ namespace Umbraco.Tests.Services { [SetUp] public override void Initialize() - { - - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + { base.Initialize(); CreateTestData(); @@ -37,10 +23,6 @@ namespace Umbraco.Tests.Services [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - PluginManager.Current = null; - base.TearDown(); } diff --git a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs index a6c2f418cc..bb44827ffa 100644 --- a/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs +++ b/src/Umbraco.Tests/Services/ThreadSafetyServiceTest.cs @@ -26,21 +26,7 @@ namespace Umbraco.Tests.Services [SetUp] public override void Initialize() - { - //NOTE The DataTypesResolver is only necessary because we are using the Save method in the MediaService - //this ensures its reset - PluginManager.Current = new PluginManager(false); - - //for testing, we'll specify which assemblies are scanned for the PluginTypeResolver - PluginManager.Current.AssembliesToScan = new[] - { - typeof(IDataType).Assembly, - typeof(tinyMCE3dataType).Assembly - }; - - DataTypesResolver.Current = new DataTypesResolver( - () => PluginManager.Current.ResolveDataTypes()); - + { base.Initialize(); //we need to use our own custom IDatabaseFactory for the DatabaseContext because we MUST ensure that @@ -63,9 +49,6 @@ namespace Umbraco.Tests.Services [TearDown] public override void TearDown() { - //reset the app context - DataTypesResolver.Reset(); - _error = null; //dispose! diff --git a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs index bcf51b4236..1a5c0d24c1 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseDatabaseFactoryTest.cs @@ -31,19 +31,16 @@ namespace Umbraco.Tests.TestHelpers /// The PetaPoco Database class should be used through the . /// [TestFixture, RequiresSTA] - public abstract class BaseDatabaseFactoryTest + public abstract class BaseDatabaseFactoryTest : BaseUmbracoApplicationTest { [SetUp] - public virtual void Initialize() + public override void Initialize() { - TestHelper.SetupLog4NetForTests(); - TestHelper.InitializeContentDirectories(); + base.Initialize(); - string path = TestHelper.CurrentAssemblyDirectory; + var path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", path); - PluginManager.Current = new PluginManager(false); - //Ensure that any database connections from a previous test is disposed. This is really just double safety as its also done in the TearDown. if(ApplicationContext != null && DatabaseContext != null) DatabaseContext.Database.Dispose(); @@ -65,18 +62,7 @@ namespace Umbraco.Tests.TestHelpers TearDown(); throw; } - - RepositoryResolver.Current = new RepositoryResolver( - new RepositoryFactory()); - - SqlSyntaxProvidersResolver.Current = new SqlSyntaxProvidersResolver( - new List{ typeof(MySqlSyntaxProvider), typeof(SqlCeSyntaxProvider), typeof(SqlServerSyntaxProvider) }) { CanResolveBeforeFrozen = true}; - - var asdf = typeof (ContentMapper); - - MappingResolver.Current = new MappingResolver( - () => PluginManager.Current.ResolveAssignedMapperTypes()); - + //Get the connectionstring settings from config var settings = ConfigurationManager.ConnectionStrings[Core.Configuration.GlobalSettings.UmbracoConnectionName]; ConfigurationManager.AppSettings.Set(Core.Configuration.GlobalSettings.UmbracoConnectionName, @"datalayer=SQLCE4Umbraco.SqlCEHelper,SQLCE4Umbraco;data source=|DataDirectory|\UmbracoPetaPocoTests.sdf"); @@ -90,18 +76,31 @@ namespace Umbraco.Tests.TestHelpers new DatabaseContext(new DefaultDatabaseFactory()), //assign the service context new ServiceContext(new PetaPocoUnitOfWorkProvider(), new FileUnitOfWorkProvider(), new PublishingStrategy())) { IsReady = true }; - - FreezeResolution(); - + InitializeDatabase(); //ensure the configuration matches the current version for tests SettingsForTests.ConfigurationStatus = UmbracoVersion.Current.ToString(3); } - protected virtual void FreezeResolution() + /// + /// sets up resolvers before resolution is frozen + /// + protected override void FreezeResolution() { - Resolution.Freeze(); + DataTypesResolver.Current = new DataTypesResolver( + () => PluginManager.Current.ResolveDataTypes()); + + RepositoryResolver.Current = new RepositoryResolver( + new RepositoryFactory()); + + SqlSyntaxProvidersResolver.Current = new SqlSyntaxProvidersResolver( + new List { typeof(MySqlSyntaxProvider), typeof(SqlCeSyntaxProvider), typeof(SqlServerSyntaxProvider) }) { CanResolveBeforeFrozen = true }; + + MappingResolver.Current = new MappingResolver( + () => PluginManager.Current.ResolveAssignedMapperTypes()); + + base.FreezeResolution(); } protected virtual void InitializeDatabase() @@ -113,31 +112,17 @@ namespace Umbraco.Tests.TestHelpers } [TearDown] - public virtual void TearDown() + public override void TearDown() { - DatabaseContext.Database.Dispose(); - //reset the app context - ApplicationContext.ApplicationCache.ClearAllCache(); + base.TearDown(); SqlSyntaxContext.SqlSyntaxProvider = null; //legacy API database connection close - because a unit test using PetaPoco db-layer can trigger the usage of SqlHelper we need to ensure that a possible connection is closed. SqlCeContextGuardian.CloseBackgroundConnection(); - ApplicationContext.Current = null; - MappingResolver.Reset(); - RepositoryResolver.Reset(); - SqlSyntaxProvidersResolver.Reset(); - Resolution.Reset(); - - TestHelper.CleanContentDirectories(); - string path = TestHelper.CurrentAssemblyDirectory; AppDomain.CurrentDomain.SetData("DataDirectory", null); - - PluginManager.Current = null; - SettingsForTests.Reset(); - UmbracoSettings.ResetSetters(); try { @@ -156,11 +141,6 @@ namespace Umbraco.Tests.TestHelpers } - protected ApplicationContext ApplicationContext - { - get { return ApplicationContext.Current; } - } - protected ServiceContext ServiceContext { get { return ApplicationContext.Services; } diff --git a/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs new file mode 100644 index 0000000000..e5532a5f8c --- /dev/null +++ b/src/Umbraco.Tests/TestHelpers/BaseUmbracoApplicationTest.cs @@ -0,0 +1,91 @@ +using NUnit.Framework; +using Umbraco.Core; +using Umbraco.Core.Configuration; +using Umbraco.Core.ObjectResolution; + +namespace Umbraco.Tests.TestHelpers +{ + /// + /// A base test class used for umbraco tests whcih sets up the logging, plugin manager any base resolvers, etc... and + /// ensures everything is torn down properly. + /// + [TestFixture] + public abstract class BaseUmbracoApplicationTest + { + [SetUp] + public virtual void Initialize() + { + TestHelper.SetupLog4NetForTests(); + TestHelper.InitializeContentDirectories(); + SetupPluginManager(); + + FreezeResolution(); + } + + [TearDown] + public virtual void TearDown() + { + //reset settings + SettingsForTests.Reset(); + UmbracoSettings.ResetSetters(); + TestHelper.CleanContentDirectories(); + //reset the app context, this should reset most things that require resetting like ALL resolvers + ApplicationContext.Current.DisposeIfDisposable(); + ApplicationContext.Current = null; + ResetPluginManager(); + } + + /// + /// By default this returns false which means the plugin manager will not be reset so it doesn't need to re-scan + /// all of the assemblies. Inheritors can override this if plugin manager resetting is required, generally needs + /// to be set to true if the SetupPluginManager has been overridden. + /// + protected virtual bool PluginManagerResetRequired + { + get { return false; } + } + + /// + /// Inheritors can resset the plugin manager if they choose to on teardown + /// + protected virtual void ResetPluginManager() + { + if (PluginManagerResetRequired) + { + PluginManager.Current = null; + } + } + + /// + /// Inheritors can override this if they wish to create a custom application context + /// + protected virtual void SetupApplicationContext() + { + ApplicationContext.Current = new ApplicationContext {IsReady = true}; + } + + /// + /// Inheritors can override this if they wish to setup the plugin manager differenty (i.e. specify certain assemblies to load) + /// + protected virtual void SetupPluginManager() + { + if (PluginManager.Current == null || PluginManagerResetRequired) + { + PluginManager.Current = new PluginManager(false); + } + } + + /// + /// Inheritors can override this to setup any resolvers before resolution is frozen + /// + protected virtual void FreezeResolution() + { + Resolution.Freeze(); + } + + protected ApplicationContext ApplicationContext + { + get { return ApplicationContext.Current; } + } + } +} \ No newline at end of file diff --git a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs index 2af1e1bf4e..797e935c08 100644 --- a/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs +++ b/src/Umbraco.Tests/TestHelpers/BaseUsingSqlCeSyntax.cs @@ -17,26 +17,6 @@ namespace Umbraco.Tests.TestHelpers MappingResolver.Current = new MappingResolver( () => PluginManager.Current.ResolveAssignedMapperTypes()); - //MappingResolver.Current = new MappingResolver( - // new[] - // { - // typeof(ContentMapper), - // typeof(ContentTypeMapper), - // typeof(DataTypeDefinitionMapper), - // typeof(DictionaryMapper), - // typeof(DictionaryTranslationMapper), - // typeof(LanguageMapper), - // typeof(MediaMapper), - // typeof(MediaTypeMapper), - // typeof(PropertyGroupMapper), - // typeof(PropertyMapper), - // typeof(PropertyTypeMapper), - // typeof(RelationMapper), - // typeof(RelationTypeMapper), - // typeof(ServerRegistrationMapper), - // typeof(UserMapper), - // typeof(UserTypeMapper) - // }); Resolution.Freeze(); SetUp(); } diff --git a/src/Umbraco.Tests/Umbraco.Tests.csproj b/src/Umbraco.Tests/Umbraco.Tests.csproj index 98fd3385d6..1fa8603804 100644 --- a/src/Umbraco.Tests/Umbraco.Tests.csproj +++ b/src/Umbraco.Tests/Umbraco.Tests.csproj @@ -301,6 +301,7 @@ +