More update code. almost there.

This commit is contained in:
kay.one 2011-11-13 12:31:02 -08:00
parent 60d598f2c1
commit 883dffca80
8 changed files with 166 additions and 14 deletions

View File

@ -63,7 +63,7 @@ namespace NzbDrone.Common
} }
} }
public virtual string StartUpPath public virtual string StartUpPath
{ {
get get
@ -92,7 +92,19 @@ namespace NzbDrone.Common
var fileLocation = Assembly.GetCallingAssembly().Location; var fileLocation = Assembly.GetCallingAssembly().Location;
return new FileInfo(fileLocation).CreationTime; return new FileInfo(fileLocation).CreationTime;
} }
}
public virtual int NzbDroneProcessIdFromEnviroment
{
get
{
var id = Convert.ToInt32(Environment.GetEnvironmentVariable("NZBDRONE_PID"));
if (id == 0)
throw new InvalidOperationException("NZBDRONE_PID isn't a valid environment variable.");
return id;
}
} }
private static bool ContainsIIS(DirectoryInfo dir) private static bool ContainsIIS(DirectoryInfo dir)

View File

@ -120,7 +120,7 @@ namespace NzbDrone.Core
{ {
try try
{ {
var pid = Convert.ToInt32(Environment.GetEnvironmentVariable("NZBDRONE_PID")); var pid = new EnviromentProvider().NzbDroneProcessIdFromEnviroment;
Logger.Debug("Attaching to parent process ({0}) for automatic termination.", pid); Logger.Debug("Attaching to parent process ({0}) for automatic termination.", pid);

View File

@ -67,8 +67,9 @@
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="UpdateProviderVerifyTest.cs" /> <Compile Include="ProgramFixture.cs" />
<Compile Include="UpdateProviderStartTest.cs" /> <Compile Include="UpdateProviderVerifyFixture.cs" />
<Compile Include="UpdateProviderStartFixture.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common;
using NzbDrone.Common.Model;
using NzbDrone.Test.Common;
using NzbDrone.Update.Providers;
namespace NzbDrone.Update.Test
{
[TestFixture]
public class ProgramFixture : TestBase
{
private Program _program;
[SetUp]
public void Setup()
{
_program = Mocker.Resolve<Program>();
}
[Test]
public void should_throw_if_null_passed_in()
{
Assert.Throws<ArgumentException>(() => _program.Start(null));
}
[Test]
public void should_throw_if_less_than_two_arguments_arent_passed_in()
{
Assert.Throws<ArgumentException>(() => _program.Start(new[] { "" }));
}
[Test]
public void should_throw_if_more_than_two_arguments_arent_passed_in()
{
Assert.Throws<ArgumentException>(() => _program.Start(new[] { "", "", "" }));
}
[TestCase("d", "")]
[TestCase("", "")]
[TestCase("0", "")]
[TestCase("-1", "")]
[TestCase(" ", "")]
[TestCase(".", "")]
public void should_throw_if_first_arg_isnt_an_int(string arg1, string arg2)
{
Assert.Throws<ArgumentOutOfRangeException>(() => _program.Start(new[] { arg1, arg2 }));
}
[Test]
public void should_call_update_with_corret_path()
{
const string ProcessPath = @"C:\NzbDrone\nzbdrone.exe";
Mocker.GetMock<ProcessProvider>().Setup(c => c.GetProcessById(12))
.Returns(new ProcessInfo() { StartPath = ProcessPath });
//Act
_program.Start(new[] { "12", "" });
//Assert
Mocker.GetMock<UpdateProvider>().Verify(c => c.Start(ProcessPath), Times.Once());
}
}
}

View File

@ -11,7 +11,7 @@ using NzbDrone.Update.Providers;
namespace NzbDrone.Update.Test namespace NzbDrone.Update.Test
{ {
[TestFixture] [TestFixture]
class UpdateProviderStartTest : TestBase class UpdateProviderStartFixture : TestBase
{ {
private const string UPDATE_FOLDER = @"C:\Temp\nzbdrone_update\nzbdrone\"; private const string UPDATE_FOLDER = @"C:\Temp\nzbdrone_update\nzbdrone\";
private const string BACKUP_FOLDER = @"C:\Temp\nzbdrone_update\nzbdrone_backup\"; private const string BACKUP_FOLDER = @"C:\Temp\nzbdrone_update\nzbdrone_backup\";

View File

@ -12,7 +12,7 @@ using NzbDrone.Update.Providers;
namespace NzbDrone.Update.Test namespace NzbDrone.Update.Test
{ {
[TestFixture] [TestFixture]
class UpdateProviderVerifyTest : TestBase class UpdateProviderVerifyFixture : TestBase
{ {
AutoMoqer mocker = new AutoMoqer(); AutoMoqer mocker = new AutoMoqer();

View File

@ -1,15 +1,78 @@
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using NLog;
using NzbDrone.Common;
using NzbDrone.Update.Providers;
namespace NzbDrone.Update namespace NzbDrone.Update
{ {
class Program public class Program
{ {
static void Main(string[] args) private readonly UpdateProvider _updateProvider;
private readonly ProcessProvider _processProvider;
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public Program(UpdateProvider updateProvider, ProcessProvider processProvider)
{ {
_updateProvider = updateProvider;
_processProvider = processProvider;
}
public static void Main(string[] args)
{
try
{
Console.WriteLine("Starting NzbDrone Update Client");
LogConfiguration.RegisterConsoleLogger(LogLevel.Trace);
LogConfiguration.RegisterUdpLogger();
LogConfiguration.RegisterExceptioneer();
LogConfiguration.Reload();
logger.Info("Initializing update application");
var enviromentProvider = new EnviromentProvider();
var processProvider = new ProcessProvider();
var serviceProvider = new ServiceProvider();
var diskProvider = new DiskProvider();
var updateProvider = new UpdateProvider(diskProvider, serviceProvider, processProvider, enviromentProvider);
new Program(updateProvider, processProvider).Start(args);
}
catch (Exception e)
{
logger.Fatal("An error has occurred while applying update.", e);
}
}
public void Start(string[] args)
{
VerfityArguments(args);
int processId = ParseProcessId(args);
string appPath = _processProvider.GetProcessById(processId).StartPath;
logger.Info("Starting update process");
_updateProvider.Start(appPath);
}
private int ParseProcessId(string[] args)
{
int id = 0;
if (!Int32.TryParse(args[0], out id) || id <= 0)
{
throw new ArgumentOutOfRangeException("Invalid process id: " + args[0]);
}
return id;
}
private void VerfityArguments(string[] args)
{
if (args == null || args.Length != 2)
throw new ArgumentException("Wrong number of parameters were passed in.");
} }
} }
} }

View File

@ -14,7 +14,7 @@ namespace NzbDrone.Update.Providers
private readonly EnviromentProvider _enviromentProvider; private readonly EnviromentProvider _enviromentProvider;
private static readonly Logger logger = LogManager.GetCurrentClassLogger(); private static readonly Logger logger = LogManager.GetCurrentClassLogger();
public UpdateProvider(DiskProvider diskProvider,ServiceProvider serviceProvider, public UpdateProvider(DiskProvider diskProvider, ServiceProvider serviceProvider,
ProcessProvider processProvider, EnviromentProvider enviromentProvider) ProcessProvider processProvider, EnviromentProvider enviromentProvider)
{ {
_diskProvider = diskProvider; _diskProvider = diskProvider;
@ -23,6 +23,10 @@ namespace NzbDrone.Update.Providers
_enviromentProvider = enviromentProvider; _enviromentProvider = enviromentProvider;
} }
public UpdateProvider()
{
}
private void Verify(string targetFolder) private void Verify(string targetFolder)
{ {
logger.Info("Verifying requirements before update..."); logger.Info("Verifying requirements before update...");
@ -39,7 +43,7 @@ namespace NzbDrone.Update.Providers
} }
public void Start(string targetFolder) public virtual void Start(string targetFolder)
{ {
Verify(targetFolder); Verify(targetFolder);
bool isService = false; bool isService = false;
@ -49,7 +53,7 @@ namespace NzbDrone.Update.Providers
{ {
if (_serviceProvider.IsServiceRunning(ServiceProvider.NZBDRONE_SERVICE_NAME)) if (_serviceProvider.IsServiceRunning(ServiceProvider.NZBDRONE_SERVICE_NAME))
{ {
isService = true; isService = true;
} }
_serviceProvider.Stop(ServiceProvider.NZBDRONE_SERVICE_NAME); _serviceProvider.Stop(ServiceProvider.NZBDRONE_SERVICE_NAME);
} }