mirror of https://github.com/Radarr/Radarr
Added NzbDrone.Update, refactored some common wrappers to NzbDrone.Common
This commit is contained in:
parent
7563527eac
commit
fb0b505bf4
|
@ -1,6 +1,7 @@
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Providers;
|
using NzbDrone.Providers;
|
||||||
|
|
||||||
namespace NzbDrone.App.Test
|
namespace NzbDrone.App.Test
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Providers;
|
using NzbDrone.Providers;
|
||||||
|
|
||||||
namespace NzbDrone.App.Test
|
namespace NzbDrone.App.Test
|
||||||
|
|
|
@ -7,6 +7,7 @@ using AutoMoq;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Providers;
|
using NzbDrone.Providers;
|
||||||
|
|
||||||
namespace NzbDrone.App.Test
|
namespace NzbDrone.App.Test
|
||||||
|
@ -14,9 +15,6 @@ namespace NzbDrone.App.Test
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class IISProviderTest
|
public class IISProviderTest
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void start_should_set_IISProccessId_property()
|
public void start_should_set_IISProccessId_property()
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,8 @@ using FizzWare.NBuilder;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Common.Model;
|
||||||
using NzbDrone.Model;
|
using NzbDrone.Model;
|
||||||
using NzbDrone.Providers;
|
using NzbDrone.Providers;
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,10 @@
|
||||||
<None Include="packages.config" />
|
<None Include="packages.config" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj">
|
||||||
|
<Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project>
|
||||||
|
<Name>NzbDrone.Common</Name>
|
||||||
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\NzbDrone.Test.Dummy\NzbDrone.Test.Dummy.csproj">
|
<ProjectReference Include="..\NzbDrone.Test.Dummy\NzbDrone.Test.Dummy.csproj">
|
||||||
<Project>{FAFB5948-A222-4CF6-AD14-026BE7564802}</Project>
|
<Project>{FAFB5948-A222-4CF6-AD14-026BE7564802}</Project>
|
||||||
<Name>NzbDrone.Test.Dummy</Name>
|
<Name>NzbDrone.Test.Dummy</Name>
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
using System;
|
using System.Diagnostics;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using NzbDrone.Providers;
|
using NzbDrone.Common;
|
||||||
|
|
||||||
namespace NzbDrone.App.Test
|
namespace NzbDrone.App.Test
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,8 +3,8 @@ using AutoMoq;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using Moq;
|
using Moq;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Model;
|
using NzbDrone.Model;
|
||||||
using NzbDrone.Providers;
|
|
||||||
|
|
||||||
namespace NzbDrone.App.Test
|
namespace NzbDrone.App.Test
|
||||||
{
|
{
|
||||||
|
|
|
@ -4,6 +4,7 @@ using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using FluentAssertions;
|
using FluentAssertions;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Providers;
|
using NzbDrone.Providers;
|
||||||
|
|
||||||
namespace NzbDrone.App.Test
|
namespace NzbDrone.App.Test
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace NzbDrone.Providers
|
namespace NzbDrone.Common
|
||||||
{
|
{
|
||||||
public class ConsoleProvider
|
public class ConsoleProvider
|
||||||
{
|
{
|
||||||
|
@ -32,5 +32,10 @@ namespace NzbDrone.Providers
|
||||||
{
|
{
|
||||||
Console.WriteLine("Can't find service ({0})", ServiceProvider.NzbDroneServiceName);
|
Console.WriteLine("Can't find service ({0})", ServiceProvider.NzbDroneServiceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual void UpdateFolderDoestExist(string path)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Unable to find update package in '{0}'", path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace NzbDrone.Providers
|
namespace NzbDrone.Common
|
||||||
{
|
{
|
||||||
public class EnviromentProvider
|
public class EnviromentProvider
|
||||||
{
|
{
|
||||||
|
@ -42,6 +42,14 @@ namespace NzbDrone.Providers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public virtual string StartUpPath
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return new FileInfo(Assembly.GetExecutingAssembly().Location).Directory.FullName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static bool ContainsIIS(DirectoryInfo dir)
|
private static bool ContainsIIS(DirectoryInfo dir)
|
||||||
{
|
{
|
||||||
return dir.GetDirectories("iisexpress").Length != 0;
|
return dir.GetDirectories("iisexpress").Length != 0;
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace NzbDrone.Model
|
namespace NzbDrone.Common.Model
|
||||||
{
|
{
|
||||||
public class ProcessInfo
|
public class ProcessInfo
|
||||||
{
|
{
|
|
@ -0,0 +1,67 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProductVersion>8.0.30703</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>NzbDrone.Common</RootNamespace>
|
||||||
|
<AssemblyName>NzbDrone.Common</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="NLog">
|
||||||
|
<HintPath>..\packages\NLog.2.0.0.2000\lib\net40\NLog.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Configuration.Install" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.ServiceProcess" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="ConsoleProvider.cs" />
|
||||||
|
<Compile Include="EnviromentProvider.cs" />
|
||||||
|
<Compile Include="Model\ProcessInfo.cs" />
|
||||||
|
<Compile Include="ProcessProvider.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="ServiceProvider.cs" />
|
||||||
|
<Compile Include="WebClientProvider.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
|
@ -2,9 +2,9 @@
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NzbDrone.Model;
|
using NzbDrone.Common.Model;
|
||||||
|
|
||||||
namespace NzbDrone.Providers
|
namespace NzbDrone.Common
|
||||||
{
|
{
|
||||||
public class ProcessProvider
|
public class ProcessProvider
|
||||||
{
|
{
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("NzbDrone.Common")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft")]
|
||||||
|
[assembly: AssemblyProduct("NzbDrone.Common")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("b6eaa144-e13b-42e5-a738-c60d89c0f728")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,136 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Specialized;
|
||||||
|
using System.Configuration.Install;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.ServiceProcess;
|
||||||
|
using NLog;
|
||||||
|
using TimeoutException = System.TimeoutException;
|
||||||
|
|
||||||
|
namespace NzbDrone.Common
|
||||||
|
{
|
||||||
|
public class ServiceProvider
|
||||||
|
{
|
||||||
|
public const string NzbDroneServiceName = "NzbDrone";
|
||||||
|
|
||||||
|
private static readonly Logger Logger = LogManager.GetLogger("Host.ServiceManager");
|
||||||
|
|
||||||
|
public virtual bool ServiceExist(string name)
|
||||||
|
{
|
||||||
|
Logger.Debug("Checking if service {0} exists.", name);
|
||||||
|
return
|
||||||
|
ServiceController.GetServices().Any(
|
||||||
|
s => String.Equals(s.ServiceName, name, StringComparison.InvariantCultureIgnoreCase));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public virtual void Install()
|
||||||
|
{
|
||||||
|
Logger.Info("Installing service '{0}'", NzbDroneServiceName);
|
||||||
|
|
||||||
|
|
||||||
|
var installer = new ServiceProcessInstaller
|
||||||
|
{
|
||||||
|
Account = ServiceAccount.LocalSystem
|
||||||
|
};
|
||||||
|
|
||||||
|
var serviceInstaller = new ServiceInstaller();
|
||||||
|
|
||||||
|
|
||||||
|
String[] cmdline = { @"/assemblypath=" + Assembly.GetExecutingAssembly().Location };
|
||||||
|
|
||||||
|
var context = new InstallContext("service_install.log", cmdline);
|
||||||
|
serviceInstaller.Context = context;
|
||||||
|
serviceInstaller.DisplayName = NzbDroneServiceName;
|
||||||
|
serviceInstaller.ServiceName = NzbDroneServiceName;
|
||||||
|
serviceInstaller.Description = "NzbDrone Application Server";
|
||||||
|
serviceInstaller.StartType = ServiceStartMode.Automatic;
|
||||||
|
|
||||||
|
serviceInstaller.Parent = installer;
|
||||||
|
|
||||||
|
serviceInstaller.Install(new ListDictionary());
|
||||||
|
|
||||||
|
Logger.Info("Service Has installed successfully.");
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void UnInstall()
|
||||||
|
{
|
||||||
|
Logger.Info("Uninstalling NzbDrone service");
|
||||||
|
var serviceInstaller = new ServiceInstaller();
|
||||||
|
|
||||||
|
var context = new InstallContext("service_uninstall.log", null);
|
||||||
|
serviceInstaller.Context = context;
|
||||||
|
serviceInstaller.ServiceName = NzbDroneServiceName;
|
||||||
|
serviceInstaller.Uninstall(null);
|
||||||
|
|
||||||
|
Logger.Info("NzbDrone successfully uninstalled");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public virtual void Run(ServiceBase service)
|
||||||
|
{
|
||||||
|
ServiceBase.Run(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual ServiceController GetService(string serviceName)
|
||||||
|
{
|
||||||
|
return ServiceController.GetServices().Where(
|
||||||
|
c => String.Equals(c.ServiceName, serviceName, StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
.FirstOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Stop(string serviceName)
|
||||||
|
{
|
||||||
|
Logger.Info("Stopping {0} Service...");
|
||||||
|
var service = GetService(serviceName);
|
||||||
|
if (service == null)
|
||||||
|
{
|
||||||
|
Logger.Warn("Unable to stop {0}. no service with that name exists.", serviceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.Info("Service is currently {0}", service.Status);
|
||||||
|
|
||||||
|
service.Stop();
|
||||||
|
service.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromSeconds(60));
|
||||||
|
|
||||||
|
service.Refresh();
|
||||||
|
if (service.Status == ServiceControllerStatus.Stopped)
|
||||||
|
{
|
||||||
|
Logger.Info("{0} has stopped successfully.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.Error("Service stop request has timed out. {0}", service.Status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Start(string serviceName)
|
||||||
|
{
|
||||||
|
Logger.Info("Starting {0} Service...");
|
||||||
|
var service = GetService(serviceName);
|
||||||
|
if (service == null)
|
||||||
|
{
|
||||||
|
Logger.Warn("Unable to start '{0}' no service with that name exists.", serviceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (service.Status != ServiceControllerStatus.Paused || service.Status != ServiceControllerStatus.Stopped)
|
||||||
|
{
|
||||||
|
Logger.Warn("Service is in a state that can't be started {0}", service.Status);
|
||||||
|
}
|
||||||
|
|
||||||
|
service.Start();
|
||||||
|
|
||||||
|
service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(60));
|
||||||
|
service.Refresh();
|
||||||
|
|
||||||
|
if (service.Status == ServiceControllerStatus.Running)
|
||||||
|
{
|
||||||
|
Logger.Info("{0} has started successfully.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Logger.Error("Service start request has timed out. {0}", service.Status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
|
||||||
namespace NzbDrone.Providers
|
namespace NzbDrone.Common
|
||||||
{
|
{
|
||||||
public class WebClientProvider
|
public class WebClientProvider
|
||||||
{
|
{
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="NLog" version="2.0.0.2000" />
|
||||||
|
</packages>
|
|
@ -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<Type, object> 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<T>()
|
||||||
|
{
|
||||||
|
ResolveType = typeof(T);
|
||||||
|
var result = container.Resolve<T>();
|
||||||
|
SetConstant(result);
|
||||||
|
ResolveType = null;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Mock<T> GetMock<T>() where T : class
|
||||||
|
{
|
||||||
|
return GetMock<T>(DefaultBehavior);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual Mock<T> GetMock<T>(MockBehavior behavior) where T : class
|
||||||
|
{
|
||||||
|
ResolveType = null;
|
||||||
|
var type = GetTheMockType<T>();
|
||||||
|
if (GetMockHasNotBeenCalledForThisType(type))
|
||||||
|
{
|
||||||
|
CreateANewMockAndRegisterIt<T>(type, behavior);
|
||||||
|
}
|
||||||
|
|
||||||
|
var mock = TheRegisteredMockForThisType<T>(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>(T instance)
|
||||||
|
{
|
||||||
|
container.RegisterInstance(instance);
|
||||||
|
SetMock(instance.GetType(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ISetup<T> Setup<T>(Expression<Action<T>> expression) where T : class
|
||||||
|
{
|
||||||
|
return GetMock<T>().Setup(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ISetup<T, TResult> Setup<T, TResult>(Expression<Func<T, TResult>> expression) where T : class
|
||||||
|
{
|
||||||
|
return GetMock<T>().Setup(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Verify<T>(Expression<Action<T>> expression) where T : class
|
||||||
|
{
|
||||||
|
GetMock<T>().Verify(expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Verify<T>(Expression<Action<T>> expression, string failMessage) where T : class
|
||||||
|
{
|
||||||
|
GetMock<T>().Verify(expression, failMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Verify<T>(Expression<Action<T>> expression, Times times) where T : class
|
||||||
|
{
|
||||||
|
GetMock<T>().Verify(expression, times);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Verify<T>(Expression<Action<T>> expression, Times times, string failMessage) where T : class
|
||||||
|
{
|
||||||
|
GetMock<T>().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<Type, object>();
|
||||||
|
AddTheAutoMockingContainerExtensionToTheContainer(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void AddTheAutoMockingContainerExtensionToTheContainer(IUnityContainer container)
|
||||||
|
{
|
||||||
|
container.AddNewExtension<AutoMockingContainerExtension>();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Mock<T> TheRegisteredMockForThisType<T>(Type type) where T : class
|
||||||
|
{
|
||||||
|
return (Mock<T>)registeredMocks.Where(x => x.Key == type).First().Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateANewMockAndRegisterIt<T>(Type type, MockBehavior behavior) where T : class
|
||||||
|
{
|
||||||
|
var mock = new Mock<T>(behavior);
|
||||||
|
container.RegisterInstance(mock.Object);
|
||||||
|
SetMock(type, mock);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool GetMockHasNotBeenCalledForThisType(Type type)
|
||||||
|
{
|
||||||
|
return registeredMocks.ContainsKey(type) == false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Type GetTheMockType<T>() where T : class
|
||||||
|
{
|
||||||
|
return typeof(T);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,187 @@
|
||||||
|
// ReSharper disable RedundantUsingDirective
|
||||||
|
using System;
|
||||||
|
using AutoMoq;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
|
namespace NzbDrone.App.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<IDependency>();
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
Assert.IsNotNull(mock);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetMock_on_concrete_returns_mock()
|
||||||
|
{
|
||||||
|
//Arrange
|
||||||
|
var mocker = new AutoMoqer();
|
||||||
|
|
||||||
|
//Act
|
||||||
|
var mock = mocker.GetMock<ConcreteClass>();
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
Assert.IsNotNull(mock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Resolve_doesnt_return_mock()
|
||||||
|
{
|
||||||
|
//Arrange
|
||||||
|
var mocker = new AutoMoqer();
|
||||||
|
|
||||||
|
//Act
|
||||||
|
var result = mocker.Resolve<ConcreteClass>().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<VirtualDependency>().VirtualMethod();
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
Assert.AreEqual("hello", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Resolve_with_mocked_dependency_uses_mock()
|
||||||
|
{
|
||||||
|
//Arrange
|
||||||
|
var mocker = new AutoMoqer();
|
||||||
|
|
||||||
|
mocker.GetMock<VirtualDependency>()
|
||||||
|
.Setup(m => m.VirtualMethod())
|
||||||
|
.Returns("mocked");
|
||||||
|
|
||||||
|
//Act
|
||||||
|
var result = mocker.Resolve<ClassWithVirtualDependencies>().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<ClassWithVirtualDependencies>().CallVirtualChild();
|
||||||
|
|
||||||
|
var mockedResult = new Mock<VirtualDependency>().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<ClassWithVirtualDependencies>().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";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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.
|
|
@ -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<Type> _registeredTypes;
|
||||||
|
|
||||||
|
public AutoMockingBuilderStrategy(IEnumerable<Type> registeredTypes, IUnityContainer container)
|
||||||
|
{
|
||||||
|
var autoMoqer = container.Resolve<AutoMoqer>();
|
||||||
|
_mockFactory = new MockRepository(autoMoqer.DefaultBehavior);
|
||||||
|
_registeredTypes = registeredTypes;
|
||||||
|
_container = container;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void PreBuildUp(IBuilderContext context)
|
||||||
|
{
|
||||||
|
var autoMoqer = _container.Resolve<AutoMoqer>();
|
||||||
|
|
||||||
|
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<AutoMoqer>();
|
||||||
|
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<object>().ToArray() });
|
||||||
|
}
|
||||||
|
|
||||||
|
private MethodInfo GenerateAnInterfaceMockCreationMethod(Type type)
|
||||||
|
{
|
||||||
|
var createMethodWithNoParameters = _mockFactory.GetType().GetMethod("Create", EmptyArgumentList());
|
||||||
|
|
||||||
|
return createMethodWithNoParameters.MakeGenericMethod(new[] { type });
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Type[] EmptyArgumentList()
|
||||||
|
{
|
||||||
|
return new[] { typeof(object[]) };
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
// ReSharper disable RedundantUsingDirective
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Microsoft.Practices.Unity;
|
||||||
|
using Microsoft.Practices.Unity.ObjectBuilder;
|
||||||
|
|
||||||
|
namespace AutoMoq.Unity
|
||||||
|
{
|
||||||
|
internal class AutoMockingContainerExtension : UnityContainerExtension
|
||||||
|
{
|
||||||
|
private readonly IList<Type> registeredTypes = new List<Type>();
|
||||||
|
|
||||||
|
protected override void Initialize()
|
||||||
|
{
|
||||||
|
SetEventsOnContainerToTrackAllRegisteredTypes();
|
||||||
|
SetBuildingStrategyForBuildingUnregisteredTypes();
|
||||||
|
}
|
||||||
|
|
||||||
|
#region private methods
|
||||||
|
|
||||||
|
private void SetEventsOnContainerToTrackAllRegisteredTypes()
|
||||||
|
{
|
||||||
|
Context.Registering += ((sender, e) => RegisterType(e.TypeFrom));
|
||||||
|
Context.RegisteringInstance += ((sender, e) => RegisterType(e.RegisteredType));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RegisterType(Type typeToRegister)
|
||||||
|
{
|
||||||
|
registeredTypes.Add(typeToRegister);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetBuildingStrategyForBuildingUnregisteredTypes()
|
||||||
|
{
|
||||||
|
var strategy = new AutoMockingBuilderStrategy(registeredTypes, Container);
|
||||||
|
Context.Strategies.Add(strategy, UnityBuildStage.PreCreation);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,105 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||||
|
<ProductVersion>8.0.30703</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>NzbDrone.Update.Test</RootNamespace>
|
||||||
|
<AssemblyName>NzbDrone.Update.Test</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||||
|
<TargetFrameworkProfile>
|
||||||
|
</TargetFrameworkProfile>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup>
|
||||||
|
<StartupObject />
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="FluentAssertions">
|
||||||
|
<HintPath>..\packages\FluentAssertions.1.5.0.0\Lib\.NetFramework 4.0\FluentAssertions.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.Practices.ServiceLocation">
|
||||||
|
<HintPath>..\packages\CommonServiceLocator.1.0\lib\NET35\Microsoft.Practices.ServiceLocation.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.Practices.Unity">
|
||||||
|
<HintPath>..\packages\Unity.2.1.505.0\lib\NET35\Microsoft.Practices.Unity.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Microsoft.Practices.Unity.Configuration">
|
||||||
|
<HintPath>..\packages\Unity.2.1.505.0\lib\NET35\Microsoft.Practices.Unity.Configuration.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="Moq">
|
||||||
|
<HintPath>..\packages\Moq.4.0.10827\lib\NET40\Moq.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="nunit.framework">
|
||||||
|
<HintPath>..\packages\NUnit.2.5.10.11092\lib\nunit.framework.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="nunit.mocks">
|
||||||
|
<HintPath>..\packages\NUnit.2.5.10.11092\lib\nunit.mocks.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="pnunit.framework">
|
||||||
|
<HintPath>..\packages\NUnit.2.5.10.11092\lib\pnunit.framework.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="AutoMoq\AutoMoqer.cs" />
|
||||||
|
<Compile Include="AutoMoq\AutoMoqerTest.cs" />
|
||||||
|
<Compile Include="AutoMoq\Unity\AutoMockingBuilderStrategy.cs" />
|
||||||
|
<Compile Include="AutoMoq\Unity\AutoMockingContainerExtension.cs" />
|
||||||
|
<Compile Include="UpdateProviderTest.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj">
|
||||||
|
<Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project>
|
||||||
|
<Name>NzbDrone.Common</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
<ProjectReference Include="..\NzbDrone.Update\NzbDrone.Update.csproj">
|
||||||
|
<Project>{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}</Project>
|
||||||
|
<Name>NzbDrone.Update</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Content Include="AutoMoq\License.txt" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("NzbDrone.Update.Test")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft")]
|
||||||
|
[assembly: AssemblyProduct("NzbDrone.Update.Test")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("b323e212-2d04-4c7f-9097-c356749ace4d")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,65 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using AutoMoq;
|
||||||
|
using Moq;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Update.Providers;
|
||||||
|
|
||||||
|
namespace NzbDrone.Update.Test
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
class UpdateProviderTest
|
||||||
|
{
|
||||||
|
AutoMoqer mocker = new AutoMoqer();
|
||||||
|
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
mocker = new AutoMoqer();
|
||||||
|
|
||||||
|
mocker.GetMock<EnviromentProvider>()
|
||||||
|
.Setup(c => c.StartUpPath).Returns(@"C:\Temp\NzbDrone_update\");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void update_should_abort_with_message_if_update_package_isnt_in_current_folder()
|
||||||
|
{
|
||||||
|
string sandboxFolder = @"C:\Temp\NzbDrone_update\nzbdrone_update";
|
||||||
|
mocker.GetMock<DiskProvider>()
|
||||||
|
.Setup(c => c.FolderExists(sandboxFolder)).
|
||||||
|
Returns(false);
|
||||||
|
|
||||||
|
mocker.GetMock<ServiceProvider>(MockBehavior.Strict);
|
||||||
|
|
||||||
|
//Act
|
||||||
|
mocker.Resolve<UpdateProvider>().Start();
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
mocker.GetMock<ConsoleProvider>().Verify(c => c.UpdateFolderDoestExist(sandboxFolder), Times.Once());
|
||||||
|
mocker.VerifyAllMocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void should_stop_nzbdrone_service_if_installed()
|
||||||
|
{
|
||||||
|
mocker.GetMock<DiskProvider>()
|
||||||
|
.Setup(c => c.FolderExists(It.IsAny<string>())).
|
||||||
|
Returns(true);
|
||||||
|
|
||||||
|
mocker.GetMock<ServiceProvider>()
|
||||||
|
.Setup(c => c.ServiceExist(ServiceProvider.NzbDroneServiceName))
|
||||||
|
.Returns(true);
|
||||||
|
|
||||||
|
//Act
|
||||||
|
mocker.Resolve<UpdateProvider>().Start();
|
||||||
|
|
||||||
|
//Assert
|
||||||
|
mocker.GetMock<ServiceProvider>().Verify(c => c.Stop(ServiceProvider.NzbDroneServiceName), Times.Once());
|
||||||
|
mocker.VerifyAllMocks();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="CommonServiceLocator" version="1.0" />
|
||||||
|
<package id="FluentAssertions" version="1.5.0.0" />
|
||||||
|
<package id="Moq" version="4.0.10827" />
|
||||||
|
<package id="NUnit" version="2.5.10.11092" />
|
||||||
|
<package id="Unity" version="2.1.505.0" />
|
||||||
|
</packages>
|
|
@ -0,0 +1,71 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
|
||||||
|
<ProductVersion>8.0.30703</ProductVersion>
|
||||||
|
<SchemaVersion>2.0</SchemaVersion>
|
||||||
|
<ProjectGuid>{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>NzbDrone.Update</RootNamespace>
|
||||||
|
<AssemblyName>NzbDrone.Update</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
|
||||||
|
<TargetFrameworkProfile>Client</TargetFrameworkProfile>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="NLog">
|
||||||
|
<HintPath>..\packages\NLog.2.0.0.2000\lib\net40\NLog.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Providers\DiskProvider.cs" />
|
||||||
|
<Compile Include="Providers\UpdateProvider.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj">
|
||||||
|
<Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project>
|
||||||
|
<Name>NzbDrone.Common</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
|
@ -0,0 +1,15 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace NzbDrone.Update
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// General Information about an assembly is controlled through the following
|
||||||
|
// set of attributes. Change these attribute values to modify the information
|
||||||
|
// associated with an assembly.
|
||||||
|
[assembly: AssemblyTitle("NzbDrone.Update")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("Microsoft")]
|
||||||
|
[assembly: AssemblyProduct("NzbDrone.Update")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © Microsoft 2011")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Setting ComVisible to false makes the types in this assembly not visible
|
||||||
|
// to COM components. If you need to access a type in this assembly from
|
||||||
|
// COM, set the ComVisible attribute to true on that type.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||||
|
[assembly: Guid("e4560a3d-8053-4d57-a260-bfe52f4cc357")]
|
||||||
|
|
||||||
|
// Version information for an assembly consists of the following four values:
|
||||||
|
//
|
||||||
|
// Major Version
|
||||||
|
// Minor Version
|
||||||
|
// Build Number
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// You can specify all the values or you can default the Build and Revision Numbers
|
||||||
|
// by using the '*' as shown below:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -0,0 +1,87 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using NLog;
|
||||||
|
|
||||||
|
namespace NzbDrone.Update.Providers
|
||||||
|
{
|
||||||
|
public class DiskProvider
|
||||||
|
{
|
||||||
|
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
|
public virtual bool FolderExists(string path)
|
||||||
|
{
|
||||||
|
return Directory.Exists(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual bool FileExists(string path)
|
||||||
|
{
|
||||||
|
return File.Exists(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual string[] GetDirectories(string path)
|
||||||
|
{
|
||||||
|
return Directory.GetDirectories(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual string[] GetFiles(string path, SearchOption searchOption)
|
||||||
|
{
|
||||||
|
return Directory.GetFiles(path, "*.*", searchOption);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual long GetDirectorySize(string path)
|
||||||
|
{
|
||||||
|
return GetFiles(path, SearchOption.AllDirectories).Sum(e => new FileInfo(e).Length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual long GetSize(string path)
|
||||||
|
{
|
||||||
|
var fi = new FileInfo(path);
|
||||||
|
return fi.Length;
|
||||||
|
//return new FileInfo(path).Length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual String CreateDirectory(string path)
|
||||||
|
{
|
||||||
|
return Directory.CreateDirectory(path).FullName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void DeleteFile(string path)
|
||||||
|
{
|
||||||
|
File.Delete(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void MoveFile(string sourcePath, string destinationPath)
|
||||||
|
{
|
||||||
|
File.Move(sourcePath, destinationPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void DeleteFolder(string path, bool recursive)
|
||||||
|
{
|
||||||
|
Directory.Delete(path, recursive);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual DateTime DirectoryDateCreated(string path)
|
||||||
|
{
|
||||||
|
return Directory.GetCreationTime(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual IEnumerable<FileInfo> GetFileInfos(string path, string pattern, SearchOption searchOption)
|
||||||
|
{
|
||||||
|
return new DirectoryInfo(path).GetFiles(pattern, searchOption);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void MoveDirectory(string source, string destination)
|
||||||
|
{
|
||||||
|
Directory.Move(source, destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void InheritFolderPermissions(string filename)
|
||||||
|
{
|
||||||
|
var fs = File.GetAccessControl(filename);
|
||||||
|
fs.SetAccessRuleProtection(false, false);
|
||||||
|
File.SetAccessControl(filename, fs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
using System.IO;
|
||||||
|
using NLog;
|
||||||
|
using NzbDrone.Common;
|
||||||
|
|
||||||
|
namespace NzbDrone.Update.Providers
|
||||||
|
{
|
||||||
|
public class UpdateProvider
|
||||||
|
{
|
||||||
|
private readonly DiskProvider _diskProvider;
|
||||||
|
private readonly EnviromentProvider _enviromentProvider;
|
||||||
|
private readonly ConsoleProvider _consoleProvider;
|
||||||
|
private readonly ServiceProvider _serviceProvider;
|
||||||
|
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
|
public UpdateProvider(DiskProvider diskProvider, EnviromentProvider enviromentProvider, ConsoleProvider consoleProvider,
|
||||||
|
ServiceProvider serviceProvider)
|
||||||
|
{
|
||||||
|
_diskProvider = diskProvider;
|
||||||
|
_enviromentProvider = enviromentProvider;
|
||||||
|
_consoleProvider = consoleProvider;
|
||||||
|
_serviceProvider = serviceProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Start()
|
||||||
|
{
|
||||||
|
var sandboxFolder = Path.Combine(_enviromentProvider.StartUpPath, "nzbdrone_update");
|
||||||
|
Logger.Info("Looking for update package at {0}", sandboxFolder);
|
||||||
|
|
||||||
|
Logger.Info("Verifying Update Folder");
|
||||||
|
if (!_diskProvider.FolderExists(sandboxFolder))
|
||||||
|
{
|
||||||
|
Logger.Error("Update folder doesn't exist {0}", sandboxFolder);
|
||||||
|
_consoleProvider.UpdateFolderDoestExist(sandboxFolder);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_serviceProvider.ServiceExist(ServiceProvider.NzbDroneServiceName))
|
||||||
|
{
|
||||||
|
_serviceProvider.Stop(ServiceProvider.NzbDroneServiceName);
|
||||||
|
}
|
||||||
|
|
||||||
|
//Stop NzbDrone Process
|
||||||
|
|
||||||
|
//Create backup of current folder
|
||||||
|
|
||||||
|
//Copy update folder on top of the existing folder
|
||||||
|
|
||||||
|
//Happy: Start Service, Process?
|
||||||
|
//Happy: Cleanup
|
||||||
|
|
||||||
|
//Sad: delete fucked up folder
|
||||||
|
//Sad: restore backup
|
||||||
|
//Sad: start service, process
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="NLog" version="2.0.0.2000" />
|
||||||
|
</packages>
|
43
NzbDrone.sln
43
NzbDrone.sln
|
@ -15,6 +15,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone.App.Test", "NzbDro
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone.Test.Dummy", "NzbDrone.Test.Dummy\NzbDrone.Test.Dummy.csproj", "{FAFB5948-A222-4CF6-AD14-026BE7564802}"
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone.Test.Dummy", "NzbDrone.Test.Dummy\NzbDrone.Test.Dummy.csproj", "{FAFB5948-A222-4CF6-AD14-026BE7564802}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone.Update", "NzbDrone.Update\NzbDrone.Update.csproj", "{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone.Update.Test", "NzbDrone.Update.Test\NzbDrone.Update.Test.csproj", "{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone.Common", "NzbDrone.Common\NzbDrone.Common.csproj", "{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
@ -105,6 +111,42 @@ Global
|
||||||
{FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|x64.ActiveCfg = Release|x86
|
{FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|x64.ActiveCfg = Release|x86
|
||||||
{FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|x86.ActiveCfg = Release|x86
|
{FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|x86.ActiveCfg = Release|x86
|
||||||
{FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|x86.Build.0 = Release|x86
|
{FAFB5948-A222-4CF6-AD14-026BE7564802}.Release|x86.Build.0 = Release|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|Mixed Platforms.Build.0 = Debug|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|x64.ActiveCfg = Debug|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|Any CPU.ActiveCfg = Release|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|x64.ActiveCfg = Release|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}.Release|x86.Build.0 = Release|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|Any CPU.ActiveCfg = Debug|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|Mixed Platforms.ActiveCfg = Debug|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|Mixed Platforms.Build.0 = Debug|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|x64.ActiveCfg = Debug|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|x86.ActiveCfg = Debug|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Debug|x86.Build.0 = Debug|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|Any CPU.ActiveCfg = Release|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|Mixed Platforms.ActiveCfg = Release|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|Mixed Platforms.Build.0 = Release|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|x64.ActiveCfg = Release|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|x86.ActiveCfg = Release|x86
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97}.Release|x86.Build.0 = Release|x86
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Mixed Platforms.Build.0 = Release|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
@ -113,6 +155,7 @@ Global
|
||||||
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0} = {57A04B72-8088-4F75-A582-1158CF8291F7}
|
{193ADD3B-792B-4173-8E4C-5A3F8F0237F0} = {57A04B72-8088-4F75-A582-1158CF8291F7}
|
||||||
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5} = {57A04B72-8088-4F75-A582-1158CF8291F7}
|
{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5} = {57A04B72-8088-4F75-A582-1158CF8291F7}
|
||||||
{FAFB5948-A222-4CF6-AD14-026BE7564802} = {57A04B72-8088-4F75-A582-1158CF8291F7}
|
{FAFB5948-A222-4CF6-AD14-026BE7564802} = {57A04B72-8088-4F75-A582-1158CF8291F7}
|
||||||
|
{35388E8E-0CDB-4A84-AD16-E4B6EFDA5D97} = {57A04B72-8088-4F75-A582-1158CF8291F7}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
EnterpriseLibraryConfigurationToolBinariesPath = packages\Unity.2.1.505.0\lib\NET35
|
EnterpriseLibraryConfigurationToolBinariesPath = packages\Unity.2.1.505.0\lib\NET35
|
||||||
|
|
|
@ -3,6 +3,7 @@ using System.Net;
|
||||||
using System.ServiceProcess;
|
using System.ServiceProcess;
|
||||||
using NLog;
|
using NLog;
|
||||||
using Ninject;
|
using Ninject;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Providers;
|
using NzbDrone.Providers;
|
||||||
|
|
||||||
namespace NzbDrone
|
namespace NzbDrone
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using NLog;
|
using NLog;
|
||||||
using Ninject;
|
using Ninject;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Providers;
|
using NzbDrone.Providers;
|
||||||
|
|
||||||
namespace NzbDrone
|
namespace NzbDrone
|
||||||
|
|
|
@ -93,19 +93,13 @@
|
||||||
<Compile Include="CentralDispatch.cs" />
|
<Compile Include="CentralDispatch.cs" />
|
||||||
<Compile Include="Model\ApplicationMode.cs" />
|
<Compile Include="Model\ApplicationMode.cs" />
|
||||||
<Compile Include="Model\AuthenticationType.cs" />
|
<Compile Include="Model\AuthenticationType.cs" />
|
||||||
<Compile Include="Model\ProcessInfo.cs" />
|
|
||||||
<Compile Include="Providers\ConsoleProvider.cs" />
|
|
||||||
<Compile Include="Providers\DebuggerProvider.cs" />
|
<Compile Include="Providers\DebuggerProvider.cs" />
|
||||||
<Compile Include="Providers\EnviromentProvider.cs" />
|
|
||||||
<Compile Include="ProcessAttacher.cs" />
|
<Compile Include="ProcessAttacher.cs" />
|
||||||
<Compile Include="Providers\ConfigProvider.cs" />
|
<Compile Include="Providers\ConfigProvider.cs" />
|
||||||
<Compile Include="Providers\IISProvider.cs" />
|
<Compile Include="Providers\IISProvider.cs" />
|
||||||
<Compile Include="AppMain.cs" />
|
<Compile Include="AppMain.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="Providers\MonitoringProvider.cs" />
|
<Compile Include="Providers\MonitoringProvider.cs" />
|
||||||
<Compile Include="Providers\ProcessProvider.cs" />
|
|
||||||
<Compile Include="Providers\ServiceProvider.cs" />
|
|
||||||
<Compile Include="Providers\WebClientProvider.cs" />
|
|
||||||
<Compile Include="Router.cs" />
|
<Compile Include="Router.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -137,7 +131,12 @@
|
||||||
<Install>true</Install>
|
<Install>true</Install>
|
||||||
</BootstrapperPackage>
|
</BootstrapperPackage>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup />
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\NzbDrone.Common\NzbDrone.Common.csproj">
|
||||||
|
<Project>{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}</Project>
|
||||||
|
<Name>NzbDrone.Common</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<PreBuildEvent>
|
<PreBuildEvent>
|
||||||
|
|
|
@ -6,6 +6,7 @@ using System.Xml.XPath;
|
||||||
using NLog;
|
using NLog;
|
||||||
using NLog.Config;
|
using NLog.Config;
|
||||||
using Ninject;
|
using Ninject;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Model;
|
using NzbDrone.Model;
|
||||||
|
|
||||||
namespace NzbDrone.Providers
|
namespace NzbDrone.Providers
|
||||||
|
|
|
@ -3,6 +3,8 @@ using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using NLog;
|
using NLog;
|
||||||
using Ninject;
|
using Ninject;
|
||||||
|
using NzbDrone.Common;
|
||||||
|
using NzbDrone.Common.Model;
|
||||||
|
|
||||||
namespace NzbDrone.Providers
|
namespace NzbDrone.Providers
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System.Timers;
|
||||||
using Exceptioneer.WindowsFormsClient;
|
using Exceptioneer.WindowsFormsClient;
|
||||||
using NLog;
|
using NLog;
|
||||||
using Ninject;
|
using Ninject;
|
||||||
|
using NzbDrone.Common;
|
||||||
|
|
||||||
namespace NzbDrone.Providers
|
namespace NzbDrone.Providers
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
using System;
|
|
||||||
using System.Collections.Specialized;
|
|
||||||
using System.Configuration.Install;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.ServiceProcess;
|
|
||||||
using NLog;
|
|
||||||
|
|
||||||
namespace NzbDrone.Providers
|
|
||||||
{
|
|
||||||
public class ServiceProvider
|
|
||||||
{
|
|
||||||
public const string NzbDroneServiceName = "NzbDrone";
|
|
||||||
|
|
||||||
private static readonly Logger Logger = LogManager.GetLogger("Host.ServiceManager");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public virtual bool ServiceExist(string name)
|
|
||||||
{
|
|
||||||
return
|
|
||||||
ServiceController.GetServices().Any(
|
|
||||||
s => String.Equals(s.ServiceName, name, StringComparison.InvariantCultureIgnoreCase));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public virtual void Install()
|
|
||||||
{
|
|
||||||
Logger.Info("Installing service '{0}'", NzbDroneServiceName);
|
|
||||||
|
|
||||||
|
|
||||||
var installer = new ServiceProcessInstaller
|
|
||||||
{
|
|
||||||
Account = ServiceAccount.LocalSystem
|
|
||||||
};
|
|
||||||
|
|
||||||
var serviceInstaller = new ServiceInstaller();
|
|
||||||
|
|
||||||
|
|
||||||
String[] cmdline = { @"/assemblypath=" + Assembly.GetExecutingAssembly().Location };
|
|
||||||
|
|
||||||
var context = new InstallContext("service_install.log", cmdline);
|
|
||||||
serviceInstaller.Context = context;
|
|
||||||
serviceInstaller.DisplayName = NzbDroneServiceName;
|
|
||||||
serviceInstaller.ServiceName = NzbDroneServiceName;
|
|
||||||
serviceInstaller.Description = "NzbDrone Application Server";
|
|
||||||
serviceInstaller.StartType = ServiceStartMode.Automatic;
|
|
||||||
|
|
||||||
serviceInstaller.Parent = installer;
|
|
||||||
|
|
||||||
serviceInstaller.Install(new ListDictionary());
|
|
||||||
|
|
||||||
Logger.Info("Service Has installed successfully.");
|
|
||||||
}
|
|
||||||
|
|
||||||
public virtual void UnInstall()
|
|
||||||
{
|
|
||||||
var serviceInstaller = new ServiceInstaller();
|
|
||||||
|
|
||||||
var context = new InstallContext("service_uninstall.log", null);
|
|
||||||
serviceInstaller.Context = context;
|
|
||||||
serviceInstaller.ServiceName = NzbDroneServiceName;
|
|
||||||
serviceInstaller.Uninstall(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public virtual void Run(ServiceBase service)
|
|
||||||
{
|
|
||||||
ServiceBase.Run(service);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -2,8 +2,8 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Model;
|
using NzbDrone.Model;
|
||||||
using NzbDrone.Providers;
|
|
||||||
|
|
||||||
namespace NzbDrone
|
namespace NzbDrone
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,4 +5,7 @@
|
||||||
<repository path="..\NzbDrone.Core\packages.config" />
|
<repository path="..\NzbDrone.Core\packages.config" />
|
||||||
<repository path="..\NzbDrone.App.Test\packages.config" />
|
<repository path="..\NzbDrone.App.Test\packages.config" />
|
||||||
<repository path="..\NzbDrone\packages.config" />
|
<repository path="..\NzbDrone\packages.config" />
|
||||||
|
<repository path="..\NzbDrone.Update.Test\packages.config" />
|
||||||
|
<repository path="..\NzbDrone.Update\packages.config" />
|
||||||
|
<repository path="..\NzbDrone.Common\packages.config" />
|
||||||
</repositories>
|
</repositories>
|
Loading…
Reference in New Issue