Index: visual_studio/NativeClientVSAddIn/UnitTests/TestUtilities.cs |
diff --git a/visual_studio/NativeClientVSAddIn/UnitTests/TestUtilities.cs b/visual_studio/NativeClientVSAddIn/UnitTests/TestUtilities.cs |
index 27941426fb325c54a8d4f43f0ca1014d6319d639..788a7a0223bedc38141d95f1ed76c550b82f3b9e 100644 |
--- a/visual_studio/NativeClientVSAddIn/UnitTests/TestUtilities.cs |
+++ b/visual_studio/NativeClientVSAddIn/UnitTests/TestUtilities.cs |
@@ -36,6 +36,12 @@ namespace UnitTests |
public const string NotNaClProjectUniqueName = @"NotNaCl\NotNaCl.csproj"; |
/// <summary> |
+ /// A generic boolean statement to be used with RetryWithTimeout. |
+ /// </summary> |
+ /// <returns>True if the statement is true, false if false.</returns> |
+ public delegate bool RetryStatement(); |
+ |
+ /// <summary> |
/// This starts an instance of Visual Studio and get its DTE object. |
/// </summary> |
/// <returns>DTE of the started instance.</returns> |
@@ -134,27 +140,6 @@ namespace UnitTests |
} |
/// <summary> |
- /// Ensures that the add-in is configured to load on start. If it isn't then some tests may |
- /// unexpectedly fail, this check helps catch that problem early. |
- /// </summary> |
- /// <param name="dte">The main Visual Studio interface.</param> |
- /// <param name="addInName">The name of the add-in to check if loaded.</param> |
- public static void AssertAddinLoaded(DTE2 dte, string addInName) |
- { |
- bool found = false; |
- foreach (AddIn addin in dte.AddIns) |
- { |
- if (addin.Connected && addInName.Equals(addin.Name)) |
- { |
- found = true; |
- break; |
- } |
- } |
- |
- Assert.IsTrue(found, "Add-in is not configured to load on start."); |
- } |
- |
- /// <summary> |
/// This returns the text contained in the given output window pane. |
/// </summary> |
/// <param name="pane">Pane to get text from.</param> |
@@ -385,6 +370,51 @@ namespace UnitTests |
} |
/// <summary> |
+ /// Ensures that the add-in is configured to load on start. If it isn't then some tests may |
+ /// unexpectedly fail, this check helps catch that problem early. |
+ /// </summary> |
+ /// <param name="dte">The main Visual Studio interface.</param> |
+ /// <param name="addInName">The name of the add-in to check if loaded.</param> |
+ public static void AssertAddinLoaded(DTE2 dte, string addInName) |
+ { |
+ bool found = false; |
+ foreach (AddIn addin in dte.AddIns) |
+ { |
+ if (addin.Connected && addInName.Equals(addin.Name)) |
+ { |
+ found = true; |
+ break; |
+ } |
+ } |
+ |
+ Assert.IsTrue(found, "Add-in is not configured to load on start."); |
+ } |
+ |
+ /// <summary> |
+ /// Will retry the given statement up to maxRetry times while pausing between each try for |
+ /// the given interval. |
+ /// </summary> |
+ /// <param name="test">Generic boolean statement.</param> |
+ /// <param name="interval">Amount of time to wait between each retry.</param> |
+ /// <param name="maxRetry">Maximum number of retries.</param> |
+ /// <param name="message">Message to print on failure.</param> |
+ public static void AssertTrueWithTimeout( |
+ RetryStatement test, TimeSpan interval, int maxRetry, string message) |
+ { |
+ for (int tryCount = 0; tryCount <= maxRetry; tryCount++) |
+ { |
+ if (test.Invoke()) |
+ { |
+ return; |
+ } |
+ |
+ System.Threading.Thread.Sleep(interval); |
+ } |
+ |
+ throw new Exception(string.Format("Statement timed out. {0}", message)); |
+ } |
+ |
+ /// <summary> |
/// Extends the string class to allow checking if a string contains another string |
/// allowing a comparison type (such as case-insensitivity). |
/// </summary> |