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)
|
private TimeSpan SingleTimeSpanElement(XmlNode parent, string tagName, TimeSpan defaultValue)
|
||||||
{
|
{
|
||||||
var e = parent.SelectSingleNode(tagName);
|
var value = SingleElement(tagName, true);
|
||||||
|
return (value != null) ? ParseTimeSpan(value) : defaultValue;
|
||||||
if (e == null)
|
|
||||||
{
|
|
||||||
return defaultValue;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return ParseTimeSpan(e.InnerText);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private TimeSpan ParseTimeSpan(string v)
|
private TimeSpan ParseTimeSpan(string v)
|
||||||
|
@ -505,7 +497,7 @@ namespace winsw
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return SingleTimeSpanElement(dom.FirstChild, "waithint", Defaults.WaitHint);
|
return SingleTimeSpanElement(dom, "waithint", Defaults.WaitHint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -519,7 +511,7 @@ namespace winsw
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return SingleTimeSpanElement(dom.FirstChild, "sleeptime", Defaults.SleepTime);
|
return SingleTimeSpanElement(dom, "sleeptime", Defaults.SleepTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -615,7 +607,7 @@ namespace winsw
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return SingleTimeSpanElement(dom.FirstChild, "resetfailure", Defaults.ResetFailureAfter);
|
return SingleTimeSpanElement(dom, "resetfailure", Defaults.ResetFailureAfter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -703,7 +695,7 @@ namespace winsw
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
return SingleTimeSpanElement(dom.FirstChild, "stoptimeout", Defaults.StopTimeout);
|
return SingleTimeSpanElement(dom, "stoptimeout", Defaults.StopTimeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ namespace winswTests
|
||||||
{
|
{
|
||||||
using System;
|
using System;
|
||||||
using WMI;
|
using WMI;
|
||||||
|
using winswTests.Util;
|
||||||
|
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class ServiceDescriptorTests
|
public class ServiceDescriptorTests
|
||||||
|
@ -250,5 +251,65 @@ namespace winswTests
|
||||||
var serviceDescriptor = ServiceDescriptor.FromXML(seedXml);
|
var serviceDescriptor = ServiceDescriptor.FromXML(seedXml);
|
||||||
Assert.That(serviceDescriptor.AllowServiceAcountLogonRight, Is.EqualTo(false));
|
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="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="ServiceDescriptorTests.cs" />
|
<Compile Include="ServiceDescriptorTests.cs" />
|
||||||
<Compile Include="Util\CLITestHelper.cs" />
|
<Compile Include="Util\CLITestHelper.cs" />
|
||||||
|
<Compile Include="Util\ConfigXmlBuilder.cs" />
|
||||||
<Compile Include="Util\ServiceDescriptorAssert.cs" />
|
<Compile Include="Util\ServiceDescriptorAssert.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
Loading…
Reference in New Issue