return false;\r
}\r
\r
- var exitCode = (MIConst)output["exit-code"];\r
-\r
- if (exitCode.CString == "0") {\r
- return true;\r
- }\r
-\r
- return false;\r
+ // we don't check exit code here, since Windows and Linux provide different exit code in case of "-gdb-exit" usage\r
+ return true;\r
};\r
\r
if (!MIDebugger.IsEventReceived(filter))\r
--- /dev/null
+<Project Sdk="Microsoft.NET.Sdk">\r
+\r
+ <ItemGroup>\r
+ <ProjectReference Include="..\NetcoreDbgTest\NetcoreDbgTest.csproj" />\r
+ </ItemGroup>\r
+\r
+ <PropertyGroup>\r
+ <OutputType>Exe</OutputType>\r
+ <TargetFramework>netcoreapp3.1</TargetFramework>\r
+ </PropertyGroup>\r
+\r
+</Project>\r
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Runtime.InteropServices;\r
+using System.Diagnostics;\r
+\r
+using NetcoreDbgTest;\r
+using NetcoreDbgTest.MI;\r
+using NetcoreDbgTest.Script;\r
+\r
+using Xunit;\r
+\r
+namespace NetcoreDbgTest.Script\r
+{\r
+ class Context\r
+ {\r
+ public static void Prepare()\r
+ {\r
+ Assert.Equal(MIResultClass.Done,\r
+ MIDebugger.Request("-file-exec-and-symbols "\r
+ + DebuggeeInfo.CorerunPath).Class);\r
+\r
+ Assert.Equal(MIResultClass.Done,\r
+ MIDebugger.Request("-exec-arguments "\r
+ + DebuggeeInfo.TargetAssemblyPath).Class);\r
+\r
+ Assert.Equal(MIResultClass.Running, MIDebugger.Request("-exec-run").Class);\r
+ }\r
+\r
+ static bool IsStoppedEvent(MIOutOfBandRecord record)\r
+ {\r
+ if (record.Type != MIOutOfBandRecordType.Async) {\r
+ return false;\r
+ }\r
+\r
+ var asyncRecord = (MIAsyncRecord)record;\r
+\r
+ if (asyncRecord.Class != MIAsyncRecordClass.Exec ||\r
+ asyncRecord.Output.Class != MIAsyncOutputClass.Stopped) {\r
+ return false;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+ public static void WasEntryPointHit()\r
+ {\r
+ Func<MIOutOfBandRecord, bool> filter = (record) => {\r
+ if (!IsStoppedEvent(record)) {\r
+ return false;\r
+ }\r
+\r
+ var output = ((MIAsyncRecord)record).Output;\r
+ var reason = (MIConst)output["reason"];\r
+\r
+ if (reason.CString != "entry-point-hit") {\r
+ return false;\r
+ }\r
+\r
+ var frame = (MITuple)(output["frame"]);\r
+ var func = (MIConst)(frame["func"]);\r
+ if (func.CString == DebuggeeInfo.TestName + ".Program.Main()") {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ };\r
+\r
+ if (!MIDebugger.IsEventReceived(filter))\r
+ throw new NetcoreDbgTestCore.ResultNotSuccessException();\r
+ }\r
+\r
+ public static void WasExit(int ExitCode)\r
+ {\r
+ Func<MIOutOfBandRecord, bool> filter = (record) => {\r
+ if (!IsStoppedEvent(record)) {\r
+ return false;\r
+ }\r
+\r
+ var output = ((MIAsyncRecord)record).Output;\r
+ var reason = (MIConst)output["reason"];\r
+\r
+ if (reason.CString != "exited") {\r
+ return false;\r
+ }\r
+\r
+ var exitCode = (MIConst)output["exit-code"];\r
+\r
+ if (exitCode.CString == ExitCode.ToString()) {\r
+ return true;\r
+ }\r
+\r
+ return false;\r
+ };\r
+\r
+ if (!MIDebugger.IsEventReceived(filter))\r
+ throw new NetcoreDbgTestCore.ResultNotSuccessException();\r
+ }\r
+\r
+ public static void DebuggerExit()\r
+ {\r
+ Assert.Equal(MIResultClass.Exit, Context.MIDebugger.Request("-gdb-exit").Class);\r
+ }\r
+\r
+ public static void Continue()\r
+ {\r
+ Assert.Equal(MIResultClass.Running, MIDebugger.Request("-exec-continue").Class);\r
+ }\r
+\r
+ static MIDebugger MIDebugger = new MIDebugger();\r
+ }\r
+}\r
+\r
+namespace MITestExitCode\r
+{\r
+ class Program\r
+ {\r
+ [DllImport("libc")]\r
+ static extern void exit(int status);\r
+\r
+ [DllImport("libc")]\r
+ static extern void _exit(int status);\r
+\r
+ [DllImport("libc")]\r
+ static extern int kill(int pid, int sig);\r
+\r
+ [DllImport("kernel32.dll")]\r
+ static extern void ExitProcess(uint uExitCode);\r
+\r
+ [DllImport("kernel32.dll", SetLastError=true)]\r
+ [return: MarshalAs(UnmanagedType.Bool)]\r
+ static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);\r
+\r
+ static int Main(string[] args)\r
+ {\r
+ // first checkpoint (initialization) must provide "init" as id\r
+ Label.Checkpoint("init", "finish", () => {\r
+ Context.Prepare();\r
+ Context.WasEntryPointHit();\r
+ Context.Continue();\r
+ });\r
+\r
+ // TODO as soon, as netcoredbg will be able restart debuggee process, implement all tests\r
+\r
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))\r
+ {\r
+ //Console.WriteLine("Test TerminateProcess()");\r
+ //ExitProcess(3);\r
+\r
+ Console.WriteLine("Test TerminateProcess()");\r
+ TerminateProcess(Process.GetCurrentProcess().Handle, 3);\r
+ }\r
+ else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))\r
+ {\r
+ //Console.WriteLine("Test exit()");\r
+ //exit(3);\r
+\r
+ Console.WriteLine("Test _exit()");\r
+ _exit(3);\r
+\r
+ //int PID = Process.GetCurrentProcess().Id;\r
+ //Console.WriteLine("Test SIGABRT, process Id = " + PID);\r
+ //kill(PID, 6); // SIGABRT\r
+ }\r
+\r
+ //Console.WriteLine("Test return 3");\r
+ //return 3;\r
+\r
+ //Console.WriteLine("Test throw new System.Exception()");\r
+ //throw new System.Exception();\r
+\r
+ Label.Checkpoint("finish", "", () => {\r
+ Context.WasExit(3);\r
+ Context.DebuggerExit();\r
+ });\r
+\r
+ return 0;\r
+ }\r
+ }\r
+}\r
return false;
}
- var exitCode = (MIConst)output["exit-code"];
-
- if (exitCode.CString == "0") {
- return true;
- }
-
- return false;
+ // we don't check exit code here, since Windows and Linux provide different exit code in case of "-gdb-exit" usage
+ return true;
};
if (!MIDebugger.IsEventReceived(filter))
if (VSCodeDebugger.isResponseContainProperty(resJSON, "event", "terminated")) {
wasTerminated = true;
}
- if (wasExited && exitCode == 0 && wasTerminated)
+ // we don't check exit code here, since Windows and Linux provide different exit code in case of "disconnectRequest" usage
+ if (wasExited && wasTerminated)
return true;
return false;
--- /dev/null
+using System;\r
+using System.IO;\r
+using System.Collections.Generic;\r
+using System.Runtime.InteropServices;\r
+using System.Diagnostics;\r
+\r
+using NetcoreDbgTest;\r
+using NetcoreDbgTest.VSCode;\r
+using NetcoreDbgTest.Script;\r
+\r
+using Xunit;\r
+using Newtonsoft.Json;\r
+\r
+namespace NetcoreDbgTest.Script\r
+{\r
+ // Context includes methods and constants which\r
+ // will be move to debugger API\r
+ class Context\r
+ {\r
+ public static void PrepareStart()\r
+ {\r
+ InitializeRequest initializeRequest = new InitializeRequest();\r
+ initializeRequest.arguments.clientID = "vscode";\r
+ initializeRequest.arguments.clientName = "Visual Studio Code";\r
+ initializeRequest.arguments.adapterID = "coreclr";\r
+ initializeRequest.arguments.pathFormat = "path";\r
+ initializeRequest.arguments.linesStartAt1 = true;\r
+ initializeRequest.arguments.columnsStartAt1 = true;\r
+ initializeRequest.arguments.supportsVariableType = true;\r
+ initializeRequest.arguments.supportsVariablePaging = true;\r
+ initializeRequest.arguments.supportsRunInTerminalRequest = true;\r
+ initializeRequest.arguments.locale = "en-us";\r
+ Assert.True(VSCodeDebugger.Request(initializeRequest).Success);\r
+\r
+ LaunchRequest launchRequest = new LaunchRequest();\r
+ launchRequest.arguments.name = ".NET Core Launch (console) with pipeline";\r
+ launchRequest.arguments.type = "coreclr";\r
+ launchRequest.arguments.preLaunchTask = "build";\r
+ launchRequest.arguments.program = DebuggeeInfo.TargetAssemblyPath;\r
+ launchRequest.arguments.cwd = "";\r
+ launchRequest.arguments.console = "internalConsole";\r
+ launchRequest.arguments.stopAtEntry = true;\r
+ launchRequest.arguments.internalConsoleOptions = "openOnSessionStart";\r
+ launchRequest.arguments.__sessionId = Guid.NewGuid().ToString();\r
+ Assert.True(VSCodeDebugger.Request(launchRequest).Success);\r
+ }\r
+\r
+ public static void PrepareEnd()\r
+ {\r
+ ConfigurationDoneRequest configurationDoneRequest = new ConfigurationDoneRequest();\r
+ Assert.True(VSCodeDebugger.Request(configurationDoneRequest).Success);\r
+ }\r
+\r
+ public static void WasEntryPointHit()\r
+ {\r
+ Func<string, bool> filter = (resJSON) => {\r
+ if (VSCodeDebugger.isResponseContainProperty(resJSON, "event", "stopped")\r
+ && VSCodeDebugger.isResponseContainProperty(resJSON, "reason", "entry")) {\r
+ threadId = Convert.ToInt32(VSCodeDebugger.GetResponsePropertyValue(resJSON, "threadId"));\r
+ return true;\r
+ }\r
+ return false;\r
+ };\r
+\r
+ if (!VSCodeDebugger.IsEventReceived(filter))\r
+ throw new NetcoreDbgTestCore.ResultNotSuccessException();\r
+ }\r
+\r
+ public static void WasExit(int ExitCode)\r
+ {\r
+ bool wasExited = false;\r
+ int ?exitCode = null;\r
+ bool wasTerminated = false;\r
+\r
+ Func<string, bool> filter = (resJSON) => {\r
+ if (VSCodeDebugger.isResponseContainProperty(resJSON, "event", "exited")) {\r
+ wasExited = true;\r
+ ExitedEvent exitedEvent = JsonConvert.DeserializeObject<ExitedEvent>(resJSON);\r
+ exitCode = exitedEvent.body.exitCode;\r
+ }\r
+ if (VSCodeDebugger.isResponseContainProperty(resJSON, "event", "terminated")) {\r
+ wasTerminated = true;\r
+ }\r
+ if (wasExited && exitCode == ExitCode && wasTerminated)\r
+ return true;\r
+\r
+ return false;\r
+ };\r
+\r
+ if (!VSCodeDebugger.IsEventReceived(filter))\r
+ throw new NetcoreDbgTestCore.ResultNotSuccessException();\r
+ }\r
+\r
+ public static void DebuggerExit()\r
+ {\r
+ DisconnectRequest disconnectRequest = new DisconnectRequest();\r
+ disconnectRequest.arguments = new DisconnectArguments();\r
+ disconnectRequest.arguments.restart = false;\r
+ Assert.True(VSCodeDebugger.Request(disconnectRequest).Success);\r
+ }\r
+\r
+ public static void Continue()\r
+ {\r
+ ContinueRequest continueRequest = new ContinueRequest();\r
+ continueRequest.arguments.threadId = threadId;\r
+ Assert.True(VSCodeDebugger.Request(continueRequest).Success);\r
+ }\r
+\r
+ static VSCodeDebugger VSCodeDebugger = new VSCodeDebugger();\r
+ static int threadId = -1;\r
+ }\r
+}\r
+\r
+namespace VSCodeTestExitCode\r
+{\r
+ class Program\r
+ {\r
+ [DllImport("libc")]\r
+ static extern void exit(int status);\r
+\r
+ [DllImport("libc")]\r
+ static extern void _exit(int status);\r
+\r
+ [DllImport("libc")]\r
+ static extern int kill(int pid, int sig);\r
+\r
+ [DllImport("kernel32.dll")]\r
+ static extern void ExitProcess(uint uExitCode);\r
+\r
+ [DllImport("kernel32.dll", SetLastError=true)]\r
+ [return: MarshalAs(UnmanagedType.Bool)]\r
+ static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);\r
+\r
+ static void Main(string[] args)\r
+ {\r
+ Label.Checkpoint("init", "finish", () => {\r
+ Context.PrepareStart();\r
+ Context.PrepareEnd();\r
+ Context.WasEntryPointHit();\r
+ Context.Continue();\r
+ });\r
+\r
+ // TODO as soon, as netcoredbg will be able restart debuggee process, implement all tests\r
+\r
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))\r
+ {\r
+ //Console.WriteLine("Test TerminateProcess()");\r
+ //ExitProcess(3);\r
+\r
+ Console.WriteLine("Test TerminateProcess()");\r
+ TerminateProcess(Process.GetCurrentProcess().Handle, 3);\r
+ }\r
+ else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))\r
+ {\r
+ //Console.WriteLine("Test exit()");\r
+ //exit(3);\r
+\r
+ Console.WriteLine("Test _exit()");\r
+ _exit(3);\r
+\r
+ //int PID = Process.GetCurrentProcess().Id;\r
+ //Console.WriteLine("Test SIGABRT, process Id = " + PID);\r
+ //kill(PID, 6); // SIGABRT\r
+ }\r
+\r
+ //Console.WriteLine("Test return 3");\r
+ //return 3;\r
+\r
+ //Console.WriteLine("Test throw new System.Exception()");\r
+ //throw new System.Exception();\r
+\r
+ Label.Checkpoint("finish", "", () => {\r
+ Context.WasExit(3);\r
+ Context.DebuggerExit();\r
+ });\r
+ }\r
+ }\r
+}\r
--- /dev/null
+<Project Sdk="Microsoft.NET.Sdk">\r
+\r
+ <ItemGroup>\r
+ <ProjectReference Include="..\NetcoreDbgTest\NetcoreDbgTest.csproj" />\r
+ </ItemGroup>\r
+\r
+ <PropertyGroup>\r
+ <OutputType>Exe</OutputType>\r
+ <TargetFramework>netcoreapp3.1</TargetFramework>\r
+ </PropertyGroup>\r
+\r
+</Project>\r
[InlineData("MITestHandshake", "Program.cs")]
[InlineData("MITestTarget", "Program.cs")]
[InlineData("MITestExceptionBreakpoint", "Program.cs")]
+ [InlineData("MITestExitCode", "Program.cs")]
[InlineData("VSCodeExampleTest", "Program.cs")]
[InlineData("VSCodeTestBreakpoint", "Program.cs")]
[InlineData("VSCodeTestFuncBreak", "Program.cs")]
[InlineData("VSCodeTestEvaluate", "Program.cs")]
[InlineData("VSCodeTestStepping", "Program.cs")]
[InlineData("VSCodeTestEnv", "Program.cs")]
+ [InlineData("VSCodeTestExitCode", "Program.cs")]
public void Run(string testCaseName, string testCourceList)
{
string testSuiteRoot = Path.GetFullPath(
"MITestHandshake"
"MITestTarget"
"MITestExceptionBreakpoint"
+ "MITestExitCode"
"VSCodeExampleTest"
"VSCodeTestBreakpoint"
"VSCodeTestFuncBreak"
"VSCodeTestEvaluate"
"VSCodeTestStepping"
"VSCodeTestEnv"
+ "VSCodeTestExitCode"
)
$TEST_NAMES = $args
"MITestHandshake"
"MITestTarget"
"MITestExceptionBreakpoint"
+ "MITestExitCode"
"VSCodeExampleTest"
"VSCodeTestBreakpoint"
"VSCodeTestFuncBreak"
"VSCodeTestEvaluate"
"VSCodeTestStepping"
"VSCodeTestEnv"
+ "VSCodeTestExitCode"
)
TEST_NAMES="$@"
"MITestExecInt"
"MITestHandshake"
"MITestExceptionBreakpoint"
+ "MITestExitCode"
"VSCodeExampleTest"
"VSCodeTestBreakpoint"
"VSCodeTestFuncBreak"
"VSCodeTestEvaluate"
"VSCodeTestStepping"
"VSCodeTestEnv"
+ "VSCodeTestExitCode"
)
$TEST_NAMES = $args
"MITestExecInt"
"MITestHandshake"
"MITestExceptionBreakpoint"
+ "MITestExitCode"
"VSCodeExampleTest"
"VSCodeTestBreakpoint"
"VSCodeTestFuncBreak"
"VSCodeTestEvaluate"
"VSCodeTestStepping"
"VSCodeTestEnv"
+ "VSCodeTestExitCode"
)
SDB=${SDB:-sdb}
-
+
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.26124.0
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSCodeTestEnv", "VSCodeTestEnv\VSCodeTestEnv.csproj", "{7555F581-C632-4490-A0E4-E4F1539E9209}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MITestExitCode", "MITestExitCode\MITestExitCode.csproj", "{9308CF34-12C5-4D5B-A318-00AD7AC1907A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSCodeTestExitCode", "VSCodeTestExitCode\VSCodeTestExitCode.csproj", "{045EE2A3-F595-4D40-8E1A-734CA9CEB10C}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
{7555F581-C632-4490-A0E4-E4F1539E9209}.Release|x64.Build.0 = Release|Any CPU
{7555F581-C632-4490-A0E4-E4F1539E9209}.Release|x86.ActiveCfg = Release|Any CPU
{7555F581-C632-4490-A0E4-E4F1539E9209}.Release|x86.Build.0 = Release|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|x64.Build.0 = Debug|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Debug|x86.Build.0 = Debug|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|x64.ActiveCfg = Release|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|x64.Build.0 = Release|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|x86.ActiveCfg = Release|Any CPU
+ {9308CF34-12C5-4D5B-A318-00AD7AC1907A}.Release|x86.Build.0 = Release|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|x64.Build.0 = Debug|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Debug|x86.Build.0 = Debug|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|x64.ActiveCfg = Release|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|x64.Build.0 = Release|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|x86.ActiveCfg = Release|Any CPU
+ {045EE2A3-F595-4D40-8E1A-734CA9CEB10C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal