- 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);
- }
- }
- }
- }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#1 | 13946 | OmegaNemesis28 | Merging //guest/perforce_software/p4api.net/... to //guest/omeganemesis28/p4api.net/...... « |
10 years ago | |
//guest/perforce_software/p4api.net/p4api.net-unit-test/Utilities.cs | |||||
#3 | 10191 | Matt Attaway | Bring Workshop version of p4api.net up-to-date with the 14.2 release. | 11 years ago | |
#2 | 8964 | Bill | fix line endings | 11 years ago | |
#1 | 8873 | Matt Attaway | Initial add of the P4API.NET source code | 11 years ago |