diff --git a/NzbDrone.6.0.ReSharper b/NzbDrone.6.0.ReSharper
index fc6b1c5c3..c52dd4866 100644
--- a/NzbDrone.6.0.ReSharper
+++ b/NzbDrone.6.0.ReSharper
@@ -87,4 +87,9 @@
+
+
+ - 43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD/d:Content
+
+
\ No newline at end of file
diff --git a/NzbDrone.App.Test/ApplicationTest.cs b/NzbDrone.App.Test/ApplicationTest.cs
new file mode 100644
index 000000000..0713810c5
--- /dev/null
+++ b/NzbDrone.App.Test/ApplicationTest.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using AutoMoq;
+using FizzWare.NBuilder;
+using FluentAssertions;
+using Moq;
+using NUnit.Framework;
+using NzbDrone.Providers;
+
+namespace NzbDrone.App.Test
+{
+ [TestFixture]
+ public class MonitoringProviderTest
+ {
+
+ [Test]
+ public void Ensure_priority_doesnt_fail_on_invalid_iis_proccess_id()
+ {
+ var mocker = new AutoMoqer();
+
+ var processMock = mocker.GetMock();
+ processMock.Setup(c => c.GetCurrentProcess())
+ .Returns(Builder.CreateNew().With(c => c.Priority == ProcessPriorityClass.Normal).Build());
+
+ processMock.Setup(c => c.GetProcessById(It.IsAny())).Returns((ProcessInfo)null);
+
+ var subject = mocker.Resolve();
+
+
+ //Act
+ subject.EnsurePriority(null, null);
+ }
+
+
+ }
+}
diff --git a/NzbDrone.App.Test/AutoMoq/AutoMoqer.cs b/NzbDrone.App.Test/AutoMoq/AutoMoqer.cs
new file mode 100644
index 000000000..27b2eee78
--- /dev/null
+++ b/NzbDrone.App.Test/AutoMoq/AutoMoqer.cs
@@ -0,0 +1,166 @@
+// ReSharper disable RedundantUsingDirective
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Linq.Expressions;
+using System.Runtime.CompilerServices;
+using AutoMoq.Unity;
+using Microsoft.Practices.Unity;
+using Moq;
+using Moq.Language.Flow;
+
+[assembly: InternalsVisibleTo("AutoMoq.Tests")]
+
+namespace AutoMoq
+{
+ public class AutoMoqer
+ {
+ internal readonly MockBehavior DefaultBehavior = MockBehavior.Default;
+ internal Type ResolveType;
+ private IUnityContainer container;
+ private IDictionary registeredMocks;
+
+ public AutoMoqer()
+ {
+ SetupAutoMoqer(new UnityContainer());
+ }
+
+ public AutoMoqer(MockBehavior defaultBehavior)
+ {
+ DefaultBehavior = defaultBehavior;
+ SetupAutoMoqer(new UnityContainer());
+
+ }
+
+ internal AutoMoqer(IUnityContainer container)
+ {
+ SetupAutoMoqer(container);
+ }
+
+ public virtual T Resolve()
+ {
+ ResolveType = typeof(T);
+ var result = container.Resolve();
+ SetConstant(result);
+ ResolveType = null;
+ return result;
+ }
+
+ public virtual Mock GetMock() where T : class
+ {
+ return GetMock(DefaultBehavior);
+ }
+
+ public virtual Mock GetMock(MockBehavior behavior) where T : class
+ {
+ ResolveType = null;
+ var type = GetTheMockType();
+ if (GetMockHasNotBeenCalledForThisType(type))
+ {
+ CreateANewMockAndRegisterIt(type, behavior);
+ }
+
+ var mock = TheRegisteredMockForThisType(type);
+
+ if (behavior != MockBehavior.Default && mock.Behavior == MockBehavior.Default)
+ {
+ throw new InvalidOperationException("Unable to change be behaviour of a an existing mock.");
+ }
+
+ return mock;
+ }
+
+ internal virtual void SetMock(Type type, Mock mock)
+ {
+ if (registeredMocks.ContainsKey(type) == false)
+ registeredMocks.Add(type, mock);
+ }
+
+ public virtual void SetConstant(T instance)
+ {
+ container.RegisterInstance(instance);
+ SetMock(instance.GetType(), null);
+ }
+
+ public ISetup Setup(Expression> expression) where T : class
+ {
+ return GetMock().Setup(expression);
+ }
+
+ public ISetup Setup(Expression> expression) where T : class
+ {
+ return GetMock().Setup(expression);
+ }
+
+ public void Verify(Expression> expression) where T : class
+ {
+ GetMock().Verify(expression);
+ }
+
+ public void Verify(Expression> expression, string failMessage) where T : class
+ {
+ GetMock().Verify(expression, failMessage);
+ }
+
+ public void Verify(Expression> expression, Times times) where T : class
+ {
+ GetMock().Verify(expression, times);
+ }
+
+ public void Verify(Expression> expression, Times times, string failMessage) where T : class
+ {
+ GetMock().Verify(expression, times, failMessage);
+ }
+
+ public void VerifyAllMocks()
+ {
+ foreach (var registeredMock in registeredMocks)
+ {
+ var mock = registeredMock.Value as Mock;
+ if (mock != null)
+ mock.VerifyAll();
+ }
+ }
+
+ #region private methods
+
+ private void SetupAutoMoqer(IUnityContainer container)
+ {
+ this.container = container;
+ container.RegisterInstance(this);
+
+ registeredMocks = new Dictionary();
+ AddTheAutoMockingContainerExtensionToTheContainer(container);
+ }
+
+ private static void AddTheAutoMockingContainerExtensionToTheContainer(IUnityContainer container)
+ {
+ container.AddNewExtension();
+ return;
+ }
+
+ private Mock TheRegisteredMockForThisType(Type type) where T : class
+ {
+ return (Mock)registeredMocks.Where(x => x.Key == type).First().Value;
+ }
+
+ private void CreateANewMockAndRegisterIt(Type type, MockBehavior behavior) where T : class
+ {
+ var mock = new Mock(behavior);
+ container.RegisterInstance(mock.Object);
+ SetMock(type, mock);
+ }
+
+ private bool GetMockHasNotBeenCalledForThisType(Type type)
+ {
+ return registeredMocks.ContainsKey(type) == false;
+ }
+
+ private static Type GetTheMockType() where T : class
+ {
+ return typeof(T);
+ }
+
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/NzbDrone.App.Test/AutoMoq/AutoMoqerTest.cs b/NzbDrone.App.Test/AutoMoq/AutoMoqerTest.cs
new file mode 100644
index 000000000..4d31e398e
--- /dev/null
+++ b/NzbDrone.App.Test/AutoMoq/AutoMoqerTest.cs
@@ -0,0 +1,187 @@
+// ReSharper disable RedundantUsingDirective
+using System;
+using AutoMoq;
+using Moq;
+using NUnit.Framework;
+
+namespace NzbDrone.Core.Test
+{
+ [TestFixture]
+ // ReSharper disable InconsistentNaming
+ public class AutoMoqerTest
+ {
+ [Test]
+ public void GetMock_on_interface_returns_mock()
+ {
+ //Arrange
+ var mocker = new AutoMoqer();
+
+ //Act
+ var mock = mocker.GetMock();
+
+ //Assert
+ Assert.IsNotNull(mock);
+ }
+
+ [Test]
+ public void GetMock_on_concrete_returns_mock()
+ {
+ //Arrange
+ var mocker = new AutoMoqer();
+
+ //Act
+ var mock = mocker.GetMock();
+
+ //Assert
+ Assert.IsNotNull(mock);
+ }
+
+
+ [Test]
+ public void Resolve_doesnt_return_mock()
+ {
+ //Arrange
+ var mocker = new AutoMoqer();
+
+ //Act
+ var result = mocker.Resolve().Do();
+
+ //Assert
+ Assert.AreEqual("hello", result);
+ }
+
+ [Test]
+ public void Resolve_with_dependency_doesnt_return_mock()
+ {
+ //Arrange
+ var mocker = new AutoMoqer();
+
+ //Act
+ var result = mocker.Resolve().VirtualMethod();
+
+ //Assert
+ Assert.AreEqual("hello", result);
+ }
+
+ [Test]
+ public void Resolve_with_mocked_dependency_uses_mock()
+ {
+ //Arrange
+ var mocker = new AutoMoqer();
+
+ mocker.GetMock()
+ .Setup(m => m.VirtualMethod())
+ .Returns("mocked");
+
+ //Act
+ var result = mocker.Resolve().CallVirtualChild();
+
+ //Assert
+ Assert.AreEqual("mocked", result);
+ }
+
+
+ [Test]
+ public void Resolve_with_unbound_concerete_dependency_uses_mock()
+ {
+ //Arrange
+ var mocker = new AutoMoqer();
+
+ //Act
+ var result = mocker.Resolve().CallVirtualChild();
+
+ var mockedResult = new Mock().Object.VirtualMethod();
+
+ //Assert
+ Assert.AreEqual(mockedResult, result);
+ }
+
+
+ [Test]
+ public void Resolve_with_constant_concerete_dependency_uses_constant()
+ {
+ //Arrange
+ var mocker = new AutoMoqer();
+
+ var constant = new VirtualDependency { PropValue = Guid.NewGuid().ToString() };
+
+ mocker.SetConstant(constant);
+
+ //Act
+ var result = mocker.Resolve().GetVirtualProperty();
+
+ //Assert
+ Assert.AreEqual(constant.PropValue, result);
+ }
+ }
+
+ public class ConcreteClass
+ {
+ public string Do()
+ {
+ return "hello";
+ }
+ }
+
+ public class Dependency : IDependency
+ {
+ }
+
+ public interface IDependency
+ {
+ }
+
+ public class ClassWithDependencies
+ {
+ public ClassWithDependencies(IDependency dependency)
+ {
+ Dependency = dependency;
+ }
+
+ public IDependency Dependency { get; set; }
+ }
+
+ public class ClassWithVirtualDependencies
+ {
+ private readonly VirtualDependency _virtualDependency;
+
+ public ClassWithVirtualDependencies(IDependency dependency, VirtualDependency virtualDependency)
+ {
+ _virtualDependency = virtualDependency;
+ Dependency = dependency;
+ }
+
+ public IDependency Dependency { get; set; }
+
+ public string CallVirtualChild()
+ {
+ return _virtualDependency.VirtualMethod();
+ }
+
+ public string GetVirtualProperty()
+ {
+ return _virtualDependency.PropValue;
+ }
+ }
+
+ public class VirtualDependency
+ {
+ private readonly IDependency _dependency;
+
+ public VirtualDependency()
+ {
+ }
+
+ public VirtualDependency(IDependency dependency)
+ {
+ _dependency = dependency;
+ }
+
+ public string PropValue { get; set; }
+
+ public virtual string VirtualMethod()
+ {
+ return "hello";
+ }
+ }
+}
\ No newline at end of file
diff --git a/NzbDrone.App.Test/AutoMoq/License.txt b/NzbDrone.App.Test/AutoMoq/License.txt
new file mode 100644
index 000000000..5ead6991a
--- /dev/null
+++ b/NzbDrone.App.Test/AutoMoq/License.txt
@@ -0,0 +1,22 @@
+ Copyright (c) 2010 Darren Cauthon
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the "Software"), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
diff --git a/NzbDrone.App.Test/AutoMoq/Unity/AutoMockingBuilderStrategy.cs b/NzbDrone.App.Test/AutoMoq/Unity/AutoMockingBuilderStrategy.cs
new file mode 100644
index 000000000..af393fbee
--- /dev/null
+++ b/NzbDrone.App.Test/AutoMoq/Unity/AutoMockingBuilderStrategy.cs
@@ -0,0 +1,84 @@
+// ReSharper disable RedundantUsingDirective
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using Microsoft.Practices.ObjectBuilder2;
+using Microsoft.Practices.Unity;
+using Moq;
+
+namespace AutoMoq.Unity
+{
+ internal class AutoMockingBuilderStrategy : BuilderStrategy
+ {
+ private readonly IUnityContainer _container;
+ private readonly MockRepository _mockFactory;
+ private readonly IEnumerable _registeredTypes;
+
+ public AutoMockingBuilderStrategy(IEnumerable registeredTypes, IUnityContainer container)
+ {
+ var autoMoqer = container.Resolve();
+ _mockFactory = new MockRepository(autoMoqer.DefaultBehavior);
+ _registeredTypes = registeredTypes;
+ _container = container;
+ }
+
+ public override void PreBuildUp(IBuilderContext context)
+ {
+ var autoMoqer = _container.Resolve();
+
+ var type = GetTheTypeFromTheBuilderContext(context);
+ if (AMockObjectShouldBeCreatedForThisType(type))
+ {
+ var mock = CreateAMockObject(type);
+ context.Existing = mock.Object;
+ autoMoqer.SetMock(type, mock);
+ }
+ }
+
+ #region private methods
+
+ private bool AMockObjectShouldBeCreatedForThisType(Type type)
+ {
+ var mocker = _container.Resolve();
+ return TypeIsNotRegistered(type) && (mocker.ResolveType == null || mocker.ResolveType != type);
+ //return TypeIsNotRegistered(type) && type.IsInterface;
+ }
+
+ private static Type GetTheTypeFromTheBuilderContext(IBuilderContext context)
+ {
+ return (context.OriginalBuildKey).Type;
+ }
+
+ private bool TypeIsNotRegistered(Type type)
+ {
+ return _registeredTypes.Any(x => x.Equals(type)) == false;
+ }
+
+ private Mock CreateAMockObject(Type type)
+ {
+ var createMethod = GenerateAnInterfaceMockCreationMethod(type);
+
+ return InvokeTheMockCreationMethod(createMethod);
+ }
+
+ private Mock InvokeTheMockCreationMethod(MethodInfo createMethod)
+ {
+ return (Mock)createMethod.Invoke(_mockFactory, new object[] { new List