NzbDrone Update no longer opens console/browser.

pull/3113/head
Keivan Beigi 12 years ago
parent 46c093559e
commit 34f3ee6b4b

@ -16,22 +16,25 @@ namespace NzbDrone.App.Test
[TestFixture]
public class ContainerFixture : TestBase
{
string[] args = new[]{"first","second"};
[Test]
public void should_be_able_to_resolve_indexers()
{
MainAppContainerBuilder.BuildContainer().Resolve<IEnumerable<IIndexer>>().Should().NotBeEmpty();
MainAppContainerBuilder.BuildContainer(args).Resolve<IEnumerable<IIndexer>>().Should().NotBeEmpty();
}
[Test]
public void should_be_able_to_resolve_downlodclients()
{
MainAppContainerBuilder.BuildContainer().Resolve<IEnumerable<IDownloadClient>>().Should().NotBeEmpty();
MainAppContainerBuilder.BuildContainer(args).Resolve<IEnumerable<IDownloadClient>>().Should().NotBeEmpty();
}
[Test]
public void container_should_inject_itself()
{
var factory = MainAppContainerBuilder.BuildContainer().Resolve<IServiceFactory>();
var factory = MainAppContainerBuilder.BuildContainer(args).Resolve<IServiceFactory>();
factory.Build<IIndexerService>().Should().NotBeNull();
}
@ -40,7 +43,7 @@ namespace NzbDrone.App.Test
public void should_resolve_command_executor_by_name()
{
var genericExecutor = typeof(IExecute<>).MakeGenericType(typeof(RssSyncCommand));
var container = MainAppContainerBuilder.BuildContainer();
var container = MainAppContainerBuilder.BuildContainer(args);
DbFactory.RegisterDatabase(container);
var executor = container.Resolve(genericExecutor);
@ -53,7 +56,7 @@ namespace NzbDrone.App.Test
[Ignore("need to fix this at some point")]
public void should_return_same_instance_of_singletons()
{
var container = MainAppContainerBuilder.BuildContainer();
var container = MainAppContainerBuilder.BuildContainer(args);
var first = container.ResolveAll<IHandle<ApplicationShutdownRequested>>().OfType<Scheduler>().Single();
var second = container.ResolveAll<IHandle<ApplicationShutdownRequested>>().OfType<Scheduler>().Single();

@ -1,5 +1,4 @@
using System.ServiceProcess;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common;
@ -11,37 +10,6 @@ namespace NzbDrone.App.Test
[TestFixture]
public class RouterTest : TestBase<Router>
{
[TestCase(null, ApplicationModes.Console)]
[TestCase("", ApplicationModes.Console)]
[TestCase("1", ApplicationModes.Help)]
[TestCase("ii", ApplicationModes.Help)]
[TestCase("uu", ApplicationModes.Help)]
[TestCase("i", ApplicationModes.InstallService)]
[TestCase("I", ApplicationModes.InstallService)]
[TestCase("/I", ApplicationModes.InstallService)]
[TestCase("/i", ApplicationModes.InstallService)]
[TestCase("-I", ApplicationModes.InstallService)]
[TestCase("-i", ApplicationModes.InstallService)]
[TestCase("u", ApplicationModes.UninstallService)]
[TestCase("U", ApplicationModes.UninstallService)]
[TestCase("/U", ApplicationModes.UninstallService)]
[TestCase("/u", ApplicationModes.UninstallService)]
[TestCase("-U", ApplicationModes.UninstallService)]
[TestCase("-u", ApplicationModes.UninstallService)]
public void GetApplicationMode_single_arg(string arg, ApplicationModes modes)
{
Router.GetApplicationMode(new[] { arg }).Should().Be(modes);
}
[TestCase("", "", ApplicationModes.Console)]
[TestCase("", null, ApplicationModes.Console)]
[TestCase("i", "n", ApplicationModes.Help)]
public void GetApplicationMode_two_args(string a, string b, ApplicationModes modes)
{
Router.GetApplicationMode(new[] { a, b }).Should().Be(modes);
}
[Test]
public void Route_should_call_install_service_when_application_mode_is_install()
{
@ -123,7 +91,7 @@ namespace NzbDrone.App.Test
var serviceMock = Mocker.GetMock<IServiceProvider>();
Mocker.GetMock<IRuntimeInfo>().SetupGet(c => c.IsUserInteractive).Returns(true);
consoleMock.Setup(c => c.PrintServiceDoestExist());
consoleMock.Setup(c => c.PrintServiceDoesNotExist());
serviceMock.Setup(c => c.ServiceExist(ServiceProvider.NZBDRONE_SERVICE_NAME)).Returns(false);
Subject.Route(ApplicationModes.UninstallService);

@ -0,0 +1,30 @@
using FluentAssertions;
using NUnit.Framework;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Test.Common;
namespace NzbDrone.Common.Test.EnvironmentTests
{
[TestFixture]
public class StartupArgumentsFixture : TestBase
{
[Test]
public void empty_array_should_return_empty_flags()
{
var args = new StartupArguments(new string[0]);
args.Flags.Should().BeEmpty();
}
[TestCase("/t")]
[TestCase(" /t")]
[TestCase(" /T")]
[TestCase(" /t ")]
public void should_parse_single_flag(string arg)
{
var args = new StartupArguments(new[] { arg });
args.Flags.Should().HaveCount(1);
args.Flags.Contains("t").Should().BeTrue();
}
}
}

@ -82,6 +82,7 @@
<Compile Include="CacheTests\CachedFixture.cs" />
<Compile Include="ConfigFileProviderTest.cs" />
<Compile Include="EnsureTest\PathExtensionFixture.cs" />
<Compile Include="EnvironmentTests\StartupArgumentsFixture.cs" />
<Compile Include="EnvironmentTests\EnviromentProviderTest.cs" />
<Compile Include="EventingTests\MessageAggregatorCommandTests.cs" />
<Compile Include="EventingTests\MessageAggregatorEventTests.cs" />
@ -124,7 +125,6 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Folder Include="EnviromentTests\" />
<Folder Include="Properties\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

@ -13,10 +13,9 @@ namespace NzbDrone.Common.Test
[SetUp]
public void setup()
{
Mocker.SetConstant(MainAppContainerBuilder.BuildContainer());
Mocker.SetConstant(MainAppContainerBuilder.BuildContainer(new string[0]));
}
[Test]
public void event_handlers_should_be_unique()
{

@ -1,6 +1,7 @@
using System;
using System.Diagnostics;
using System.IO;
using NzbDrone.Common.EnvironmentInfo;
namespace NzbDrone.Common
{
@ -10,7 +11,7 @@ namespace NzbDrone.Common
void WaitForClose();
void PrintHelp();
void PrintServiceAlreadyExist();
void PrintServiceDoestExist();
void PrintServiceDoesNotExist();
}
public class ConsoleService : IConsoleService
@ -33,8 +34,9 @@ namespace NzbDrone.Common
Console.WriteLine();
Console.WriteLine(" Usage: {0} <command> ", Process.GetCurrentProcess().MainModule.ModuleName);
Console.WriteLine(" Commands:");
Console.WriteLine(" /i Install the application as a Windows Service ({0}).", ServiceProvider.NZBDRONE_SERVICE_NAME);
Console.WriteLine(" /u Uninstall already installed Windows Service ({0}).", ServiceProvider.NZBDRONE_SERVICE_NAME);
Console.WriteLine(" /{0} Install the application as a Windows Service ({1}).",StartupArguments.INSTALL_SERVICE, ServiceProvider.NZBDRONE_SERVICE_NAME);
Console.WriteLine(" /{0} Uninstall already installed Windows Service ({1}).",StartupArguments.UNINSTALL_SERVICE, ServiceProvider.NZBDRONE_SERVICE_NAME);
Console.WriteLine(" /{0} Don't open NzbDrone in a browser", StartupArguments.NO_BROWSER);
Console.WriteLine(" <No Arguments> Run application in console mode.");
}
@ -43,7 +45,7 @@ namespace NzbDrone.Common
Console.WriteLine("A service with the same name ({0}) already exists. Aborting installation", ServiceProvider.NZBDRONE_SERVICE_NAME);
}
public void PrintServiceDoestExist()
public void PrintServiceDoesNotExist()
{
Console.WriteLine("Can't find service ({0})", ServiceProvider.NZBDRONE_SERVICE_NAME);
}

@ -0,0 +1,26 @@
using System.Collections.Generic;
namespace NzbDrone.Common.EnvironmentInfo
{
public class StartupArguments
{
public const string NO_BROWSER = "no-browser";
public const string INSTALL_SERVICE = "i";
public const string UNINSTALL_SERVICE = "u";
public const string HELP = "?";
public StartupArguments(string[] args)
{
Flags = new HashSet<string>();
foreach (var s in args)
{
var flag = s.Trim(' ', '/', '-').ToLower();
Flags.Add(flag);
}
}
public HashSet<string> Flags { get; private set; }
}
}

@ -104,6 +104,7 @@
<Compile Include="EnsureThat\Param.cs" />
<Compile Include="EnsureThat\Resources\ExceptionMessages.Designer.cs" />
<Compile Include="EnvironmentInfo\BuildInfo.cs" />
<Compile Include="EnvironmentInfo\StartupArguments.cs" />
<Compile Include="EnvironmentInfo\RuntimeInfo.cs" />
<Compile Include="EnvironmentInfo\OsInfo.cs" />
<Compile Include="Exceptions\NzbDroneException.cs" />

@ -57,7 +57,7 @@ namespace NzbDrone.Integration.Test
[SetUp]
public void SmokeTestSetup()
{
Container = MainAppContainerBuilder.BuildContainer();
Container = MainAppContainerBuilder.BuildContainer(new string[0]);
Container.Register(typeof(IAppFolderInfo), new IntegrationTestFolderInfo());
DbFactory.RegisterDatabase(Container);

@ -81,6 +81,8 @@ namespace NzbDrone.Test.Common
Mocker.SetConstant(LogManager.GetLogger("TestLogger"));
Mocker.SetConstant(new StartupArguments(new string[0]));
LogManager.ReconfigExistingLoggers();
TempFolder = Path.Combine(Directory.GetCurrentDirectory(), "_temp_" + DateTime.Now.Ticks);

@ -1,9 +1,11 @@
using System;
using System.Diagnostics;
using System.IO;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Test.Common;
using NzbDrone.Update.UpdateEngine;
@ -26,13 +28,16 @@ namespace NzbDrone.Update.Test
[Test]
public void should_start_console_if_app_type_was_serivce_but_start_failed_because_of_permissions()
{
string targetFolder = "c:\\NzbDrone\\";
const string targetFolder = "c:\\NzbDrone\\";
Mocker.GetMock<Common.IServiceProvider>().Setup(c => c.Start(ServiceProvider.NZBDRONE_SERVICE_NAME)).Throws(new InvalidOperationException());
Subject.Start(AppType.Service, targetFolder);
Mocker.GetMock<IProcessProvider>().Verify(c => c.Start("c:\\NzbDrone\\NzbDrone.Console.exe"), Times.Once());
Mocker.GetMock<IProcessProvider>().Verify(c => c.Start(It.Is<ProcessStartInfo>(s =>
s.FileName == "c:\\NzbDrone\\NzbDrone.Console.exe" &&
s.Arguments == StartupArguments.NO_BROWSER
)), Times.Once());
ExceptionVerification.ExpectedWarns(1);
}

@ -6,7 +6,7 @@
<ProductVersion>8.0.30703</ProductVersion>
<SchemaVersion>2.0</SchemaVersion>
<ProjectGuid>{4CCC53CD-8D5E-4CC4-97D2-5C9312AC2BD7}</ProjectGuid>
<OutputType>Exe</OutputType>
<OutputType>WinExe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>NzbDrone.Update</RootNamespace>
<AssemblyName>NzbDrone.Update</AssemblyName>
@ -54,6 +54,9 @@
<ErrorReport>prompt</ErrorReport>
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
</PropertyGroup>
<PropertyGroup>
<StartupObject />
</PropertyGroup>
<ItemGroup>
<Reference Include="NLog, Version=2.0.1.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>

@ -1,7 +1,9 @@
using System;
using System.Diagnostics;
using System.IO;
using NLog;
using NzbDrone.Common;
using NzbDrone.Common.EnvironmentInfo;
using IServiceProvider = NzbDrone.Common.IServiceProvider;
namespace NzbDrone.Update.UpdateEngine
@ -58,14 +60,20 @@ namespace NzbDrone.Update.UpdateEngine
private void StartWinform(string installationFolder)
{
_logger.Info("Starting NzbDrone without Console");
_processProvider.Start(Path.Combine(installationFolder, "NzbDrone.exe"));
Start(installationFolder, "NzbDrone.exe");
}
private void StartConsole(string installationFolder)
{
_logger.Info("Starting NzbDrone with Console");
_processProvider.Start(Path.Combine(installationFolder, "NzbDrone.Console.exe"));
Start(installationFolder, "NzbDrone.Console.exe");
}
private void Start(string installationFolder, string fileName)
{
_logger.Info("Starting {0}", fileName);
var path = Path.Combine(installationFolder, fileName);
_processProvider.Start(new ProcessStartInfo(path, StartupArguments.NO_BROWSER));
}
}
}

@ -8,6 +8,7 @@
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=NUnit_002ENonPublicMethodWithTestAttribute/@EntryIndexedValue">ERROR</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=ReturnTypeCanBeEnumerable_002EGlobal/@EntryIndexedValue">HINT</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseObjectOrCollectionInitializer/@EntryIndexedValue">HINT</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Constants/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateConstants/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AA_BB" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/JavaScriptNaming/UserRules/=JS_005FPARAMETER/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb"&gt;&lt;ExtraRule Prefix="" Suffix="" Style="AaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:String x:Key="/Default/Environment/Editor/MatchingBraceHighlighting/Position/@EntryValue">BOTH_SIDES</s:String>

@ -49,10 +49,10 @@ namespace NzbDrone
return;
}
var container = MainAppContainerBuilder.BuildContainer();
var container = MainAppContainerBuilder.BuildContainer(args);
DbFactory.RegisterDatabase(container);
container.Resolve<Router>().Route(args);
container.Resolve<Router>().Route();
}
catch (Exception e)
{

@ -22,12 +22,13 @@ namespace NzbDrone
private readonly IHostController _hostController;
private readonly IProcessProvider _processProvider;
private readonly PriorityMonitor _priorityMonitor;
private readonly StartupArguments _startupArguments;
private readonly IFirewallAdapter _firewallAdapter;
private readonly IUrlAclAdapter _urlAclAdapter;
private readonly Logger _logger;
public NzbDroneServiceFactory(IConfigFileProvider configFileProvider, IHostController hostController, IRuntimeInfo runtimeInfo,
IProcessProvider processProvider, PriorityMonitor priorityMonitor,
IProcessProvider processProvider, PriorityMonitor priorityMonitor, StartupArguments startupArguments,
IFirewallAdapter firewallAdapter, IUrlAclAdapter urlAclAdapter, Logger logger)
{
_configFileProvider = configFileProvider;
@ -35,6 +36,7 @@ namespace NzbDrone
_runtimeInfo = runtimeInfo;
_processProvider = processProvider;
_priorityMonitor = priorityMonitor;
_startupArguments = startupArguments;
_firewallAdapter = firewallAdapter;
_urlAclAdapter = urlAclAdapter;
_logger = logger;
@ -55,7 +57,9 @@ namespace NzbDrone
}
_hostController.StartServer();
if (_runtimeInfo.IsUserInteractive && _configFileProvider.LaunchBrowser)
if (!_startupArguments.Flags.Contains(StartupArguments.NO_BROWSER) &&
_runtimeInfo.IsUserInteractive &&
_configFileProvider.LaunchBrowser)
{
try
{

@ -1,11 +1,9 @@
using NLog;
using Nancy.Bootstrapper;
using Nancy.Bootstrapper;
using NzbDrone.Api;
using NzbDrone.Api.SignalR;
using NzbDrone.Common.Composition;
using NzbDrone.Common.Messaging;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Core.Datastore;
using NzbDrone.Core.Instrumentation;
using NzbDrone.Core.Organizer;
using NzbDrone.Core.RootFolders;
@ -13,15 +11,12 @@ namespace NzbDrone
{
public class MainAppContainerBuilder : ContainerBuilderBase
{
private static readonly Logger Logger = LogManager.GetLogger("ContainerBuilderBase");
public static IContainer BuildContainer()
public static IContainer BuildContainer(string[] args)
{
return new MainAppContainerBuilder().Container;
return new MainAppContainerBuilder(args).Container;
}
private MainAppContainerBuilder()
private MainAppContainerBuilder(string[] args)
: base("NzbDrone", "NzbDrone.Common", "NzbDrone.Core", "NzbDrone.Api")
{
AutoRegisterImplementations<NzbDronePersistentConnection>();
@ -30,9 +25,8 @@ namespace NzbDrone
Container.Register(typeof(IBasicRepository<NamingConfig>), typeof(BasicRepository<NamingConfig>));
Container.Register<INancyBootstrapper, NancyBootstrapper>();
}
Container.Register(new StartupArguments(args));
}
}
}

@ -3,7 +3,6 @@ using System.Collections.Generic;
using System.Linq;
using NLog;
using NzbDrone.Common;
using NzbDrone.Common.Composition;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.SysTray;
using IServiceProvider = NzbDrone.Common.IServiceProvider;
@ -14,25 +13,28 @@ namespace NzbDrone
{
private readonly INzbDroneServiceFactory _nzbDroneServiceFactory;
private readonly IServiceProvider _serviceProvider;
private readonly StartupArguments _startupArguments;
private readonly IConsoleService _consoleService;
private readonly IRuntimeInfo _runtimeInfo;
private readonly ISystemTrayApp _systemTrayProvider;
private readonly Logger _logger;
public Router(INzbDroneServiceFactory nzbDroneServiceFactory, IServiceProvider serviceProvider,
public Router(INzbDroneServiceFactory nzbDroneServiceFactory, IServiceProvider serviceProvider, StartupArguments startupArguments,
IConsoleService consoleService, IRuntimeInfo runtimeInfo, ISystemTrayApp systemTrayProvider, Logger logger)
{
_nzbDroneServiceFactory = nzbDroneServiceFactory;
_serviceProvider = serviceProvider;
_startupArguments = startupArguments;
_consoleService = consoleService;
_runtimeInfo = runtimeInfo;
_systemTrayProvider = systemTrayProvider;
_logger = logger;
}
public void Route(IEnumerable<string> args)
public void Route()
{
Route(GetApplicationMode(args));
var appMode = GetApplicationMode();
Route(appMode);
}
public void Route(ApplicationModes applicationModes)
@ -87,7 +89,7 @@ namespace NzbDrone
_logger.Trace("Uninstall Service selected");
if (!_serviceProvider.ServiceExist(ServiceProvider.NZBDRONE_SERVICE_NAME))
{
_consoleService.PrintServiceDoestExist();
_consoleService.PrintServiceDoesNotExist();
}
else
{
@ -104,20 +106,24 @@ namespace NzbDrone
}
}
public static ApplicationModes GetApplicationMode(IEnumerable<string> args)
private ApplicationModes GetApplicationMode()
{
if (args == null) return ApplicationModes.Console;
var cleanArgs = args.Where(c => c != null && !String.IsNullOrWhiteSpace(c)).ToList();
if (cleanArgs.Count == 0) return ApplicationModes.Console;
if (cleanArgs.Count != 1) return ApplicationModes.Help;
if (_startupArguments.Flags.Contains(StartupArguments.HELP))
{
return ApplicationModes.Help;
}
var arg = cleanArgs.First().Trim('/', '\\', '-').ToLower();
if (_startupArguments.Flags.Contains(StartupArguments.INSTALL_SERVICE))
{
return ApplicationModes.InstallService;
}
if (arg == "i") return ApplicationModes.InstallService;
if (arg == "u") return ApplicationModes.UninstallService;
if (_startupArguments.Flags.Contains(StartupArguments.UNINSTALL_SERVICE))
{
return ApplicationModes.UninstallService;
}
return ApplicationModes.Help;
return ApplicationModes.Console;
}
}
}

Loading…
Cancel
Save