From 633f0b619731b3a5b647b718b95e005f0234203c Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Wed, 2 Nov 2011 22:04:14 -0700 Subject: [PATCH 1/8] PathProvider. visit us for all of your pathing needs. --- NzbDrone.App.Test/Fixtures.cs | 2 +- .../EnviromentProviderTest.cs | 8 -- NzbDrone.Common.Test/Fixtures.cs | 2 +- NzbDrone.Common/EnviromentProvider.cs | 35 +----- NzbDrone.Common/NzbDrone.Common.csproj | 1 + NzbDrone.Common/PathProvider.cs | 111 ++++++++++++++++++ NzbDrone.Core.Test/Framework/Fixtures.cs | 36 +++--- NzbDrone.Core.Test/Framework/TestBase.cs | 49 +++++++- .../JobTests/BannerDownloadJobTest.cs | 23 ++-- .../ProviderTests/ConfigFileProviderTest.cs | 53 ++++----- .../ProviderTests/TvDbProviderTest.cs | 30 ++--- .../PreformUpdateFixture.cs | 12 +- NzbDrone.Core/CentralDispatch.cs | 12 +- NzbDrone.Core/Datastore/Connection.cs | 37 ++++-- .../Instrumentation/LogConfiguration.cs | 12 +- .../Providers/Core/ConfigFileProvider.cs | 21 ++-- .../Providers/Jobs/BannerDownloadJob.cs | 12 +- NzbDrone.Core/Providers/TvDbProvider.cs | 8 +- NzbDrone.Core/Providers/UpdateProvider.cs | 12 +- .../{LoggingFixtures.cs => LoggingTest.cs} | 6 +- .../NzbDrone.Test.Common.csproj | 2 +- NzbDrone.Update.Test/Fixtures.cs | 2 +- NzbDrone.Web/Global.asax.cs | 11 +- config.xml | 2 + 24 files changed, 313 insertions(+), 186 deletions(-) create mode 100644 NzbDrone.Common/PathProvider.cs rename NzbDrone.Test.Common/{LoggingFixtures.cs => LoggingTest.cs} (88%) create mode 100644 config.xml diff --git a/NzbDrone.App.Test/Fixtures.cs b/NzbDrone.App.Test/Fixtures.cs index b3a5640d5..4089933e0 100644 --- a/NzbDrone.App.Test/Fixtures.cs +++ b/NzbDrone.App.Test/Fixtures.cs @@ -3,6 +3,6 @@ using NUnit.Framework; using NzbDrone.Test.Common; [SetUpFixture] -public class Fixtures : LoggingFixtures +public class Fixtures : LoggingTest { } diff --git a/NzbDrone.Common.Test/EnviromentProviderTest.cs b/NzbDrone.Common.Test/EnviromentProviderTest.cs index b4d7d6c3d..68da7c761 100644 --- a/NzbDrone.Common.Test/EnviromentProviderTest.cs +++ b/NzbDrone.Common.Test/EnviromentProviderTest.cs @@ -17,14 +17,6 @@ namespace NzbDrone.Common.Test enviromentController.IsUserInteractive.Should().BeTrue(); } - [Test] - public void Log_path_should_not_be_empty() - { - enviromentController.LogPath.Should().NotBeBlank(); - Path.IsPathRooted(enviromentController.LogPath).Should().BeTrue("Path is not rooted"); - - } - [Test] public void StartupPath_should_not_be_empty() { diff --git a/NzbDrone.Common.Test/Fixtures.cs b/NzbDrone.Common.Test/Fixtures.cs index b3a5640d5..4089933e0 100644 --- a/NzbDrone.Common.Test/Fixtures.cs +++ b/NzbDrone.Common.Test/Fixtures.cs @@ -3,6 +3,6 @@ using NUnit.Framework; using NzbDrone.Test.Common; [SetUpFixture] -public class Fixtures : LoggingFixtures +public class Fixtures : LoggingTest { } diff --git a/NzbDrone.Common/EnviromentProvider.cs b/NzbDrone.Common/EnviromentProvider.cs index fe7b78451..6ff76153f 100644 --- a/NzbDrone.Common/EnviromentProvider.cs +++ b/NzbDrone.Common/EnviromentProvider.cs @@ -32,11 +32,6 @@ namespace NzbDrone.Common } } - public virtual String LogPath - { - get { return Environment.CurrentDirectory; } - } - public virtual bool IsUserInteractive { get { return Environment.UserInteractive; } @@ -68,26 +63,7 @@ namespace NzbDrone.Common } } - public virtual string WebRoot - { - get - { - return Path.Combine(ApplicationPath, "NzbDrone.Web"); - } - } - - public virtual string AppDataPath - { - get - { - var path = Path.Combine(WebRoot, "App_Data"); - if (!Directory.Exists(path)) - Directory.CreateDirectory(path); - - return path; - } - } - + public virtual string StartUpPath { get @@ -111,15 +87,6 @@ namespace NzbDrone.Common } - - public virtual String TempPath - { - get - { - return Path.GetTempPath(); - } - } - private static bool ContainsIIS(DirectoryInfo dir) { return dir.GetDirectories(IIS_FOLDER_NAME).Length != 0; diff --git a/NzbDrone.Common/NzbDrone.Common.csproj b/NzbDrone.Common/NzbDrone.Common.csproj index 4297ab830..04df7f468 100644 --- a/NzbDrone.Common/NzbDrone.Common.csproj +++ b/NzbDrone.Common/NzbDrone.Common.csproj @@ -50,6 +50,7 @@ + diff --git a/NzbDrone.Common/PathProvider.cs b/NzbDrone.Common/PathProvider.cs new file mode 100644 index 000000000..9925e72b5 --- /dev/null +++ b/NzbDrone.Common/PathProvider.cs @@ -0,0 +1,111 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Reflection; + +namespace NzbDrone.Common +{ + public class PathProvider + { + + private const string WEB_FOLDER = "NzbDrone.Web"; + private const string APP_DATA = "App_Data"; + + private const string LOG_CONFIG_FILE = "log.config"; + private const string APP_CONFIG_FILE = "config.xml"; + + private const string NZBDRONE_DB_FILE = "nzbdrone.sdf"; + private const string LOG_DB_FILE = "log.sdf"; + + public const string UPDATE_SANDBOX_FOLDER_NAME = "nzbdrone_update"; + + private readonly string _applicationPath; + + + public PathProvider(EnviromentProvider enviromentProvider) + { + _applicationPath = enviromentProvider.ApplicationPath; + } + + public PathProvider() + { + + } + + public virtual String LogPath + { + get { return Environment.CurrentDirectory; } + } + + public virtual string WebRoot + { + get + { + return Path.Combine(_applicationPath, WEB_FOLDER); + } + } + + public virtual string AppData + { + get + { + var path = Path.Combine(WebRoot, APP_DATA); + if (!Directory.Exists(path)) + Directory.CreateDirectory(path); + + return path; + } + } + + public virtual string NzbDronoeDbFile + { + get + { + + return Path.Combine(AppData, NZBDRONE_DB_FILE); + } + } + + public virtual string LogDbFile + { + get + { + + return Path.Combine(AppData, LOG_DB_FILE); + } + } + + public virtual String SystemTemp + { + get + { + return Path.GetTempPath(); + } + } + + public string LogConfigFile + { + get { return Path.Combine(WebRoot, LOG_CONFIG_FILE); } + } + + public string AppConfigFile + { + get { return Path.Combine(_applicationPath, APP_CONFIG_FILE); } + } + + public string BannerPath + { + get { return Path.Combine(WebRoot, "Content", "Images", "Banners"); } + } + + public string CacheFolder + { + get { return Path.Combine(AppData, "Cache"); } + } + + public string UpdateSandboxFolder + { + get { return Path.Combine(SystemTemp, UPDATE_SANDBOX_FOLDER_NAME); } + } + } +} \ No newline at end of file diff --git a/NzbDrone.Core.Test/Framework/Fixtures.cs b/NzbDrone.Core.Test/Framework/Fixtures.cs index b5e8a4e52..a1fa89703 100644 --- a/NzbDrone.Core.Test/Framework/Fixtures.cs +++ b/NzbDrone.Core.Test/Framework/Fixtures.cs @@ -4,22 +4,22 @@ using NUnit.Framework; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common; -[SetUpFixture] -public class Fixtures : LoggingFixtures -{ - [SetUp] - public void SetUp() - { - var oldDbFiles = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.sdf", SearchOption.AllDirectories); - foreach (var file in oldDbFiles) - { - try - { - File.Delete(file); - } - catch { } - } +//[SetUpFixture] +//public class Fixtures : LoggingFixtures +//{ +// //[SetUp] +// //public void SetUp() +// //{ +// // var oldDbFiles = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.sdf", SearchOption.AllDirectories); +// // foreach (var file in oldDbFiles) +// // { +// // try +// // { +// // File.Delete(file); +// // } +// // catch { } +// // } - MockLib.CreateDataBaseTemplate(); - } -} +// // MockLib.CreateDataBaseTemplate(); +// //} +//} diff --git a/NzbDrone.Core.Test/Framework/TestBase.cs b/NzbDrone.Core.Test/Framework/TestBase.cs index 344c1efd1..427b01c5c 100644 --- a/NzbDrone.Core.Test/Framework/TestBase.cs +++ b/NzbDrone.Core.Test/Framework/TestBase.cs @@ -1,13 +1,47 @@ using System.IO; +using AutoMoq; using NUnit.Framework; +using Ninject; +using NzbDrone.Common; using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.Framework { - public class TestBase + public class TestBase : LoggingTest // ReSharper disable InconsistentNaming { + static TestBase() + { + InitLogging(); + + var oldDbFiles = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.sdf", SearchOption.AllDirectories); + foreach (var file in oldDbFiles) + { + try + { + File.Delete(file); + } + catch { } + } + + MockLib.CreateDataBaseTemplate(); + } + + protected StandardKernel LiveKernel = null; + protected AutoMoqer Mocker = null; + + protected string VirtualPath + { + get + { + var virtualPath = Path.Combine(TempFolder, "VirtualNzbDrone"); + if (!Directory.Exists(virtualPath)) Directory.CreateDirectory(virtualPath); + + return virtualPath; + } + } + [SetUp] public virtual void SetupBase() { @@ -18,6 +52,9 @@ namespace NzbDrone.Core.Test.Framework } Directory.CreateDirectory(TempFolder); + + LiveKernel = new StandardKernel(); + Mocker = new AutoMoqer(); } [TearDown] @@ -27,6 +64,16 @@ namespace NzbDrone.Core.Test.Framework } + protected void WithTempAsStartUpPath() + { + Mocker.GetMock() + .SetupGet(c => c.ApplicationPath) + .Returns(VirtualPath); + + Mocker.Resolve(); + } + + protected string TempFolder { get { return Path.Combine(Directory.GetCurrentDirectory(), "temp"); } diff --git a/NzbDrone.Core.Test/JobTests/BannerDownloadJobTest.cs b/NzbDrone.Core.Test/JobTests/BannerDownloadJobTest.cs index 58a678bdd..59b50e506 100644 --- a/NzbDrone.Core.Test/JobTests/BannerDownloadJobTest.cs +++ b/NzbDrone.Core.Test/JobTests/BannerDownloadJobTest.cs @@ -92,7 +92,8 @@ namespace NzbDrone.Core.Test.JobTests var fakeSeries = Builder.CreateListOfSize(10) .Build(); - var path = Path.Combine(new EnviromentProvider().WebRoot, "Content", "Images", "Banners"); + + var pathProvider = Mocker.Resolve(); var mocker = new AutoMoqer(MockBehavior.Strict); mocker.Resolve(); @@ -104,42 +105,42 @@ namespace NzbDrone.Core.Test.JobTests .Returns(fakeSeries); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "1.jpg"))) + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "1.jpg"))) .Throws(new WebException()); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "2.jpg"))); + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "2.jpg"))); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "3.jpg"))) + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "3.jpg"))) .Throws(new WebException()); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "4.jpg"))); + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "4.jpg"))); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "5.jpg"))) + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "5.jpg"))) .Throws(new WebException()); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "6.jpg"))); + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "6.jpg"))); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "7.jpg"))) + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "7.jpg"))) .Throws(new WebException()); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "8.jpg"))); + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "8.jpg"))); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "9.jpg"))) + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "9.jpg"))) .Throws(new WebException()); mocker.GetMock() - .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(path, "10.jpg"))); + .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "10.jpg"))); mocker.GetMock() diff --git a/NzbDrone.Core.Test/ProviderTests/ConfigFileProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/ConfigFileProviderTest.cs index 704fc9857..6b56ff532 100644 --- a/NzbDrone.Core.Test/ProviderTests/ConfigFileProviderTest.cs +++ b/NzbDrone.Core.Test/ProviderTests/ConfigFileProviderTest.cs @@ -2,6 +2,7 @@ using AutoMoq; using FluentAssertions; using NUnit.Framework; +using NzbDrone.Common; using NzbDrone.Core.Model; using NzbDrone.Core.Providers.Core; using NzbDrone.Core.Test.Framework; @@ -15,14 +16,15 @@ namespace NzbDrone.Core.Test.ProviderTests [SetUp] public void SetUp() { + WithTempAsStartUpPath(); + //Reset config file - var mocker = new AutoMoqer(); - var configFile = mocker.Resolve().ConfigFile; + var configFile = Mocker.Resolve().AppConfigFile; if (File.Exists(configFile)) File.Delete(configFile); - mocker.Resolve().CreateDefaultConfigFile(); + Mocker.Resolve().CreateDefaultConfigFile(); } [Test] @@ -31,10 +33,8 @@ namespace NzbDrone.Core.Test.ProviderTests const string key = "Port"; const string value = "8989"; - var mocker = new AutoMoqer(); - //Act - var result = mocker.Resolve().GetValue(key, value); + var result = Mocker.Resolve().GetValue(key, value); //Assert result.Should().Be(value); @@ -46,10 +46,8 @@ namespace NzbDrone.Core.Test.ProviderTests const string key = "Port"; const int value = 8989; - var mocker = new AutoMoqer(); - //Act - var result = mocker.Resolve().GetValueInt(key, value); + var result = Mocker.Resolve().GetValueInt(key, value); //Assert result.Should().Be(value); @@ -64,7 +62,7 @@ namespace NzbDrone.Core.Test.ProviderTests var mocker = new AutoMoqer(); //Act - var result = mocker.Resolve().GetValueBoolean(key, value); + var result = Mocker.Resolve().GetValueBoolean(key, value); //Assert result.Should().BeTrue(); @@ -76,7 +74,7 @@ namespace NzbDrone.Core.Test.ProviderTests var mocker = new AutoMoqer(); //Act - var result = mocker.Resolve().LaunchBrowser; + var result = Mocker.Resolve().LaunchBrowser; //Assert result.Should().Be(true); @@ -87,10 +85,8 @@ namespace NzbDrone.Core.Test.ProviderTests { const int value = 8989; - var mocker = new AutoMoqer(); - //Act - var result = mocker.Resolve().Port; + var result = Mocker.Resolve().Port; //Assert result.Should().Be(value); @@ -102,13 +98,11 @@ namespace NzbDrone.Core.Test.ProviderTests const string key = "LaunchBrowser"; const bool value = false; - var mocker = new AutoMoqer(); - //Act - mocker.Resolve().SetValue(key, value); + Mocker.Resolve().SetValue(key, value); //Assert - var result = mocker.Resolve().LaunchBrowser; + var result = Mocker.Resolve().LaunchBrowser; result.Should().Be(value); } @@ -118,13 +112,11 @@ namespace NzbDrone.Core.Test.ProviderTests const string key = "Port"; const int value = 12345; - var mocker = new AutoMoqer(); - //Act - mocker.Resolve().SetValue(key, value); + Mocker.Resolve().SetValue(key, value); //Assert - var result = mocker.Resolve().Port; + var result = Mocker.Resolve().Port; result.Should().Be(value); } @@ -134,10 +126,8 @@ namespace NzbDrone.Core.Test.ProviderTests const string key = "Hello"; const string value = "World"; - var mocker = new AutoMoqer(); - //Act - var result = mocker.Resolve().GetValue(key, value); + var result = Mocker.Resolve().GetValue(key, value); //Assert result.Should().Be(value); @@ -149,10 +139,8 @@ namespace NzbDrone.Core.Test.ProviderTests const string key = "Hello"; const string value = "World"; - var mocker = new AutoMoqer(); - //Act - var result = mocker.Resolve().GetValue(key, value, "Universe"); + var result = Mocker.Resolve().GetValue(key, value, "Universe"); //Assert result.Should().Be(value); @@ -161,10 +149,9 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void GetAuthenticationType_No_Existing_Value() { - var mocker = new AutoMoqer(); //Act - var result = mocker.Resolve().AuthenticationType; + var result = Mocker.Resolve().AuthenticationType; //Assert result.Should().Be(AuthenticationType.Anonymous); @@ -173,11 +160,11 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void GetAuthenticationType_Windows() { - var mocker = new AutoMoqer(); - mocker.Resolve().SetValue("AuthenticationType", 1); + + Mocker.Resolve().SetValue("AuthenticationType", 1); //Act - var result = mocker.Resolve().AuthenticationType; + var result = Mocker.Resolve().AuthenticationType; //Assert result.Should().Be(AuthenticationType.Windows); diff --git a/NzbDrone.Core.Test/ProviderTests/TvDbProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/TvDbProviderTest.cs index a7e570261..cb894ebf6 100644 --- a/NzbDrone.Core.Test/ProviderTests/TvDbProviderTest.cs +++ b/NzbDrone.Core.Test/ProviderTests/TvDbProviderTest.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Linq; using FluentAssertions; using NUnit.Framework; +using Ninject; using NzbDrone.Common; using NzbDrone.Core.Providers; using NzbDrone.Core.Test.Framework; @@ -16,30 +17,31 @@ namespace NzbDrone.Core.Test.ProviderTests // ReSharper disable InconsistentNaming public class TvDbProviderTest : TestBase { + private TvDbProvider tvDbProvider; + + [SetUp] + public void Setup() + { + tvDbProvider = LiveKernel.Get(); + } + [TestCase("The Simpsons")] [TestCase("Family Guy")] [TestCase("South Park")] public void successful_search(string title) { - var result = new TvDbProvider(new EnviromentProvider()).SearchSeries(title); + var result = tvDbProvider.SearchSeries(title); result.Should().NotBeEmpty(); result[0].SeriesName.Should().Be(title); } - - - - [Test] public void no_search_result() { - //setup - var tvdbProvider = new TvDbProvider(new EnviromentProvider()); - //act - var result = tvdbProvider.SearchSeries(Guid.NewGuid().ToString()); + var result = tvDbProvider.SearchSeries(Guid.NewGuid().ToString()); //assert result.Should().BeEmpty(); @@ -49,11 +51,8 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void none_unique_season_episode_number() { - //setup - var tvdbProvider = new TvDbProvider(new EnviromentProvider()); - //act - var result = tvdbProvider.GetSeries(75978, true);//Family guy + var result = tvDbProvider.GetSeries(75978, true);//Family guy //Asserts that when episodes are grouped by Season/Episode each group contains maximum of //one item. @@ -65,11 +64,8 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void American_dad_fix() { - //setup - var tvdbProvider = new TvDbProvider(new EnviromentProvider()); - //act - var result = tvdbProvider.GetSeries(73141, true); + var result = tvDbProvider.GetSeries(73141, true); var seasonsNumbers = result.Episodes.Select(e => e.SeasonNumber) .Distinct().ToList(); diff --git a/NzbDrone.Core.Test/ProviderTests/UpdateProviderTests/PreformUpdateFixture.cs b/NzbDrone.Core.Test/ProviderTests/UpdateProviderTests/PreformUpdateFixture.cs index 68e28f688..a6d09601d 100644 --- a/NzbDrone.Core.Test/ProviderTests/UpdateProviderTests/PreformUpdateFixture.cs +++ b/NzbDrone.Core.Test/ProviderTests/UpdateProviderTests/PreformUpdateFixture.cs @@ -22,8 +22,8 @@ namespace NzbDrone.Core.Test.ProviderTests.UpdateProviderTests public void setup() { _mocker = new AutoMoqer(MockBehavior.Strict); - _mocker.GetMock() - .SetupGet(c => c.TempPath).Returns(TempFolder); + _mocker.GetMock() + .SetupGet(c => c.SystemTemp).Returns(TempFolder); } @@ -39,11 +39,11 @@ namespace NzbDrone.Core.Test.ProviderTests.UpdateProviderTests }; _mocker.GetMock().Setup( - c => c.DownloadFile(updatePackage.Url, Path.Combine(TempFolder, UpdateProvider.SandboxFolderName ,updatePackage.FileName))); + c => c.DownloadFile(updatePackage.Url, Path.Combine(TempFolder, PathProvider.UPDATE_SANDBOX_FOLDER_NAME, updatePackage.FileName))); _mocker.GetMock().Setup( - c => c.ExtractArchive(Path.Combine(TempFolder, UpdateProvider.SandboxFolderName, updatePackage.FileName), - Path.Combine(TempFolder, UpdateProvider.SandboxFolderName))); + c => c.ExtractArchive(Path.Combine(TempFolder, PathProvider.UPDATE_SANDBOX_FOLDER_NAME, updatePackage.FileName), + Path.Combine(TempFolder, PathProvider.UPDATE_SANDBOX_FOLDER_NAME))); _mocker.Resolve().PreformUpdate(updatePackage); } @@ -52,7 +52,7 @@ namespace NzbDrone.Core.Test.ProviderTests.UpdateProviderTests public void Should_download_and_extract_to_temp_folder() { - var updateSubFolder = new DirectoryInfo(Path.Combine(TempFolder, UpdateProvider.SandboxFolderName)); + var updateSubFolder = new DirectoryInfo(Path.Combine(TempFolder, PathProvider.UPDATE_SANDBOX_FOLDER_NAME)); var updatePackage = new UpdatePackage { diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index 37a3fb385..4d805a29e 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -39,7 +39,9 @@ namespace NzbDrone.Core { BindKernel(); - MigrationsHelper.Run(Connection.MainConnectionString, true); + var mainConnectionString = _kernel.Get().MainConnectionString; + + MigrationsHelper.Run(mainConnectionString, true); LogConfiguration.RegisterDatabaseLogger(_kernel.Get()); @@ -59,9 +61,11 @@ namespace NzbDrone.Core Logger.Debug("Binding Ninject's Kernel"); _kernel = new StandardKernel(); - _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.MainConnectionString)).InTransientScope(); - _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString, false)).WhenInjectedInto().InSingletonScope(); - _kernel.Bind().ToMethod(c => Connection.GetPetaPocoDb(Connection.LogConnectionString)).WhenInjectedInto().InSingletonScope(); + var connection = _kernel.Get(); + + _kernel.Bind().ToMethod(c => connection.GetMainPetaPocoDb()).InTransientScope(); + _kernel.Bind().ToMethod(c => connection.GetLogPetaPocoDb(false)).WhenInjectedInto().InSingletonScope(); + _kernel.Bind().ToMethod(c => connection.GetLogPetaPocoDb()).WhenInjectedInto().InSingletonScope(); _kernel.Bind().ToSelf().InSingletonScope(); } diff --git a/NzbDrone.Core/Datastore/Connection.cs b/NzbDrone.Core/Datastore/Connection.cs index 7c05d377f..8dfc38859 100644 --- a/NzbDrone.Core/Datastore/Connection.cs +++ b/NzbDrone.Core/Datastore/Connection.cs @@ -10,38 +10,51 @@ using PetaPoco; namespace NzbDrone.Core.Datastore { - public static class Connection + public class Connection { - private static EnviromentProvider _enviromentProvider = new EnviromentProvider(); + private readonly PathProvider _pathProvider; - static Connection() + public Connection(PathProvider pathProvider) { - Database.Mapper = new CustomeMapper(); + _pathProvider = pathProvider; } - - public static string GetConnectionString(string path) + static Connection() { - //return String.Format("Data Source={0};Version=3;Cache Size=30000;Pooling=true;Default Timeout=2", path); - return String.Format("Data Source={0}", path); + Database.Mapper = new CustomeMapper(); } - public static String MainConnectionString + public String MainConnectionString { get { - return GetConnectionString(Path.Combine(_enviromentProvider.AppDataPath, "nzbdrone.sdf")); + return GetConnectionString(_pathProvider.NzbDronoeDbFile); } } - public static String LogConnectionString + public String LogConnectionString { get { - return GetConnectionString(Path.Combine(_enviromentProvider.AppDataPath, "log.sdf")); + return GetConnectionString(_pathProvider.LogDbFile); } } + public static string GetConnectionString(string path) + { + //return String.Format("Data Source={0};Version=3;Cache Size=30000;Pooling=true;Default Timeout=2", path); + return String.Format("Data Source={0}", path); + } + + public IDatabase GetMainPetaPocoDb(Boolean profiled = true) + { + return GetPetaPocoDb(MainConnectionString, profiled); + } + + public IDatabase GetLogPetaPocoDb(Boolean profiled = true) + { + return GetPetaPocoDb(LogConnectionString, profiled); + } public static IDatabase GetPetaPocoDb(string connectionString, Boolean profiled = true) { diff --git a/NzbDrone.Core/Instrumentation/LogConfiguration.cs b/NzbDrone.Core/Instrumentation/LogConfiguration.cs index d94c6d520..8ce6037e7 100644 --- a/NzbDrone.Core/Instrumentation/LogConfiguration.cs +++ b/NzbDrone.Core/Instrumentation/LogConfiguration.cs @@ -7,17 +7,23 @@ using NzbDrone.Core.Providers; namespace NzbDrone.Core.Instrumentation { - public static class LogConfiguration + public class LogConfiguration { + private readonly PathProvider _pathProvider; - public static void Setup() + public LogConfiguration(PathProvider pathProvider) + { + _pathProvider = pathProvider; + } + + public void Setup() { if (Common.EnviromentProvider.IsProduction) { LogManager.ThrowExceptions = false; } - LogManager.Configuration = new XmlLoggingConfiguration(Path.Combine(new EnviromentProvider().WebRoot, "log.config"), false); + LogManager.Configuration = new XmlLoggingConfiguration(_pathProvider.LogConfigFile, false); Common.LogConfiguration.RegisterConsoleLogger(LogLevel.Info, "NzbDrone.Web.MvcApplication"); Common.LogConfiguration.RegisterConsoleLogger(LogLevel.Info, "NzbDrone.Core.CentralDispatch"); diff --git a/NzbDrone.Core/Providers/Core/ConfigFileProvider.cs b/NzbDrone.Core/Providers/Core/ConfigFileProvider.cs index 5047fec37..25ffac54e 100644 --- a/NzbDrone.Core/Providers/Core/ConfigFileProvider.cs +++ b/NzbDrone.Core/Providers/Core/ConfigFileProvider.cs @@ -9,12 +9,13 @@ namespace NzbDrone.Core.Providers.Core { public class ConfigFileProvider { - private string _configFile = Path.Combine(new EnviromentProvider().AppDataPath, "Config.xml"); + private readonly PathProvider _pathProvider; - public string ConfigFile + private readonly string _configFile; + public ConfigFileProvider(PathProvider pathProvider) { - get { return _configFile; } - set { _configFile = value; } + _pathProvider = pathProvider; + _configFile = _pathProvider.AppConfigFile; } public virtual int Port @@ -37,7 +38,7 @@ namespace NzbDrone.Core.Providers.Core public virtual string GetValue(string key, object defaultValue, string parent = null) { - var xDoc = XDocument.Load(ConfigFile); + var xDoc = XDocument.Load(_configFile); var config = xDoc.Descendants("Config").Single(); var parentContainer = config; @@ -50,7 +51,7 @@ namespace NzbDrone.Core.Providers.Core SetValue(key, defaultValue, parent); //Reload the configFile - xDoc = XDocument.Load(ConfigFile); + xDoc = XDocument.Load(_configFile); config = xDoc.Descendants("Config").Single(); } @@ -81,7 +82,7 @@ namespace NzbDrone.Core.Providers.Core public virtual void SetValue(string key, object value, string parent = null) { - var xDoc = XDocument.Load(ConfigFile); + var xDoc = XDocument.Load(_configFile); var config = xDoc.Descendants("Config").Single(); var parentContainer = config; @@ -105,18 +106,18 @@ namespace NzbDrone.Core.Providers.Core else parentContainer.Descendants(key).Single().Value = value.ToString(); - xDoc.Save(ConfigFile); + xDoc.Save(_configFile); } public virtual void CreateDefaultConfigFile() { - if (!File.Exists(ConfigFile)) + if (!File.Exists(_configFile)) { var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes")); xDoc.Add(new XElement("Config")); - xDoc.Save(ConfigFile); + xDoc.Save(_configFile); } } } diff --git a/NzbDrone.Core/Providers/Jobs/BannerDownloadJob.cs b/NzbDrone.Core/Providers/Jobs/BannerDownloadJob.cs index 15e0ad431..8f8da8622 100644 --- a/NzbDrone.Core/Providers/Jobs/BannerDownloadJob.cs +++ b/NzbDrone.Core/Providers/Jobs/BannerDownloadJob.cs @@ -18,18 +18,20 @@ namespace NzbDrone.Core.Providers.Jobs private readonly HttpProvider _httpProvider; private readonly DiskProvider _diskProvider; private readonly EnviromentProvider _enviromentProvider; + private readonly PathProvider _pathProvider; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); - private string _bannerPath = ""; private const string _bannerUrlPrefix = "http://www.thetvdb.com/banners/"; [Inject] - public BannerDownloadJob(SeriesProvider seriesProvider, HttpProvider httpProvider, DiskProvider diskProvider, EnviromentProvider enviromentProvider) + public BannerDownloadJob(SeriesProvider seriesProvider, HttpProvider httpProvider, DiskProvider diskProvider, + EnviromentProvider enviromentProvider, PathProvider pathProvider) { _seriesProvider = seriesProvider; _httpProvider = httpProvider; _diskProvider = diskProvider; _enviromentProvider = enviromentProvider; + _pathProvider = pathProvider; } public BannerDownloadJob() @@ -51,8 +53,8 @@ namespace NzbDrone.Core.Providers.Jobs { Logger.Debug("Starting banner download job"); - _bannerPath = Path.Combine(_enviromentProvider.WebRoot, "Content", "Images", "Banners"); - _diskProvider.CreateDirectory(_bannerPath); + + _diskProvider.CreateDirectory(_pathProvider.BannerPath); if (targetId > 0) { @@ -76,7 +78,7 @@ namespace NzbDrone.Core.Providers.Jobs public virtual void DownloadBanner(ProgressNotification notification, Series series) { - var bannerFilename = String.Format("{0}{1}{2}.jpg", _bannerPath, Path.DirectorySeparatorChar, series.SeriesId); + var bannerFilename = Path.Combine(_pathProvider.BannerPath, series.SeriesId.ToString(), ".jpg"); notification.CurrentMessage = string.Format("Downloading banner for '{0}'", series.Title); diff --git a/NzbDrone.Core/Providers/TvDbProvider.cs b/NzbDrone.Core/Providers/TvDbProvider.cs index da8465070..7998e55ef 100644 --- a/NzbDrone.Core/Providers/TvDbProvider.cs +++ b/NzbDrone.Core/Providers/TvDbProvider.cs @@ -13,22 +13,20 @@ namespace NzbDrone.Core.Providers { public class TvDbProvider { - private readonly EnviromentProvider _enviromentProvider; private const string TVDB_APIKEY = "5D2D188E86E07F4F"; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private readonly TvdbHandler _handler; [Inject] - public TvDbProvider(EnviromentProvider enviromentProvider) + public TvDbProvider(PathProvider pathProvider) { - _enviromentProvider = enviromentProvider; - _handler = new TvdbHandler(new XmlCacheProvider(_enviromentProvider.AppDataPath + @"\cache\tvdb"), TVDB_APIKEY); + _handler = new TvdbHandler(new XmlCacheProvider(pathProvider.CacheFolder), TVDB_APIKEY); } public TvDbProvider() { - + } public virtual IList SearchSeries(string title) diff --git a/NzbDrone.Core/Providers/UpdateProvider.cs b/NzbDrone.Core/Providers/UpdateProvider.cs index bc682c026..dab67ad13 100644 --- a/NzbDrone.Core/Providers/UpdateProvider.cs +++ b/NzbDrone.Core/Providers/UpdateProvider.cs @@ -18,19 +18,22 @@ namespace NzbDrone.Core.Providers private readonly HttpProvider _httpProvider; private readonly ConfigProvider _configProvider; private readonly EnviromentProvider _enviromentProvider; + private readonly PathProvider _pathProvider; private readonly DiskProvider _diskProvider; private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Regex ParseRegex = new Regex(@"(?:\>)(?NzbDrone.+?(?\d+\.\d+\.\d+\.\d+).+?)(?:\<\/A\>)", RegexOptions.IgnoreCase); - public const string SandboxFolderName = "nzbdrone_update"; + [Inject] - public UpdateProvider(HttpProvider httpProvider, ConfigProvider configProvider, EnviromentProvider enviromentProvider, DiskProvider diskProvider) + public UpdateProvider(HttpProvider httpProvider, ConfigProvider configProvider, EnviromentProvider enviromentProvider, + PathProvider pathProvider, DiskProvider diskProvider) { _httpProvider = httpProvider; _configProvider = configProvider; _enviromentProvider = enviromentProvider; + _pathProvider = pathProvider; _diskProvider = diskProvider; } @@ -73,15 +76,14 @@ namespace NzbDrone.Core.Providers public virtual void PreformUpdate(UpdatePackage updatePackage) { - var tempSubFolder = Path.Combine(_enviromentProvider.TempPath, SandboxFolderName); - var packageDestination = Path.Combine(tempSubFolder, updatePackage.FileName); + var packageDestination = Path.Combine(_pathProvider.UpdateSandboxFolder, updatePackage.FileName); Logger.Info("Downloading update package from [{0}] to [{1}]", updatePackage.Url, packageDestination); _httpProvider.DownloadFile(updatePackage.Url, packageDestination); Logger.Info("Download completed for update package from [{0}]", updatePackage.FileName); Logger.Info("Extracting Update package"); - _diskProvider.ExtractArchive(packageDestination, tempSubFolder); + _diskProvider.ExtractArchive(packageDestination, _pathProvider.UpdateSandboxFolder); Logger.Info("Update package extracted successfully"); } diff --git a/NzbDrone.Test.Common/LoggingFixtures.cs b/NzbDrone.Test.Common/LoggingTest.cs similarity index 88% rename from NzbDrone.Test.Common/LoggingFixtures.cs rename to NzbDrone.Test.Common/LoggingTest.cs index f8db8d252..df68f0479 100644 --- a/NzbDrone.Test.Common/LoggingFixtures.cs +++ b/NzbDrone.Test.Common/LoggingTest.cs @@ -5,11 +5,9 @@ using NzbDrone.Common; namespace NzbDrone.Test.Common { - public abstract class LoggingFixtures + public abstract class LoggingTest { - - [SetUp] - public void SetUpBase() + protected static void InitLogging() { LogConfiguration.RegisterConsoleLogger(LogLevel.Trace); LogConfiguration.RegisterUdpLogger(); diff --git a/NzbDrone.Test.Common/NzbDrone.Test.Common.csproj b/NzbDrone.Test.Common/NzbDrone.Test.Common.csproj index a30c1aab0..fba895fe7 100644 --- a/NzbDrone.Test.Common/NzbDrone.Test.Common.csproj +++ b/NzbDrone.Test.Common/NzbDrone.Test.Common.csproj @@ -69,7 +69,7 @@ - + diff --git a/NzbDrone.Update.Test/Fixtures.cs b/NzbDrone.Update.Test/Fixtures.cs index b3a5640d5..4089933e0 100644 --- a/NzbDrone.Update.Test/Fixtures.cs +++ b/NzbDrone.Update.Test/Fixtures.cs @@ -3,6 +3,6 @@ using NUnit.Framework; using NzbDrone.Test.Common; [SetUpFixture] -public class Fixtures : LoggingFixtures +public class Fixtures : LoggingTest { } diff --git a/NzbDrone.Web/Global.asax.cs b/NzbDrone.Web/Global.asax.cs index fb0f24137..906410b98 100644 --- a/NzbDrone.Web/Global.asax.cs +++ b/NzbDrone.Web/Global.asax.cs @@ -43,24 +43,23 @@ namespace NzbDrone.Web //base.OnApplicationStarted(); AreaRegistration.RegisterAllAreas(); - var razor =ViewEngines.Engines.Where(e => e.GetType() == typeof (RazorViewEngine)).Single(); + var razor = ViewEngines.Engines.Where(e => e.GetType() == typeof(RazorViewEngine)).Single(); ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(razor); RegisterGlobalFilters(GlobalFilters.Filters); - + Logger.Info("Fully initialized and ready."); } protected override IKernel CreateKernel() { - LogConfiguration.Setup(); + var kernel = CentralDispatch.NinjectKernel; + kernel.Get().Setup(); Logger.Info("NZBDrone Starting up."); - CentralDispatch.DedicateToHost(); - var kernel = CentralDispatch.NinjectKernel; + CentralDispatch.DedicateToHost(); - // kernel.Bind().ToConstant(kernel.Get("LogDb")); kernel.Load(Assembly.GetExecutingAssembly()); return kernel; } diff --git a/config.xml b/config.xml new file mode 100644 index 000000000..5d35eea2e --- /dev/null +++ b/config.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 82b6ec5ed4b95257bb776f2b9f64a6e2c84f4061 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Thu, 3 Nov 2011 16:23:54 -0700 Subject: [PATCH 2/8] Some test cleanup --- NzbDrone.Core.Test/Framework/TestBase.cs | 8 +- .../JobTests/BannerDownloadJobTest.cs | 115 ++++++++---------- NzbDrone.Core.Test/dbBenchmark.cs | 1 + .../Providers/Jobs/BannerDownloadJob.cs | 2 +- NzbDrone.Core/WebTimer.cs | 1 + 5 files changed, 63 insertions(+), 64 deletions(-) diff --git a/NzbDrone.Core.Test/Framework/TestBase.cs b/NzbDrone.Core.Test/Framework/TestBase.cs index 427b01c5c..9fc833d3a 100644 --- a/NzbDrone.Core.Test/Framework/TestBase.cs +++ b/NzbDrone.Core.Test/Framework/TestBase.cs @@ -1,5 +1,6 @@ using System.IO; using AutoMoq; +using Moq; using NUnit.Framework; using Ninject; using NzbDrone.Common; @@ -10,7 +11,6 @@ namespace NzbDrone.Core.Test.Framework public class TestBase : LoggingTest // ReSharper disable InconsistentNaming { - static TestBase() { InitLogging(); @@ -57,10 +57,16 @@ namespace NzbDrone.Core.Test.Framework Mocker = new AutoMoqer(); } + protected void WithStrictMocker() + { + Mocker = new AutoMoqer(MockBehavior.Strict); + } + [TearDown] public void TearDownBase() { ExceptionVerification.AssertNoUnexcpectedLogs(); + Mocker = new AutoMoqer(MockBehavior.Strict); } diff --git a/NzbDrone.Core.Test/JobTests/BannerDownloadJobTest.cs b/NzbDrone.Core.Test/JobTests/BannerDownloadJobTest.cs index 59b50e506..3f37ffe38 100644 --- a/NzbDrone.Core.Test/JobTests/BannerDownloadJobTest.cs +++ b/NzbDrone.Core.Test/JobTests/BannerDownloadJobTest.cs @@ -19,6 +19,14 @@ namespace NzbDrone.Core.Test.JobTests // ReSharper disable InconsistentNaming public class BannerDownloadJobTest : TestBase { + + [SetUp] + public void Setup() + { + WithStrictMocker(); + WithTempAsStartUpPath(); + } + [Test] public void BannerDownload_all() { @@ -26,28 +34,25 @@ namespace NzbDrone.Core.Test.JobTests var fakeSeries = Builder.CreateListOfSize(10) .Build(); - var mocker = new AutoMoqer(MockBehavior.Strict); - mocker.Resolve(); - var notification = new ProgressNotification("Banner Download"); - mocker.GetMock() + Mocker.GetMock() .Setup(c => c.GetAllSeries()) .Returns(fakeSeries); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), It.IsAny())); - mocker.GetMock() + Mocker.GetMock() .Setup(S => S.CreateDirectory(It.IsAny())) .Returns(""); //Act - mocker.Resolve().Start(notification, 0, 0); + Mocker.Resolve().Start(notification, 0, 0); //Assert - mocker.VerifyAllMocks(); - mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), + Mocker.VerifyAllMocks(); + Mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), Times.Exactly(fakeSeries.Count)); } @@ -60,28 +65,25 @@ namespace NzbDrone.Core.Test.JobTests .With(s => s.BannerUrl = null) .Build(); - var mocker = new AutoMoqer(MockBehavior.Strict); - mocker.Resolve(); - - var notification = new ProgressNotification("Banner Download"); + var notification = new ProgressNotification("Banner Download"); - mocker.GetMock() + Mocker.GetMock() .Setup(c => c.GetAllSeries()) .Returns(fakeSeries); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), It.IsAny())); - mocker.GetMock() + Mocker.GetMock() .Setup(S => S.CreateDirectory(It.IsAny())) .Returns(""); //Act - mocker.Resolve().Start(notification, 0, 0); + Mocker.Resolve().Start(notification, 0, 0); //Assert - mocker.VerifyAllMocks(); - mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), + Mocker.VerifyAllMocks(); + Mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), Times.Exactly(8)); } @@ -92,67 +94,64 @@ namespace NzbDrone.Core.Test.JobTests var fakeSeries = Builder.CreateListOfSize(10) .Build(); - - var pathProvider = Mocker.Resolve(); - var mocker = new AutoMoqer(MockBehavior.Strict); - mocker.Resolve(); + var pathProvider = Mocker.Resolve(); var notification = new ProgressNotification("Banner Download"); - mocker.GetMock() + Mocker.GetMock() .Setup(c => c.GetAllSeries()) .Returns(fakeSeries); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "1.jpg"))) .Throws(new WebException()); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "2.jpg"))); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "3.jpg"))) .Throws(new WebException()); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "4.jpg"))); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "5.jpg"))) .Throws(new WebException()); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "6.jpg"))); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "7.jpg"))) .Throws(new WebException()); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "8.jpg"))); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "9.jpg"))) .Throws(new WebException()); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), Path.Combine(pathProvider.BannerPath, "10.jpg"))); - mocker.GetMock() + Mocker.GetMock() .Setup(S => S.CreateDirectory(It.IsAny())) .Returns(""); //Act - mocker.Resolve().Start(notification, 0, 0); + Mocker.Resolve().Start(notification, 0, 0); //Assert - mocker.VerifyAllMocks(); - mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), + Mocker.VerifyAllMocks(); + Mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), Times.Exactly(fakeSeries.Count)); } @@ -163,29 +162,26 @@ namespace NzbDrone.Core.Test.JobTests var fakeSeries = Builder.CreateListOfSize(10) .Build(); - var mocker = new AutoMoqer(MockBehavior.Strict); - mocker.Resolve(); - var notification = new ProgressNotification("Banner Download"); - mocker.GetMock() + Mocker.GetMock() .Setup(c => c.GetAllSeries()) .Returns(fakeSeries); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), It.IsAny())) .Throws(new WebException()); - mocker.GetMock() + Mocker.GetMock() .Setup(S => S.CreateDirectory(It.IsAny())) .Returns(""); //Act - mocker.Resolve().Start(notification, 0, 0); + Mocker.Resolve().Start(notification, 0, 0); //Assert - mocker.VerifyAllMocks(); - mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), + Mocker.VerifyAllMocks(); + Mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), Times.Exactly(fakeSeries.Count)); } @@ -197,29 +193,26 @@ namespace NzbDrone.Core.Test.JobTests .With(s => s.SeriesId = 1) .Build(); - var mocker = new AutoMoqer(MockBehavior.Strict); - mocker.Resolve(); - var notification = new ProgressNotification("Banner Download"); - mocker.GetMock() + Mocker.GetMock() .Setup(c => c.GetSeries(1)) .Returns(fakeSeries); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), It.IsAny())) .Throws(new WebException()); - mocker.GetMock() + Mocker.GetMock() .Setup(S => S.CreateDirectory(It.IsAny())) .Returns(""); //Act - mocker.Resolve().Start(notification, 1, 0); + Mocker.Resolve().Start(notification, 1, 0); //Assert - mocker.VerifyAllMocks(); - mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), + Mocker.VerifyAllMocks(); + Mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), Times.Once()); } @@ -231,20 +224,18 @@ namespace NzbDrone.Core.Test.JobTests .With(s => s.SeriesId = 1) .Build(); - var mocker = new AutoMoqer(MockBehavior.Strict); - var notification = new ProgressNotification("Banner Download"); - mocker.GetMock() + Mocker.GetMock() .Setup(s => s.DownloadFile(It.IsAny(), It.IsAny())) .Throws(new WebException()); //Act - mocker.Resolve().DownloadBanner(notification, fakeSeries); + Mocker.Resolve().DownloadBanner(notification, fakeSeries); //Assert - mocker.VerifyAllMocks(); - mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), + Mocker.VerifyAllMocks(); + Mocker.GetMock().Verify(s => s.DownloadFile(It.IsAny(), It.IsAny()), Times.Once()); } } diff --git a/NzbDrone.Core.Test/dbBenchmark.cs b/NzbDrone.Core.Test/dbBenchmark.cs index de2b63b49..66fae0a9f 100644 --- a/NzbDrone.Core.Test/dbBenchmark.cs +++ b/NzbDrone.Core.Test/dbBenchmark.cs @@ -15,6 +15,7 @@ using PetaPoco; namespace NzbDrone.Core.Test { [TestFixture] + [Explicit] [Category("Benchmark")] // ReSharper disable InconsistentNaming public class DbBenchmark : TestBase diff --git a/NzbDrone.Core/Providers/Jobs/BannerDownloadJob.cs b/NzbDrone.Core/Providers/Jobs/BannerDownloadJob.cs index 8f8da8622..f90e73748 100644 --- a/NzbDrone.Core/Providers/Jobs/BannerDownloadJob.cs +++ b/NzbDrone.Core/Providers/Jobs/BannerDownloadJob.cs @@ -78,7 +78,7 @@ namespace NzbDrone.Core.Providers.Jobs public virtual void DownloadBanner(ProgressNotification notification, Series series) { - var bannerFilename = Path.Combine(_pathProvider.BannerPath, series.SeriesId.ToString(), ".jpg"); + var bannerFilename = Path.Combine(_pathProvider.BannerPath, series.SeriesId.ToString()) + ".jpg"; notification.CurrentMessage = string.Format("Downloading banner for '{0}'", series.Title); diff --git a/NzbDrone.Core/WebTimer.cs b/NzbDrone.Core/WebTimer.cs index 03d940da6..e9872407a 100644 --- a/NzbDrone.Core/WebTimer.cs +++ b/NzbDrone.Core/WebTimer.cs @@ -18,6 +18,7 @@ namespace NzbDrone.Core _jobProvider = jobProvider; } + //TODO: Make timer doesn't keep running during unit tests. public void StartTimer(int secondInterval) { _onCacheRemove = new CacheItemRemovedCallback(DoWork); From 07458529f6358e1961d7cd08f7423b5a730d36f1 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 6 Nov 2011 22:26:21 -0800 Subject: [PATCH 3/8] JobProvider can reset itself. cleaned up unit test logging --- NzbDrone.Core.Test/CentralDispatchTest.cs | 1 - NzbDrone.Core.Test/Framework/MockLib.cs | 5 + NzbDrone.Core.Test/Framework/TestBase.cs | 13 + NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 3 +- .../{ => JobProviderTests}/JobProviderTest.cs | 213 +++++-------- .../JobProviderTests/TestJobs.cs | 60 ++++ NzbDrone.Core/CentralDispatch.cs | 1 + NzbDrone.Core/Model/JobQueueItem.cs | 14 +- NzbDrone.Core/Providers/Jobs/JobProvider.cs | 293 +++++++++--------- NzbDrone.Core/WebTimer.cs | 19 +- NzbDrone.Test.Common/ExceptionVerification.cs | 11 +- 11 files changed, 318 insertions(+), 315 deletions(-) rename NzbDrone.Core.Test/ProviderTests/{ => JobProviderTests}/JobProviderTest.cs (68%) create mode 100644 NzbDrone.Core.Test/ProviderTests/JobProviderTests/TestJobs.cs diff --git a/NzbDrone.Core.Test/CentralDispatchTest.cs b/NzbDrone.Core.Test/CentralDispatchTest.cs index 3c5ea5d5b..e9abaff52 100644 --- a/NzbDrone.Core.Test/CentralDispatchTest.cs +++ b/NzbDrone.Core.Test/CentralDispatchTest.cs @@ -21,7 +21,6 @@ namespace NzbDrone.Core.Test readonly IList indexers = typeof(CentralDispatch).Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(IndexerBase))).ToList(); readonly IList jobs = typeof(CentralDispatch).Assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IJob))).ToList(); - [Test] public void InitAppTest() { diff --git a/NzbDrone.Core.Test/Framework/MockLib.cs b/NzbDrone.Core.Test/Framework/MockLib.cs index d309f99f5..77807a2eb 100644 --- a/NzbDrone.Core.Test/Framework/MockLib.cs +++ b/NzbDrone.Core.Test/Framework/MockLib.cs @@ -18,6 +18,7 @@ namespace NzbDrone.Core.Test.Framework public static IDatabase GetEmptyDatabase(bool enableLogging = false, string fileName = "") { + Console.WriteLine("====================DataBase===================="); Console.WriteLine("Cloning database from template."); if (String.IsNullOrWhiteSpace(fileName)) @@ -31,6 +32,10 @@ namespace NzbDrone.Core.Test.Framework var database = Connection.GetPetaPocoDb(connectionString); + Console.WriteLine("====================DataBase===================="); + Console.WriteLine(); + Console.WriteLine(); + return database; } diff --git a/NzbDrone.Core.Test/Framework/TestBase.cs b/NzbDrone.Core.Test/Framework/TestBase.cs index 9fc833d3a..b589fbde8 100644 --- a/NzbDrone.Core.Test/Framework/TestBase.cs +++ b/NzbDrone.Core.Test/Framework/TestBase.cs @@ -5,6 +5,7 @@ using NUnit.Framework; using Ninject; using NzbDrone.Common; using NzbDrone.Test.Common; +using PetaPoco; namespace NzbDrone.Core.Test.Framework { @@ -30,6 +31,7 @@ namespace NzbDrone.Core.Test.Framework protected StandardKernel LiveKernel = null; protected AutoMoqer Mocker = null; + protected IDatabase Db = null; protected string VirtualPath { @@ -60,6 +62,16 @@ namespace NzbDrone.Core.Test.Framework protected void WithStrictMocker() { Mocker = new AutoMoqer(MockBehavior.Strict); + if (Db != null) + { + Mocker.SetConstant(Db); + } + } + + protected void WithRealDb() + { + Db = MockLib.GetEmptyDatabase(); + Mocker.SetConstant(Db); } [TearDown] @@ -67,6 +79,7 @@ namespace NzbDrone.Core.Test.Framework { ExceptionVerification.AssertNoUnexcpectedLogs(); Mocker = new AutoMoqer(MockBehavior.Strict); + WebTimer.Stop(); } diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 984b9ca9b..84d29a96f 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -86,6 +86,7 @@ + @@ -117,7 +118,7 @@ - + diff --git a/NzbDrone.Core.Test/ProviderTests/JobProviderTest.cs b/NzbDrone.Core.Test/ProviderTests/JobProviderTests/JobProviderTest.cs similarity index 68% rename from NzbDrone.Core.Test/ProviderTests/JobProviderTest.cs rename to NzbDrone.Core.Test/ProviderTests/JobProviderTests/JobProviderTest.cs index eac09bd4e..a36bda385 100644 --- a/NzbDrone.Core.Test/ProviderTests/JobProviderTest.cs +++ b/NzbDrone.Core.Test/ProviderTests/JobProviderTests/JobProviderTest.cs @@ -1,5 +1,6 @@ // ReSharper disable RedundantUsingDirective +using System.Linq; using System; using System.Collections.Generic; using System.Threading; @@ -7,12 +8,11 @@ using AutoMoq; using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Model; -using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Providers.Jobs; using NzbDrone.Core.Test.Framework; using NzbDrone.Test.Common; -namespace NzbDrone.Core.Test.ProviderTests +namespace NzbDrone.Core.Test.ProviderTests.JobProviderTests { [TestFixture] // ReSharper disable InconsistentNaming @@ -21,11 +21,11 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void Run_Jobs_Updates_Last_Execution() { - IList fakeJobs = new List { new FakeJob() }; + IList BaseFakeJobs = new List { new FakeJob() }; var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); //Act var timerProvider = mocker.Resolve(); @@ -42,11 +42,11 @@ namespace NzbDrone.Core.Test.ProviderTests public void Run_Jobs_Updates_Last_Execution_Mark_as_unsuccesful() { - IList fakeJobs = new List { new BrokenJob() }; + IList BaseFakeJobs = new List { new BrokenJob() }; var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); //Act var timerProvider = mocker.Resolve(); @@ -65,12 +65,12 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void scheduler_skips_jobs_that_arent_mature_yet() { - var fakeJob = new FakeJob(); + var BaseFakeJob = new FakeJob(); var mocker = new AutoMoqer(); - IList fakeJobs = new List { fakeJob }; + IList BaseFakeJobs = new List { BaseFakeJob }; mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var timerProvider = mocker.Resolve(); timerProvider.Initialize(); @@ -79,7 +79,7 @@ namespace NzbDrone.Core.Test.ProviderTests timerProvider.QueueScheduled(); Thread.Sleep(500); - fakeJob.ExecutionCount.Should().Be(1); + BaseFakeJob.ExecutionCount.Should().Be(1); } [Test] @@ -87,12 +87,12 @@ namespace NzbDrone.Core.Test.ProviderTests //after execution so the job can successfully run. public void can_run_async_job_again() { - var fakeJob = new FakeJob(); + var BaseFakeJob = new FakeJob(); var mocker = new AutoMoqer(); - IList fakeJobs = new List { fakeJob }; + IList BaseFakeJobs = new List { BaseFakeJob }; mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var jobProvider = mocker.Resolve(); jobProvider.Initialize(); @@ -101,17 +101,17 @@ namespace NzbDrone.Core.Test.ProviderTests jobProvider.QueueJob(typeof(FakeJob)); Thread.Sleep(2000); jobProvider.Queue.Should().BeEmpty(); - fakeJob.ExecutionCount.Should().Be(2); + BaseFakeJob.ExecutionCount.Should().Be(2); } [Test] public void no_concurent_jobs() { - IList fakeJobs = new List { new SlowJob() }; + IList BaseFakeJobs = new List { new SlowJob() }; var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var jobProvider = mocker.Resolve(); jobProvider.Initialize(); @@ -132,11 +132,11 @@ namespace NzbDrone.Core.Test.ProviderTests public void can_run_broken_async_job_again() { var brokenJob = new BrokenJob(); - IList fakeJobs = new List { brokenJob }; + IList BaseFakeJobs = new List { brokenJob }; var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var jobProvider = mocker.Resolve(); jobProvider.Initialize(); @@ -152,54 +152,48 @@ namespace NzbDrone.Core.Test.ProviderTests } [Test] - //This test will confirm that the concurrency checks are rest - //after execution so the job can successfully run. public void can_run_two_jobs_at_the_same_time() { - var slowJob = new SlowJob(); - IList fakeJobs = new List { slowJob }; - var mocker = new AutoMoqer(); - - mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); - - var timerProvider = mocker.Resolve(); - timerProvider.Initialize(); + WithRealDb(); + var fakeJob = new FakeJob(); + IList fakeJobs = new List { fakeJob }; - var thread1 = new Thread(() => timerProvider.QueueScheduled()); - thread1.Start(); - Thread.Sleep(1000); - var thread2 = new Thread(() => timerProvider.QueueScheduled()); - thread2.Start(); + Mocker.SetConstant(fakeJobs); - thread1.Join(); - thread2.Join(); + var jobProvider = Mocker.Resolve(); + jobProvider.Initialize(); - slowJob.ExecutionCount = 2; + jobProvider.QueueScheduled(); + jobProvider.QueueScheduled(); + + Thread.Sleep(2000); + + fakeJob.ExecutionCount.Should().Be(1); } [Test] - //This test will confirm that the concurrency checks are rest - //after execution so the job can successfully run. public void can_queue_jobs_at_the_same_time() { var slowJob = new SlowJob(); + var BaseFakeJob = new FakeJob(); - IList fakeJobs = new List { slowJob }; + IList BaseFakeJobs = new List { slowJob, BaseFakeJob }; var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var jobProvider = mocker.Resolve(); jobProvider.Initialize(); - var thread1 = new Thread(() => jobProvider.QueueJob(typeof(SlowJob))); - var thread2 = new Thread(() => jobProvider.QueueJob(typeof(SlowJob))); + + jobProvider.QueueJob(typeof(SlowJob)); + var thread1 = new Thread(() => jobProvider.QueueJob(typeof(FakeJob))); + var thread2 = new Thread(() => jobProvider.QueueJob(typeof(FakeJob))); thread1.Start(); thread2.Start(); @@ -209,20 +203,19 @@ namespace NzbDrone.Core.Test.ProviderTests Thread.Sleep(5000); - Assert.AreEqual(1, slowJob.ExecutionCount); + BaseFakeJob.ExecutionCount.Should().Be(1); jobProvider.Queue.Should().BeEmpty(); - } [Test] public void Init_Jobs() { var fakeTimer = new FakeJob(); - IList fakeJobs = new List { fakeTimer }; + IList BaseFakeJobs = new List { fakeTimer }; var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var timerProvider = mocker.Resolve(); timerProvider.Initialize(); @@ -248,11 +241,11 @@ namespace NzbDrone.Core.Test.ProviderTests for (int i = 0; i < 2; i++) { var fakeTimer = new FakeJob(); - IList fakeJobs = new List { fakeTimer }; + IList BaseFakeJobs = new List { fakeTimer }; var mocker = new AutoMoqer(); mocker.SetConstant(repo); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var timerProvider = mocker.Resolve(); timerProvider.Initialize(); @@ -279,11 +272,11 @@ namespace NzbDrone.Core.Test.ProviderTests for (int i = 0; i < 2; i++) { var disabledJob = new DisabledJob(); - IList fakeJobs = new List { disabledJob }; + IList BaseFakeJobs = new List { disabledJob }; var mocker = new AutoMoqer(); mocker.SetConstant(repo); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var timerProvider = mocker.Resolve(); timerProvider.Initialize(); @@ -305,11 +298,11 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void Get_Next_Execution_Time() { - IList fakeJobs = new List { new FakeJob() }; + IList BaseFakeJobs = new List { new FakeJob() }; var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); //Act var timerProvider = mocker.Resolve(); @@ -330,11 +323,11 @@ namespace NzbDrone.Core.Test.ProviderTests var disabledJob = new DisabledJob(); - IList fakeJobs = new List { disabledJob }; + IList BaseFakeJobs = new List { disabledJob }; var mocker = new AutoMoqer(); mocker.SetConstant(repo); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var timerProvider = mocker.Resolve(); timerProvider.Initialize(); @@ -351,11 +344,11 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void SingleId_do_not_update_last_execution() { - IList fakeJobs = new List { new FakeJob() }; + IList BaseFakeJobs = new List { new FakeJob() }; var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); //Act var jobProvider = mocker.Resolve(); @@ -373,11 +366,11 @@ namespace NzbDrone.Core.Test.ProviderTests [Test] public void SingleId_do_not_set_success() { - IList fakeJobs = new List { new FakeJob() }; + IList BaseFakeJobs = new List { new FakeJob() }; var mocker = new AutoMoqer(); mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); //Act var jobProvider = mocker.Resolve(); @@ -397,16 +390,16 @@ namespace NzbDrone.Core.Test.ProviderTests { var mocker = new AutoMoqer(); - var fakeJob = new FakeJob(); - IList fakeJobs = new List { fakeJob }; + var BaseFakeJob = new FakeJob(); + IList BaseFakeJobs = new List { BaseFakeJob }; mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var fakeQueueItem = new JobQueueItem { - JobType = fakeJob.GetType(), + JobType = BaseFakeJob.GetType(), TargetId = 12, SecondaryTargetId = 0 }; @@ -415,11 +408,11 @@ namespace NzbDrone.Core.Test.ProviderTests var jobProvider = mocker.Resolve(); jobProvider.Initialize(); jobProvider.Queue.Add(fakeQueueItem); - jobProvider.QueueJob(fakeJob.GetType(), 12); + jobProvider.QueueJob(BaseFakeJob.GetType(), 12); Thread.Sleep(1000); //Assert - fakeJob.ExecutionCount.Should().Be(1); + BaseFakeJob.ExecutionCount.Should().Be(1); } @@ -430,16 +423,16 @@ namespace NzbDrone.Core.Test.ProviderTests var slowJob = new SlowJob(); var disabledJob = new DisabledJob(); - IList fakeJobs = new List { slowJob, disabledJob }; + IList BaseFakeJobs = new List { slowJob, disabledJob }; mocker.SetConstant(MockLib.GetEmptyDatabase()); - mocker.SetConstant(fakeJobs); + mocker.SetConstant(BaseFakeJobs); var jobProvider = mocker.Resolve(); jobProvider.Initialize(); - var _jobThread = new Thread(() => jobProvider.QueueScheduled()); + var _jobThread = new Thread(jobProvider.QueueScheduled); _jobThread.Start(); Thread.Sleep(200); @@ -453,89 +446,25 @@ namespace NzbDrone.Core.Test.ProviderTests slowJob.ExecutionCount.Should().Be(1); disabledJob.ExecutionCount.Should().Be(1); } - } - - public class FakeJob : IJob - { - public string Name - { - get { return "FakeJob"; } - } - - public int DefaultInterval - { - get { return 15; } - } - - public int ExecutionCount { get; set; } - - public void Start(ProgressNotification notification, int targetId, int secondaryTargetId) - { - ExecutionCount++; - } - } - public class DisabledJob : IJob - { - public string Name - { - get { return "DisabledJob"; } - } - - public int DefaultInterval + [Test] + public void trygin_to_queue_unregistered_job_should_fail() { - get { return 0; } - } + WithRealDb(); - public int ExecutionCount { get; set; } + IList BaseFakeJobs = new List { new SlowJob(), new DisabledJob() }; - public void Start(ProgressNotification notification, int targetId, int secondaryTargetId) - { - ExecutionCount++; - } - } + Mocker.SetConstant(BaseFakeJobs); - public class BrokenJob : IJob - { - public string Name - { - get { return "FakeJob"; } - } + var jobProvider = Mocker.Resolve(); - public int DefaultInterval - { - get { return 15; } - } - - public int ExecutionCount { get; set; } + jobProvider.Initialize(); + jobProvider.QueueJob(typeof(string)); - public void Start(ProgressNotification notification, int targetId, int secondaryTargetId) - { - ExecutionCount++; - throw new ApplicationException("Broken job is broken"); + Thread.Sleep(1000); + ExceptionVerification.ExcpectedErrors(1); } } - public class SlowJob : IJob - { - public string Name - { - get { return "FakeJob"; } - } - - public int DefaultInterval - { - get { return 15; } - } - - public int ExecutionCount { get; set; } - public void Start(ProgressNotification notification, int targetId, int secondaryTargetId) - { - Console.WriteLine("Starting Job"); - Thread.Sleep(1000); - ExecutionCount++; - Console.WriteLine("Finishing Job"); - } - } } \ No newline at end of file diff --git a/NzbDrone.Core.Test/ProviderTests/JobProviderTests/TestJobs.cs b/NzbDrone.Core.Test/ProviderTests/JobProviderTests/TestJobs.cs new file mode 100644 index 000000000..efa413ea7 --- /dev/null +++ b/NzbDrone.Core.Test/ProviderTests/JobProviderTests/TestJobs.cs @@ -0,0 +1,60 @@ +using System; +using System.Linq; +using System.Threading; +using NzbDrone.Core.Model.Notification; +using NzbDrone.Core.Providers.Jobs; + +namespace NzbDrone.Core.Test.ProviderTests.JobProviderTests +{ + + public class FakeJob : IJob + { + public string Name + { + get { return GetType().Name; } + } + + public virtual int DefaultInterval + { + get { return 15; } + } + + public int ExecutionCount { get; private set; } + + public void Start(ProgressNotification notification, int targetId, int secondaryTargetId) + { + ExecutionCount++; + Console.WriteLine("Begin " + Name); + Start(); + Console.WriteLine("End " + Name); + } + + protected virtual void Start() + { + } + } + + public class DisabledJob : FakeJob + { + public override int DefaultInterval + { + get { return 0; } + } + } + + public class BrokenJob : FakeJob + { + protected override void Start() + { + throw new ApplicationException("Broken job is broken"); + } + } + + public class SlowJob : FakeJob + { + protected override void Start() + { + Thread.Sleep(1000); + } + } +} diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index 4d805a29e..48e04fb80 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -147,6 +147,7 @@ namespace NzbDrone.Core private static void ShutDown() { Logger.Info("Shutting down application."); + WebTimer.Stop(); Process.GetCurrentProcess().Kill(); } } diff --git a/NzbDrone.Core/Model/JobQueueItem.cs b/NzbDrone.Core/Model/JobQueueItem.cs index 93f6bfeab..c2b983a07 100644 --- a/NzbDrone.Core/Model/JobQueueItem.cs +++ b/NzbDrone.Core/Model/JobQueueItem.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Text; namespace NzbDrone.Core.Model { @@ -12,13 +10,13 @@ namespace NzbDrone.Core.Model public bool Equals(JobQueueItem other) { - if (JobType == other.JobType && TargetId == other.TargetId - && SecondaryTargetId == other.SecondaryTargetId) - { - return true; - } + return (JobType == other.JobType && TargetId == other.TargetId + && SecondaryTargetId == other.SecondaryTargetId); + } - return false; + public override string ToString() + { + return string.Format("[{0}({1}, {2})]", JobType.Name, TargetId, SecondaryTargetId); } } } diff --git a/NzbDrone.Core/Providers/Jobs/JobProvider.cs b/NzbDrone.Core/Providers/Jobs/JobProvider.cs index b61429fe0..2509077ac 100644 --- a/NzbDrone.Core/Providers/Jobs/JobProvider.cs +++ b/NzbDrone.Core/Providers/Jobs/JobProvider.cs @@ -11,7 +11,6 @@ using NzbDrone.Core.Model; using NzbDrone.Core.Model.Notification; using NzbDrone.Core.Repository; using PetaPoco; -using ThreadState = System.Threading.ThreadState; namespace NzbDrone.Core.Providers.Jobs { @@ -21,15 +20,15 @@ namespace NzbDrone.Core.Providers.Jobs /// public class JobProvider { - private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + private static readonly Logger logger = LogManager.GetCurrentClassLogger(); private readonly IDatabase _database; private readonly NotificationProvider _notificationProvider; private readonly IList _jobs; private Thread _jobThread; + private Stopwatch _jobThreadStopWatch; - private readonly object ExecutionLock = new object(); - private bool _isRunning; + private readonly object executionLock = new object(); private readonly List _queue = new List(); private ProgressNotification _notification; @@ -40,6 +39,7 @@ namespace NzbDrone.Core.Providers.Jobs _database = database; _notificationProvider = notificationProvider; _jobs = jobs; + ResetThread(); } /// @@ -68,6 +68,34 @@ namespace NzbDrone.Core.Providers.Jobs return _database.Fetch().ToList(); } + /// + /// Initializes jobs in the database using the IJob instances that are + /// registered using ninject + /// + public virtual void Initialize() + { + logger.Debug("Initializing jobs. Count {0}", _jobs.Count()); + var currentTimer = All(); + + foreach (var timer in _jobs) + { + var timerProviderLocal = timer; + if (!currentTimer.Exists(c => c.TypeName == timerProviderLocal.GetType().ToString())) + { + var settings = new JobDefinition + { + Enable = timerProviderLocal.DefaultInterval > 0, + TypeName = timer.GetType().ToString(), + Name = timerProviderLocal.Name, + Interval = timerProviderLocal.DefaultInterval, + LastExecution = new DateTime(2000, 1, 1) + }; + + SaveDefinition(settings); + } + } + } + /// /// Adds/Updates definitions for a job /// @@ -76,213 +104,186 @@ namespace NzbDrone.Core.Providers.Jobs { if (definitions.Id == 0) { - Logger.Trace("Adding job definitions for {0}", definitions.Name); + logger.Trace("Adding job definitions for {0}", definitions.Name); _database.Insert(definitions); } else { - Logger.Trace("Updating job definitions for {0}", definitions.Name); + logger.Trace("Updating job definitions for {0}", definitions.Name); _database.Update(definitions); } } - /// - /// Iterates through all registered jobs and queues any that are due for an execution. - /// - /// Will ignore request if queue is already running. public virtual void QueueScheduled() { - lock (ExecutionLock) + lock (executionLock) { - if (_isRunning) + VerifyThreadTime(); + + if (_jobThread.IsAlive) { - Logger.Trace("Queue is already running. Ignoring scheduler's request."); + logger.Trace("Queue is already running. Ignoring scheduler's request."); return; } } - var counter = 0; - - var pendingJobs = All().Where( + var pendingJobTypes = All().Where( t => t.Enable && (DateTime.Now - t.LastExecution) > TimeSpan.FromMinutes(t.Interval) - ).Select(c => _jobs.Where(t => t.GetType().ToString() == c.TypeName).Single()); + ).Select(c => _jobs.Where(t => t.GetType().ToString() == c.TypeName).Single().GetType()).ToList(); - foreach (var job in pendingJobs) - { - QueueJob(job.GetType()); - counter++; - } - Logger.Trace("{0} Scheduled tasks have been added to the queue", counter); + pendingJobTypes.ForEach(jobType => QueueJob(jobType)); + logger.Trace("{0} Scheduled tasks have been added to the queue", pendingJobTypes.Count); } /// - /// Queues the execution of a job asynchronously + /// Gets the next scheduled run time for a specific job + /// (Estimated due to schedule timer) /// - /// Type of the job that should be queued. - /// The targetId could be any Id parameter eg. SeriesId. it will be passed to the job implementation - /// to allow it to filter it's target of execution. - /// /// The secondaryTargetId could be any Id parameter eg. SeasonNumber. it will be passed to - /// the timer implementation to further allow it to filter it's target of execution - /// Job is only added to the queue if same job with the same targetId doesn't already exist in the queue. + /// DateTime of next scheduled job execution + public virtual DateTime NextScheduledRun(Type jobType) + { + var job = All().Where(t => t.TypeName == jobType.ToString()).Single(); + return job.LastExecution.AddMinutes(job.Interval); + } + public virtual void QueueJob(Type jobType, int targetId = 0, int secondaryTargetId = 0) { - Logger.Debug("Adding [{0}:{1}] to the queue", jobType.Name, targetId); + var queueItem = new JobQueueItem + { + JobType = jobType, + TargetId = targetId, + SecondaryTargetId = secondaryTargetId + }; - lock (ExecutionLock) + logger.Debug("Attempting to queue {0}", queueItem); + + lock (executionLock) { + VerifyThreadTime(); + lock (Queue) { - var queueItem = new JobQueueItem - { - JobType = jobType, - TargetId = targetId, - SecondaryTargetId = secondaryTargetId - }; - if (!Queue.Contains(queueItem)) { Queue.Add(queueItem); - Logger.Trace("Job [{0}:{1}] added to the queue", jobType.Name, targetId); - + logger.Trace("Job {0} added to the queue. current items in queue: {1}", queueItem, Queue.Count); } else { - Logger.Info("[{0}:{1}] already exists in the queue. Skipping.", jobType.Name, targetId); + logger.Info("{0} already exists in the queue. Skipping. current items in queue: {1}", queueItem, Queue.Count); } } - if (_isRunning) + if (_jobThread.IsAlive) { - Logger.Trace("Queue is already running. No need to start it up."); + logger.Trace("Queue is already running. No need to start it up."); return; } - _isRunning = true; - } - - if (_jobThread == null || _jobThread.ThreadState != ThreadState.Running) - { - Logger.Trace("Initializing queue processor thread"); - - ThreadStart starter = () => - { - try - { - ProcessQueue(); - } - catch (Exception e) - { - Logger.ErrorException("Error has occurred in queue processor thread", e); - } - finally - { - _isRunning = false; - _jobThread.Abort(); - } - }; - - _jobThread = new Thread(starter) { Name = "JobQueueThread" }; + ResetThread(); + _jobThreadStopWatch = Stopwatch.StartNew(); _jobThread.Start(); - - } - else - { - var messge = "Job Thread is null"; - - if (_jobThread != null) - { - messge = "Job Thread State: " + _jobThread.ThreadState; - } - - Logger.Error("Execution lock has fucked up. {0}. Ignoring request.", messge); } } - /// - /// Starts processing of queue synchronously. - /// private void ProcessQueue() { - do + try { - using (NestedDiagnosticsContext.Push(Guid.NewGuid().ToString())) + do { - try + using (NestedDiagnosticsContext.Push(Guid.NewGuid().ToString())) { - JobQueueItem job = null; - - lock (Queue) + try { - if (Queue.Count != 0) + JobQueueItem job = null; + + lock (Queue) { - job = Queue.First(); - Queue.Remove(job); + if (Queue.Count != 0) + { + job = Queue.First(); + Queue.Remove(job); + logger.Debug("Popping {0} from the queue.", job); + } } - } - if (job != null) + if (job != null) + { + Execute(job); + } + } + catch (ThreadAbortException) { - Execute(job.JobType, job.TargetId, job.SecondaryTargetId); + throw; + } + catch (Exception e) + { + logger.FatalException("An error has occurred while executing job.", e); } - - } - catch (Exception e) - { - Logger.FatalException("An error has occurred while processing queued job.", e); } - } - } while (Queue.Count != 0); + } while (Queue.Count != 0); - Logger.Trace("Finished processing jobs in the queue."); + logger.Trace("Finished processing jobs in the queue."); - return; + return; + } + + catch (ThreadAbortException e) + { + logger.Warn(e.Message); + } + catch (Exception e) + { + logger.ErrorException("Error has occurred in queue processor thread", e); + } + finally + { + ResetThread(); + } } - /// - /// Executes the job synchronously - /// - /// Type of the job that should be executed - /// The targetId could be any Id parameter eg. SeriesId. it will be passed to the timer implementation - /// to allow it to filter it's target of execution - /// /// The secondaryTargetId could be any Id parameter eg. SeasonNumber. it will be passed to - /// the timer implementation to further allow it to filter it's target of execution - private void Execute(Type jobType, int targetId = 0, int secondaryTargetId = 0) + private void Execute(JobQueueItem queueItem) { - var jobImplementation = _jobs.Where(t => t.GetType() == jobType).Single(); + var jobImplementation = _jobs.Where(t => t.GetType() == queueItem.JobType).SingleOrDefault(); if (jobImplementation == null) { - Logger.Error("Unable to locate implementation for '{0}'. Make sure it is properly registered.", jobType); + logger.Error("Unable to locate implementation for '{0}'. Make sure it is properly registered.", queueItem.JobType); return; } - var settings = All().Where(j => j.TypeName == jobType.ToString()).Single(); + var settings = All().Where(j => j.TypeName == queueItem.JobType.ToString()).Single(); using (_notification = new ProgressNotification(jobImplementation.Name)) { try { - Logger.Debug("Starting '{0}' job. Last execution {1}", settings.Name, settings.LastExecution); + logger.Debug("Starting {0}. Last execution {1}", queueItem, settings.LastExecution); var sw = Stopwatch.StartNew(); _notificationProvider.Register(_notification); - jobImplementation.Start(_notification, targetId, secondaryTargetId); + jobImplementation.Start(_notification, queueItem.TargetId, queueItem.SecondaryTargetId); _notification.Status = ProgressNotificationStatus.Completed; settings.LastExecution = DateTime.Now; settings.Success = true; sw.Stop(); - Logger.Debug("Job '{0}' successfully completed in {1:0}.{2} seconds.", jobImplementation.Name, sw.Elapsed.TotalSeconds, sw.Elapsed.Milliseconds / 100, - sw.Elapsed.Seconds); + logger.Debug("Job '{0}' successfully completed in {1:0}.{2} seconds.", queueItem, sw.Elapsed.TotalSeconds, sw.Elapsed.Milliseconds / 100, + sw.Elapsed.Seconds); + } + catch (ThreadAbortException) + { + throw; } catch (Exception e) { - Logger.ErrorException("An error has occurred while executing job " + jobImplementation.Name, e); + logger.ErrorException("An error has occurred while executing job [" + jobImplementation.Name + "].", e); _notification.Status = ProgressNotificationStatus.Failed; _notification.CurrentMessage = jobImplementation.Name + " Failed."; @@ -292,49 +293,33 @@ namespace NzbDrone.Core.Providers.Jobs } //Only update last execution status if was triggered by the scheduler - if (targetId == 0) + if (queueItem.TargetId == 0) { SaveDefinition(settings); } } - /// - /// Initializes jobs in the database using the IJob instances that are - /// registered using ninject - /// - public virtual void Initialize() + private void VerifyThreadTime() { - Logger.Debug("Initializing jobs. Count {0}", _jobs.Count()); - var currentTimer = All(); - - foreach (var timer in _jobs) + if (_jobThreadStopWatch.Elapsed.TotalHours > 1) { - var timerProviderLocal = timer; - if (!currentTimer.Exists(c => c.TypeName == timerProviderLocal.GetType().ToString())) - { - var settings = new JobDefinition - { - Enable = timerProviderLocal.DefaultInterval > 0, - TypeName = timer.GetType().ToString(), - Name = timerProviderLocal.Name, - Interval = timerProviderLocal.DefaultInterval, - LastExecution = new DateTime(2000, 1, 1) - }; - - SaveDefinition(settings); - } + logger.Warn("Thread job has been running for more than an hour. fuck it!"); + ResetThread(); } } - /// - /// Gets the next scheduled run time for a specific job - /// (Estimated due to schedule timer) - /// - /// DateTime of next scheduled job execution - public virtual DateTime NextScheduledRun(Type jobType) + private void ResetThread() { - var job = All().Where(t => t.TypeName == jobType.ToString()).Single(); - return job.LastExecution.AddMinutes(job.Interval); + if (_jobThread != null) + { + _jobThread.Abort(); + } + + logger.Trace("resetting queue processor thread"); + _jobThread = new Thread(ProcessQueue) { Name = "JobQueueThread" }; + _jobThreadStopWatch = new Stopwatch(); } + + } } \ No newline at end of file diff --git a/NzbDrone.Core/WebTimer.cs b/NzbDrone.Core/WebTimer.cs index e9872407a..9208fb1ee 100644 --- a/NzbDrone.Core/WebTimer.cs +++ b/NzbDrone.Core/WebTimer.cs @@ -6,13 +6,17 @@ using NzbDrone.Core.Providers.Jobs; namespace NzbDrone.Core { - class WebTimer + public class WebTimer { private readonly JobProvider _jobProvider; private static CacheItemRemovedCallback _onCacheRemove; + private static bool _stop; + private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); + + public WebTimer(JobProvider jobProvider) { _jobProvider = jobProvider; @@ -31,8 +35,17 @@ namespace NzbDrone.Core public void DoWork(string k, object v, CacheItemRemovedReason r) { - _jobProvider.QueueScheduled(); - StartTimer(Convert.ToInt32(v)); + if (!_stop) + { + _jobProvider.QueueScheduled(); + StartTimer(Convert.ToInt32(v)); + } + } + + public static void Stop() + { + Logger.Info("Stopping Web Timer"); + _stop = true; } } } diff --git a/NzbDrone.Test.Common/ExceptionVerification.cs b/NzbDrone.Test.Common/ExceptionVerification.cs index e4e13ec99..8e455f401 100644 --- a/NzbDrone.Test.Common/ExceptionVerification.cs +++ b/NzbDrone.Test.Common/ExceptionVerification.cs @@ -41,9 +41,10 @@ namespace NzbDrone.Test.Common string exception = ""; if (log.Exception != null) { - exception = log.Exception.Message; + exception = "[" + log.Exception.Message + "]"; } - errors += Environment.NewLine + String.Format("[{0}] {1}: {2} [{3}]", log.Level, log.LoggerName, log.FormattedMessage, exception); + + errors += Environment.NewLine + String.Format("[{0}] {1}: {2} {3}", log.Level, log.LoggerName, log.FormattedMessage, exception); } return errors; } @@ -87,8 +88,6 @@ namespace NzbDrone.Test.Common private static void Excpected(LogLevel level, int count) { - - var levelLogs = _logs.Where(l => l.Level == level).ToList(); if (levelLogs.Count != count) @@ -97,9 +96,9 @@ namespace NzbDrone.Test.Common var message = String.Format("{0} {1}(s) were expected but {2} were logged.\n\r{3}", count, level, levelLogs.Count, GetLogsString(levelLogs)); - message = "********************************************************************************************************************************\n\r" + message = "\n\r****************************************************************************************\n\r" + message + - "\n\r********************************************************************************************************************************"; + "\n\r****************************************************************************************"; Assert.Fail(message); } From 390dfbdee8db4298719ec6a10281af654e91c24c Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Sun, 6 Nov 2011 22:38:07 -0800 Subject: [PATCH 4/8] Fixed startup issue. --- NzbDrone.Core/CentralDispatch.cs | 2 ++ NzbDrone.Core/Fluent.cs | 2 ++ NzbDrone.Core/Providers/Jobs/JobProvider.cs | 2 +- NzbDrone.Web/Global.asax.cs | 1 - 4 files changed, 5 insertions(+), 2 deletions(-) diff --git a/NzbDrone.Core/CentralDispatch.cs b/NzbDrone.Core/CentralDispatch.cs index 48e04fb80..a10440fcc 100644 --- a/NzbDrone.Core/CentralDispatch.cs +++ b/NzbDrone.Core/CentralDispatch.cs @@ -39,6 +39,8 @@ namespace NzbDrone.Core { BindKernel(); + _kernel.Get().Setup(); + var mainConnectionString = _kernel.Get().MainConnectionString; MigrationsHelper.Run(mainConnectionString, true); diff --git a/NzbDrone.Core/Fluent.cs b/NzbDrone.Core/Fluent.cs index 112249cd3..317acdb43 100644 --- a/NzbDrone.Core/Fluent.cs +++ b/NzbDrone.Core/Fluent.cs @@ -54,6 +54,8 @@ namespace NzbDrone.Core return dateTime.ToShortDateString(); } + + //TODO: this should be moved to DiskProvider public static ulong FreeDiskSpace(this DirectoryInfo directoryInfo) { ulong freeBytesAvailable; diff --git a/NzbDrone.Core/Providers/Jobs/JobProvider.cs b/NzbDrone.Core/Providers/Jobs/JobProvider.cs index 2509077ac..97690a4eb 100644 --- a/NzbDrone.Core/Providers/Jobs/JobProvider.cs +++ b/NzbDrone.Core/Providers/Jobs/JobProvider.cs @@ -274,7 +274,7 @@ namespace NzbDrone.Core.Providers.Jobs settings.Success = true; sw.Stop(); - logger.Debug("Job '{0}' successfully completed in {1:0}.{2} seconds.", queueItem, sw.Elapsed.TotalSeconds, sw.Elapsed.Milliseconds / 100, + logger.Debug("Job {0} successfully completed in {1:0}.{2} seconds.", queueItem, sw.Elapsed.TotalSeconds, sw.Elapsed.Milliseconds / 100, sw.Elapsed.Seconds); } catch (ThreadAbortException) diff --git a/NzbDrone.Web/Global.asax.cs b/NzbDrone.Web/Global.asax.cs index 906410b98..7c6a2ff9a 100644 --- a/NzbDrone.Web/Global.asax.cs +++ b/NzbDrone.Web/Global.asax.cs @@ -55,7 +55,6 @@ namespace NzbDrone.Web protected override IKernel CreateKernel() { var kernel = CentralDispatch.NinjectKernel; - kernel.Get().Setup(); Logger.Info("NZBDrone Starting up."); CentralDispatch.DedicateToHost(); From b43397752eecd8053a9ec707c8e966fd7cfe71d6 Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Mon, 7 Nov 2011 23:01:52 -0800 Subject: [PATCH 5/8] Fixed broken tests --- NzbDrone.Common.Test/EnviromentProviderTest.cs | 6 ------ ...ntralDispatchTest.cs => CentralDispatchFixture.cs} | 2 +- NzbDrone.Core.Test/Framework/TestBase.cs | 4 ++-- NzbDrone.Core.Test/NzbDrone.Core.Test.csproj | 2 +- NzbDrone.Test.Common/LoggingTest.cs | 11 +++++++---- 5 files changed, 11 insertions(+), 14 deletions(-) rename NzbDrone.Core.Test/{CentralDispatchTest.cs => CentralDispatchFixture.cs} (98%) diff --git a/NzbDrone.Common.Test/EnviromentProviderTest.cs b/NzbDrone.Common.Test/EnviromentProviderTest.cs index 68da7c761..c5f43cc2c 100644 --- a/NzbDrone.Common.Test/EnviromentProviderTest.cs +++ b/NzbDrone.Common.Test/EnviromentProviderTest.cs @@ -11,12 +11,6 @@ namespace NzbDrone.Common.Test { readonly EnviromentProvider enviromentController = new EnviromentProvider(); - [Test] - public void Is_user_interactive_should_be_false() - { - enviromentController.IsUserInteractive.Should().BeTrue(); - } - [Test] public void StartupPath_should_not_be_empty() { diff --git a/NzbDrone.Core.Test/CentralDispatchTest.cs b/NzbDrone.Core.Test/CentralDispatchFixture.cs similarity index 98% rename from NzbDrone.Core.Test/CentralDispatchTest.cs rename to NzbDrone.Core.Test/CentralDispatchFixture.cs index e9abaff52..937b25378 100644 --- a/NzbDrone.Core.Test/CentralDispatchTest.cs +++ b/NzbDrone.Core.Test/CentralDispatchFixture.cs @@ -16,7 +16,7 @@ namespace NzbDrone.Core.Test { [TestFixture] // ReSharper disable InconsistentNaming - class CentralDispatchTest : TestBase + class CentralDispatchFixture : TestBase { readonly IList indexers = typeof(CentralDispatch).Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(IndexerBase))).ToList(); readonly IList jobs = typeof(CentralDispatch).Assembly.GetTypes().Where(t => t.GetInterfaces().Contains(typeof(IJob))).ToList(); diff --git a/NzbDrone.Core.Test/Framework/TestBase.cs b/NzbDrone.Core.Test/Framework/TestBase.cs index b589fbde8..351c9cf0d 100644 --- a/NzbDrone.Core.Test/Framework/TestBase.cs +++ b/NzbDrone.Core.Test/Framework/TestBase.cs @@ -14,8 +14,6 @@ namespace NzbDrone.Core.Test.Framework { static TestBase() { - InitLogging(); - var oldDbFiles = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.sdf", SearchOption.AllDirectories); foreach (var file in oldDbFiles) { @@ -47,6 +45,8 @@ namespace NzbDrone.Core.Test.Framework [SetUp] public virtual void SetupBase() { + InitLogging(); + ExceptionVerification.Reset(); if (Directory.Exists(TempFolder)) { diff --git a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 84d29a96f..1dbe42f98 100644 --- a/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -99,7 +99,7 @@ - + diff --git a/NzbDrone.Test.Common/LoggingTest.cs b/NzbDrone.Test.Common/LoggingTest.cs index df68f0479..5c8a13748 100644 --- a/NzbDrone.Test.Common/LoggingTest.cs +++ b/NzbDrone.Test.Common/LoggingTest.cs @@ -1,6 +1,5 @@ using NLog; using NLog.Config; -using NUnit.Framework; using NzbDrone.Common; namespace NzbDrone.Test.Common @@ -9,10 +8,14 @@ namespace NzbDrone.Test.Common { protected static void InitLogging() { - LogConfiguration.RegisterConsoleLogger(LogLevel.Trace); - LogConfiguration.RegisterUdpLogger(); + if (LogManager.Configuration == null || LogManager.Configuration is XmlLoggingConfiguration) + { + LogManager.Configuration = new LoggingConfiguration(); + LogConfiguration.RegisterConsoleLogger(LogLevel.Trace); + LogConfiguration.RegisterUdpLogger(); - RegisterExceptionVerification(); + RegisterExceptionVerification(); + } } private static void RegisterExceptionVerification() From 157bcd8b0f9623512d1f53efaa843f354d5c0e0b Mon Sep 17 00:00:00 2001 From: "kay.one" Date: Tue, 8 Nov 2011 09:48:34 -0800 Subject: [PATCH 6/8] AssemblyInfo.cs cleanup --- .../EnviromentProviderTest.cs | 20 ++++++--- .../NzbDrone.Common.Test.csproj | 4 +- NzbDrone.Common/ExceptioneerTarget.cs | 2 +- NzbDrone.Common/NzbDrone.Common.csproj | 1 + NzbDrone.Common/Properties/AssemblyInfo.cs | 26 ----------- .../Properties/SharedAssemblyInfo.cs | 19 +++----- NzbDrone.Core/NzbDrone.Core.csproj | 3 ++ NzbDrone.Core/Properties/AssemblyInfo.cs | 44 +------------------ NzbDrone.Update/NzbDrone.Update.csproj | 3 ++ NzbDrone.Update/Properties/AssemblyInfo.cs | 28 +----------- NzbDrone.Web/Content/NzbDrone.css | 11 ++--- NzbDrone.Web/Content/Slider.css | 2 - NzbDrone.Web/Controllers/SharedController.cs | 10 +++-- NzbDrone.Web/Global.asax.cs | 2 +- NzbDrone.Web/Models/CodeFile1.cs | 10 +++++ NzbDrone.Web/NzbDrone.Web.csproj | 4 ++ NzbDrone.Web/Properties/AssemblyInfo.cs | 32 +------------- NzbDrone.Web/Views/Series/Index.cshtml | 2 +- NzbDrone.Web/Views/Shared/Error.cshtml | 2 +- NzbDrone.Web/Views/Shared/Footer.cshtml | 6 +-- NzbDrone.Web/Views/Shared/_Layout.cshtml | 4 +- NzbDrone/NzbDrone.csproj | 3 ++ NzbDrone/Properties/AssemblyInfo.cs | 34 +------------- NzbDrone/Providers/MonitoringProvider.cs | 2 +- 24 files changed, 72 insertions(+), 202 deletions(-) rename NzbDrone.Common.Test/Properties/AssemblyInfo.cs => NzbDrone.Common/Properties/SharedAssemblyInfo.cs (51%) create mode 100644 NzbDrone.Web/Models/CodeFile1.cs diff --git a/NzbDrone.Common.Test/EnviromentProviderTest.cs b/NzbDrone.Common.Test/EnviromentProviderTest.cs index c5f43cc2c..9032ab740 100644 --- a/NzbDrone.Common.Test/EnviromentProviderTest.cs +++ b/NzbDrone.Common.Test/EnviromentProviderTest.cs @@ -1,5 +1,6 @@ // ReSharper disable InconsistentNaming +using System; using System.IO; using FluentAssertions; using NUnit.Framework; @@ -9,21 +10,21 @@ namespace NzbDrone.Common.Test [TestFixture] public class EnviromentProviderTest { - readonly EnviromentProvider enviromentController = new EnviromentProvider(); + readonly EnviromentProvider enviromentProvider = new EnviromentProvider(); [Test] public void StartupPath_should_not_be_empty() { - enviromentController.StartUpPath.Should().NotBeBlank(); - Path.IsPathRooted(enviromentController.StartUpPath).Should().BeTrue("Path is not rooted"); + enviromentProvider.StartUpPath.Should().NotBeBlank(); + Path.IsPathRooted(enviromentProvider.StartUpPath).Should().BeTrue("Path is not rooted"); } [Test] public void ApplicationPath_should_not_be_empty() { - enviromentController.ApplicationPath.Should().NotBeBlank(); - Path.IsPathRooted(enviromentController.ApplicationPath).Should().BeTrue("Path is not rooted"); + enviromentProvider.ApplicationPath.Should().NotBeBlank(); + Path.IsPathRooted(enviromentProvider.ApplicationPath).Should().BeTrue("Path is not rooted"); } @@ -31,7 +32,7 @@ namespace NzbDrone.Common.Test public void ApplicationPath_should_find_iis_in_current_folder() { Directory.CreateDirectory(EnviromentProvider.IIS_FOLDER_NAME); - enviromentController.ApplicationPath.Should().BeEquivalentTo(Directory.GetCurrentDirectory()); + enviromentProvider.ApplicationPath.Should().BeEquivalentTo(Directory.GetCurrentDirectory()); } [Test] @@ -39,5 +40,12 @@ namespace NzbDrone.Common.Test { EnviromentProvider.IsProduction.Should().BeFalse(); } + + [TestCase("0.0.0.0")] + [TestCase("1.0.0.0")] + public void Application_version_should_not_be_default(string version) + { + enviromentProvider.Version.Should().NotBe(new Version(version)); + } } } diff --git a/NzbDrone.Common.Test/NzbDrone.Common.Test.csproj b/NzbDrone.Common.Test/NzbDrone.Common.Test.csproj index 2efe649e7..bf72a48ee 100644 --- a/NzbDrone.Common.Test/NzbDrone.Common.Test.csproj +++ b/NzbDrone.Common.Test/NzbDrone.Common.Test.csproj @@ -65,7 +65,6 @@ - @@ -86,6 +85,9 @@ NzbDrone.Test.Dummy + + +