| Index: visual_studio/NativeClientVSAddIn/UnitTests/PluginDebuggerGDBTest.cs
|
| diff --git a/visual_studio/NativeClientVSAddIn/UnitTests/PluginDebuggerGDBTest.cs b/visual_studio/NativeClientVSAddIn/UnitTests/PluginDebuggerGDBTest.cs
|
| index 6f54d083a523ee42aca8753d61257c29e1a65dde..9a85d903ddb35d19e0454a7b8e5e81e38add94db 100644
|
| --- a/visual_studio/NativeClientVSAddIn/UnitTests/PluginDebuggerGDBTest.cs
|
| +++ b/visual_studio/NativeClientVSAddIn/UnitTests/PluginDebuggerGDBTest.cs
|
| @@ -1,398 +1,398 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -namespace UnitTests
|
| -{
|
| - using System;
|
| - using System.Collections.Generic;
|
| - using System.IO;
|
| - using System.Reflection;
|
| -
|
| - using EnvDTE80;
|
| - using Microsoft.VisualStudio.TestTools.UnitTesting;
|
| -
|
| - using NativeClientVSAddIn;
|
| -
|
| - /// <summary>
|
| - /// This is a test class for PluginDebuggerGDBTest and is intended
|
| - /// to contain all PluginDebuggerGDB Unit Tests
|
| - /// </summary>
|
| - [TestClass]
|
| - public class PluginDebuggerGDBTest
|
| - {
|
| - /// <summary>
|
| - /// This holds the path to the NaCl solution used in these tests.
|
| - /// The NaCl solution is a valid nacl/pepper plug-in VS solution.
|
| - /// It is copied into the testing deployment directory and opened in some tests.
|
| - /// Because unit-tests run in any order, the solution should not be written to
|
| - /// in any tests.
|
| - /// </summary>
|
| - private static string naclSolution;
|
| -
|
| - /// <summary>
|
| - /// The main visual studio object.
|
| - /// </summary>
|
| - private DTE2 dte_;
|
| -
|
| - /// <summary>
|
| - /// Holds the default properties from property pages to use during tests.
|
| - /// </summary>
|
| - private MockPropertyManager properties_;
|
| -
|
| - /// <summary>
|
| - /// Gets or sets the test context which provides information about,
|
| - /// and functionality for the current test run.
|
| - /// </summary>
|
| - public TestContext TestContext { get; set; }
|
| -
|
| - /// <summary>
|
| - /// This is run one time before any test methods are called. Here we set-up a test-copy of a
|
| - /// new NaCl solution for use in the tests.
|
| - /// </summary>
|
| - /// <param name="testContext">Holds information about the current test run</param>
|
| - [ClassInitialize]
|
| - public static void ClassSetup(TestContext testContext)
|
| - {
|
| - DTE2 dte = TestUtilities.StartVisualStudioInstance();
|
| - try
|
| - {
|
| - naclSolution = TestUtilities.CreateBlankValidNaClSolution(
|
| - dte,
|
| - "PluginDebuggerGDBTest",
|
| - NativeClientVSAddIn.Strings.PepperPlatformName,
|
| - NativeClientVSAddIn.Strings.NaClPlatformName,
|
| - testContext);
|
| - }
|
| - finally
|
| - {
|
| - TestUtilities.CleanUpVisualStudioInstance(dte);
|
| - }
|
| - }
|
| -
|
| - /// <summary>
|
| - /// This is run before each test to create test resources.
|
| - /// </summary>
|
| - [TestInitialize]
|
| - public void TestSetup()
|
| - {
|
| - dte_ = TestUtilities.StartVisualStudioInstance();
|
| - try
|
| - {
|
| - TestUtilities.AssertAddinLoaded(dte_, NativeClientVSAddIn.Strings.AddInName);
|
| - }
|
| - catch
|
| - {
|
| - TestUtilities.CleanUpVisualStudioInstance(dte_);
|
| - throw;
|
| - }
|
| -
|
| - // Set up mock property manager to return the desired property values.
|
| - properties_ = new MockPropertyManager(
|
| - PropertyManager.ProjectPlatformType.NaCl,
|
| - delegate(string page, string name)
|
| - {
|
| - switch (page)
|
| - {
|
| - case "ConfigurationGeneral":
|
| - switch (name)
|
| - {
|
| - case "VSNaClSDKRoot": return System.Environment.GetEnvironmentVariable(
|
| - NativeClientVSAddIn.Strings.SDKPathEnvironmentVariable);
|
| - case "NaClIrtPath": return @"fake\Irt\Path";
|
| - case "NaClManifestPath": return string.Empty;
|
| - case "ToolchainName": return "newlib";
|
| - }
|
| -
|
| - break;
|
| - case "Property":
|
| - switch (name)
|
| - {
|
| - case "ProjectDirectory": return TestContext.DeploymentDirectory;
|
| - case "PluginAssembly": return @"fake\Assembly\String";
|
| - }
|
| -
|
| - break;
|
| - }
|
| -
|
| - return null;
|
| - },
|
| - null);
|
| - }
|
| -
|
| - /// <summary>
|
| - /// This is run after each test to clean up things created in TestSetup().
|
| - /// </summary>
|
| - [TestCleanup]
|
| - public void TestCleanup()
|
| - {
|
| - TestUtilities.CleanUpVisualStudioInstance(dte_);
|
| - }
|
| -
|
| - /// <summary>
|
| - /// A test for the constructor.
|
| - /// </summary>
|
| - [TestMethod]
|
| - public void PluginDebuggerGDBConstructorTest()
|
| - {
|
| - // Check that a null dte fails.
|
| - try
|
| - {
|
| - PluginDebuggerBase nullDte = new PluginDebuggerGDB(null, properties_);
|
| - Assert.Fail("Using null DTE instance did not throw exception");
|
| - }
|
| - catch (ArgumentNullException)
|
| - {
|
| - // This is expected for a correct implementation.
|
| - }
|
| - catch
|
| - {
|
| - Assert.Fail("Using null DTE instance threw something other than ArgumentNullException");
|
| - }
|
| -
|
| - // Check that a null PropertyManager fails.
|
| - try
|
| - {
|
| - PluginDebuggerBase nullDte = new PluginDebuggerGDB(dte_, null);
|
| - Assert.Fail("Using null property manager did not throw exception");
|
| - }
|
| - catch (ArgumentNullException)
|
| - {
|
| - // This is expected for a correct implementation.
|
| - }
|
| - catch
|
| - {
|
| - Assert.Fail("Using null property manager threw something other than ArgumentNullException");
|
| - }
|
| - }
|
| -
|
| - /// <summary>
|
| - /// Tests that a plugin can be found.
|
| - /// </summary>
|
| - [TestMethod]
|
| - [DeploymentItem("NativeClientVSAddIn.dll")]
|
| - public void FindAndAttachToNaClPluginTest()
|
| - {
|
| - MockProcessSearcher processResults = new MockProcessSearcher();
|
| -
|
| - using (PluginDebuggerGDB target = new PluginDebuggerGDB(dte_, properties_))
|
| - {
|
| - PluginDebuggerBase_Accessor targetBase = new PluginDebuggerBase_Accessor(
|
| - new PrivateObject(target, new PrivateType(typeof(PluginDebuggerBase))));
|
| - targetBase.debuggedChromeMainProcess_ = System.Diagnostics.Process.GetCurrentProcess();
|
| -
|
| - uint currentProcId = (uint)targetBase.debuggedChromeMainProcess_.Id;
|
| -
|
| - // Target nacl process flag.
|
| - string naclCommandLine = Strings.NaClLoaderFlag;
|
| -
|
| - // Fake the list of processes on the system.
|
| - processResults.ProcessList.Add(
|
| - new ProcessInfo(
|
| - currentProcId,
|
| - currentProcId,
|
| - string.Empty,
|
| - Strings.NaClDebugFlag,
|
| - Strings.ChromeProcessName));
|
| - processResults.ProcessList.Add(
|
| - new ProcessInfo(1, currentProcId, string.Empty, string.Empty, "MyParentProcess"));
|
| - processResults.ProcessList.Add(
|
| - new ProcessInfo(11, 1, string.Empty, naclCommandLine, Strings.NaClProcessName));
|
| -
|
| - // This is missing some relevant command line args, should not be attached to.
|
| - processResults.ProcessList.Add(
|
| - new ProcessInfo(13, 1, string.Empty, string.Empty, Strings.NaClProcessName));
|
| -
|
| - // This doesn't have chrome process as their parent, so they should not be attached to.
|
| - processResults.ProcessList.Add(
|
| - new ProcessInfo(15, 15, string.Empty, naclCommandLine, Strings.NaClProcessName));
|
| -
|
| - // Set the private value to the mock object (can't use accessor since no valid cast).
|
| - FieldInfo processSearcherField = typeof(PluginDebuggerBase).GetField(
|
| - "processSearcher_",
|
| - BindingFlags.NonPublic | BindingFlags.Instance);
|
| - processSearcherField.SetValue(targetBase.Target, processResults);
|
| -
|
| - // Test that the correct processes are attached to.
|
| - bool goodNaCl = false;
|
| - var handler = new EventHandler<NativeClientVSAddIn.PluginDebuggerBase.PluginFoundEventArgs>(
|
| - delegate(object unused, NativeClientVSAddIn.PluginDebuggerBase.PluginFoundEventArgs args)
|
| - {
|
| - switch (args.ProcessID)
|
| - {
|
| - case 11:
|
| - if (goodNaCl)
|
| - {
|
| - Assert.Fail("Should not attach twice to same nacl process");
|
| - }
|
| -
|
| - goodNaCl = true;
|
| - break;
|
| - case 13:
|
| - Assert.Fail("Should not attach to nacl process with bad args");
|
| - break;
|
| - case 15:
|
| - Assert.Fail("Should not attach to nacl process that is not "
|
| - + "descendant of Visual Studio");
|
| - break;
|
| - default:
|
| - Assert.Fail("Should not attach to non-pepper/non-nacl process");
|
| - break;
|
| - }
|
| - });
|
| -
|
| - target.PluginFoundEvent += handler;
|
| - target.FindAndAttachToPlugin(null, null);
|
| - target.PluginFoundEvent -= handler;
|
| -
|
| - Assert.IsTrue(goodNaCl, "Failed to attach to NaCl process");
|
| - }
|
| - }
|
| -
|
| - /// <summary>
|
| - /// A test for Attach. Implicitly tests CleanUpGDBProcess().
|
| - /// </summary>
|
| - [TestMethod]
|
| - [DeploymentItem("NativeClientVSAddIn.dll")]
|
| - public void AttachNaClGDBTest()
|
| - {
|
| - PluginDebuggerGDB_Accessor target = new PluginDebuggerGDB_Accessor(dte_, properties_);
|
| -
|
| - string existingGDB = "AttachNaClGDBTest_existingGDB";
|
| - try
|
| - {
|
| - target.gdbProcess_ = TestUtilities.StartProcessForKilling(existingGDB, 20);
|
| - string existingInitFileName = Path.GetTempFileName();
|
| - target.gdbInitFileName_ = existingInitFileName;
|
| -
|
| - // Visual studio won't allow adding a breakpoint unless it is associated with
|
| - // an existing file and valid line number, so use BlankValidSolution.
|
| - dte_.Solution.Open(naclSolution);
|
| - string fileName = "main.cpp";
|
| - string functionName = "NaClProjectInstance::HandleMessage";
|
| - int lineNumber = 39;
|
| - dte_.Debugger.Breakpoints.Add(Function: functionName);
|
| - dte_.Debugger.Breakpoints.Add(Line: lineNumber, File: fileName);
|
| -
|
| - target.Attach(null, new PluginDebuggerBase.PluginFoundEventArgs(0));
|
| -
|
| - Assert.IsTrue(File.Exists(target.gdbInitFileName_), "Init file not written");
|
| -
|
| - var gdbCommands = new List<string>(File.ReadAllLines(target.gdbInitFileName_));
|
| -
|
| - // Validate that the commands contain what we specified.
|
| - // The syntax itself is not validated since this add-in is not responsible for
|
| - // the syntax and it could change.
|
| - Assert.IsTrue(
|
| - gdbCommands.Exists(s => s.Contains(fileName) && s.Contains(lineNumber.ToString())),
|
| - "Line breakpoint not properly set");
|
| - Assert.IsTrue(
|
| - gdbCommands.Exists(s => s.Contains(functionName)),
|
| - "Function breakpoint not properly set");
|
| -
|
| - // Note fake assembly string should be double escaped when passed to gdb.
|
| - Assert.IsTrue(
|
| - gdbCommands.Exists(s => s.Contains(functionName)),
|
| - @"fake\\Assembly\\String");
|
| -
|
| - // Check that the pre-existing gdb process was killed and its init file cleaned up.
|
| - Assert.IsFalse(
|
| - TestUtilities.DoesProcessExist("python.exe", existingGDB),
|
| - "Failed to kill existing GDB process");
|
| - Assert.IsFalse(
|
| - File.Exists(existingInitFileName),
|
| - "Failed to delete existing temp gdb init file");
|
| - }
|
| - finally
|
| - {
|
| - if (dte_.Debugger.Breakpoints != null)
|
| - {
|
| - // Remove all breakpoints.
|
| - foreach (EnvDTE.Breakpoint bp in dte_.Debugger.Breakpoints)
|
| - {
|
| - bp.Delete();
|
| - }
|
| - }
|
| -
|
| - // Clean up file if not erased.
|
| - if (!string.IsNullOrEmpty(target.gdbInitFileName_) && File.Exists(target.gdbInitFileName_))
|
| - {
|
| - File.Delete(target.gdbInitFileName_);
|
| - }
|
| -
|
| - // Kill the gdb process if not killed.
|
| - if (target.gdbProcess_ != null && !target.gdbProcess_.HasExited)
|
| - {
|
| - target.gdbProcess_.Kill();
|
| - target.gdbProcess_.Dispose();
|
| - }
|
| - }
|
| - }
|
| -
|
| - /// <summary>
|
| - /// A test for Dispose. Implicitly tests CleanUpGDBProcess().
|
| - /// </summary>
|
| - [TestMethod]
|
| - [DeploymentItem("NativeClientVSAddIn.dll")]
|
| - public void DisposeTest()
|
| - {
|
| - PluginDebuggerGDB_Accessor target = new PluginDebuggerGDB_Accessor(dte_, properties_);
|
| -
|
| - string existingGDB = "DisposeTest_GDB";
|
| - try
|
| - {
|
| - target.gdbProcess_ = TestUtilities.StartProcessForKilling(existingGDB, 20);
|
| - string existingInitFileName = Path.GetTempFileName();
|
| - target.gdbInitFileName_ = existingInitFileName;
|
| -
|
| - target.Dispose();
|
| -
|
| - // Check that the pre-existing gdb process was killed and its init file cleaned up.
|
| - Assert.IsFalse(
|
| - TestUtilities.DoesProcessExist("python.exe", existingGDB),
|
| - "Failed to kill existing GDB process");
|
| - Assert.IsFalse(
|
| - File.Exists(existingInitFileName),
|
| - "Failed to delete existing temp gdb init file");
|
| - }
|
| - finally
|
| - {
|
| - // Clean up file if not erased.
|
| - if (!string.IsNullOrEmpty(target.gdbInitFileName_) && File.Exists(target.gdbInitFileName_))
|
| - {
|
| - File.Delete(target.gdbInitFileName_);
|
| - }
|
| -
|
| - // Kill the gdb process if not killed.
|
| - if (target.gdbProcess_ != null && !target.gdbProcess_.HasExited)
|
| - {
|
| - target.gdbProcess_.Kill();
|
| - target.gdbProcess_.Dispose();
|
| - }
|
| - }
|
| - }
|
| -
|
| - /// <summary>
|
| - /// A test for IsPluginProcess.
|
| - /// </summary>
|
| - [TestMethod]
|
| - [DeploymentItem("NativeClientVSAddIn.dll")]
|
| - public void IsNaClPluginProcessTest()
|
| - {
|
| - PluginDebuggerGDB_Accessor target = new PluginDebuggerGDB_Accessor(dte_, properties_);
|
| -
|
| - ProcessInfo badProc = new ProcessInfo(
|
| - 1, 1, string.Empty, Strings.ChromeRendererFlag, Strings.NaClProcessName);
|
| - ProcessInfo goodProc = new ProcessInfo(
|
| - 1, 1, string.Empty, Strings.NaClLoaderFlag, Strings.NaClProcessName);
|
| -
|
| - string goodMainChromeFlags = Strings.NaClDebugFlag;
|
| - string badMainChromeFlags = string.Format(
|
| - Strings.PepperProcessPluginFlagFormat, target.pluginAssembly_);
|
| -
|
| - Assert.IsTrue(target.IsPluginProcess(goodProc, goodMainChromeFlags));
|
| - Assert.IsFalse(target.IsPluginProcess(goodProc, badMainChromeFlags));
|
| - Assert.IsFalse(target.IsPluginProcess(badProc, goodMainChromeFlags));
|
| - }
|
| - }
|
| -}
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +namespace UnitTests
|
| +{
|
| + using System;
|
| + using System.Collections.Generic;
|
| + using System.IO;
|
| + using System.Reflection;
|
| +
|
| + using EnvDTE80;
|
| + using Microsoft.VisualStudio.TestTools.UnitTesting;
|
| +
|
| + using NativeClientVSAddIn;
|
| +
|
| + /// <summary>
|
| + /// This is a test class for PluginDebuggerGDBTest and is intended
|
| + /// to contain all PluginDebuggerGDB Unit Tests
|
| + /// </summary>
|
| + [TestClass]
|
| + public class PluginDebuggerGDBTest
|
| + {
|
| + /// <summary>
|
| + /// This holds the path to the NaCl solution used in these tests.
|
| + /// The NaCl solution is a valid nacl/pepper plug-in VS solution.
|
| + /// It is copied into the testing deployment directory and opened in some tests.
|
| + /// Because unit-tests run in any order, the solution should not be written to
|
| + /// in any tests.
|
| + /// </summary>
|
| + private static string naclSolution;
|
| +
|
| + /// <summary>
|
| + /// The main visual studio object.
|
| + /// </summary>
|
| + private DTE2 dte_;
|
| +
|
| + /// <summary>
|
| + /// Holds the default properties from property pages to use during tests.
|
| + /// </summary>
|
| + private MockPropertyManager properties_;
|
| +
|
| + /// <summary>
|
| + /// Gets or sets the test context which provides information about,
|
| + /// and functionality for the current test run.
|
| + /// </summary>
|
| + public TestContext TestContext { get; set; }
|
| +
|
| + /// <summary>
|
| + /// This is run one time before any test methods are called. Here we set-up a test-copy of a
|
| + /// new NaCl solution for use in the tests.
|
| + /// </summary>
|
| + /// <param name="testContext">Holds information about the current test run</param>
|
| + [ClassInitialize]
|
| + public static void ClassSetup(TestContext testContext)
|
| + {
|
| + DTE2 dte = TestUtilities.StartVisualStudioInstance();
|
| + try
|
| + {
|
| + naclSolution = TestUtilities.CreateBlankValidNaClSolution(
|
| + dte,
|
| + "PluginDebuggerGDBTest",
|
| + NativeClientVSAddIn.Strings.PepperPlatformName,
|
| + NativeClientVSAddIn.Strings.NaClPlatformName,
|
| + testContext);
|
| + }
|
| + finally
|
| + {
|
| + TestUtilities.CleanUpVisualStudioInstance(dte);
|
| + }
|
| + }
|
| +
|
| + /// <summary>
|
| + /// This is run before each test to create test resources.
|
| + /// </summary>
|
| + [TestInitialize]
|
| + public void TestSetup()
|
| + {
|
| + dte_ = TestUtilities.StartVisualStudioInstance();
|
| + try
|
| + {
|
| + TestUtilities.AssertAddinLoaded(dte_, NativeClientVSAddIn.Strings.AddInName);
|
| + }
|
| + catch
|
| + {
|
| + TestUtilities.CleanUpVisualStudioInstance(dte_);
|
| + throw;
|
| + }
|
| +
|
| + // Set up mock property manager to return the desired property values.
|
| + properties_ = new MockPropertyManager(
|
| + PropertyManager.ProjectPlatformType.NaCl,
|
| + delegate(string page, string name)
|
| + {
|
| + switch (page)
|
| + {
|
| + case "ConfigurationGeneral":
|
| + switch (name)
|
| + {
|
| + case "VSNaClSDKRoot": return System.Environment.GetEnvironmentVariable(
|
| + NativeClientVSAddIn.Strings.SDKPathEnvironmentVariable);
|
| + case "NaClIrtPath": return @"fake\Irt\Path";
|
| + case "NaClManifestPath": return string.Empty;
|
| + case "ToolchainName": return "newlib";
|
| + }
|
| +
|
| + break;
|
| + case "Property":
|
| + switch (name)
|
| + {
|
| + case "ProjectDirectory": return TestContext.DeploymentDirectory;
|
| + case "PluginAssembly": return @"fake\Assembly\String";
|
| + }
|
| +
|
| + break;
|
| + }
|
| +
|
| + return null;
|
| + },
|
| + null);
|
| + }
|
| +
|
| + /// <summary>
|
| + /// This is run after each test to clean up things created in TestSetup().
|
| + /// </summary>
|
| + [TestCleanup]
|
| + public void TestCleanup()
|
| + {
|
| + TestUtilities.CleanUpVisualStudioInstance(dte_);
|
| + }
|
| +
|
| + /// <summary>
|
| + /// A test for the constructor.
|
| + /// </summary>
|
| + [TestMethod]
|
| + public void PluginDebuggerGDBConstructorTest()
|
| + {
|
| + // Check that a null dte fails.
|
| + try
|
| + {
|
| + PluginDebuggerBase nullDte = new PluginDebuggerGDB(null, properties_);
|
| + Assert.Fail("Using null DTE instance did not throw exception");
|
| + }
|
| + catch (ArgumentNullException)
|
| + {
|
| + // This is expected for a correct implementation.
|
| + }
|
| + catch
|
| + {
|
| + Assert.Fail("Using null DTE instance threw something other than ArgumentNullException");
|
| + }
|
| +
|
| + // Check that a null PropertyManager fails.
|
| + try
|
| + {
|
| + PluginDebuggerBase nullDte = new PluginDebuggerGDB(dte_, null);
|
| + Assert.Fail("Using null property manager did not throw exception");
|
| + }
|
| + catch (ArgumentNullException)
|
| + {
|
| + // This is expected for a correct implementation.
|
| + }
|
| + catch
|
| + {
|
| + Assert.Fail("Using null property manager threw something other than ArgumentNullException");
|
| + }
|
| + }
|
| +
|
| + /// <summary>
|
| + /// Tests that a plugin can be found.
|
| + /// </summary>
|
| + [TestMethod]
|
| + [DeploymentItem("NativeClientVSAddIn.dll")]
|
| + public void FindAndAttachToNaClPluginTest()
|
| + {
|
| + MockProcessSearcher processResults = new MockProcessSearcher();
|
| +
|
| + using (PluginDebuggerGDB target = new PluginDebuggerGDB(dte_, properties_))
|
| + {
|
| + PluginDebuggerBase_Accessor targetBase = new PluginDebuggerBase_Accessor(
|
| + new PrivateObject(target, new PrivateType(typeof(PluginDebuggerBase))));
|
| + targetBase.debuggedChromeMainProcess_ = System.Diagnostics.Process.GetCurrentProcess();
|
| +
|
| + uint currentProcId = (uint)targetBase.debuggedChromeMainProcess_.Id;
|
| +
|
| + // Target nacl process flag.
|
| + string naclCommandLine = Strings.NaClLoaderFlag;
|
| +
|
| + // Fake the list of processes on the system.
|
| + processResults.ProcessList.Add(
|
| + new ProcessInfo(
|
| + currentProcId,
|
| + currentProcId,
|
| + string.Empty,
|
| + Strings.NaClDebugFlag,
|
| + Strings.ChromeProcessName));
|
| + processResults.ProcessList.Add(
|
| + new ProcessInfo(1, currentProcId, string.Empty, string.Empty, "MyParentProcess"));
|
| + processResults.ProcessList.Add(
|
| + new ProcessInfo(11, 1, string.Empty, naclCommandLine, Strings.NaClProcessName));
|
| +
|
| + // This is missing some relevant command line args, should not be attached to.
|
| + processResults.ProcessList.Add(
|
| + new ProcessInfo(13, 1, string.Empty, string.Empty, Strings.NaClProcessName));
|
| +
|
| + // This doesn't have chrome process as their parent, so they should not be attached to.
|
| + processResults.ProcessList.Add(
|
| + new ProcessInfo(15, 15, string.Empty, naclCommandLine, Strings.NaClProcessName));
|
| +
|
| + // Set the private value to the mock object (can't use accessor since no valid cast).
|
| + FieldInfo processSearcherField = typeof(PluginDebuggerBase).GetField(
|
| + "processSearcher_",
|
| + BindingFlags.NonPublic | BindingFlags.Instance);
|
| + processSearcherField.SetValue(targetBase.Target, processResults);
|
| +
|
| + // Test that the correct processes are attached to.
|
| + bool goodNaCl = false;
|
| + var handler = new EventHandler<NativeClientVSAddIn.PluginDebuggerBase.PluginFoundEventArgs>(
|
| + delegate(object unused, NativeClientVSAddIn.PluginDebuggerBase.PluginFoundEventArgs args)
|
| + {
|
| + switch (args.ProcessID)
|
| + {
|
| + case 11:
|
| + if (goodNaCl)
|
| + {
|
| + Assert.Fail("Should not attach twice to same nacl process");
|
| + }
|
| +
|
| + goodNaCl = true;
|
| + break;
|
| + case 13:
|
| + Assert.Fail("Should not attach to nacl process with bad args");
|
| + break;
|
| + case 15:
|
| + Assert.Fail("Should not attach to nacl process that is not "
|
| + + "descendant of Visual Studio");
|
| + break;
|
| + default:
|
| + Assert.Fail("Should not attach to non-pepper/non-nacl process");
|
| + break;
|
| + }
|
| + });
|
| +
|
| + target.PluginFoundEvent += handler;
|
| + target.FindAndAttachToPlugin(null, null);
|
| + target.PluginFoundEvent -= handler;
|
| +
|
| + Assert.IsTrue(goodNaCl, "Failed to attach to NaCl process");
|
| + }
|
| + }
|
| +
|
| + /// <summary>
|
| + /// A test for Attach. Implicitly tests CleanUpGDBProcess().
|
| + /// </summary>
|
| + [TestMethod]
|
| + [DeploymentItem("NativeClientVSAddIn.dll")]
|
| + public void AttachNaClGDBTest()
|
| + {
|
| + PluginDebuggerGDB_Accessor target = new PluginDebuggerGDB_Accessor(dte_, properties_);
|
| +
|
| + string existingGDB = "AttachNaClGDBTest_existingGDB";
|
| + try
|
| + {
|
| + target.gdbProcess_ = TestUtilities.StartProcessForKilling(existingGDB, 20);
|
| + string existingInitFileName = Path.GetTempFileName();
|
| + target.gdbInitFileName_ = existingInitFileName;
|
| +
|
| + // Visual studio won't allow adding a breakpoint unless it is associated with
|
| + // an existing file and valid line number, so use BlankValidSolution.
|
| + dte_.Solution.Open(naclSolution);
|
| + string fileName = "main.cpp";
|
| + string functionName = "NaClProjectInstance::HandleMessage";
|
| + int lineNumber = 39;
|
| + dte_.Debugger.Breakpoints.Add(Function: functionName);
|
| + dte_.Debugger.Breakpoints.Add(Line: lineNumber, File: fileName);
|
| +
|
| + target.Attach(null, new PluginDebuggerBase.PluginFoundEventArgs(0));
|
| +
|
| + Assert.IsTrue(File.Exists(target.gdbInitFileName_), "Init file not written");
|
| +
|
| + var gdbCommands = new List<string>(File.ReadAllLines(target.gdbInitFileName_));
|
| +
|
| + // Validate that the commands contain what we specified.
|
| + // The syntax itself is not validated since this add-in is not responsible for
|
| + // the syntax and it could change.
|
| + Assert.IsTrue(
|
| + gdbCommands.Exists(s => s.Contains(fileName) && s.Contains(lineNumber.ToString())),
|
| + "Line breakpoint not properly set");
|
| + Assert.IsTrue(
|
| + gdbCommands.Exists(s => s.Contains(functionName)),
|
| + "Function breakpoint not properly set");
|
| +
|
| + // Note fake assembly string should be double escaped when passed to gdb.
|
| + Assert.IsTrue(
|
| + gdbCommands.Exists(s => s.Contains(functionName)),
|
| + @"fake\\Assembly\\String");
|
| +
|
| + // Check that the pre-existing gdb process was killed and its init file cleaned up.
|
| + Assert.IsFalse(
|
| + TestUtilities.DoesProcessExist("python.exe", existingGDB),
|
| + "Failed to kill existing GDB process");
|
| + Assert.IsFalse(
|
| + File.Exists(existingInitFileName),
|
| + "Failed to delete existing temp gdb init file");
|
| + }
|
| + finally
|
| + {
|
| + if (dte_.Debugger.Breakpoints != null)
|
| + {
|
| + // Remove all breakpoints.
|
| + foreach (EnvDTE.Breakpoint bp in dte_.Debugger.Breakpoints)
|
| + {
|
| + bp.Delete();
|
| + }
|
| + }
|
| +
|
| + // Clean up file if not erased.
|
| + if (!string.IsNullOrEmpty(target.gdbInitFileName_) && File.Exists(target.gdbInitFileName_))
|
| + {
|
| + File.Delete(target.gdbInitFileName_);
|
| + }
|
| +
|
| + // Kill the gdb process if not killed.
|
| + if (target.gdbProcess_ != null && !target.gdbProcess_.HasExited)
|
| + {
|
| + target.gdbProcess_.Kill();
|
| + target.gdbProcess_.Dispose();
|
| + }
|
| + }
|
| + }
|
| +
|
| + /// <summary>
|
| + /// A test for Dispose. Implicitly tests CleanUpGDBProcess().
|
| + /// </summary>
|
| + [TestMethod]
|
| + [DeploymentItem("NativeClientVSAddIn.dll")]
|
| + public void DisposeTest()
|
| + {
|
| + PluginDebuggerGDB_Accessor target = new PluginDebuggerGDB_Accessor(dte_, properties_);
|
| +
|
| + string existingGDB = "DisposeTest_GDB";
|
| + try
|
| + {
|
| + target.gdbProcess_ = TestUtilities.StartProcessForKilling(existingGDB, 20);
|
| + string existingInitFileName = Path.GetTempFileName();
|
| + target.gdbInitFileName_ = existingInitFileName;
|
| +
|
| + target.Dispose();
|
| +
|
| + // Check that the pre-existing gdb process was killed and its init file cleaned up.
|
| + Assert.IsFalse(
|
| + TestUtilities.DoesProcessExist("python.exe", existingGDB),
|
| + "Failed to kill existing GDB process");
|
| + Assert.IsFalse(
|
| + File.Exists(existingInitFileName),
|
| + "Failed to delete existing temp gdb init file");
|
| + }
|
| + finally
|
| + {
|
| + // Clean up file if not erased.
|
| + if (!string.IsNullOrEmpty(target.gdbInitFileName_) && File.Exists(target.gdbInitFileName_))
|
| + {
|
| + File.Delete(target.gdbInitFileName_);
|
| + }
|
| +
|
| + // Kill the gdb process if not killed.
|
| + if (target.gdbProcess_ != null && !target.gdbProcess_.HasExited)
|
| + {
|
| + target.gdbProcess_.Kill();
|
| + target.gdbProcess_.Dispose();
|
| + }
|
| + }
|
| + }
|
| +
|
| + /// <summary>
|
| + /// A test for IsPluginProcess.
|
| + /// </summary>
|
| + [TestMethod]
|
| + [DeploymentItem("NativeClientVSAddIn.dll")]
|
| + public void IsNaClPluginProcessTest()
|
| + {
|
| + PluginDebuggerGDB_Accessor target = new PluginDebuggerGDB_Accessor(dte_, properties_);
|
| +
|
| + ProcessInfo badProc = new ProcessInfo(
|
| + 1, 1, string.Empty, Strings.ChromeRendererFlag, Strings.NaClProcessName);
|
| + ProcessInfo goodProc = new ProcessInfo(
|
| + 1, 1, string.Empty, Strings.NaClLoaderFlag, Strings.NaClProcessName);
|
| +
|
| + string goodMainChromeFlags = Strings.NaClDebugFlag;
|
| + string badMainChromeFlags = string.Format(
|
| + Strings.PepperProcessPluginFlagFormat, target.pluginAssembly_);
|
| +
|
| + Assert.IsTrue(target.IsPluginProcess(goodProc, goodMainChromeFlags));
|
| + Assert.IsFalse(target.IsPluginProcess(goodProc, badMainChromeFlags));
|
| + Assert.IsFalse(target.IsPluginProcess(badProc, goodMainChromeFlags));
|
| + }
|
| + }
|
| +}
|
|
|