using System;
using System.Collections.Generic;
using System.IO;
using System.Diagnostics;
using System.Text;
namespace p4api.net.unit.test
{
class Utilities
{
public static void ClobberDirectory( String path )
{
DirectoryInfo di = new DirectoryInfo( path );
ClobberDirectory( di );
}
public static void ClobberDirectory(DirectoryInfo di)
{
// Process Zapper = Process.Start("rd", "/S /Q " + di.FullName);
string comSpec = Environment.GetEnvironmentVariable("ComSpec");
Process Zapper = new Process();
ProcessStartInfo si = new ProcessStartInfo(comSpec, "/c rd /S /Q " + di.FullName);
si.WorkingDirectory = Path.GetDirectoryName(di.FullName);
si.UseShellExecute = true;
Zapper.StartInfo = si;
try
{
Zapper.Start();
}
catch (Exception ex)
{
LogMessage("In ClobberDirectory, Zapper.Start() failed: {0}", ex.Message);
}
if (Zapper.HasExited == false)
{
Zapper.WaitForExit();
}
if (Directory.Exists(di.FullName))
{
bool worked = false;
int retries = 0;
do
{
if (!di.Exists)
return;
try
{
FileInfo[] files = di.GetFiles();
foreach (FileInfo fi in files)
{
if (fi.IsReadOnly)
fi.IsReadOnly = false;
fi.Delete();
}
DirectoryInfo[] subDirs = di.GetDirectories();
foreach (DirectoryInfo sdi in subDirs)
{
ClobberDirectory(sdi);
}
di.Delete();
worked = true;
}
catch (Exception)
{
System.Threading.Thread.Sleep(100);
}
retries++;
}
while (!worked && retries < 2);
}
}
static String p4d_cmd = "-p localhost:6666 -Id UnitTestServer -r {0}";
static String restore_cmd = "-r {0} -jr checkpoint.{1}";
static String upgrade_cmd = "-r {0} -xu";
static String generate_key_cmd = string.Empty;
static string rubbishBin = "c:\\MyTestDir-rubbish-bin";
public static Process DeploySSLP4TestServer(string path, bool Unicode)
{
System.Environment.SetEnvironmentVariable("P4SSLDIR", path);
string test = System.Environment.GetEnvironmentVariable("P4SSLDIR");
p4d_cmd = "-p ssl:6666 -Id UnitTestServer -r {0}";
generate_key_cmd = "-Gc";
return DeployP4TestServer(path, 1, Unicode);
}
public static Process DeployIPv6P4TestServer(string path, string tcp, bool Unicode)
{
p4d_cmd = "-p " + tcp + ":::1:6666 -Id UnitTestServer -r {0}";
return DeployP4TestServer(path, 1, Unicode);
}
public static Process DeployP4TestServer(string path, bool Unicode)
{
return DeployP4TestServer(path, 1, Unicode);
}
public static Process DeployP4TestServer(string path, int checkpointRev, bool Unicode)
{
String zippedFile = "a.exe";
if (Unicode)
{
zippedFile = "u.exe";
}
return DeployP4TestServer(path, checkpointRev, zippedFile);
}
public static Process DeployP4TestServer(string path, int checkpointRev, string zippedFile)
{
return DeployP4TestServer(path, checkpointRev, zippedFile, null);
}
public static Process DeployP4TestServer(string path, int checkpointRev, string zippedFile, string P4DCmd )
{
if (Directory.Exists(rubbishBin) == false)
{
Directory.CreateDirectory(rubbishBin);
}
// path = Path.Combine(path, DateTime.Now.Ticks.ToString());
int retries = 10;
string rubbishDirectory = Path.Combine(rubbishBin, DateTime.Now.Ticks.ToString());
try
{
retries = 2;
while ((Directory.Exists(path)) && (retries > 0))
{
try
{
// Try to rename it
Directory.Move(path, rubbishDirectory);
//must have worked
break;
}
catch
{
retries--;
System.Threading.Thread.Sleep(1000);
if (retries <= 0)
{
throw;
//throw new Exception("Couldn.t move test directory after 10 tries");
}
}
}
}
catch (Exception ex)
{
LogMessage("In DeployP4TestServer, Directory.Move failed: {0}", ex.Message);
// rename failed, try to clobber it (can be slow so last resort)
Utilities.ClobberDirectory(path);
}
string assemblyFile = typeof(Utilities).Assembly.CodeBase;
String unitTestDir = Path.GetDirectoryName(assemblyFile);
String EnvPath = Environment.GetEnvironmentVariable("path");
String CurWDir = Environment.CurrentDirectory;
retries = 10;
while ((Directory.Exists(path) == false) && (retries > 0))
{
try
{
Directory.CreateDirectory(path);
if (Directory.Exists(path))
{
break;
}
retries--;
System.Threading.Thread.Sleep(1000);
}
catch (Exception ex)
{
retries--;
bool dirExists = Directory.Exists(path);
Trace.WriteLine(ex.Message);
if (dirExists)
{
break;
}
System.Threading.Thread.Sleep(200);
}
}
try
{
//Directory.CreateDirectory(path);
Environment.CurrentDirectory = path;
}
catch (Exception ex)
{
bool dirExists = Directory.Exists(path);
Trace.WriteLine(ex.Message);
return null;
}
using (StreamWriter sw = new StreamWriter("CmdLog.txt", false))
{
int idx;
if (unitTestDir.ToLower().StartsWith("file:\\"))
{
// cut off the file:\\
idx = unitTestDir.IndexOf("\\") + 1;
unitTestDir = unitTestDir.Substring(idx);
}
if ((idx = unitTestDir.IndexOf("TestResults")) > 0)
{
unitTestDir = unitTestDir.Substring(0, idx);
if (unitTestDir.ToLower().Contains("bin\\debug") == false)
{
unitTestDir = Path.Combine(unitTestDir, "bin\\debug");
}
}
string unitTestZip = Path.Combine(unitTestDir, zippedFile);
string targetTestZip = Path.Combine(path, zippedFile);
retries = 3;
int delay = 1000; // initial delay 1 second
while (retries > 0)
{
try
{
File.Copy(unitTestZip, targetTestZip);
break; //success
}
catch (Exception ex)
{
System.Threading.Thread.Sleep(delay);
delay *= 2; // wait twice as long next time
retries--;
}
}
FileInfo fi = new FileInfo(targetTestZip);
Process Unzipper = new Process();
// unpack the zip
ProcessStartInfo si = new ProcessStartInfo(zippedFile);
si.WorkingDirectory = path;
si.Arguments="-y";
String msg = String.Format("{0} {1}", si.FileName, si.Arguments);
sw.WriteLine(msg);
Unzipper.StartInfo = si;
Unzipper.Start();
Unzipper.WaitForExit();
if (p4d_cmd.Contains("ssl:"))
{
Process GenKeyandCert = new Process();
// generate private key and certificate
si = new ProcessStartInfo("p4d");
si.Arguments = generate_key_cmd;
si.WorkingDirectory = path;
si.UseShellExecute = false;
msg = si.Arguments;
sw.WriteLine(msg);
GenKeyandCert.StartInfo = si;
GenKeyandCert.Start();
GenKeyandCert.WaitForExit();
}
Process RestoreCheckPoint = new Process();
// restore the checkpoint
si = new ProcessStartInfo("p4d");
si.Arguments = String.Format(restore_cmd, path, checkpointRev);
si.WorkingDirectory = path;
si.UseShellExecute = false;
msg = String.Format("{0} {1}", si.FileName, si.Arguments);
sw.WriteLine(msg);
RestoreCheckPoint.StartInfo = si;
RestoreCheckPoint.Start();
RestoreCheckPoint.WaitForExit();
Process UpgradeTables = new Process();
// upgrade the db tables
si = new ProcessStartInfo("p4d");
si.Arguments = String.Format(upgrade_cmd, path);
si.WorkingDirectory = path;
si.UseShellExecute = false;
msg = String.Format("{0} {1}", si.FileName, si.Arguments);
sw.WriteLine(msg);
UpgradeTables.StartInfo = si;
UpgradeTables.Start();
UpgradeTables.WaitForExit();
Process p4d = new Process();
if (P4DCmd != null)
{
string P4DCmdSrc = Path.Combine(unitTestDir, P4DCmd);
string P4DCmdTarget = Path.Combine(path, P4DCmd);
File.Copy(P4DCmdSrc, P4DCmdTarget);
// run the command to start p4d
si = new ProcessStartInfo(P4DCmdTarget);
si.Arguments = String.Format(path);
si.WorkingDirectory = path;
si.UseShellExecute = false;
msg = String.Format("{0} {1}", si.FileName, si.Arguments);
sw.WriteLine(msg);
p4d.StartInfo = si;
p4d.Start();
}
else
{
//start p4d
si = new ProcessStartInfo("p4d");
si.Arguments = String.Format(p4d_cmd, path);
si.WorkingDirectory = path;
si.UseShellExecute = false;
msg = String.Format("{0} {1}", si.FileName, si.Arguments);
sw.WriteLine(msg);
p4d.StartInfo = si;
p4d.Start();
}
Environment.CurrentDirectory = CurWDir;
return p4d;
}
}
public static Process DeployP4TestServerZip(string path, bool Unicode)
{
if (Directory.Exists(rubbishBin) == false)
{
Directory.CreateDirectory(rubbishBin);
}
if (Directory.Exists(path))
{
//test directory exists
try
{
// try to delete it
Directory.Delete(path, true);
}
catch
{
try
{
// delete failed, try to rename it
Directory.Move(path, string.Format("{0}-{1}", path, DateTime.Now.Ticks));
}
catch
{
// rename failed, try to clobber it (can be slow so last resort)
Utilities.ClobberDirectory(path);
}
}
}
Directory.CreateDirectory(path);
string assemblyFile = typeof(Utilities).Assembly.CodeBase;
String unitTestDir = Path.GetDirectoryName(assemblyFile);
int idx;
if (unitTestDir.ToLower().StartsWith("file:\\"))
{
// cut off the file:\\
idx = unitTestDir.IndexOf("\\") + 1;
unitTestDir = unitTestDir.Substring(idx);
}
if ((idx = unitTestDir.IndexOf("TestResults")) > 0)
{
unitTestDir = Path.Combine(unitTestDir.Substring(0, idx), "bin\\debug");
}
String zippedFile = "a.exe";
if (Unicode)
{
zippedFile = "u.exe";
}
string unitTestZip = Path.Combine(unitTestDir, zippedFile);
string targetTestZip = Path.Combine(path, zippedFile);
File.Copy(unitTestZip, targetTestZip);
FileInfo fi = new FileInfo(targetTestZip);
Process Unzipper = new Process();
// unpack the zip
ProcessStartInfo si = new ProcessStartInfo(zippedFile);
si.WorkingDirectory = path;
Unzipper.StartInfo = si;
Unzipper.Start();
Unzipper.WaitForExit();
Process p4d = new Process();
//start p4d
si = new ProcessStartInfo("p4d");
si.Arguments = p4d_cmd;
si.WorkingDirectory = path;
si.UseShellExecute = false;
p4d.StartInfo = si;
p4d.Start();
return p4d;
}
public static void RemoveTestServer(Process p, String path)
{
if (p != null)
{
if (!p.HasExited)
p.Kill();
p.WaitForExit();
// sleep for a second to let the system clean up
System.Threading.Thread.Sleep(100);
}
string rubbishDirectory = Path.Combine(rubbishBin, DateTime.Now.Ticks.ToString());
// Rename the directory to make room for the next test
try
{
int retries = 2;
while ((Directory.Exists(path)) && (retries > 0))
{
try
{
// Try to rename it
Directory.Move(path, rubbishDirectory);
//must have worked
break;
}
catch
{
retries--;
System.Threading.Thread.Sleep(1000);
if (retries <= 0)
{
throw;
//throw new Exception("Couldn.t move test directory after 10 tries");
}
}
}
}
catch (Exception ex)
{
LogMessage("In DeployP4TestServer, Directory.Move failed: {0}", ex.Message);
// rename failed, try to clobber it (can be slow so last resort)
Utilities.ClobberDirectory(path);
}
//try to delete all old test directories
string[] rubbishDirectories = Directory.GetDirectories(rubbishBin);
foreach (string rubbish in rubbishDirectories)
{
//test directory exists
try
{
// try to delete it
Directory.Delete(rubbish, true);
}
catch
{
// simple delete failed, try to rename it
// rename failed, try to clobber it (can be slow so last resort)
Utilities.ClobberDirectory(rubbish);
}
}
}
public static void LogMessage(string format, params object[] args )
{
String LogDir = @"C:\MyTestLog\";
String LogFile = "log.txt";
if ( !Directory.Exists( LogDir ) )
{
Directory.CreateDirectory( LogDir );
}
string message = format;
if ((args != null) && (args.Length > 0))
{
message = string.Format(format, args);
}
if ( File.Exists( LogDir + LogFile ) )
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(LogDir + LogFile, true))
{
file.WriteLine(message);
}
}
else
{
System.IO.File.WriteAllText(LogDir + LogFile, message);
}
}
}
}