From 75677b729ff6a251d968f49c3bc70c2eafcd5f97 Mon Sep 17 00:00:00 2001 From: Dan <46821332+nsadeveloper789@users.noreply.github.com> Date: Fri, 4 Aug 2023 14:29:45 -0400 Subject: [PATCH] GP-2677: Fix and enable tests --- Ghidra/Debug/Debugger-agent-gdb/build.gradle | 2 - .../Debugger-agent-gdb/certification.manifest | 3 +- .../main/py/{ => src}/ghidragdb/__init__.py | 0 .../src/main/py/{ => src}/ghidragdb/arch.py | 0 .../main/py/{ => src}/ghidragdb/commands.py | 0 .../src/main/py/{ => src}/ghidragdb/hooks.py | 0 .../main/py/{ => src}/ghidragdb/methods.py | 0 .../main/py/{ => src}/ghidragdb/parameters.py | 0 .../main/py/{ => src}/ghidragdb/schema.xml | 0 .../src/main/py/{ => src}/ghidragdb/util.py | 0 Ghidra/Debug/Debugger-agent-lldb/build.gradle | 2 - .../certification.manifest | 2 +- .../main/py/{ => src}/ghidralldb/__init__.py | 0 .../src/main/py/{ => src}/ghidralldb/arch.py | 0 .../main/py/{ => src}/ghidralldb/commands.py | 0 .../src/main/py/{ => src}/ghidralldb/hooks.py | 0 .../main/py/{ => src}/ghidralldb/methods.py | 0 .../py/{ => src}/ghidralldb/parameters.py | 0 .../main/py/{ => src}/ghidralldb/schema.xml | 0 .../src/main/py/{ => src}/ghidralldb/util.py | 0 .../java/ghidra/dbg/testutil/DummyProc.java | 23 ++- Ghidra/Test/IntegrationTest/build.gradle | 11 +- .../gdb/rmi/AbstractGdbTraceRmiTest.java | 38 +++- .../java/agent/gdb/rmi/GdbCommandsTest.java | 183 +++++++----------- .../java/agent/gdb/rmi/GdbHooksTest.java | 1 - .../java/agent/gdb/rmi/GdbMethodsTest.java | 2 - .../lldb/rmi/AbstractLldbTraceRmiTest.java | 37 +++- .../java/agent/lldb/rmi/LldbCommandsTest.java | 142 +++++++------- .../java/agent/lldb/rmi/LldbHooksTest.java | 1 - .../java/agent/lldb/rmi/LldbMethodsTest.java | 2 - gradle/debugger/hasPythonPackage.gradle | 61 +----- 31 files changed, 236 insertions(+), 274 deletions(-) rename Ghidra/Debug/Debugger-agent-gdb/src/main/py/{ => src}/ghidragdb/__init__.py (100%) rename Ghidra/Debug/Debugger-agent-gdb/src/main/py/{ => src}/ghidragdb/arch.py (100%) rename Ghidra/Debug/Debugger-agent-gdb/src/main/py/{ => src}/ghidragdb/commands.py (100%) rename Ghidra/Debug/Debugger-agent-gdb/src/main/py/{ => src}/ghidragdb/hooks.py (100%) rename Ghidra/Debug/Debugger-agent-gdb/src/main/py/{ => src}/ghidragdb/methods.py (100%) rename Ghidra/Debug/Debugger-agent-gdb/src/main/py/{ => src}/ghidragdb/parameters.py (100%) rename Ghidra/Debug/Debugger-agent-gdb/src/main/py/{ => src}/ghidragdb/schema.xml (100%) rename Ghidra/Debug/Debugger-agent-gdb/src/main/py/{ => src}/ghidragdb/util.py (100%) rename Ghidra/Debug/Debugger-agent-lldb/src/main/py/{ => src}/ghidralldb/__init__.py (100%) rename Ghidra/Debug/Debugger-agent-lldb/src/main/py/{ => src}/ghidralldb/arch.py (100%) rename Ghidra/Debug/Debugger-agent-lldb/src/main/py/{ => src}/ghidralldb/commands.py (100%) rename Ghidra/Debug/Debugger-agent-lldb/src/main/py/{ => src}/ghidralldb/hooks.py (100%) rename Ghidra/Debug/Debugger-agent-lldb/src/main/py/{ => src}/ghidralldb/methods.py (100%) rename Ghidra/Debug/Debugger-agent-lldb/src/main/py/{ => src}/ghidralldb/parameters.py (100%) rename Ghidra/Debug/Debugger-agent-lldb/src/main/py/{ => src}/ghidralldb/schema.xml (100%) rename Ghidra/Debug/Debugger-agent-lldb/src/main/py/{ => src}/ghidralldb/util.py (100%) diff --git a/Ghidra/Debug/Debugger-agent-gdb/build.gradle b/Ghidra/Debug/Debugger-agent-gdb/build.gradle index cd6d0a542d..91a01307c2 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/build.gradle +++ b/Ghidra/Debug/Debugger-agent-gdb/build.gradle @@ -34,8 +34,6 @@ dependencies { testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts') testImplementation project(path: ':Framework-Debugging', configuration: 'testArtifacts') testImplementation project(path: ':Debugger-gadp', configuration: 'testArtifacts') - - pypkgInstall project(path: ':Debugger-rmi-trace', configuration: 'pypkgInstall') } tasks.nodepJar { diff --git a/Ghidra/Debug/Debugger-agent-gdb/certification.manifest b/Ghidra/Debug/Debugger-agent-gdb/certification.manifest index 2daab586ea..a81d11782d 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/certification.manifest +++ b/Ghidra/Debug/Debugger-agent-gdb/certification.manifest @@ -1,6 +1,5 @@ ##VERSION: 2.0 ##MODULE IP: JSch License -DEVNOTES.txt||GHIDRA||||END| Module.manifest||GHIDRA||||END| data/scripts/fallback_info_proc_mappings.gdb||GHIDRA||||END| data/scripts/fallback_maintenance_info_sections.gdb||GHIDRA||||END| @@ -8,6 +7,6 @@ data/scripts/getpid-linux-i386.gdb||GHIDRA||||END| data/scripts/wine32_info_proc_mappings.gdb||GHIDRA||||END| src/main/py/LICENSE||GHIDRA||||END| src/main/py/README.md||GHIDRA||||END| -src/main/py/ghidragdb/schema.xml||GHIDRA||||END| src/main/py/pyproject.toml||GHIDRA||||END| +src/main/py/src/ghidragdb/schema.xml||GHIDRA||||END| src/main/py/tests/EMPTY||GHIDRA||||END| diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/__init__.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/__init__.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/__init__.py rename to Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/__init__.py diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/arch.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/arch.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/arch.py rename to Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/arch.py diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/commands.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/commands.py rename to Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/hooks.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/hooks.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/hooks.py rename to Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/hooks.py diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/methods.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/methods.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/methods.py rename to Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/methods.py diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/parameters.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/parameters.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/parameters.py rename to Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/parameters.py diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/schema.xml b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/schema.xml similarity index 100% rename from Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/schema.xml rename to Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/schema.xml diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/util.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/util.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-gdb/src/main/py/ghidragdb/util.py rename to Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/util.py diff --git a/Ghidra/Debug/Debugger-agent-lldb/build.gradle b/Ghidra/Debug/Debugger-agent-lldb/build.gradle index 61e2cc10f4..3811c8d33d 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/build.gradle +++ b/Ghidra/Debug/Debugger-agent-lldb/build.gradle @@ -34,8 +34,6 @@ dependencies { testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts') testImplementation project(path: ':Framework-Debugging', configuration: 'testArtifacts') testImplementation project(path: ':Debugger-gadp', configuration: 'testArtifacts') - - pypkgInstall project(path: ':Debugger-rmi-trace', configuration: 'pypkgInstall') } tasks.nodepJar { diff --git a/Ghidra/Debug/Debugger-agent-lldb/certification.manifest b/Ghidra/Debug/Debugger-agent-lldb/certification.manifest index 9297aca74d..e68c49c255 100644 --- a/Ghidra/Debug/Debugger-agent-lldb/certification.manifest +++ b/Ghidra/Debug/Debugger-agent-lldb/certification.manifest @@ -9,5 +9,5 @@ src/llvm-project/lldb/bindings/java/java-typemaps.swig||Apache License 2.0 with src/llvm-project/lldb/bindings/java/java.swig||Apache License 2.0 with LLVM Exceptions||||END| src/main/py/LICENSE||GHIDRA||||END| src/main/py/README.md||GHIDRA||||END| -src/main/py/ghidralldb/schema.xml||GHIDRA||||END| src/main/py/pyproject.toml||GHIDRA||||END| +src/main/py/src/ghidralldb/schema.xml||GHIDRA||||END| diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/__init__.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/__init__.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/__init__.py rename to Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/__init__.py diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/arch.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/arch.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/arch.py rename to Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/arch.py diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/commands.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/commands.py rename to Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/hooks.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/hooks.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/hooks.py rename to Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/hooks.py diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/methods.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/methods.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/methods.py rename to Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/methods.py diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/parameters.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/parameters.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/parameters.py rename to Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/parameters.py diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/schema.xml b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/schema.xml similarity index 100% rename from Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/schema.xml rename to Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/schema.xml diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/util.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/util.py similarity index 100% rename from Ghidra/Debug/Debugger-agent-lldb/src/main/py/ghidralldb/util.py rename to Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/util.py diff --git a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DummyProc.java b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DummyProc.java index a91b73da92..aca4cb236a 100644 --- a/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DummyProc.java +++ b/Ghidra/Debug/Framework-Debugging/src/test/java/ghidra/dbg/testutil/DummyProc.java @@ -20,7 +20,9 @@ import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import generic.jar.ResourceFile; import ghidra.framework.Application; +import ghidra.framework.Platform; import ghidra.util.Msg; public class DummyProc implements AutoCloseable { @@ -28,15 +30,34 @@ public class DummyProc implements AutoCloseable { public final long pid; public static String which(String cmd) { + // Try the os// directory try { return Application.getOSFile(cmd).getAbsolutePath(); } catch (Exception e) { - // fallback to system + // just try next strategy } + + // Try the build/exe// and build/exe/// directory + for (ResourceFile modRoot : Application.getModuleRootDirectories()) { + ResourceFile exe = new ResourceFile(modRoot, "build/exe/" + cmd + "/" + cmd); + if (exe.exists() && exe.getFile(false).canExecute()) { + return exe.getAbsolutePath(); + } + ResourceFile platformExe = new ResourceFile(modRoot, + "build/exe/" + cmd + "/" + Platform.CURRENT_PLATFORM.getDirectoryName() + "/" + + cmd); + if (platformExe.exists() && platformExe.getFile(false).canExecute()) { + return platformExe.getAbsolutePath(); + } + } + + // Try the current directory if (new File(cmd).canExecute()) { return cmd; } + + // Try the system PATH String line; try { boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows"); diff --git a/Ghidra/Test/IntegrationTest/build.gradle b/Ghidra/Test/IntegrationTest/build.gradle index a2f60bf41f..2dfab73f13 100644 --- a/Ghidra/Test/IntegrationTest/build.gradle +++ b/Ghidra/Test/IntegrationTest/build.gradle @@ -78,9 +78,8 @@ ext.addExports([ 'java.desktop/sun.java2d=ALL-UNNAMED' ]) -// The CI system runs these tests as root and pip complains about using venv -// Disable them for now -/* integrationTest { - dependsOn { project(':Debugger-agent-gdb').installPyPackage } - dependsOn { project(':Debugger-agent-lldb').installPyPackage } -} */ +integrationTest { + dependsOn { project(':Debugger-rmi-trace').assemblePyPackage } + dependsOn { project(':Debugger-agent-gdb').assemblePyPackage } + dependsOn { project(':Debugger-agent-lldb').assemblePyPackage } +} diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/AbstractGdbTraceRmiTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/AbstractGdbTraceRmiTest.java index 20955bdf63..ea58ada9bf 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/AbstractGdbTraceRmiTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/AbstractGdbTraceRmiTest.java @@ -15,7 +15,7 @@ */ package agent.gdb.rmi; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.*; import java.io.*; @@ -31,7 +31,6 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.exception.ExceptionUtils; import org.junit.Before; -import org.junit.BeforeClass; import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest; import ghidra.app.plugin.core.debug.service.rmi.trace.*; @@ -39,7 +38,7 @@ import ghidra.app.plugin.core.debug.utils.ManagedDomainObject; import ghidra.app.services.TraceRmiService; import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState; import ghidra.dbg.testutil.DummyProc; -import ghidra.framework.TestApplicationUtils; +import ghidra.framework.*; import ghidra.framework.main.ApplicationLevelOnlyPlugin; import ghidra.framework.model.DomainFile; import ghidra.framework.plugintool.Plugin; @@ -54,6 +53,19 @@ import ghidra.util.Msg; import ghidra.util.NumericUtilities; public abstract class AbstractGdbTraceRmiTest extends AbstractGhidraHeadedDebuggerGUITest { + /** + * The tests are touchy about anything being printed on stderr, because that's usually where + * Python stack traces go that otherwise are ignored. Unfortunately, GDB also emits some + * warnings there, and these are more common in containers where permissions and resources are + * more restricted. Thus, we add some commands here to disable the features that commonly cause + * these warnings: Leave ASLR alone, and don't try to display source code. + */ + public static final String PREAMBLE = """ + set python print-stack full + python import ghidragdb + set disable-randomization off + set source open off + """; // Connecting should be the first thing the script does, so use a tight timeout. protected static final int CONNECT_TIMEOUT_MS = 3000; protected static final int TIMEOUT_SECONDS = 300; @@ -84,13 +96,24 @@ public abstract class AbstractGdbTraceRmiTest extends AbstractGhidraHeadedDebugg // @BeforeClass public static void setupPython() throws Throwable { - new ProcessBuilder("gradle", "Debugger-agent-gdb:installPyPackage") + new ProcessBuilder("gradle", "Debugger-agent-gdb:assemblePyPackage") .directory(TestApplicationUtils.getInstallationDirectory()) .inheritIO() .start() .waitFor(); } + protected void setPythonPath(ProcessBuilder pb) throws IOException { + String sep = + OperatingSystem.CURRENT_OPERATING_SYSTEM == OperatingSystem.WINDOWS ? ";" : ":"; + String rmiPyPkg = Application.getModuleSubDirectory("Debugger-rmi-trace", + "build/pypkg/src").getAbsolutePath(); + String gdbPyPkg = Application.getModuleSubDirectory("Debugger-agent-gdb", + "build/pypkg/src").getAbsolutePath(); + String add = rmiPyPkg + sep + gdbPyPkg; + pb.environment().compute("PYTHONPATH", (k, v) -> v == null ? add : (v + sep + add)); + } + protected Path getGdbPath() { return Paths.get(DummyProc.which("gdb")); } @@ -147,6 +170,8 @@ public abstract class AbstractGdbTraceRmiTest extends AbstractGhidraHeadedDebugg @SuppressWarnings("resource") // Do not close stdin protected ExecInGdb execInGdb(String script) throws IOException { ProcessBuilder pb = new ProcessBuilder(gdbPath.toString()); + setPythonPath(pb); + // If commands come from file, GDB will quit after EOF. Msg.info(this, "outFile: " + outFile); Msg.info(this, "errFile: " + errFile); @@ -283,10 +308,9 @@ public abstract class AbstractGdbTraceRmiTest extends AbstractGhidraHeadedDebugg protected GdbAndHandler startAndConnectGdb() throws Exception { return startAndConnectGdb(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); } @SuppressWarnings("resource") diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbCommandsTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbCommandsTest.java index 15507d2f0c..f70bdfa074 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbCommandsTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbCommandsTest.java @@ -25,7 +25,6 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.junit.Ignore; import org.junit.Test; import db.Transaction; @@ -51,7 +50,6 @@ import ghidra.trace.model.target.*; import ghidra.trace.model.time.TraceSnapshot; import ghidra.util.Msg; -@Ignore("Cannot install python packages in CI") public class GdbCommandsTest extends AbstractGdbTraceRmiTest { //@Test @@ -69,11 +67,10 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { public void testConnectErrorNoArg() throws Exception { try { runThrowError(""" - set python print-stack full - python import ghidragdb + %s ghidra trace connect quit - """); + """.formatted(PREAMBLE)); fail(); } catch (GdbError e) { @@ -85,35 +82,32 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testConnect() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); } @Test public void testDisconnect() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s ghidra trace disconnect quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); } @Test public void testStartTraceDefaults() throws Exception { // Default name and lcsp runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash ghidra trace start quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals("x86:LE:64:default", @@ -126,12 +120,11 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testStartTraceDefaultNoFile() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s ghidra trace start quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) { assertThat(mdo.get(), instanceOf(Trace.class)); } @@ -140,15 +133,14 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testStartTraceCustomize() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash set ghidra-language Toy:BE:64:default set ghidra-compiler default ghidra trace start myToy quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); DomainFile dfMyToy = env.getProject().getProjectData().getFile("/New Traces/myToy"); assertNotNull(dfMyToy); try (ManagedDomainObject mdo = new ManagedDomainObject(dfMyToy, false, false, monitor)) { @@ -164,14 +156,13 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { public void testStopTrace() throws Exception { // TODO: This test assumes gdb and the target file bash are x86-64 runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash ghidra trace start ghidra trace stop quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); DomainFile dfBash = env.getProject().getProjectData().getFile("/New Traces/gdb/bash"); assertNotNull(dfBash); // TODO: Given the 'quit' command, I'm not sure this assertion is checking anything. @@ -184,10 +175,8 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { String out = runThrowError(addr -> { refAddr.set(addr); return """ - set python print-stack full + %s file bash - echo \\n - python import ghidragdb echo \\n---Import---\\n ghidra trace info ghidra trace connect %s @@ -203,7 +192,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n---Disconnect---\\n ghidra trace info quit - """.formatted(addr); + """.formatted(PREAMBLE, addr); }); assertEquals(""" @@ -230,8 +219,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { public void testLcsp() throws Exception { // TODO: This test assumes x86-64 on test system String out = runThrowError(""" - set python print-stack full - python import ghidragdb + %s echo \\n---Import---\\n ghidra trace lcsp echo \\n---\\n @@ -245,7 +233,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n---Compiler---\\n ghidra trace lcsp quit - """); + """.formatted(PREAMBLE)); assertEquals(""" Selected Ghidra language: DATA:LE:64:default Selected Ghidra compiler: pointer64""", @@ -270,8 +258,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { // For sanity check, verify failing to save drops data runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash ghidra trace start no-save @@ -279,15 +266,14 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace new-snap "Scripted snapshot" ghidra trace tx-commit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/no-save")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals(0, tb.trace.getTimeManager().getAllSnapshots().size()); } runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash ghidra trace start save @@ -296,7 +282,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit ghidra trace save quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/save")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals(1, tb.trace.getTimeManager().getAllSnapshots().size()); @@ -306,8 +292,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testSnapshot() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash ghidra trace start @@ -315,7 +300,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace new-snap "Scripted snapshot" ghidra trace tx-commit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceSnapshot snapshot = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()); @@ -327,8 +312,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutmem() throws Exception { String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -342,7 +326,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n--- kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey(); @@ -358,8 +342,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutmemInferior2() throws Exception { String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s add-inferior inferior 2 @@ -375,7 +358,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n--- kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); AddressSpace ram2 = tb.trace.getBaseAddressFactory().getAddressSpace("ram2"); @@ -393,8 +376,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutmemState() throws Exception { String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -408,7 +390,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n--- kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey(); @@ -426,8 +408,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testDelmem() throws Exception { String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -442,7 +423,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n--- kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey(); @@ -462,8 +443,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { .mapToObj(Integer::toString) .collect(Collectors.joining(",", "{", "}")); runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -476,7 +456,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr, count)); + """.formatted(PREAMBLE, addr, count)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey(); @@ -505,8 +485,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { .mapToObj(Integer::toString) .collect(Collectors.joining(",", "{", "}")); runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -520,7 +499,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr, count)); + """.formatted(PREAMBLE, addr, count)); // The spaces will be left over, but the values should be zeroed try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); @@ -545,8 +524,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testCreateObj() throws Exception { String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s ghidra trace start ghidra trace tx-start "Create Object" @@ -555,7 +533,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n--- ghidra trace tx-commit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -570,8 +548,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testInsertObj() throws Exception { String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s ghidra trace start ghidra trace tx-start "Create Object" @@ -581,7 +558,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n--- ghidra trace tx-commit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -597,8 +574,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testRemoveObj() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s ghidra trace start ghidra trace tx-start "Create Object" @@ -608,7 +584,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace remove-obj Test.Objects[1] ghidra trace tx-commit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -624,8 +600,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { throws Exception { String expPrint = DummyProc.which("expPrint"); runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file %s start @@ -638,7 +613,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr, expPrint, extra, gdbExpr, gtype)); + """.formatted(PREAMBLE, addr, expPrint, extra, gdbExpr, gtype)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/expPrint")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -781,8 +756,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testRetainValues() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash set language c++ @@ -799,7 +773,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -818,8 +792,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testGetObj() throws Exception { String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s ghidra trace start ghidra trace tx-start "Create Object" @@ -831,7 +804,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace get-obj Test.Objects[1] echo \\n--- quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -846,8 +819,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { public void testGetValues() throws Exception { String expPrint = DummyProc.which("expPrint"); String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file %s set language c++ @@ -878,7 +850,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n--- kill quit - """.formatted(addr, expPrint)); + """.formatted(PREAMBLE, addr, expPrint)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/expPrint")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals(""" @@ -905,8 +877,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testGetValuesRng() throws Exception { String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash set language c++ @@ -922,7 +893,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { echo \\n--- kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals(""" @@ -935,8 +906,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testActivateObject() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash set language c++ @@ -949,7 +919,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace activate Test.Objects[1] kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { assertSame(mdo.get(), traceManager.getCurrentTrace()); assertEquals("Test.Objects[1]", @@ -960,8 +930,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testDisassemble() throws Exception { String out = runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash set language c++ @@ -975,7 +944,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Not concerned about specifics, so long as disassembly occurs @@ -991,8 +960,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutInferiors() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s add-inferior ghidra trace start @@ -1000,7 +968,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace put-inferiors ghidra trace tx-commit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1015,8 +983,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutAvailable() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s add-inferior ghidra trace start @@ -1024,7 +991,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace put-available ghidra trace tx-commit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1039,8 +1006,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutBreakpoints() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -1055,7 +1021,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); List infBreakLocVals = tb.trace.getObjectManager() @@ -1090,8 +1056,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutEnvironment() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -1101,7 +1066,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Assumes GDB on Linux amd64 @@ -1116,8 +1081,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutRegions() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -1127,7 +1091,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1140,8 +1104,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutModules() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -1151,7 +1114,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1165,8 +1128,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutThreads() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -1176,7 +1138,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1187,8 +1149,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { @Test public void testPutFrames() throws Exception { runThrowError(addr -> """ - set python print-stack full - python import ghidragdb + %s ghidra trace connect %s file bash start @@ -1200,7 +1161,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest { ghidra trace tx-commit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbHooksTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbHooksTest.java index af9d0251ca..8927533dfc 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbHooksTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbHooksTest.java @@ -37,7 +37,6 @@ import ghidra.trace.model.memory.TraceMemorySpace; import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.time.TraceSnapshot; -@Ignore("Cannot install python packages in CI") public class GdbHooksTest extends AbstractGdbTraceRmiTest { private static final long RUN_TIMEOUT_MS = 20000; private static final long RETRY_MS = 500; diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbMethodsTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbMethodsTest.java index aec12771b0..aca5980085 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbMethodsTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/gdb/rmi/GdbMethodsTest.java @@ -22,7 +22,6 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.junit.Ignore; import org.junit.Test; import db.Transaction; @@ -49,7 +48,6 @@ import ghidra.trace.model.modules.TraceModule; import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.target.TraceObjectValue; -@Ignore("Cannot install python packages in CI") public class GdbMethodsTest extends AbstractGdbTraceRmiTest { @Test diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/AbstractLldbTraceRmiTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/AbstractLldbTraceRmiTest.java index 811c5137d4..863213531e 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/AbstractLldbTraceRmiTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/AbstractLldbTraceRmiTest.java @@ -36,7 +36,7 @@ import ghidra.app.plugin.core.debug.service.rmi.trace.*; import ghidra.app.plugin.core.debug.utils.ManagedDomainObject; import ghidra.app.services.TraceRmiService; import ghidra.dbg.testutil.DummyProc; -import ghidra.framework.TestApplicationUtils; +import ghidra.framework.*; import ghidra.framework.main.ApplicationLevelOnlyPlugin; import ghidra.framework.model.DomainFile; import ghidra.framework.plugintool.Plugin; @@ -53,6 +53,14 @@ import ghidra.util.Msg; import ghidra.util.NumericUtilities; public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebuggerGUITest { + /** + * Some features have to be disabled to avoid permissions issues in the test container. Namely, + * don't try to disable ASLR. + */ + public static final String PREAMBLE = """ + script import ghidralldb + settings set target.disable-aslr false + """; // Connecting should be the first thing the script does, so use a tight timeout. protected static final int CONNECT_TIMEOUT_MS = 3000; protected static final int TIMEOUT_SECONDS = 300; @@ -87,18 +95,34 @@ public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebug // @BeforeClass public static void setupPython() throws Throwable { - new ProcessBuilder("gradle", "Debugger-agent-lldb:installPyPackage") + new ProcessBuilder("gradle", "Debugger-agent-lldb:assemblePyPackage") .directory(TestApplicationUtils.getInstallationDirectory()) .inheritIO() .start() .waitFor(); } + protected void setPythonPath(ProcessBuilder pb) throws IOException { + String sep = + OperatingSystem.CURRENT_OPERATING_SYSTEM == OperatingSystem.WINDOWS ? ";" : ":"; + String rmiPyPkg = Application.getModuleSubDirectory("Debugger-rmi-trace", + "build/pypkg/src").getAbsolutePath(); + String gdbPyPkg = Application.getModuleSubDirectory("Debugger-agent-lldb", + "build/pypkg/src").getAbsolutePath(); + String add = rmiPyPkg + sep + gdbPyPkg; + pb.environment().compute("PYTHONPATH", (k, v) -> v == null ? add : (v + sep + add)); + } + @Before public void setupTraceRmi() throws Throwable { traceRmi = addPlugin(tool, TraceRmiPlugin.class); - lldbPath = Paths.get(DummyProc.which("lldb")); + try { + lldbPath = Paths.get(DummyProc.which("lldb-16")); + } + catch (RuntimeException e) { + lldbPath = Paths.get(DummyProc.which("lldb")); + } outFile = Files.createTempFile("lldbout", null); errFile = Files.createTempFile("lldberr", null); } @@ -146,6 +170,8 @@ public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebug @SuppressWarnings("resource") // Do not close stdin protected ExecInLldb execInLldb(String script) throws IOException { ProcessBuilder pb = new ProcessBuilder(lldbPath.toString()); + setPythonPath(pb); + // If commands come from file, LLDB will quit after EOF. Msg.info(this, "outFile: " + outFile); Msg.info(this, "errFile: " + errFile); @@ -257,9 +283,9 @@ public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebug protected LldbAndHandler startAndConnectLldb() throws Exception { return startAndConnectLldb(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); } @SuppressWarnings("resource") @@ -397,6 +423,7 @@ public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebug } protected record Tabular(List headings, List rows) { + static final Pattern SPACES = Pattern.compile(" *"); static final Pattern WORDS = Pattern.compile("\\w+"); diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbCommandsTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbCommandsTest.java index d05617579e..fe63e4cec6 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbCommandsTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbCommandsTest.java @@ -26,7 +26,6 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; -import org.junit.Ignore; import org.junit.Test; import generic.Unique; @@ -47,7 +46,6 @@ import ghidra.trace.model.target.*; import ghidra.trace.model.time.TraceSnapshot; import ghidra.util.Msg; -@Ignore("Cannot install python packages in CI") public class LldbCommandsTest extends AbstractLldbTraceRmiTest { //@Test @@ -80,32 +78,32 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testConnect() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); } @Test public void testDisconnect() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s ghidra_trace_disconnect quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); } @Test public void testStartTraceDefaults() throws Exception { // Default name and lcsp runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash ghidra_trace_start quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals("x86:LE:64:default", @@ -118,11 +116,11 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testStartTraceDefaultNoFile() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s ghidra_trace_start quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) { assertThat(mdo.get(), instanceOf(Trace.class)); } @@ -132,7 +130,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { public void testStartTraceCustomize() throws Exception { runThrowError( addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash script ghidralldb.util.set_convenience_variable('ghidra-language','Toy:BE:64:default') @@ -140,7 +138,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_start myToy quit """ - .formatted(addr)); + .formatted(PREAMBLE, addr)); DomainFile dfMyToy = env.getProject().getProjectData().getFile("/New Traces/myToy"); assertNotNull(dfMyToy); try (ManagedDomainObject mdo = new ManagedDomainObject(dfMyToy, false, false, monitor)) { @@ -156,13 +154,13 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { public void testStopTrace() throws Exception { // TODO: This test assumes lldb and the target file bash are x86-64 runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash ghidra_trace_start ghidra_trace_stop quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); DomainFile dfBash = env.getProject().getProjectData().getFile("/New Traces/lldb/bash"); assertNotNull(dfBash); // TODO: Given the 'quit' command, I'm not sure this assertion is checking anything. @@ -176,7 +174,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { refAddr.set(addr); return """ file bash - script import ghidralldb + %s _mark_ ---Import--- ghidra_trace_info ghidra_trace_connect %s @@ -192,7 +190,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { _mark_ ---Disconnect--- ghidra_trace_info quit - """.formatted(addr); + """.formatted(PREAMBLE, addr); }); assertEquals(""" @@ -260,7 +258,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { // For sanity check, verify failing to save drops data runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash ghidra_trace_start no-save @@ -268,14 +266,14 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_new_snap "Scripted snapshot" ghidra_trace_txcommit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/no-save")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals(0, tb.trace.getTimeManager().getAllSnapshots().size()); } runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash ghidra_trace_start save @@ -284,7 +282,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit ghidra_trace_save quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/save")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals(1, tb.trace.getTimeManager().getAllSnapshots().size()); @@ -294,7 +292,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testSnapshot() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash ghidra_trace_start @@ -302,7 +300,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_new_snap "Scripted snapshot" ghidra_trace_txcommit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceSnapshot snapshot = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()); @@ -314,7 +312,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutmem() throws Exception { String out = runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -328,7 +326,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { _mark_ ---") kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey(); @@ -345,7 +343,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutmemProcess2() throws Exception { String out = runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -359,7 +357,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { _mark_ ---") kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); AddressSpace ram2 = tb.trace.getBaseAddressFactory().getAddressSpace("ram"); @@ -378,7 +376,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { public void testPutmemState() throws Exception { String out = runThrowError(addr -> """ settings set interpreter.echo-commands false - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -392,7 +390,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { _mark_ ---") kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey(); @@ -414,7 +412,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testDelmem() throws Exception { String out = runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -429,7 +427,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { _mark_ ---") kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey(); @@ -449,7 +447,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { .mapToObj(Integer::toString) .collect(Collectors.joining(",", "{", "}")); runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -463,7 +461,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr, count)); + """.formatted(PREAMBLE, addr, count)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey(); @@ -501,7 +499,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { .mapToObj(Integer::toString) .collect(Collectors.joining(",", "{", "}")); runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -515,7 +513,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr, count)); + """.formatted(PREAMBLE, addr, count)); // The spaces will be left over, but the values should be zeroed try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); @@ -549,7 +547,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testCreateObj() throws Exception { String out = runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s ghidra_trace_start ghidra_trace_txstart "Create Object" @@ -558,7 +556,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { _mark_ ---") ghidra_trace_txcommit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -573,7 +571,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testInsertObj() throws Exception { String out = runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s ghidra_trace_start ghidra_trace_txstart "Create Object" @@ -583,7 +581,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { _mark_ ---") ghidra_trace_txcommit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -599,7 +597,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testRemoveObj() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -612,7 +610,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -627,7 +625,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { protected T runTestSetValue(String extra, String lldbExpr, String gtype) throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -640,7 +638,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr, extra, lldbExpr, gtype)); + """.formatted(PREAMBLE, addr, extra, lldbExpr, gtype)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -782,7 +780,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testRetainValues() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash #set language c++ @@ -799,7 +797,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -818,7 +816,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testGetObj() throws Exception { String out = runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s ghidra_trace_start ghidra_trace_txstart "Create Object" @@ -830,7 +828,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_get_obj Test.Objects[1] _mark_ ---") quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); TraceObject object = tb.trace.getObjectManager() @@ -844,7 +842,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testGetValues() throws Exception { String out = runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -880,7 +878,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { _mark_ ---") kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals( @@ -910,7 +908,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testGetValuesRng() throws Exception { String out = runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash #set language c++ @@ -926,7 +924,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { _mark_ ---") kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); assertEquals(""" @@ -947,7 +945,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { //@Test public void testActivateObject() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash #set language c++ @@ -960,7 +958,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_activate Test.Objects[1] kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { assertSame(mdo.get(), traceManager.getCurrentTrace()); assertEquals("Test.Objects[1]", @@ -971,7 +969,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testDisassemble() throws Exception { String out = runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash #set language c++ @@ -985,7 +983,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Not concerned about specifics, so long as disassembly occurs @@ -1001,14 +999,14 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutProcesses() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s ghidra_trace_start ghidra_trace_txstart "Tx" ghidra_trace_put_processes ghidra_trace_txcommit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1023,14 +1021,14 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutAvailable() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s ghidra_trace_start ghidra_trace_txstart "Tx" ghidra_trace_put_available ghidra_trace_txcommit quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1045,7 +1043,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutBreakpoints() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -1057,7 +1055,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); List procBreakLocVals = tb.trace.getObjectManager() @@ -1082,7 +1080,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutWatchpoints() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -1095,7 +1093,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); List procWatchLocVals = tb.trace.getObjectManager() @@ -1126,7 +1124,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutEnvironment() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -1136,7 +1134,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Assumes LLDB on Linux amd64 @@ -1152,7 +1150,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutRegions() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -1162,7 +1160,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1175,7 +1173,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutModules() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -1185,7 +1183,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1199,7 +1197,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testPutThreads() throws Exception { runThrowError(addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s file bash process launch --stop-at-entry @@ -1209,7 +1207,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { ghidra_trace_txcommit kill quit - """.formatted(addr)); + """.formatted(PREAMBLE, addr)); try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) { tb = new ToyDBTraceBuilder((Trace) mdo.get()); // Would be nice to control / validate the specifics @@ -1252,9 +1250,9 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest { @Test public void testMinimal() throws Exception { Function scriptSupplier = addr -> """ - script import ghidralldb + %s ghidra_trace_connect %s - """.formatted(addr); + """.formatted(PREAMBLE, addr); try (LldbAndHandler conn = startAndConnectLldb(scriptSupplier)) { conn.execute("script print('FINISHED')"); conn.execute("quit"); diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbHooksTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbHooksTest.java index 87f7d6e643..858791f244 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbHooksTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbHooksTest.java @@ -38,7 +38,6 @@ import ghidra.trace.model.memory.TraceMemorySpace; import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.time.TraceSnapshot; -@Ignore("Cannot install python packages in CI") public class LldbHooksTest extends AbstractLldbTraceRmiTest { private static final long RUN_TIMEOUT_MS = 20000; private static final long RETRY_MS = 500; diff --git a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbMethodsTest.java b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbMethodsTest.java index fe51498c3c..d7daca0ec3 100644 --- a/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbMethodsTest.java +++ b/Ghidra/Test/IntegrationTest/src/test.slow/java/agent/lldb/rmi/LldbMethodsTest.java @@ -21,7 +21,6 @@ import static org.junit.Assert.*; import java.util.*; -import org.junit.Ignore; import org.junit.Test; import generic.Unique; @@ -43,7 +42,6 @@ import ghidra.trace.model.modules.TraceModule; import ghidra.trace.model.target.TraceObject; import ghidra.trace.model.target.TraceObjectValue; -@Ignore("Cannot install python packages in CI") public class LldbMethodsTest extends AbstractLldbTraceRmiTest { @Test diff --git a/gradle/debugger/hasPythonPackage.gradle b/gradle/debugger/hasPythonPackage.gradle index 95a0426348..456fbc8870 100644 --- a/gradle/debugger/hasPythonPackage.gradle +++ b/gradle/debugger/hasPythonPackage.gradle @@ -13,74 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -configurations { - pypkgInstall -} task assemblePyPackage(type: Copy) { from "src/main/py" into "build/pypkg/" } -def getGdbPython() { - def out = new ByteArrayOutputStream() - exec { - commandLine "gdb", "--batch" - args "-ex", "python import sys" - args "-ex", "python print(f'python{sys.version_info.major}.{sys.version_info.minor}')" - standardOutput = out - } - return "$out".strip() -} - -def getLldbPython() { - def out = new ByteArrayOutputStream() - exec { - commandLine "lldb", "--batch" - args "-ex", "python import sys" - args "-ex", "python print(f'python{sys.version_info.major}.{sys.version_info.minor}')" - standardOutput = out - } - return "$out".strip() -} - -task configureBuildPyPackage { - doLast { - def gdbPython = getGdbPython() - buildPyPackage.commandLine gdbPython, "-m", "build" - } -} - task buildPyPackage(type: Exec) { - dependsOn(configureBuildPyPackage) ext.dist = { file("build/pypkg/dist") } inputs.files(assemblePyPackage) outputs.dir(dist) + workingDir { "build/pypkg" } -} - -task configureInstallPyPackage { - dependsOn(configurations.pypkgInstall) - doLast { - def gdbPython = getGdbPython() - installPyPackage.commandLine gdbPython, "-m", "pip", "install", "--force-reinstall" - installPyPackage.args configurations.pypkgInstall.filter { f -> !f.name.endsWith(".jar") } - installPyPackage.args file("build/pypkg") - } -} - -task installPyPackage(type: Exec) { - dependsOn(configureInstallPyPackage) - inputs.files(assemblePyPackage) -} - -task phonyJarPyPackage(type: Jar) { - dependsOn(assemblePyPackage) -} - -afterEvaluate { - artifacts { - pypkgInstall file("build/pypkg") - pypkgInstall phonyJarPyPackage - } + commandLine "python", "-m", "build" }