mirror of https://github.com/winsw/winsw
Merge pull request #175 from oleg-nenashev/TimeSpan_settings_parsing
Fix #159 - Time span settings parsingpull/179/head
commit
71dfc0b291
|
@ -126,16 +126,8 @@ namespace winsw
|
|||
|
||||
private TimeSpan SingleTimeSpanElement(XmlNode parent, string tagName, TimeSpan defaultValue)
|
||||
{
|
||||
var e = parent.SelectSingleNode(tagName);
|
||||
|
||||
if (e == null)
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ParseTimeSpan(e.InnerText);
|
||||
}
|
||||
var value = SingleElement(tagName, true);
|
||||
return (value != null) ? ParseTimeSpan(value) : defaultValue;
|
||||
}
|
||||
|
||||
private TimeSpan ParseTimeSpan(string v)
|
||||
|
@ -505,7 +497,7 @@ namespace winsw
|
|||
{
|
||||
get
|
||||
{
|
||||
return SingleTimeSpanElement(dom.FirstChild, "waithint", Defaults.WaitHint);
|
||||
return SingleTimeSpanElement(dom, "waithint", Defaults.WaitHint);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -519,7 +511,7 @@ namespace winsw
|
|||
{
|
||||
get
|
||||
{
|
||||
return SingleTimeSpanElement(dom.FirstChild, "sleeptime", Defaults.SleepTime);
|
||||
return SingleTimeSpanElement(dom, "sleeptime", Defaults.SleepTime);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -615,7 +607,7 @@ namespace winsw
|
|||
{
|
||||
get
|
||||
{
|
||||
return SingleTimeSpanElement(dom.FirstChild, "resetfailure", Defaults.ResetFailureAfter);
|
||||
return SingleTimeSpanElement(dom, "resetfailure", Defaults.ResetFailureAfter);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -703,7 +695,7 @@ namespace winsw
|
|||
{
|
||||
get
|
||||
{
|
||||
return SingleTimeSpanElement(dom.FirstChild, "stoptimeout", Defaults.StopTimeout);
|
||||
return SingleTimeSpanElement(dom, "stoptimeout", Defaults.StopTimeout);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ namespace winswTests
|
|||
{
|
||||
using System;
|
||||
using WMI;
|
||||
using winswTests.Util;
|
||||
|
||||
[TestFixture]
|
||||
public class ServiceDescriptorTests
|
||||
|
@ -250,5 +251,65 @@ namespace winswTests
|
|||
var serviceDescriptor = ServiceDescriptor.FromXML(seedXml);
|
||||
Assert.That(serviceDescriptor.AllowServiceAcountLogonRight, Is.EqualTo(false));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void VerifyWaitHint_FullXML()
|
||||
{
|
||||
var sd = ConfigXmlBuilder.create()
|
||||
.WithTag("waithint", "20 min")
|
||||
.ToServiceDescriptor(true);
|
||||
Assert.That(sd.WaitHint, Is.EqualTo(TimeSpan.FromMinutes(20)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Test for https://github.com/kohsuke/winsw/issues/159
|
||||
/// </summary>
|
||||
[Test]
|
||||
public void VerifyWaitHint_XMLWithoutVersion()
|
||||
{
|
||||
var sd = ConfigXmlBuilder.create(printXMLVersion: false)
|
||||
.WithTag("waithint", "21 min")
|
||||
.ToServiceDescriptor(true);
|
||||
Assert.That(sd.WaitHint, Is.EqualTo(TimeSpan.FromMinutes(21)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void VerifyWaitHint_XMLWithoutComment()
|
||||
{
|
||||
var sd = ConfigXmlBuilder.create(xmlComment: null)
|
||||
.WithTag("waithint", "22 min")
|
||||
.ToServiceDescriptor(true);
|
||||
Assert.That(sd.WaitHint, Is.EqualTo(TimeSpan.FromMinutes(22)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void VerifyWaitHint_XMLWithoutVersionAndComment()
|
||||
{
|
||||
var sd = ConfigXmlBuilder.create(xmlComment: null, printXMLVersion: false)
|
||||
.WithTag("waithint", "23 min")
|
||||
.ToServiceDescriptor(true);
|
||||
Assert.That(sd.WaitHint, Is.EqualTo(TimeSpan.FromMinutes(23)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void VerifySleepTime()
|
||||
{
|
||||
var sd = ConfigXmlBuilder.create().WithTag("sleeptime", "3 hrs").ToServiceDescriptor(true);
|
||||
Assert.That(sd.SleepTime, Is.EqualTo(TimeSpan.FromHours(3)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void VerifyResetFailureAfter()
|
||||
{
|
||||
var sd = ConfigXmlBuilder.create().WithTag("resetfailure", "75 sec").ToServiceDescriptor(true);
|
||||
Assert.That(sd.ResetFailureAfter, Is.EqualTo(TimeSpan.FromSeconds(75)));
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void VerifyStopTimeout()
|
||||
{
|
||||
var sd = ConfigXmlBuilder.create().WithTag("stoptimeout", "35 secs").ToServiceDescriptor(true);
|
||||
Assert.That(sd.StopTimeout, Is.EqualTo(TimeSpan.FromSeconds(35)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,92 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using winsw;
|
||||
|
||||
namespace winswTests.Util
|
||||
{
|
||||
/// <summary>
|
||||
/// Configuration XML builder, which simplifies testing of WinSW Configuration file.
|
||||
/// </summary>
|
||||
class ConfigXmlBuilder
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Id { get; set; }
|
||||
public string Description { get; set; }
|
||||
public string Executable { get; set; }
|
||||
public bool PrintXMLVersion { get; set; }
|
||||
public string XMLComment { get; set; }
|
||||
|
||||
private List<String> configEntries;
|
||||
|
||||
// TODO: Switch to the initializer?
|
||||
private ConfigXmlBuilder()
|
||||
{
|
||||
configEntries = new List<string>();
|
||||
}
|
||||
|
||||
public static ConfigXmlBuilder create(string id = null, string name = null,
|
||||
string description = null, string executable = null, bool printXMLVersion = true,
|
||||
string xmlComment = "")
|
||||
{
|
||||
var config = new ConfigXmlBuilder();
|
||||
config.Id = id ?? "myapp";
|
||||
config.Name = name ?? "MyApp Service";
|
||||
config.Description = description ?? "MyApp Service (powered by WinSW)";
|
||||
config.Executable = executable ?? "%BASE%\\myExecutable.exe";
|
||||
config.PrintXMLVersion = printXMLVersion;
|
||||
config.XMLComment = (xmlComment != null && xmlComment.Length == 0)
|
||||
? "Just a sample configuration file generated by the test suite"
|
||||
: xmlComment;
|
||||
return config;
|
||||
}
|
||||
|
||||
public string ToXMLString(bool dumpConfig = false)
|
||||
{
|
||||
StringBuilder str = new StringBuilder();
|
||||
if (PrintXMLVersion)
|
||||
{
|
||||
// TODO: The encoding is generally wrong
|
||||
str.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
|
||||
}
|
||||
if (XMLComment != null)
|
||||
{
|
||||
str.AppendFormat("<!--{0}-->\n", XMLComment);
|
||||
}
|
||||
str.Append("<service>\n");
|
||||
str.AppendFormat(" <id>{0}</id>\n", Id);
|
||||
str.AppendFormat(" <name>{0}</name>\n", Name);
|
||||
str.AppendFormat(" <description>{0}</description>\n", Description);
|
||||
str.AppendFormat(" <executable>{0}</executable>\n", Executable);
|
||||
foreach (String entry in configEntries)
|
||||
{
|
||||
// We do not care much about pretty formatting here
|
||||
str.AppendFormat(" {0}\n", entry);
|
||||
}
|
||||
str.Append("</service>\n");
|
||||
string res = str.ToString();
|
||||
if (dumpConfig)
|
||||
{
|
||||
Console.Out.WriteLine("Produced config:");
|
||||
Console.Out.WriteLine(res);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public ServiceDescriptor ToServiceDescriptor(bool dumpConfig = false)
|
||||
{
|
||||
return ServiceDescriptor.FromXML(ToXMLString(dumpConfig));
|
||||
}
|
||||
|
||||
public ConfigXmlBuilder WithRawEntry(string entry)
|
||||
{
|
||||
configEntries.Add(entry);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ConfigXmlBuilder WithTag(string tagName, string value)
|
||||
{
|
||||
return WithRawEntry(String.Format("<{0}>{1}</{0}>", tagName, value));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -63,6 +63,7 @@
|
|||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="ServiceDescriptorTests.cs" />
|
||||
<Compile Include="Util\CLITestHelper.cs" />
|
||||
<Compile Include="Util\ConfigXmlBuilder.cs" />
|
||||
<Compile Include="Util\ServiceDescriptorAssert.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
Loading…
Reference in New Issue