diff --git a/src/Topshelf.Tests/CommandLine_Specs.cs b/src/Topshelf.Tests/CommandLine_Specs.cs index 7116174e..29c6faf6 100644 --- a/src/Topshelf.Tests/CommandLine_Specs.cs +++ b/src/Topshelf.Tests/CommandLine_Specs.cs @@ -73,6 +73,21 @@ public void Should_create_an_install_host_with_service_name() Assert.AreEqual("Joe", installHost.Settings.ServiceName); } + [Test] + public void Should_create_an_install_host_with_service_name_no_quotes() + { + Host host = HostFactory.New(x => + { + x.Service(); + x.ApplyCommandLine("install -servicename Joe"); + }); + + Assert.IsInstanceOf(host); + var installHost = (InstallHost)host; + Assert.AreEqual("Joe", installHost.Settings.Name); + Assert.AreEqual("Joe", installHost.Settings.ServiceName); + } + [Test] public void Should_create_an_install_host_with_display_name() { @@ -101,6 +116,20 @@ public void Should_create_an_install_host_with_display_name_and_instance_name() Assert.AreEqual("Joe (Instance: 42)", installHost.Settings.DisplayName); } + [Test] + public void Should_create_an_install_host_with_display_name_and_instance_name_no_quotes() + { + Host host = HostFactory.New(x => + { + x.Service(); + x.ApplyCommandLine("install -displayname Joe -instance 42"); + }); + + Assert.IsInstanceOf(host); + var installHost = (InstallHost)host; + Assert.AreEqual("Joe (Instance: 42)", installHost.Settings.DisplayName); + } + [Test] public void Should_create_an_install_host_with_display_name_with_instance_name() { @@ -115,6 +144,20 @@ public void Should_create_an_install_host_with_display_name_with_instance_name() Assert.AreEqual("Joe (Instance: 42)", installHost.Settings.DisplayName); } + [Test] + public void Should_create_an_install_host_with_display_name_with_instance_name_no_quotes() + { + Host host = HostFactory.New(x => + { + x.Service(); + x.ApplyCommandLine("install -displayname \"Joe (Instance: 42)\" -instance 42"); + }); + + Assert.IsInstanceOf(host); + var installHost = (InstallHost)host; + Assert.AreEqual("Joe (Instance: 42)", installHost.Settings.DisplayName); + } + [Test] public void Should_create_an_install_host_with_description() { @@ -145,6 +188,22 @@ public void Should_create_an_install_host_with_service_name_and_instance_name() Assert.AreEqual("Joe$42", installHost.Settings.ServiceName); } + [Test] + public void Should_create_an_install_host_with_service_name_and_instance_name_no_quotes() + { + Host host = HostFactory.New(x => + { + x.Service(); + x.ApplyCommandLine("install -servicename Joe -instance 42"); + }); + + Assert.IsInstanceOf(host); + var installHost = (InstallHost)host; + Assert.AreEqual("Joe", installHost.Settings.Name); + Assert.AreEqual("42", installHost.Settings.InstanceName); + Assert.AreEqual("Joe$42", installHost.Settings.ServiceName); + } + [Test] public void Should_create_and_install_host_with_service_name_containing_space() { @@ -319,6 +378,23 @@ public void Need_to_handle_crazy_special_characters_in_argument() Assert.AreEqual("abc123=:,.<>/?;!@#$%^&*()-+", password); } + [Test] + public void Need_to_handle_crazy_special_characters_in_argument_no_quotes() + { + string password = null; + + Host host = HostFactory.New(x => + { + x.Service(); + + x.AddCommandLineDefinition("password", v => password = v); + + x.ApplyCommandLine("-password abc123=:,.<>/?;!@#$%^&*()-+"); + }); + + Assert.AreEqual("abc123=:,.<>/?;!@#$%^&*()-+", password); + } + [Test] public void Extensible_the_command_line_should_be_yet_again() { diff --git a/src/Topshelf/Configuration/CommandLineParser/StringCommandLineParser.cs b/src/Topshelf/Configuration/CommandLineParser/StringCommandLineParser.cs index 1dc3c1ff..43d4ba26 100644 --- a/src/Topshelf/Configuration/CommandLineParser/StringCommandLineParser.cs +++ b/src/Topshelf/Configuration/CommandLineParser/StringCommandLineParser.cs @@ -41,6 +41,11 @@ from cs in Rep(Char(char.IsLetterOrDigit).Or(Char('.'))) Value = (from symbol in Rep(Char(char.IsLetterOrDigit).Or(Char(char.IsPunctuation)).Or(Char(char.IsSymbol))) select symbol.Aggregate("", (s, ch) => s + ch)); + ValueInQuotes = from oq in Char('"') + from value in Rep(EscChar) + from cq in Char('"') + select value.Aggregate("", (s, ch) => s + ch); + Definition = (from w in Whitespace from c in Char('-').Or(Char('/')) from key in Id @@ -51,10 +56,8 @@ select DefinitionElement.New(key, value)) from c in Char('-').Or(Char('/')) from key in Id from ws in Whitespace - from oq in Char('"') - from value in Rep(EscChar) - from cq in Char('"') - select DefinitionElement.New(key, value.Aggregate("", (s, ch) => s + ch))); + from value in ValueInQuotes.Or(Value) + select DefinitionElement.New(key, value)); EmptyDefinition = (from w in Whitespace from c in Char('-').Or(Char('/')) @@ -107,6 +110,7 @@ from c in Char(']') Parser Id { get; set; } Parser Key { get; set; } Parser Value { get; set; } + Parser ValueInQuotes { get; set; } Parser Definition { get; set; } Parser EmptyDefinition { get; set; }