Files
UnrealEngine/Engine/Source/ThirdParty/Perforce/P4Api.Net/p4api.net-unit-test/P4ServerTest.cs
2025-05-18 13:04:45 +08:00

3023 lines
116 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Perforce.P4;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
using NLog;
using System.Threading;
namespace p4api.net.unit.test
{
/// <summary>
///This is a test class for P4ServerTest and is intended
///to contain all P4ServerTest Unit Tests
///</summary>
[TestClass()]
public class P4ServerTest
{
private static Logger logger = LogManager.GetCurrentClassLogger();
String TestDir = "c:\\MyTestDir";
/// <summary>
///Gets or sets the test context which provides
///information about and functionality for the current test run.
///</summary>
public TestContext TestContext { get; set; }
[TestInitialize]
public void SetupTest()
{
Utilities.LogTestStart(TestContext);
}
[TestCleanup]
public void CleanupTest()
{
Utilities.LogTestFinish(TestContext);
}
#region Additional test attributes
//
//You can use the following additional attributes as you write your tests:
//
//Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext)
//{
//}
//
//Use ClassCleanup to run code after all tests in a class have run
//[ClassCleanup()]
//public static void MyClassCleanup()
//{
//}
//
//
#endregion
/// <summary>
///A test for P4Server Constructor. Connect to a server check if it supports Unicode and disconnect
///</summary>
[TestMethod()]
public void P4ServerConstructorTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("dirs", cmdId, false, new String[] { "//depot/*" }, 1),
"\"dirs\" command failed");
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
/// <summary>
/// A test for P4Server.UrlHandled() with ascii server. Connect to a server,
/// check for existence of UrlHandled bool.
///</summary>
[TestMethod()]
public void P4ServerUrlHandledTestA()
{
P4ServerUrlHandledTest(false);
}
/// <summary>
/// A test for P4Server.UrlHandled() with unicode server. Connect to a server,
/// check for existence of UrlHandled bool.
///</summary>
[TestMethod()]
public void P4ServerUrlHandledTestU()
{
P4ServerUrlHandledTest(true);
}
/// <summary>
/// A test for P4Server.UrlHandled(). Connect to a server, check for existence of
/// UrlHandled bool.
///</summary>
public void P4ServerUrlHandledTest(bool unicode)
{
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
bool UrlHandled = target.UrlHandled();
// should be false, but should exist
Assert.IsFalse(UrlHandled);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
}
/// <summary>
///A test for RunCommand
///</summary>
[TestMethod()]
public void RunCommandTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("dirs", cmdId, false, new String[] { "//depot/*" }, 1),
"\"dirs\" command failed");
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
/// <summary>
///A test for Idle disconnect
///</summary>
[TestMethod()]
public void IdleDisconnectTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("dirs", cmdId, false, new String[] { "//depot/*" }, 1),
"\"dirs\" command failed");
System.Threading.Thread.Sleep(TimeSpan.FromMilliseconds(target.IdleDisconnectWaitTime + 100));
Assert.IsFalse(target.IsConnected());
cmdId = 7;
Assert.IsTrue(target.RunCommand("dirs", cmdId, false, new String[] { "//depot/*" }, 1),
"\"dirs\" command failed");
Assert.IsTrue(target.RunCommand("dirs", cmdId + 1, false, new String[] { "//depot/*" }, 1),
"\"dirs\" command failed");
System.Threading.Thread.Sleep(TimeSpan.FromMilliseconds(target.IdleDisconnectWaitTime + 100));
Assert.IsFalse(target.IsConnected());
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
#if DEBUG_TIMEOUT
/// <summary>
///A test for RunCommand timeout
///</summary>
[TestMethod()]
public void RunCommandTimeOutTest()
{
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = Utilities.DeployP4TestServer(TestDir, false);
try
{
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
try
{
Assert.IsTrue(target.RunCommand("TimeOutTest", false, new String[] { "-1" }, 1));
}
catch (P4CommandTimeOutException)
{
Assert.Fail("Should not have timed out");
}
catch (Exception)
{
Assert.Fail("Wrong exception thrown for timeout");
}
try
{
Assert.IsFalse(target.RunCommand("TimeOutTest", false, new String[] { "1" }, 1));
Assert.Fail("Didn't timeout");
}
catch (P4CommandTimeOutException)
{
}
catch (Exception)
{
Assert.Fail("Wrong exception thrown for timeout");
}
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
}
/// <summary>
///A test for RunCommand timeout
///</summary>
[TestMethod()]
public void RunCommandLongTimeOutTest()
{
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = Utilities.DeployP4TestServer(TestDir, false);
try
{
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
try
{
Assert.IsTrue(target.RunCommand("LongTimeOutTest", false, new String[] { "10" }, 1));
}
catch (P4CommandTimeOutException)
{
Assert.Fail("Should not have timed out");
}
catch (Exception)
{
Assert.Fail("Wrong exception thrown for timeout");
}
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
}
#endif
/// <summary>
///A test for GetBinaryResults
///</summary>
[TestMethod()]
public void GetBinaryResultsTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String[] parms = new String[] { "//depot/MyCode/Silly.bmp" };
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("print", cmdId, false, parms, 1),
"\"print\" command failed");
byte[] results = target.GetBinaryResults(cmdId);
Assert.IsNotNull(results, "GetBinaryResults returned null data");
Assert.AreEqual(results.Length, 3126);
Assert.AreEqual(results[0], 0x42);
Assert.AreEqual(results[1], 0x4d);
Assert.AreEqual(results[2], 0x36);
Assert.AreEqual(results[0x10], 0x00);
Assert.AreEqual(results[0xA0], 0xC0);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
/// <summary>
///A test for GetErrorResults
///</summary>
[TestMethod()]
public void GetErrorResultsTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String[] parms = new String[] { "//depot/MyCode/NoSuchFile.bmp" };
uint cmdId = 7;
target.RunCommand("print", cmdId, false, parms, 1);
P4ClientErrorList results = target.GetErrorResults(cmdId);
Assert.IsNotNull(results, "GetErrorResults returned null data");
Assert.AreEqual(results.Count, 1);
P4ClientError firstError = (P4ClientError)results[0];
Assert.AreEqual(firstError.ErrorMessage.TrimEnd(new char[] { '\r', '\n' }),
"//depot/MyCode/NoSuchFile.bmp - no such file(s).");
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
/// <summary>
///A test for GetInfoResults
///</summary>
[TestMethod()]
public void GetInfoResultsTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String[] parms = new String[] { "//depot/mycode/*" };
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("files", cmdId, false, parms, 1),
"\"files\" command failed");
P4ClientInfoMessageList results = target.GetInfoResults(cmdId);
Assert.IsNotNull(results, "GetInfoResults returned null data");
if (unicode)
Assert.AreEqual(3, results.Count);
else
Assert.AreEqual(3, results.Count);
P4ClientInfoMessage firstResult = results[0];
Assert.AreEqual(firstResult.MessageCode, 352327915);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
/// <summary>
///A test for GetTaggedOutput
///</summary>
[TestMethod()]
public void GetTaggedOutputTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String[] parms = new String[] { "//depot/mycode/*" };
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("files", cmdId, true, parms, 1),
"\"files\" command failed");
TaggedObjectList results = target.GetTaggedOutput(cmdId);
Assert.IsNotNull(results, "GetTaggedOutput returned null data");
if (unicode)
Assert.AreEqual(3, results.Count);
else
Assert.AreEqual(3, results.Count);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
/// <summary>
///A test for GetTextResults
///</summary>
[TestMethod()]
public void GetTextResultsTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String[] parms = new String[] { "//depot/MyCode/ReadMe.txt" };
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("print", cmdId, false, parms, 1),
"\"print\" command failed");
String results = target.GetTextResults(cmdId);
Assert.IsNotNull(results, "GetErrorResults GetTextResults null data");
if (unicode)
Assert.AreEqual(results.Length, 30);
else
Assert.AreEqual(results.Length, 30);
Assert.IsTrue(results.StartsWith("Don't Read This!"));
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
private byte[] BinaryCallbackResults;
private void BinaryResultsCallback(uint cmdId, byte[] data)
{
if ((data != null) && (data.Length > 0))
BinaryCallbackResults = data;
}
/// <summary>
///A test for SetBinaryResultsCallback
///</summary>
[TestMethod()]
public void SetBinaryResultsCallbackTest()
{
P4Server.BinaryResultsDelegate cb =
new P4Server.BinaryResultsDelegate(BinaryResultsCallback);
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
target.BinaryResultsReceived += cb;
String[] parms = new String[] { "//depot/MyCode/Silly.bmp" };
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("print", cmdId, false, parms, 1),
"\"print\" command failed");
byte[] results = target.GetBinaryResults(cmdId);
Assert.IsNotNull(BinaryCallbackResults, "BinaryCallbackResults is null");
Assert.IsNotNull(results, "InfoCallbackResults is null");
Assert.AreEqual(results.Length, BinaryCallbackResults.Length);
Assert.AreEqual(BinaryCallbackResults.Length, 3126);
for (int idx = 0; idx < BinaryCallbackResults.Length; idx++)
{
Assert.AreEqual(results[idx], BinaryCallbackResults[idx]);
}
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
private string ErrorCallbackResultsMessage;
private uint ErrorCallbackResultsMessageId;
private int ErrorCallbackResultsErrorNumber;
private int ErrorCallbackResultsSeverity;
private void ErrorResultsCallback(uint cmdId, int severity, int errorNumber, String message)
{
ErrorCallbackResultsMessageId = cmdId;
ErrorCallbackResultsMessage = message;
ErrorCallbackResultsSeverity = severity;
ErrorCallbackResultsErrorNumber = errorNumber;
}
/// <summary>
///A test for SetErrorCallback
///</summary>
[TestMethod()]
public void SetErrorCallbackTest()
{
P4Server.ErrorDelegate cb =
new P4Server.ErrorDelegate(ErrorResultsCallback);
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
target.ErrorReceived += cb;
String[] parms = new String[] { "//depot/MyCode/NoSuchFile.bmp" };
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("fstat", cmdId, false, parms, 1),
"\"fstat\" command failed");
P4ClientErrorList results = target.GetErrorResults(cmdId);
Assert.IsFalse(String.IsNullOrEmpty(ErrorCallbackResultsMessage),
"ErrorCallbackResultsMessage is null or empty");
Assert.IsNotNull(results, "GetErrorResults returned null");
Assert.AreEqual(results.Count, 1);
P4ClientError firstError = (P4ClientError)results[0];
Assert.AreEqual(firstError.ErrorMessage.TrimEnd(new char[] { '\r', '\n' }),
ErrorCallbackResultsMessage.TrimEnd(new char[] { '\r', '\n' }));
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
private class InfoCbData
{
public InfoCbData(String m, int l, int id)
{
Message = m;
Level = l;
MsgId = id;
}
public String Message;
public int Level;
public int MsgId;
public override string ToString()
{
return String.Format("{0}:{1}", Level, Message);
}
}
private List<InfoCbData> InfoCallbackResults;
private void InfoResultsCallback(uint cmdId, int msgId, int level, String message)
{
InfoCallbackResults.Add(new InfoCbData(message, level, msgId));
}
private void BadInfoResultsCallback(uint cmdId, int msgId, int level, String message)
{
throw new Exception("I'm a bad delegate");
}
/// <summary>
///A test for SetInfoResultsCallback
///</summary>
[TestMethod()]
public void SetInfoResultsCallbackTest()
{
P4Server.InfoResultsDelegate cb =
new P4Server.InfoResultsDelegate(InfoResultsCallback);
P4Server.InfoResultsDelegate bcb =
new P4Server.InfoResultsDelegate(BadInfoResultsCallback);
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
target.InfoResultsReceived += cb;
// add in the bad handler that throws an exception, to
// make sure the event broadcaster can handle it.
target.InfoResultsReceived += bcb;
String[] parms = new String[] { "//depot/mycode/*" };
InfoCallbackResults = new List<InfoCbData>();
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("files", cmdId, false, parms, 1),
"\"files\" command failed");
P4ClientInfoMessageList results = target.GetInfoResults(cmdId);
Assert.IsNotNull(InfoCallbackResults, "InfoCallbackResults is null");
Assert.IsNotNull(results, "GetInfoResults returned null");
Assert.AreEqual(results.Count, InfoCallbackResults.Count);
for (int idx = 0; idx < InfoCallbackResults.Count; idx++)
{
Assert.AreEqual(results[idx].MessageCode, InfoCallbackResults[idx].MsgId);
}
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
private TaggedObjectList TaggedCallbackResults;
private void TaggedOutputCallback(uint cmdId, int objId, TaggedObject obj)
{
TaggedCallbackResults.Add(obj);
}
/// <summary>
///A test for SetTaggedOutputCallback
///</summary>
[TestMethod()]
public void SetTaggedOutputCallbackTest()
{
P4Server.TaggedOutputDelegate cb =
new P4Server.TaggedOutputDelegate(TaggedOutputCallback);
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
target.TaggedOutputReceived += cb;
StringList parms = new String[] { "//depot/mycode/*" };
TaggedCallbackResults = new TaggedObjectList();
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("fstat", cmdId, true, parms, 1),
"\"fstat\" command failed");
TaggedObjectList results = target.GetTaggedOutput(cmdId);
Assert.IsNotNull(TaggedCallbackResults, "TaggedCallbackResults is null");
Assert.IsNotNull(results, "GetTaggedOutput returned null");
Assert.AreEqual(results.Count, TaggedCallbackResults.Count);
for (int idx = 0; idx < TaggedCallbackResults.Count; idx++)
{
Assert.AreEqual((results[idx])["depotFile"],
(TaggedCallbackResults[idx])["depotFile"]);
}
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
private String TextCallbackResults;
private void TextResultsCallback(uint cmdId, String info)
{
TextCallbackResults += info;
}
/// <summary>
///A test for SetTextResultsCallback
///</summary>
[TestMethod()]
public void SetTextResultsCallbackTest()
{
P4Server.TextResultsDelegate cb =
new P4Server.TextResultsDelegate(TextResultsCallback);
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
target.TextResultsReceived += cb;
String[] parms = new String[] { "//depot/mycode/ReadMe.txt" };
TextCallbackResults = String.Empty;
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("print", cmdId, true, parms, 1),
"\"print\" command failed");
String results = target.GetTextResults(cmdId);
Assert.IsFalse(String.IsNullOrEmpty(TextCallbackResults), "TextCallbackResults is null");
Assert.IsFalse(String.IsNullOrEmpty(results), "GetTextResults is null");
Assert.AreEqual(results.Length, TextCallbackResults.Length);
Assert.AreEqual(TextCallbackResults, results);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
P4Server forParallelTransferTest = null;
bool callbackHappened = false;
private int ParallelTransferCallback(IntPtr pServer, String cmd, String[] args, uint argCount, IntPtr dictIter, uint threads)
{
callbackHappened = true;
// verify the args
Assert.IsNotNull(pServer);
Assert.IsTrue(cmd == "transmit");
Assert.IsTrue(args.Length == argCount);
StrDictListIterator iter = new StrDictListIterator(forParallelTransferTest, dictIter);
// iterate over the members to validate that it works
while (iter.NextItem())
{
KeyValuePair kv = null;
while ((kv = iter.NextEntry()) != null)
{
// walking the data is enough
}
}
Assert.IsTrue(threads > 0);
return 0;
}
/// <summary>
/// A test for SetParallelSyncUnicodeCallback
///</summary>
[TestMethod()]
public void SetParallelSyncCallbackTestUnicode()
{
SetParallelSyncCallbackTest(true);
}
/// <summary>
/// A test for SetParallelSyncUnicodeCallback
///</summary>
[TestMethod()]
public void SetParallelSyncCallbackTestAscii()
{
SetParallelSyncCallbackTest(false);
}
StringList getClientFiles(P4Server target)
{
Assert.IsTrue(target.RunCommand("fstat", 0, true, new string[] { "//..." }, 1));
TaggedObjectList list = target.GetTaggedOutput(0);
StringList ret = new StringList();
foreach (TaggedObject obj in list)
{
String action, localPath;
if (obj.TryGetValue("headAction", out action))
{
if (action == "delete")
continue;
}
else
{
continue;
}
if (obj.TryGetValue("clientFile", out localPath))
{
ret.Add(localPath);
}
}
return ret;
}
public void OpenAndModifyFiles(StringList localFiles, P4Server target)
{
foreach (String localPath in localFiles)
{
System.IO.File.SetAttributes(localPath, FileAttributes.Normal);
// modify the file
System.IO.File.WriteAllText(localPath, DateTime.Now.ToLongDateString());
// add to the default CL?
if (target != null)
Assert.IsTrue(target.RunCommand("edit", 0, true, new string[] { localPath }, 1));
}
}
/*
* Helper class for catching P4Server output
*/
class OutputReceiver
{
P4Server target = null;
public OutputReceiver(P4Server _target)
{
target = _target;
target.TaggedOutputReceived += TaggedOutputReceived;
target.ErrorReceived += ErrorReceived;
target.InfoResultsReceived += InfoReceived;
target.TextResultsReceived += TextReceived;
target.BinaryResultsReceived += BinaryReceived;
}
public void Detach()
{
// remove from the delegate list
target.TaggedOutputReceived -= TaggedOutputReceived;
target.ErrorReceived -= ErrorReceived;
target.InfoResultsReceived -= InfoReceived;
target.TextResultsReceived -= TextReceived;
target.BinaryResultsReceived -= BinaryReceived;
}
public List<int> threadTagged = new List<int>();
public List<uint> cmdIdTagged = new List<uint>();
public List<int> objIdTagged = new List<int>();
public List<TaggedObject> taggedObjs = new List<TaggedObject>();
public void TaggedOutputReceived(uint cmdId, int ObjId, TaggedObject obj)
{
threadTagged.Add(Thread.CurrentThread.ManagedThreadId);
cmdIdTagged.Add(cmdId);
objIdTagged.Add(ObjId);
taggedObjs.Add(obj);
}
public List<int> threadErrors = new List<int>();
public List<uint> cmdIdErrors = new List<uint>();
public List<int> severities = new List<int>();
public List<int> errorNums = new List<int>();
public List<String> errorData = new List<String>();
public void ErrorReceived(uint cmdId, int severity, int errorNum, string data)
{
threadErrors.Add(Thread.CurrentThread.ManagedThreadId);
cmdIdErrors.Add(cmdId);
severities.Add(severity);
errorNums.Add(errorNum);
errorData.Add(data);
}
public List<int> threadInfo = new List<int>();
public List<uint> cmdIdInfo = new List<uint>();
public List<int> infoMsgIds = new List<int>();
public List<int> infoLevels = new List<int>();
public List<String> infoData = new List<String>();
public void InfoReceived(uint cmdId, int msgId, int level, string data)
{
threadInfo.Add(Thread.CurrentThread.ManagedThreadId);
cmdIdInfo.Add(cmdId);
infoMsgIds.Add(msgId);
infoLevels.Add(level);
infoData.Add(data);
}
public List<int> threadText = new List<int>();
public List<uint> cmdIdText = new List<uint>();
public List<String> textData = new List<String>();
public void TextReceived(uint cmdId, String data)
{
threadText.Add(Thread.CurrentThread.ManagedThreadId);
cmdIdText.Add(cmdId);
textData.Add(data);
}
public List<int> threadBinary = new List<int>();
public List<uint> cmdIdBinary = new List<uint>();
public List<byte[]> binaryData = new List<byte[]>();
public void BinaryReceived(uint cmdId, byte[] data)
{
threadBinary.Add(Thread.CurrentThread.ManagedThreadId);
cmdIdBinary.Add(cmdId);
binaryData.Add(data);
}
}
public void SetParallelSyncCallbackTest(bool unicode)
{
P4Server.ParallelTransferDelegate cb =
new P4Server.ParallelTransferDelegate(ParallelTransferCallback);
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
try
{
//int checkpoint = unicode ? 19 : 21;
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
// step 1 : set net.parallel.threads to > 0
Assert.IsTrue(target.RunCommand("configure", 7, true, new String[] { "set", "net.parallel.max=4" }, 2));
// disconnect so that we get a connection that recognizes the configurable
}
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
forParallelTransferTest = target;
callbackHappened = false;
// revert aynthing in progress, it just makes testing harder
Assert.IsTrue(target.RunCommand("revert", 7, true, new string[] { "//..." }, 1));
// get the big file list
StringList localFiles = getClientFiles(target);
{
// step 2: positive tests
// 2a: test with our custom (nothing) handler
target.SetParallelTransferCallback(cb);
// set up event receivers to ensure that we're getting the events that we expect (error, tagged output, info?)
OutputReceiver outputCatcher = new OutputReceiver(target);
Assert.IsTrue(target.RunCommand("sync", 7, true, new String[] { "--parallel", "threads=4,batch=8,batchsize=1,min=1,minsize=1", "-f", "//..." }, 4));
Assert.IsTrue(callbackHappened);
// assert some info about outputCatcher
// although we didn't perform the sync, weget tagged info on what would have happened
Assert.AreEqual(7, outputCatcher.cmdIdTagged.Count);
outputCatcher.Detach();
}
{
// 2b: use the default handler, verify that we got synced files and no errors
target.SetParallelTransferCallback(null);
// set up event receivers to ensure that we're getting the events that we expect (error, tagged output, info?)
OutputReceiver outputCatcher = new OutputReceiver(target);
Assert.IsTrue(target.RunCommand("sync", 7, true, new String[] { "--parallel", "threads=4,batch=8,batchsize=1,min=1,minsize=1", "-f", "//..." }, 4));
// verify that we got the right files
foreach (String localPath in localFiles)
{
// verify that the file exists, throws an exception if it doesn't
System.IO.File.GetAttributes(localPath);
}
// assert some info about outputCatcher
// we should have 1 tagged data per file
Assert.AreEqual(7, outputCatcher.cmdIdTagged.Count);
outputCatcher.Detach();
}
{
// step 3: error case (clobber not allowed)
// to set up clobber errors for a file we need
// - revision > 1
// - synced revision < revision
// - modified local file (writeable)
// - perform a normal sync without clobber set in the client
// make all the files writeable, modify them, and add to the default CL
OpenAndModifyFiles(localFiles, target);
// submit the new revs
Assert.IsTrue(target.RunCommand("submit", 0, true, new string[] { "-d", "Add a revision to each file" }, 2));
// revert (the unicode server has repoen set, and this is easier than client modification)
Assert.IsTrue(target.RunCommand("revert", 0, true, new string[] { "//..." }, 1));
// sync to revision #1
Assert.IsTrue(target.RunCommand("sync", 0, true, new string[] { "-f", "//...#1" }, 2));
// make all of the files writeable again, but do not add to a CL
OpenAndModifyFiles(localFiles, null);
// set up event receivers to ensure that we're getting the events that we expect (error, tagged output, info?)
OutputReceiver outputCatcher = new OutputReceiver(target);
// run the sync without -f to produce the clobber issue
try
{
// the RunCommand should throw an exception, so this Assert should never be evaluated. If it is, it should fail
Assert.IsFalse(target.RunCommand("sync", 7, true, new String[] { "--parallel", "threads=4,batch=8,batchsize=1,min=1,minsize=1", "//..." }, 3));
}
catch (P4Exception e)
{
Assert.IsTrue(e.Message == "Error detected during parallel operation");
}
// assert some info about outputCatcher
// we should have 1 error data per file (from a different thread than ours) and one generic "Error detected..." error from the initiator
Assert.AreEqual(8, outputCatcher.cmdIdErrors.Count);
outputCatcher.Detach();
// error list should contain all of the files that were writable
P4ClientErrorList errors = target.GetErrorResults(7);
Assert.IsTrue(errors != null);
// this is a n^2 approach, but the files in the sync don't necessarily
// come back in the same order (threads, so you know)
for (int i = 0; i < errors.Count; i++)
{
bool foundIt = false;
for (int j = 0; j < localFiles.Count; j++)
{
// confirm that the filename is in our list
if (errors[i].ErrorMessage.Contains(localFiles[j]))
{
foundIt = true;
break;
}
}
System.Console.WriteLine(errors[i].ErrorMessage);
Assert.IsTrue(foundIt);
}
}
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
}
/// <summary>
/// A test for ParallelSubmitCallbackTest
///</summary>
[TestMethod()]
public void ParallelSubmitCallbackTestA()
{
ParallelSubmitCallbackTest(false);
}
/// <summary>
/// A test for ParallelSubmitCallbackTest
///</summary>
[TestMethod()]
public void ParallelSubmitCallbackTestU()
{
ParallelSubmitCallbackTest(true);
}
public void ParallelSubmitCallbackTest(bool unicode)
{
P4Server.ParallelTransferDelegate cb =
new P4Server.ParallelTransferDelegate(ParallelTransferCallback);
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
try
{
int checkpoint = unicode ? 19 : 21;
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
// step 1 : set net.parallel.max to > 0
Assert.IsTrue(target.RunCommand("configure", 7, true, new String[] { "set", "net.parallel.max=4" }, 2));
// disconnect so that we get a connection that recognizes the configurable
}
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
// revert aynthing in progress, it just makes testing harder
Assert.IsTrue(target.RunCommand("revert", 7, true, new string[] { "//..." }, 1));
// also sync everything
Assert.IsTrue(target.RunCommand("sync", 7, true, new string[] { "-f", "//..." }, 2));
// get the big file list
StringList localFiles = getClientFiles(target);
// step 2: positive tests
// 2a: test with our custom (nothing) handler
// open everything for edit and modify it for the submit
OpenAndModifyFiles(localFiles, target);
target.SetParallelTransferCallback(cb);
forParallelTransferTest = target;
callbackHappened = false;
try
{
Assert.IsTrue(target.RunCommand("submit", 7, true, new String[] { "--parallel", "threads=4,batch=8,min=1", "-d", "this should not create a submitted CL" }, 4));
}
catch (P4Exception e)
{
Assert.IsTrue(callbackHappened);
// we should get lots of library errors because we're trying to submit files that didn't get transferred
// at this point the server is a little messed up, so remove and redeploy to keep testing
P4ClientErrorList errs = target.GetErrorResults(7);
Assert.IsTrue(errs.Count > 0); // casually looking at the results it generates about 17 errors
}
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
// step 1 : set net.parallel.max to > 0
Assert.IsTrue(target.RunCommand("configure", 7, true, new String[] { "set", "net.parallel.max=4" }, 2));
// disconnect so that we get a connection that recognizes the configurable
}
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
// revert aynthing in progress, it just makes testing harder
Assert.IsTrue(target.RunCommand("revert", 7, true, new string[] { "//..." }, 1));
// also sync everything
Assert.IsTrue(target.RunCommand("sync", 7, true, new string[] { "-f", "//..." }, 2));
// get the big file list
StringList localFiles = getClientFiles(target);
// 2b: use the default handler, verify that we got synced files and no errors
target.SetParallelTransferCallback(null);
OpenAndModifyFiles(localFiles, target);
Assert.IsTrue(target.RunCommand("submit", 7, true, new String[] { "--parallel", "threads=4,batch=8,min=1", "-d", "this should create a submitted CL" }, 4));
// verify that we submitted
Assert.IsTrue(target.RunCommand("changes", 7, true, new String[] { "-m1", "-L" }, 2));
TaggedObjectList results = target.GetTaggedOutput(7);
TaggedObject res = results[0];
string desc = "";
res.TryGetValue("desc", out desc);
Assert.AreEqual(desc, "this should create a submitted CL");
string status = "";
res.TryGetValue("status", out status);
Assert.AreEqual(status, "submitted");
// step 3: error case
// edit the files, but delete them before the submit. the transmit errors should
// happen on the other threads and get forwarded to the initiator
OpenAndModifyFiles(localFiles, target);
foreach (String file in localFiles)
System.IO.File.Delete(file);
// now submit
try
{
// this should throw an error
Assert.IsFalse(target.RunCommand("submit", 7, true, new String[] { "--parallel", "threads=4,batch=8,min=1", "-d", "this should not create a submitted CL" }, 4));
}
catch (P4Exception e)
{
// loop thought the NextErrors looking for the
// Submit aborted message
bool foundIt = false;
bool notNull = true;
P4Exception current = e;
while (notNull)
{
if (foundIt = current.Message.StartsWith("Submit aborted"))
{
break;
}
if (notNull = current.NextError != null)
{
current = current.NextError;
}
}
Assert.IsTrue(foundIt);
P4ClientErrorList errs = target.GetErrorResults(7);
Assert.IsTrue(errs.Count > 0); // casually looking at the data, I get 8, one for each file and a general "this failed"
}
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
}
[TestMethod()]
public void ParallelServerCancelTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
Thread proc = null;
// to let us know that the cancel was caught
ManualResetEvent caughtCancel = new ManualResetEvent(false);
try
{
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
// step 1 : set net.parallel.threads to > 0
Assert.IsTrue(target.RunCommand("configure", 7, true, new String[] { "set", "net.parallel.max=4" }, 2));
}
// sometimes because of timing issues we miss-fail the test (it hangs)
// to counter that, run the test N times until it passes with a limited
// loop count for sleeping
int testTries = 5;
while (!caughtCancel.WaitOne(0) && testTries-- >= 0)
{
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
// to let the main thread know when to start looking for parallel ops to start
ManualResetEvent starting = new ManualResetEvent(false);
// to let the main thread know that the sync competed
ManualResetEvent done = new ManualResetEvent(false);
proc = new Thread(() =>
{
try
{
target.SetThreadOwner(Thread.CurrentThread.ManagedThreadId);
Thread.CurrentThread.IsBackground = true;
starting.Set();
Assert.IsTrue(target.RunCommand("sync", 7, true, new String[] { "--parallel", "threads=4,batch=8,batchsize=1,min=1,minsize=1", "-f", "//..." }, 4));
// the sync will throw over this Set() if we are successful
done.Set();
}
catch (Exception e)
{
caughtCancel.Set();
logger.Debug(e.Message);
}
});
// after this runs, the desired state is done() is not set and caughtCancel() is set
// these things have to happen at just the right moment or we miss the test
proc.Start();
starting.WaitOne();
// similarly if we cancel too soon, we will never see the threads' connections created
while (target.GetParallelOperationCount() < 4)
Thread.Sleep(100);
// connections are up, now cancel them
target.CancelCommand(7);
// recheck the cancel
int retries = 5;
while (!caughtCancel.WaitOne(250) && retries-- >= 0 && !done.WaitOne(250)) ;
// we only sync a small number of files, so if it doesn't complete in ~3s it's hung
// check that either we got the cancel or done is set
Assert.IsTrue(caughtCancel.WaitOne(0) || done.WaitOne(0));
// missing the cancel means we missed it (success sync before cancel called), so maybe try the whole thing again
}
}
Assert.IsTrue(caughtCancel.WaitOne(0));
}
catch (P4CommandCanceledException ex)
{
// I don't think that it ever gets here
caughtCancel.Set();
logger.Debug(ex.Message);
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
}
/// <summary>
///A test for Client
///</summary>
[TestMethod()]
public void ClientTestA()
{
ClientTest(false);
}
[TestMethod()]
public void ClientTestU()
{
ClientTest(true);
}
private void ClientTest(bool unicode)
{
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
// turn off exceptions for this test
ErrorSeverity oldExceptionLevel = P4Exception.MinThrowLevel;
P4Exception.MinThrowLevel = ErrorSeverity.E_NOEXC;
Process p4d = null;
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("dirs", cmdId, false, new String[] { "//depot/*" }, 1),
"\"dirs\" command failed");
String actual = target.Client;
Assert.AreEqual(actual, "admin_space");
target.Client = "admin_space2";
// run a command to trigure a reconnect
Assert.IsTrue(target.RunCommand("dirs", ++cmdId, false, new String[] { "//admin_space2/*" }, 1),
"\"dirs //admin_space2/*\" command failed");
// try a bad value
target.Client = "admin_space3";
Assert.IsTrue(target.RunCommand("dirs", ++cmdId, false, new String[] { "//admin_space3/*" }, 1),
"\"dirs //admin_space3/*\" command failed");
P4ClientErrorList ErrorList = target.GetErrorResults(cmdId);
Assert.IsNotNull(ErrorList);
Assert.AreEqual(ErrorSeverity.E_WARN, ErrorList[0].SeverityLevel);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
// reset the exception level
P4Exception.MinThrowLevel = oldExceptionLevel;
}
/// <summary>
///A test for DataSet
///</summary>
[TestMethod()]
public void DataSetTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String expected = "The quick brown fox jumped over the tall white fence.";
target.SetDataSet(7, expected);
String actual = target.GetDataSet(7);
Assert.AreEqual(actual, expected);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
/// <summary>
///A test for Password
///</summary>
[TestMethod()]
public void PasswordTestA()
{
PasswordTest(false);
}
[TestMethod()]
public void PasswordTestU()
{
PasswordTest(true);
}
private void PasswordTest(bool unicode)
{
string server = "localhost:6666";
string user = "Alex";
string pass = "pass";
string ws_client = "admin_space";
// turn off exceptions for this test
ErrorSeverity oldExceptionLevel = P4Exception.MinThrowLevel;
P4Exception.MinThrowLevel = ErrorSeverity.E_NOEXC;
Process p4d = null;
try
{
if (unicode)
user = "Алексей";
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String actual = target.Password;
Assert.IsTrue(actual == null || actual == "");
/// try a bad value
target.Password = "ssap";
uint cmdId = 7;
// command triggers a reconnect
Assert.IsFalse(target.RunCommand("dirs", cmdId, false, new String[] { "//depot/*" }, 1),
"\"dirs\" command failed");
// try a user with no password
target.User = "admin";
target.Password = String.Empty;
// command triggers a reconnect
Assert.IsTrue(target.RunCommand("dirs", ++cmdId, false, new String[] { "//depot/*" }, 1),
"\"dirs\" command failed");
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
// reset the exception level
P4Exception.MinThrowLevel = oldExceptionLevel;
}
/// <summary>
///A test for Port
///</summary>
[TestMethod()]
public void PortTestA()
{
PortTest(false);
}
[TestMethod()]
public void PortTestU()
{
PortTest(true);
}
public void PortTest(bool unicode)
{
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
// turn off exceptions for this test
ErrorSeverity oldExceptionLevel = P4Exception.MinThrowLevel;
P4Exception.MinThrowLevel = ErrorSeverity.E_NOEXC;
Process p4d = null;
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String expected = "localhost:6666";
target.Port = expected;
String actual = target.Port;
Assert.AreEqual(actual, expected);
// try a bad value
target.Port = "null:0";
uint cmdId = 7;
// command triggers a reconnect
bool reconectSucceeded = true;
try
{
reconectSucceeded = target.RunCommand("dirs", cmdId, false, new String[] { "//depot/*" }, 1);
}
catch
{
reconectSucceeded = false;
}
Assert.IsFalse(reconectSucceeded, "Reconnect to \"null:0\" did not fail");
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
// reset the exception level
P4Exception.MinThrowLevel = oldExceptionLevel;
// release the connection error if any
P4Bridge.ClearConnectionError();
}
/// <summary>
///A test for User
///</summary>
[TestMethod()]
public void UserTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "Alex";
string pass = "pass";
string ws_client = "admin_space";
// turn off exceptions for this test
ErrorSeverity oldExceptionLevel = P4Exception.MinThrowLevel;
P4Exception.MinThrowLevel = ErrorSeverity.E_NOEXC;
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
if (unicode)
user = "Алексей";
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String actual = target.User;
Assert.AreEqual(actual, user);
// try a bad value
target.User = "John";
uint cmdId = 7;
// command triggers a reconnect
bool success = target.RunCommand("dirs", cmdId, false, new String[] { "//depot/*" }, 1);
Assert.IsTrue(success, "\"dirs\" command failed");
P4ClientErrorList errors = target.GetErrorResults(cmdId);
// try a user with no password
target.User = "admin";
target.Password = String.Empty;
// command triggers a reconnect
Assert.IsTrue(target.RunCommand("dirs", ++cmdId, false, new String[] { "//depot/*" }, 1),
"\"dirs\" command failed");
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
// reset the exception level
P4Exception.MinThrowLevel = oldExceptionLevel;
}
/// <summary>
///A test for ErrorList
///</summary>
[TestMethod()]
public void ErrorListTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "Alex";
string pass = "pass";
string ws_client = "admin_space";
// turn off exceptions for this test
ErrorSeverity oldExceptionLevel = P4Exception.MinThrowLevel;
P4Exception.MinThrowLevel = ErrorSeverity.E_NOEXC;
Process p4d = null;
// refactor this to test each one individually as its own test
for (int i = 0; i < 3; i++) // run once for ascii, once for unicode, once for the security level 3 server
{
try
{
String zippedFile = "a.exe";
if (i == 1)
{
zippedFile = "u.exe";
user = "Алексей";
pass = "pass";
}
if (i == 2)
{
zippedFile = "s3.exe";
user = "alex";
pass = "Password";
}
p4d = Utilities.DeployP4TestServer(TestDir, 10, zippedFile, unicode);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
P4ClientErrorList errors = null;
uint cmdId = 7;
// a bad user will not fail on the servers fro a.exe and u.exe,
// so only test on s3
if (i == 2)
{
// setting the user name will trigger a disconnect
target.User = "badboy"; // nonexistent user
// command triggers an attempt to reconnect
Assert.IsFalse(target.RunCommand("dirs", ++cmdId, false, new String[] { "//depot/*" }, 1));
errors = target.GetErrorResults(cmdId);
Assert.IsNotNull(errors);
Assert.IsTrue(
errors[0].ErrorMessage.Contains("Password must be set before access can be granted"));
target.User = user; // back to the good user
}
target.Password = "NoWayThisWillWork"; // bad password
if (i == 2)
{
Assert.IsFalse(target.Login("NoWayThisWillWork", null));
P4ClientError conError = target.ConnectionError;
Assert.IsNotNull(conError);
Assert.IsTrue(conError.ErrorMessage.Contains("Password invalid"));
}
// command triggers an attempt to reconnect
Assert.IsFalse(target.RunCommand("dirs", ++cmdId, false, new String[] { "//depot/*" }, 1));
errors = target.GetErrorResults(cmdId);
Assert.IsNotNull(errors);
Assert.AreEqual(errors[0].ErrorCode, 807672853);
target.Password = pass; // back to the good password
if (i == 2)
{
Assert.IsTrue(target.Login(pass, null));
}
target.Client = "AintNoClientNamedLikeThis";
// command triggers an attempt to reconnect (have requires a client)
Assert.IsFalse(target.RunCommand("have", ++cmdId, false, null, 0));
errors = target.GetErrorResults(cmdId);
Assert.IsNotNull(errors);
Assert.AreEqual(errors[0].ErrorCode, 855775267);
//Assert.IsTrue(errors[0].ErrorMessage.Contains("unknown - use 'client' command to create it"));
target.Client = ws_client; // back to the good client name
target.Port = "NoServerAtThisAddress:666";
// command triggers an attempt to reconnect
Assert.IsFalse(target.RunCommand("dirs", ++cmdId, false, new String[] { "//depot/*" }, 1));
errors = target.GetErrorResults(cmdId);
P4ClientInfoMessageList info = target.GetInfoResults(cmdId);
System.Threading.Thread.Sleep(TimeSpan.FromMilliseconds(target.IdleDisconnectWaitTime + 10));
P4ClientError conErr = target.ConnectionError;
if (errors == null)
{
Assert.IsNotNull(conErr);
Assert.AreEqual(conErr.ErrorCode, 858128410);
//Assert.IsTrue(conErr.ErrorMessage.Contains("Connect to server failed"));
}
else
{
Assert.IsNotNull(errors);
Assert.AreEqual(errors[0].ErrorCode, 858128410);
//Assert.IsTrue(errors[0].ErrorMessage.Contains("Connect to server failed"));
}
target.Port = server; // back to the good port name
//if (i == 2)
//{
target.Password = null;
Assert.IsTrue(target.Login(pass, null));
//}
System.Threading.Thread.Sleep(100);
// command triggers an attempt to reconnect
// run a good command to make sure the connection is solid
bool success = target.RunCommand("dirs", ++cmdId, false, new String[] { "//depot/*" }, 1);
errors = target.GetErrorResults(cmdId);
if (!success)
{
P4ClientInfoMessageList InfoOut = target.GetInfoResults(cmdId);
Assert.IsNull(InfoOut);
}
Assert.IsTrue(success);
Assert.IsNull(errors);
// try a bad command name
Assert.IsFalse(target.RunCommand("dirrrrrs", ++cmdId, false, new String[] { "//depot/*" }, 1));
errors = target.GetErrorResults(cmdId);
Assert.IsNotNull(errors);
Assert.AreEqual(errors[0].ErrorCode, 805379098);
//Assert.IsTrue(errors[0].ErrorMessage.Contains("Unknown command. Try 'p4 help' for info"));
target.Port = server; // back to the good port name
if (i == 2)
{
target.Password = null;
Assert.IsTrue(target.Login(pass, null));
}
// try a bad command parameter
Assert.IsFalse(target.RunCommand("dirs", ++cmdId, false, new String[] { "//freebird/*" }, 1));
errors = target.GetErrorResults(cmdId);
Assert.IsNotNull(errors);
Assert.AreEqual(errors[0].ErrorCode, 838998116);
// Assert.IsTrue(errors[0].ErrorMessage.Contains("must refer to client"));
// try a bad command flag
Assert.IsFalse(target.RunCommand("dirs", ++cmdId, false, new String[] { "-UX", "//depot/*" }, 1));
errors = target.GetErrorResults(cmdId);
Assert.IsNotNull(errors);
Assert.AreEqual(errors[0].ErrorCode, 822150148);
// Assert.IsTrue(errors[0].ErrorMessage.Contains("Invalid option: -UX"));
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
// reset the exception level
P4Exception.MinThrowLevel = oldExceptionLevel;
}
/// <summary>
///A test for ApiLevel
///</summary>
[TestMethod()]
public void ApiLevelTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
Assert.IsTrue(target.ApiLevel > 0);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
/// <summary>
///A test for GetTaggedOutput
///</summary>
[TestMethod()]
public void TestTaggedUntaggedOutputTest()
{
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
String[] parms = new String[] { "//depot/mycode/*" };
uint cmdId = 7;
Assert.IsTrue(target.RunCommand("files", cmdId, false, parms, 1),
"\"files\" command failed");
TaggedObjectList results = target.GetTaggedOutput(cmdId);
Assert.IsNull(results, "GetTaggedOutput did not return null data");
Assert.IsTrue(target.RunCommand("files", ++cmdId, true, parms, 1),
"\"files\" command failed");
results = target.GetTaggedOutput(cmdId);
Assert.IsNotNull(results, "GetTaggedOutput returned null data");
if (unicode)
Assert.AreEqual(3, results.Count);
else
Assert.AreEqual(3, results.Count);
Assert.IsTrue(target.RunCommand("files", ++cmdId, false, parms, 1),
"\"files\" command failed");
results = target.GetTaggedOutput(cmdId);
Assert.IsNull(results, "GetTaggedOutput did not return null data");
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
private static bool CommandCompletedCalled = false;
/// <summary>
/// Another test for IKeepAlive
/// </summary>
[TestMethod()]
public void KeepAliveTest2()
{
// set a prompt handler, wait until the prompt comes in, cancel the command, get the "cancelled" state
// then launch another command and watch it succeed
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
target.PromptHandler = PromptWaiter;
// attempt to change the password, this guarantees a prompt
P4Command cmd = new P4Command(target, "passwd", false);
// start a thread to cancel as soon as the prompt comes in
System.Threading.Thread t = new System.Threading.Thread(KeepAliveKiller);
testKiller = new KillParams();
testKiller.server = target;
testKiller.promptCalled = new ManualResetEvent(false);
testKiller.cancelCalled = new ManualResetEvent(false);
testKiller.cmd = cmd;
testKiller.cmdId = cmd.CommandId;
t.Start();
cmd.CmdPromptHandler = PromptWaiter;
bool cancelledException = false;
try
{
P4CommandResult result = cmd.Run();
// Run() should throw an error
}
catch (P4CommandCanceledException)
{
cancelledException = true;
}
Assert.IsTrue(cancelledException, "Did not receive cancel exception");
// run another command, but run a reconnect as "cancel" terminates the session
target.Reconnect();
target.PromptHandler = null;
cmd = new P4Command(target, "depots", false);
cancelledException = false;
try
{
P4CommandResult result = cmd.Run();
// no exception
}
catch (P4CommandCanceledException)
{
cancelledException = true;
}
Assert.IsFalse(cancelledException, "Received cancel exception");
}
}
finally
{
testKiller = new KillParams();
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
private struct KillParams
{
public ManualResetEvent promptCalled;
public ManualResetEvent cancelCalled;
public uint cmdId;
public P4Server server;
public P4Command cmd;
}
private static KillParams testKiller;
private string PromptWaiter(uint cmdId, String msg, bool displayText)
{
testKiller.promptCalled.Set();
// wait until the cancel got called
testKiller.cancelCalled.WaitOne();
// wait for a few milliseconds for the C++ level to notice that the command was cancelled
Thread.Sleep(300);
return "nothing";
}
private static void KeepAliveKiller()
{
// wait for the prompt
testKiller.promptCalled.WaitOne();
// stop the command
testKiller.server.CancelCommand(testKiller.cmdId);
// let the prompter continue
testKiller.cancelCalled.Set();
// we're done
}
/// <summary>
///A test for IKeepAlive
///</summary>
[TestMethod()]
public void KeepAliveTest()
{
// set a prompt handler, wait until the prompt comes in, cancel the command, get the "cancelled" state
bool unicode = false;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
target.PromptHandler = PromptWaiter;
// attempt to change the password, this guarantees a prompt
P4Command cmd = new P4Command(target, "passwd", false);
// start a thread to cancel as soon as the prompt comes in
System.Threading.Thread t = new System.Threading.Thread(KeepAliveKiller);
testKiller = new KillParams();
testKiller.server = target;
testKiller.promptCalled = new ManualResetEvent(false);
testKiller.cancelCalled = new ManualResetEvent(false);
testKiller.cmd = cmd;
testKiller.cmdId = cmd.CommandId;
t.Start();
cmd.CmdPromptHandler = PromptWaiter;
bool cancelledException = false;
try
{
P4CommandResult result = cmd.Run();
// Run() should throw an error
}
catch (P4CommandCanceledException)
{
cancelledException = true;
}
Assert.IsTrue(cancelledException);
}
}
finally
{
testKiller = new KillParams();
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
}
}
private string ClearP4VarSetting(string var)
{
try
{
Process p = new Process();
ProcessStartInfo ps = new ProcessStartInfo();
ps.FileName = "P4";
ps.Arguments = string.Format("set {0}=", var);
ps.RedirectStandardOutput = true;
;
ps.UseShellExecute = false;
;
p.StartInfo = ps;
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
return output;
}
catch (Exception ex)
{
return ex.Message;
}
}
/// <summary>
///A test for Get/Set
///</summary>
[TestMethod()]
public void GetSetTest()
{
string expected = "C:\\login.bat";
P4Server.Set("P4FOOBAR", expected);
string value = P4Server.Get("P4FOOBAR");
Assert.AreEqual(expected, value);
expected = "D:\\login.bat";
P4Server.Set("P4FOOBAR", expected);
value = P4Server.Get("P4FOOBAR");
Assert.AreEqual(expected, value);
P4Server.Set("P4FOOBAR", null);
value = P4Server.Get("P4FOOBAR");
Assert.IsNull(value);
}
/// <summary>
///A test for IsIgnored
///</summary>
[TestMethod()]
public void IsIgnoredTest()
{
bool unicode = false;
Process p4d = null;
string oldIgnore = null;
var clientRoot = Utilities.TestClientRoot(TestDir, unicode);
var adminSpace = Path.Combine(clientRoot, "admin_space");
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
oldIgnore = P4Server.Get("P4IGNORE");
P4Server.Set("P4IGNORE", "myp4ignore.txt");
string val = P4Server.Get("P4IGNORE");
Assert.AreEqual(val, "myp4ignore.txt");
Environment.CurrentDirectory = Path.Combine(adminSpace, "MyCode");
if (System.IO.File.Exists(Path.Combine(adminSpace, "MyCode\\myp4ignore.txt")))
{
System.IO.File.Delete(Path.Combine(adminSpace, "MyCode\\myp4ignore.txt"));
}
using (System.IO.StreamWriter sw = new StreamWriter(Path.Combine(adminSpace, "MyCode\\myp4ignore.txt")))
{
sw.WriteLine("foofoofoo.foo");
}
Assert.IsTrue(P4Server.IsIgnored(Path.Combine(adminSpace, "MyCode\\foofoofoo.foo")));
Assert.IsFalse(P4Server.IsIgnored(Path.Combine(adminSpace, "MyCode\\moomoomoo.foo")));
}
catch (Exception ex)
{
Assert.Fail(ex.Message + "\r\n" + ex.StackTrace);
}
finally
{
P4Server.Set("P4IGNORE", oldIgnore);
if (System.IO.File.Exists(Path.Combine(adminSpace, "MyCode\\myp4ignore.txt")))
{
System.IO.File.Delete(Path.Combine(adminSpace, "MyCode\\myp4ignore.txt"));
}
if (System.IO.File.Exists(Path.Combine(adminSpace, "MyCode\\myp4ignore_АБВГ.txt")))
{
System.IO.File.Delete(Path.Combine(adminSpace, "MyCode\\myp4ignore_АБВГ.txt"));
}
Utilities.RemoveTestServer(p4d, TestDir);
}
unicode = !unicode;
//}
}
/// <summary>
///A test for IsIgnoredjob100206
///</summary>
[TestMethod()]
public void IsIgnoredTestjob100206()
{
string oldIgnore = P4Server.Get("P4IGNORE");
try
{
P4Server.Set("P4IGNORE", ".p4ignore");
string val = P4Server.Get("P4IGNORE");
Assert.AreEqual(val, ".p4ignore");
Environment.CurrentDirectory = "C:\\MyTestDir";
Directory.CreateDirectory("C:\\MyTestDir\\NoIgnore");
System.IO.File.Create("C:\\MyTestDir\\.p4ignore").Dispose();
System.IO.File.AppendAllText("C:\\MyTestDir\\.p4ignore", ".p4ignore");
Assert.IsTrue(P4Server.IsIgnored("C:\\MyTestDir\\.p4ignore"));
Environment.CurrentDirectory = "C:\\MyTestDir";
Assert.IsTrue(P4Server.IsIgnored(".p4ignore"));
Environment.CurrentDirectory = "C:\\MyTestDir\\NoIgnore";
Assert.IsFalse(P4Server.IsIgnored(".p4ignore"));
}
finally
{
P4Server.Set("P4IGNORE", oldIgnore);
System.IO.File.Delete("C:\\MyTestDir\\.p4ignore");
}
}
/// <summary>
///A test for GetConfig()
///</summary>
[TestMethod()]
public void GetConfigTestA()
{
GetConfigTest(false);
}
/// <summary>
///A test for GetConfig()
///</summary>
[TestMethod()]
public void GetConfigTestU()
{
GetConfigTest(true);
}
public void GetConfigTest(bool unicode)
{
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
string oldConfig = P4Server.Get("P4CONFIG");
string adminSpace = "";
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
var clientRoot = Utilities.TestClientRoot(TestDir, unicode);
adminSpace = Path.Combine(clientRoot, "admin_space");
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
string expected = Path.Combine(adminSpace, "MyCode\\myP4Config.txt");
P4Server.Set("P4CONFIG", "myP4Config.txt");
if (System.IO.File.Exists(expected))
{
System.IO.File.Delete(expected);
}
//make sure it returns null if no config file
string actual = P4Server.GetConfig(Path.Combine(adminSpace, "MyCode"));
if (actual != null)
{
Assert.AreEqual(actual, "noconfig", true);
}
using (System.IO.StreamWriter sw = new StreamWriter(expected))
{
sw.WriteLine("P4CLIENT=admin_space");
}
actual = P4Server.GetConfig(Path.Combine(adminSpace, "MyCode"));
Assert.AreEqual(actual, expected, true);
target.Disconnect();
target.CurrentWorkingDirectory = Path.Combine(adminSpace, "MyCode");
actual = target.Config;
Assert.AreEqual(actual, expected, true);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
P4Server.Set("P4CONFIG", oldConfig);
if (System.IO.File.Exists(Path.Combine(adminSpace, "MyCode\\myP4Config.txt")))
{
System.IO.File.Delete(Path.Combine(adminSpace, "MyCode\\myP4Config.txt"));
}
}
}
/// <summary>
///A test for GetConfigjob100191A()
///</summary>
[TestMethod()]
public void GetConfigTestjob100191A()
{
GetConfigTestjob100191(false);
}
/// <summary>
///A test for GetConfigjob100191U()
///</summary>
[TestMethod()]
public void GetConfigTestjob100191U()
{
GetConfigTestjob100191(true);
}
public void GetConfigTestjob100191(bool unicode)
{
string oldConfig = P4Server.Get("P4CONFIG");
string uri = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
string adminSpace = "";
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
var clientRoot = Utilities.TestClientRoot(TestDir, unicode);
adminSpace = Path.Combine(clientRoot, "admin_space");
Server server = new Server(new ServerAddress(uri));
Repository rep = new Repository(server);
using (Connection con = rep.Connection)
{
// create some directories
Directory.CreateDirectory("C:\\top_level\\mid_level\\bottom_level");
string topLevel = "C:\\top_level\\p4config";
string midLevel = "C:\\top_level\\mid_level\\p4config";
string bottomLevel = "C:\\top_level\\mid_level\\bottom_level\\p4config";
// create some config files
System.IO.File.Create(topLevel).Dispose();
System.IO.File.Create(midLevel).Dispose();
System.IO.File.Create(bottomLevel).Dispose();
System.IO.File.AppendAllText(topLevel, "P4PORT=6666\r\nP4USER=admin\r\nP4CLIENT=admin_space");
System.IO.File.AppendAllText(midLevel, "P4PORT=6666\r\nP4USER=admin\r\nP4CLIENT=admin_space");
System.IO.File.AppendAllText(bottomLevel, "P4PORT=6666\r\nP4USER=admin\r\nP4CLIENT=admin_space");
P4Server.Set("P4CONFIG", "p4config");
Options options = new Options();
options["cwd"] = "C:\\top_level\\mid_level\\bottom_level";
Directory.SetCurrentDirectory("C:\\top_level\\mid_level\\bottom_level");
con.Connect(options);
string config1 = con.GetP4ConfigFile();
Assert.AreEqual(config1, bottomLevel);
config1 = con.GetP4ConfigFile("C:\\top_level\\mid_level\\bottom_level");
Assert.AreEqual(config1, bottomLevel);
config1 = P4Server.GetConfig("C:\\top_level\\mid_level\\bottom_level");
Assert.AreEqual(config1, bottomLevel);
con.Disconnect();
options["cwd"] = "C:\\top_level\\mid_level";
Directory.SetCurrentDirectory("C:\\top_level\\mid_level");
con.Connect(options);
string config2 = con.GetP4ConfigFile();
Assert.AreEqual(config2, midLevel);
config2 = con.GetP4ConfigFile("C:\\top_level\\mid_level");
Assert.AreEqual(config2, midLevel);
config2 = P4Server.GetConfig("C:\\top_level\\mid_level");
Assert.AreEqual(config2, midLevel);
con.Disconnect();
options["cwd"] = "C:\\top_level";
Directory.SetCurrentDirectory("C:\\top_level");
con.Connect(options);
string config3 = con.GetP4ConfigFile();
Assert.AreEqual(config3, topLevel);
config3 = con.GetP4ConfigFile("C:\\top_level");
Assert.AreEqual(config3, topLevel);
config3 = P4Server.GetConfig("C:\\top_level");
Assert.AreEqual(config3, topLevel);
//delete the config files
System.IO.File.Delete("C:\\top_level\\mid_level\\bottom_level\\p4config");
System.IO.File.Delete("C:\\top_level\\mid_level\\p4config");
System.IO.File.Delete("C:\\top_level\\p4config");
con.Disconnect();
options["cwd"] = "C:\\top_level";
con.Connect(options);
string config4 = con.GetP4ConfigFile();
Assert.AreEqual(config4, "noconfig");
config4 = con.GetP4ConfigFile("C:\\top_level");
Assert.AreEqual(config4, "noconfig");
config4 = P4Server.GetConfig("C:\\top_level");
Assert.AreEqual(config4, "noconfig");
con.Disconnect();
Directory.SetCurrentDirectory("C:\\");
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
P4Server.Set("P4CONFIG", oldConfig);
// delete the directories
Directory.Delete("C:\\top_level\\mid_level\\bottom_level");
Directory.Delete("C:\\top_level\\mid_level");
Directory.Delete("C:\\top_level");
}
}
/// <summary>
///A test for GetConfig()
///</summary>
[TestMethod()]
public void ConnectWithConfigFileTest()
{
bool unicode = false;
string oldConfig = P4Server.Get("P4CONFIG");
string adminSpace = "";
Process p4d = null;
for (int i = 0; i < 2; i++) // run once for ascii, once for unicode
{
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
var clientRoot = Utilities.TestClientRoot(TestDir, unicode);
adminSpace = Path.Combine(clientRoot, "admin_space");
Directory.CreateDirectory(adminSpace);
// write a config file in the workspace root
string expected = Path.Combine(adminSpace, "myP4Config.txt");
P4Server.Set("P4CONFIG", "myP4Config.txt");
try
{
if (System.IO.File.Exists(expected))
{
System.IO.File.Delete(expected);
}
using (System.IO.StreamWriter sw = new StreamWriter(expected))
{
sw.WriteLine("P4PORT=localhost:6666");
sw.WriteLine("P4user=admin");
sw.WriteLine("P4CLIENT=admin_space");
}
}
catch { Assert.Fail("Could not write config file"); }
{
string actual = P4Server.GetConfig(Path.Combine(adminSpace, "MyCode"));
Assert.AreEqual(expected, actual);
}
using (P4Server target = new P4Server(Path.Combine(adminSpace, "MyCode")))
{
if (unicode)
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
else
Assert.IsFalse(target.UseUnicode, "Non Unicode server detected as supporting Unicode");
Assert.AreEqual(target.User, "admin");
Assert.AreEqual(target.Client, "admin_space");
Assert.AreEqual(target.Port, "localhost:6666");
string actual = target.Config;
Assert.AreEqual(actual, expected, true); // ignore case
}
}
finally
{
P4Server.Set("P4CONFIG", oldConfig);
Utilities.RemoveTestServer(p4d, TestDir);
if (System.IO.File.Exists(Path.Combine(adminSpace, "myP4Config.txt")))
{
System.IO.File.Delete(Path.Combine(adminSpace, "myP4Config.txt"));
}
}
unicode = !unicode;
}
}
/// <summary>
///A test for shiftjis
///</summary>
[TestMethod()]
public void ShiftjisFilesTest()
{
// only applies to Unicode servers
bool unicode = true;
string uri = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
try
{
Environment.SetEnvironmentVariable("P4CHARSET", "shiftjis");
p4d = Utilities.DeployP4TestServer(TestDir, 16, unicode);
Server server = new Server(new ServerAddress(uri));
Repository rep = new Repository(server);
using (Connection con = rep.Connection)
{
con.UserName = user;
con.Client = new Client();
con.Client.Name = ws_client;
Assert.AreEqual(con.Status, ConnectionStatus.Disconnected);
Assert.AreEqual(con.Server.State, ServerState.Unknown);
Assert.IsTrue(con.Connect(null));
Assert.AreEqual(con.Server.State, ServerState.Online);
Assert.AreEqual(con.Status, ConnectionStatus.Connected);
Assert.AreEqual("admin", con.Client.OwnerName);
// confirm that ああえええええ directory does not exist locally
Assert.IsFalse(System.IO.Directory.Exists(@"C:\MyTestDir\admin_space\ああえええええ"));
// sync the ああえええええ dir
FileSpec dfs = new FileSpec(new DepotPath(@"//depot/ああえええええ/..."));
Options sFlags = new SyncFilesCmdOptions(
SyncFilesCmdFlags.Force,
100
);
IList<FileSpec> rFiles = con.Client.SyncFiles(sFlags, dfs);
// confirm that the ああえええええ directory now exists
// that the files were synced and that there are 3
// files total in the new local directory
Assert.IsTrue(System.IO.Directory.Exists(@"C:\MyTestDir\admin_space\ああえええええ"));
Assert.IsNotNull(rFiles);
Assert.AreEqual(3, rFiles.Count);
// confirm that the local filenames were synced correctly
Assert.IsTrue(System.IO.File.Exists(rFiles[0].LocalPath.Path));
Assert.IsTrue(System.IO.File.Exists(rFiles[1].LocalPath.Path));
Assert.IsTrue(System.IO.File.Exists(rFiles[2].LocalPath.Path));
// sync to none and confirm directory is empty
dfs.Version = new Revision(0);
rFiles = con.Client.SyncFiles(sFlags, dfs);
Assert.AreEqual(System.IO.Directory.GetFiles(@"C:\MyTestDir\admin_space\ああえええええ").Length, 0);
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
}
/// <summary>
///A test for SetCharacterSet
///</summary>
[TestMethod()]
public void SetCharacterSetTest()
{
// only applies to Unicode servers
bool unicode = true;
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
string adminSpace = "";
string origCharset = Environment.GetEnvironmentVariable("P4CHARSET");
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
var clientRoot = Utilities.TestClientRoot(TestDir, unicode);
adminSpace = Path.Combine(clientRoot, "admin_space");
Directory.CreateDirectory(adminSpace);
Environment.SetEnvironmentVariable("P4CHARSET", "utf8-bom");
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
string gotCharset = P4Server.Get("P4CHARSET");
Assert.AreEqual(gotCharset, "utf8-bom");
//target.SetCharacterSet("utf8", "utf8-bom");
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
Assert.AreEqual(target.User, "admin");
Assert.AreEqual(target.Client, "admin_space");
Assert.AreEqual(target.Port, "localhost:6666");
string localPath = Path.Combine(adminSpace, "MyCode", "Пюп.txt");
string depotPath = "//depot/MyCode/Пюп-utf8.txt";
Assert.IsTrue(target.RunCommand("revert", 7, true, new string[] { depotPath }, 1));
Assert.IsTrue(target.RunCommand("print", 7, true, new string[] { depotPath }, 1));
string fileContents = target.GetTextResults(7);
Assert.IsTrue(target.RunCommand("sync", 7, true, new string[] { "-f", depotPath }, 2));
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
Environment.SetEnvironmentVariable("P4CHARSET", origCharset);
}
try
{
p4d = Utilities.DeployP4TestServer(TestDir, unicode, TestContext.TestName);
Environment.SetEnvironmentVariable("P4CHARSET", "utf16le-bom");
P4Bridge.ReloadEnviro();
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
string gotCharset = P4Server.Get("P4CHARSET");
Assert.AreEqual(gotCharset, "utf16le-bom");
//target.SetCharacterSet("utf8", "utf8-bom");
Assert.IsTrue(target.UseUnicode, "Unicode server detected as not supporting Unicode");
Assert.AreEqual(target.User, "admin");
Assert.AreEqual(target.Client, "admin_space");
Assert.AreEqual(target.Port, "localhost:6666");
string localPath = Path.Combine(adminSpace, "MyCode", "Пюп.txt");
string depotPath = "//depot/MyCode/Пюп-utf8.txt";
Assert.IsTrue(target.RunCommand("revert", 7, true, new string[] { depotPath }, 1));
Assert.IsTrue(target.RunCommand("print", 7, true, new string[] { depotPath }, 1));
string fileContents = target.GetTextResults(7);
Assert.IsTrue(target.RunCommand("sync", 7, true, new string[] { "-f", depotPath }, 2));
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
Environment.SetEnvironmentVariable("P4CHARSET", origCharset);
}
}
// helper
bool FindInLog(String logFile, String msg, int count = -1)
{
String line;
int foundCount = 0;
// file must be explicitly closed or p4d will stop logging to it
System.IO.StreamReader file = new System.IO.StreamReader(logFile);
try
{
while ((line = file.ReadLine()) != null)
{
if (line == msg)
{
if (count < 0) // find any instance
return true;
else
foundCount++;
}
}
return (foundCount == count);
}
finally
{
file.Close();
}
}
/// <summary>
/// A test for SetProtocol
/// </summary>
[TestMethod()]
public void SetProtocolTest()
{
string server = "localhost:6666";
string user = "admin";
string pass = string.Empty;
string ws_client = "admin_space";
Process p4d = null;
try
{
p4d = Utilities.DeployP4TestServer(TestDir, false, TestContext.TestName);
var serverRoot = Utilities.TestServerRoot(TestDir, false);
// turn on rpc debugging
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
Assert.IsTrue(target.RunCommand("configure", 0, true, new string[] { "set", "rpc=3" }, 2));
}
// reconnect
using (P4Server target = new P4Server(server, user, pass, ws_client))
{
// due to the way the .net api is implemented, we must disconnect first
// careful setting breakpoints through here, the auto-disconnect could
// cause a reconnect and re-send of protocols, which throws off the counts
target.Disconnect();
// we're not technically connected now, so call SetProtocol
target.SetProtocol("pizza", "3");
// now run a command, we should get an Rpc message in the log with our custom protocol
Assert.IsTrue(target.RunCommand("info", 0, true, null, 0));
// find RpcSendBuffer pizza = 3 in the log
Assert.IsTrue(FindInLog(serverRoot + "\\p4d.log", "RpcRecvBuffer pizza = 3"));
// negative test: SetProtocol and nothing noted in the log
// (note that the log also does not show *pizza* after this request)
target.SetProtocol("calzone", "4");
Assert.IsTrue(target.RunCommand("info", 0, true, null, 0));
Assert.IsFalse(FindInLog(serverRoot + "\\p4d.log", "RpcRecvBuffer pizza = 3", 2));
Assert.IsFalse(FindInLog(serverRoot + "\\p4d.log", "RpcRecvBuffer calzone = 4"));
// positive test: reconnect and it should be there again (as well as 2 pizzas)
target.Disconnect();
Assert.IsTrue(target.RunCommand("info", 0, true, null, 0));
Assert.IsTrue(FindInLog(serverRoot + "\\p4d.log", "RpcRecvBuffer pizza = 3", 2));
Assert.IsTrue(FindInLog(serverRoot + "\\p4d.log", "RpcRecvBuffer calzone = 4"));
}
}
finally
{
Utilities.RemoveTestServer(p4d, TestDir);
}
}
}
}