using System; using System.Collections.Generic; using System.Text; using WinSW.Plugins.RunawayProcessKiller; using WinSW.Tests.Extensions; namespace WinSW.Tests.Util { /// /// Configuration XML builder, which simplifies testing of WinSW Configuration file. /// internal 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; } public List ExtensionXmls { get; } private readonly List configEntries; // TODO: Switch to the initializer? private ConfigXmlBuilder() { this.configEntries = new List(); this.ExtensionXmls = new List(); } 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 (this.PrintXmlVersion) { // TODO: The encoding is generally wrong str.Append("\n"); } if (this.XmlComment != null) { str.AppendFormat("\n", this.XmlComment); } str.Append("\n"); str.AppendFormat(" {0}\n", this.Id); str.AppendFormat(" {0}\n", this.Name); str.AppendFormat(" {0}\n", this.Description); str.AppendFormat(" {0}\n", this.Executable); foreach (string entry in this.configEntries) { // We do not care much about pretty formatting here str.AppendFormat(" {0}\n", entry); } // Extensions if (this.ExtensionXmls.Count > 0) { str.Append(" \n"); foreach (string xml in this.ExtensionXmls) { str.Append(xml); } str.Append(" \n"); } str.Append("\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(this.ToXmlString(dumpConfig)); } public ConfigXmlBuilder WithRawEntry(string entry) { this.configEntries.Add(entry); return this; } public ConfigXmlBuilder WithTag(string tagName, string value) { return this.WithRawEntry(string.Format("<{0}>{1}", tagName, value)); } public ConfigXmlBuilder WithRunawayProcessKiller(RunawayProcessKillerExtension ext, string extensionId = "killRunawayProcess", bool enabled = true) { var fullyQualifiedExtensionName = ExtensionTestBase.GetExtensionClassNameWithAssembly(typeof(RunawayProcessKillerExtension)); StringBuilder str = new StringBuilder(); str.AppendFormat(" \n", new object[] { enabled, fullyQualifiedExtensionName, extensionId }); str.AppendFormat(" {0}\n", ext.Pidfile); str.AppendFormat(" {0}\n", ext.StopTimeout.TotalMilliseconds); str.AppendFormat(" {0}\n", ext.CheckWinSWEnvironmentVariable); str.Append(" \n"); this.ExtensionXmls.Add(str.ToString()); return this; } public ConfigXmlBuilder WithDownload(Download download) { StringBuilder xml = new StringBuilder(); xml.Append($""); return this.WithRawEntry(xml.ToString()); } public ConfigXmlBuilder WithDelayedAutoStart() { return this.WithRawEntry(""); } } }