| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 |
- using System;
- using System.Diagnostics;
- using NUnit.Framework;
- using winsw;
- namespace winswTests
- {
- using System;
- using WMI;
- using winswTests.Util;
- [TestFixture]
- public class ServiceDescriptorTests
- {
- private ServiceDescriptor _extendedServiceDescriptor;
- private const string ExpectedWorkingDirectory = @"Z:\Path\SubPath";
- private const string Username = "User";
- private const string Password = "Password";
- private const string Domain = "Domain";
- private const string AllowServiceAccountLogonRight = "true";
- [SetUp]
- public void SetUp()
- {
- const string seedXml = "<service>"
- + "<id>service.exe</id>"
- + "<name>Service</name>"
- + "<description>The service.</description>"
- + "<executable>node.exe</executable>"
- + "<arguments>My Arguments</arguments>"
- + "<logmode>rotate</logmode>"
- + "<serviceaccount>"
- + "<domain>" + Domain + "</domain>"
- + "<user>" + Username + "</user>"
- + "<password>" + Password + "</password>"
- + "<allowservicelogon>" + AllowServiceAccountLogonRight + "</allowservicelogon>"
- + "</serviceaccount>"
- + "<workingdirectory>"
- + ExpectedWorkingDirectory
- + "</workingdirectory>"
- + @"<logpath>C:\logs</logpath>"
- + "</service>";
- _extendedServiceDescriptor = ServiceDescriptor.FromXML(seedXml);
- }
- [Test]
- public void DefaultStartMode()
- {
- Assert.That(_extendedServiceDescriptor.StartMode, Is.EqualTo(StartMode.Automatic));
- }
- [Test]
- [ExpectedException(typeof(System.ArgumentException))]
- public void IncorrectStartMode()
- {
- const string SeedXml = "<service>"
- + "<id>service.exe</id>"
- + "<name>Service</name>"
- + "<description>The service.</description>"
- + "<executable>node.exe</executable>"
- + "<arguments>My Arguments</arguments>"
- + "<startmode>rotate</startmode>"
- + "<logmode>rotate</logmode>"
- + "<serviceaccount>"
- + "<domain>" + Domain + "</domain>"
- + "<user>" + Username + "</user>"
- + "<password>" + Password + "</password>"
- + "<allowservicelogon>" + AllowServiceAccountLogonRight + "</allowservicelogon>"
- + "</serviceaccount>"
- + "<workingdirectory>"
- + ExpectedWorkingDirectory
- + "</workingdirectory>"
- + @"<logpath>C:\logs</logpath>"
- + "</service>";
- _extendedServiceDescriptor = ServiceDescriptor.FromXML(SeedXml);
- Assert.That(_extendedServiceDescriptor.StartMode, Is.EqualTo(StartMode.Manual));
- }
- [Test]
- public void ChangedStartMode()
- {
- const string SeedXml = "<service>"
- + "<id>service.exe</id>"
- + "<name>Service</name>"
- + "<description>The service.</description>"
- + "<executable>node.exe</executable>"
- + "<arguments>My Arguments</arguments>"
- + "<startmode>manual</startmode>"
- + "<logmode>rotate</logmode>"
- + "<serviceaccount>"
- + "<domain>" + Domain + "</domain>"
- + "<user>" + Username + "</user>"
- + "<password>" + Password + "</password>"
- + "<allowservicelogon>" + AllowServiceAccountLogonRight + "</allowservicelogon>"
- + "</serviceaccount>"
- + "<workingdirectory>"
- + ExpectedWorkingDirectory
- + "</workingdirectory>"
- + @"<logpath>C:\logs</logpath>"
- + "</service>";
- _extendedServiceDescriptor = ServiceDescriptor.FromXML(SeedXml);
- Assert.That(_extendedServiceDescriptor.StartMode, Is.EqualTo(StartMode.Manual));
- }
- [Test]
- public void VerifyWorkingDirectory()
- {
- Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + _extendedServiceDescriptor.WorkingDirectory);
- Assert.That(_extendedServiceDescriptor.WorkingDirectory, Is.EqualTo(ExpectedWorkingDirectory));
- }
- [Test]
- public void VerifyServiceLogonRight()
- {
- Assert.That(_extendedServiceDescriptor.AllowServiceAcountLogonRight, Is.EqualTo(true));
- }
- [Test]
- public void VerifyUsername()
- {
- Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + _extendedServiceDescriptor.WorkingDirectory);
- Assert.That(_extendedServiceDescriptor.ServiceAccountUser, Is.EqualTo(Domain + "\\" + Username));
- }
- [Test]
- public void VerifyPassword()
- {
- Debug.WriteLine("_extendedServiceDescriptor.WorkingDirectory :: " + _extendedServiceDescriptor.WorkingDirectory);
- Assert.That(_extendedServiceDescriptor.ServiceAccountPassword, Is.EqualTo(Password));
- }
- [Test]
- public void Priority()
- {
- var sd = ServiceDescriptor.FromXML("<service><id>test</id><priority>normal</priority></service>");
- Assert.That(sd.Priority, Is.EqualTo(ProcessPriorityClass.Normal));
- sd = ServiceDescriptor.FromXML("<service><id>test</id><priority>idle</priority></service>");
- Assert.That(sd.Priority, Is.EqualTo(ProcessPriorityClass.Idle));
- sd = ServiceDescriptor.FromXML("<service><id>test</id></service>");
- Assert.That(sd.Priority, Is.EqualTo(ProcessPriorityClass.Normal));
- }
- [Test]
- public void StopParentProcessFirstIsFalseByDefault()
- {
- Assert.False(_extendedServiceDescriptor.StopParentProcessFirst);
- }
- [Test]
- public void CanParseStopParentProcessFirst()
- {
- const string seedXml = "<service>"
- + "<stopparentprocessfirst>true</stopparentprocessfirst>"
- + "</service>";
- var serviceDescriptor = ServiceDescriptor.FromXML(seedXml);
- Assert.True(serviceDescriptor.StopParentProcessFirst);
- }
- [Test]
- public void CanParseStopTimeout()
- {
- const string seedXml = "<service>"
- + "<stoptimeout>60sec</stoptimeout>"
- + "</service>";
- var serviceDescriptor = ServiceDescriptor.FromXML(seedXml);
- Assert.That(serviceDescriptor.StopTimeout, Is.EqualTo(TimeSpan.FromSeconds(60)));
- }
- [Test]
- public void CanParseStopTimeoutFromMinutes()
- {
- const string seedXml = "<service>"
- + "<stoptimeout>10min</stoptimeout>"
- + "</service>";
- var serviceDescriptor = ServiceDescriptor.FromXML(seedXml);
- Assert.That(serviceDescriptor.StopTimeout, Is.EqualTo(TimeSpan.FromMinutes(10)));
- }
-
- [Test]
- public void LogModeRollBySize()
- {
- const string seedXml = "<service>"
- + "<logpath>c:\\</logpath>"
- + "<log mode=\"roll-by-size\">"
- + "<sizeThreshold>112</sizeThreshold>"
- + "<keepFiles>113</keepFiles>"
- + "</log>"
- + "</service>";
-
- var serviceDescriptor = ServiceDescriptor.FromXML(seedXml);
- serviceDescriptor.BaseName = "service";
- var logHandler = serviceDescriptor.LogHandler as SizeBasedRollingLogAppender;
- Assert.NotNull(logHandler);
- Assert.That(logHandler.SizeTheshold, Is.EqualTo(112 * 1024));
- Assert.That(logHandler.FilesToKeep, Is.EqualTo(113));
- }
- [Test]
- public void LogModeRollByTime()
- {
- const string seedXml = "<service>"
- + "<logpath>c:\\</logpath>"
- + "<log mode=\"roll-by-time\">"
- + "<period>7</period>"
- + "<pattern>log pattern</pattern>"
- + "</log>"
- + "</service>";
- var serviceDescriptor = ServiceDescriptor.FromXML(seedXml);
- serviceDescriptor.BaseName = "service";
- var logHandler = serviceDescriptor.LogHandler as TimeBasedRollingLogAppender;
- Assert.NotNull(logHandler);
- Assert.That(logHandler.Period, Is.EqualTo(7));
- Assert.That(logHandler.Pattern, Is.EqualTo("log pattern"));
- }
- [Test]
- public void VerifyServiceLogonRightGraceful()
- {
- const string seedXml="<service>"
- + "<serviceaccount>"
- + "<domain>" + Domain + "</domain>"
- + "<user>" + Username + "</user>"
- + "<password>" + Password + "</password>"
- + "<allowservicelogon>true1</allowservicelogon>"
- + "</serviceaccount>"
- + "</service>";
- var serviceDescriptor = ServiceDescriptor.FromXML(seedXml);
- Assert.That(serviceDescriptor.AllowServiceAcountLogonRight, Is.EqualTo(false));
- }
- [Test]
- public void VerifyServiceLogonRightOmitted()
- {
- const string seedXml = "<service>"
- + "<serviceaccount>"
- + "<domain>" + Domain + "</domain>"
- + "<user>" + Username + "</user>"
- + "<password>" + Password + "</password>"
- + "</serviceaccount>"
- + "</service>";
- 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)));
- }
- /// <summary>
- /// https://github.com/kohsuke/winsw/issues/178
- /// </summary>
- [Test]
- public void Arguments_LegacyParam()
- {
- var sd = ConfigXmlBuilder.create().WithTag("arguments", "arg").ToServiceDescriptor(true);
- Assert.That(sd.Arguments, Is.EqualTo("arg"));
- }
- [Test]
- public void Arguments_NewParam_Single()
- {
- var sd = ConfigXmlBuilder.create()
- .WithTag("argument", "--arg1=2")
- .ToServiceDescriptor(true);
- Assert.That(sd.Arguments, Is.EqualTo(" --arg1=2"));
- }
- [Test]
- public void Arguments_NewParam_MultipleArgs()
- {
- var sd = ConfigXmlBuilder.create()
- .WithTag("argument", "--arg1=2")
- .WithTag("argument", "--arg2=123")
- .WithTag("argument", "--arg3=null")
- .ToServiceDescriptor(true);
- Assert.That(sd.Arguments, Is.EqualTo(" --arg1=2 --arg2=123 --arg3=null"));
- }
- /// <summary>
- /// Ensures that the new single-argument field has a higher priority.
- /// </summary>
- [Test]
- public void Arguments_Bothparam_Priorities()
- {
- var sd = ConfigXmlBuilder.create()
- .WithTag("arguments", "--arg1=2 --arg2=3")
- .WithTag("argument", "--arg2=123")
- .WithTag("argument", "--arg3=null")
- .ToServiceDescriptor(true);
- Assert.That(sd.Arguments, Is.EqualTo(" --arg2=123 --arg3=null"));
- }
- [TestCase(true)]
- [TestCase(false)]
- public void DelayedStart_RoundTrip(bool enabled)
- {
- var bldr = ConfigXmlBuilder.create();
- if (enabled) {
- bldr = bldr.WithDelayedAutoStart();
- }
- var sd = bldr.ToServiceDescriptor();
- Assert.That(sd.DelayedAutoStart, Is.EqualTo(enabled));
- }
- }
- }
|