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}{0}>", 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("");
}
}
}