using System; using System.Diagnostics; using System.Drawing.Imaging; using System.IO; using System.Linq; using NUnit.Framework; using NzbDrone.Common; using OpenQA.Selenium; using OpenQA.Selenium.Firefox; using OpenQA.Selenium.Remote; namespace NzbDrone.Web.UI.Automation { [Explicit] [TestFixture(Category = "Automation")] public abstract class AutomationTestBase { private static readonly EnvironmentProvider environmentProvider = new EnvironmentProvider(); private readonly string _clonePackagePath; private readonly string _masterPackagePath; protected string AppUrl { get { return "http://localhost:8989"; } } protected AutomationTestBase() { var rawPackagePath = Path.Combine(environmentProvider.ApplicationPath, "_rawPackage"); _clonePackagePath = Path.Combine(rawPackagePath, "NzbDrone_Automation"); _masterPackagePath = Path.Combine(rawPackagePath, "NzbDrone"); } protected RemoteWebDriver Driver { get; private set; } [SetUp] public void AutomationSetup() { } [TearDown] public void AutomationTearDown() { if (!Directory.Exists(Directory.GetCurrentDirectory() + "\\Screenshots")) { Directory.CreateDirectory(Directory.GetCurrentDirectory() + "\\Screenshots"); } foreach (var file in Directory.GetFiles(Directory.GetCurrentDirectory(), "*__*.png").Select(c => new FileInfo(c))) { File.Copy(file.FullName, Directory.GetCurrentDirectory() + "\\Screenshots\\" + file.Name, true); file.Delete(); } } [TestFixtureSetUp] public void AutomationTestFixtureSetup() { StopNzbDrone(); DeleteClone(); ClonePackage(); //StartNzbDrone(); InstallNzbDroneService(); new HttpProvider().DownloadString(AppUrl); Driver = new FirefoxDriver(); } [TestFixtureTearDown] public void AutomationTestFixtureTearDown() { Driver.Close(); StopNzbDrone(); } protected void CaptureScreen() { var method = new StackFrame(1).GetMethod().Name; var fileName = String.Format("{0}__{1}.png", GetType().Name, method); ((ITakesScreenshot)Driver).GetScreenshot().SaveAsFile(fileName, ImageFormat.Png); } private void StartNzbDrone() { StartProcess("nzbdrone.exe", false); } private void StopNzbDrone() { foreach (var process in Process.GetProcesses()) { if (string.Equals(process.ProcessName, "NzbDrone", StringComparison.InvariantCultureIgnoreCase) || string.Equals(process.ProcessName, "IISExpress", StringComparison.InvariantCultureIgnoreCase)) { process.Kill(); process.WaitForExit(); } } try { StartProcess("ServiceUninstall.exe", true); } catch { } foreach (var process in Process.GetProcesses()) { if (string.Equals(process.ProcessName, "NzbDrone", StringComparison.InvariantCultureIgnoreCase) || string.Equals(process.ProcessName, "IISExpress", StringComparison.InvariantCultureIgnoreCase) || string.Equals(process.ProcessName, "ServiceUninstall", StringComparison.InvariantCultureIgnoreCase)) { process.Kill(); process.WaitForExit(); } } } private void InstallNzbDroneService() { StartProcess("ServiceInstall.exe", true); } private void StartProcess(string fileName, bool waitForExit) { var startInfo = new ProcessStartInfo { FileName = Path.Combine(_clonePackagePath, fileName), RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, }; var nzbDroneProcess = new Process { StartInfo = startInfo }; nzbDroneProcess.OutputDataReceived += (o, args) => Console.WriteLine(args.Data); nzbDroneProcess.ErrorDataReceived += (o, args) => Console.WriteLine(args.Data); nzbDroneProcess.Start(); nzbDroneProcess.BeginErrorReadLine(); nzbDroneProcess.BeginOutputReadLine(); if (waitForExit) { nzbDroneProcess.WaitForExit(); } } private void ClonePackage() { new DiskProvider().CopyDirectory(_masterPackagePath, _clonePackagePath); } private void DeleteClone() { if (Directory.Exists(_clonePackagePath)) { Directory.Delete(_clonePackagePath, true); } } private string CreatePackage() { Console.WriteLine("Creating NzbDrone Package"); StopNzbDrone(); var rootDirectory = new DirectoryInfo(environmentProvider.ApplicationPath); if (rootDirectory.GetDirectories("_rawPackage").Any()) { rootDirectory.GetDirectories("_rawPackage").ToList().ForEach(c => c.Delete(true)); } var startInfo = new ProcessStartInfo { FileName = Path.Combine(rootDirectory.FullName, "package.bat"), WorkingDirectory = rootDirectory.FullName }; Process.Start(startInfo).WaitForExit(); var testFolder = Path.Combine(environmentProvider.SystemTemp, "NzbDroneAutomation"); if (Directory.Exists(testFolder)) { Directory.Delete(testFolder, true); } Directory.Move(Path.Combine(rootDirectory.FullName, "_rawPackage", "nzbdrone"), testFolder); return testFolder; } private void ResetUserData() { var appDataPath = Path.Combine(_clonePackagePath, "NzbDrone.Web", "app_data"); if (Directory.Exists(appDataPath)) Directory.Delete(appDataPath, true); } private static void CleanBinFolder() { var folderName = "Debug"; if (EnvironmentProvider.IsDebug) { folderName = "Release"; } var dirs = Directory.GetDirectories(environmentProvider.ApplicationPath, folderName, SearchOption.AllDirectories); foreach (var dir in dirs) { Directory.Delete(dir, true); } } } }