Tests - fixed failing tests

This commit is contained in:
dragonmacher 2019-05-03 13:15:05 -04:00
parent c004a11c6b
commit a4609c50f2
13 changed files with 166 additions and 367 deletions

View File

@ -146,16 +146,16 @@ public abstract class AbstractReferenceHover extends AbstractConfigurableHover {
return null;
}
panel.setProgram(program); // the program must be set in order for the goto to work
boolean validLocation = panel.goTo(previewLocation);
if (validLocation) {
panel.setProgram(program);
Rectangle bounds = panel.getBounds();
bounds.x = WINDOW_OFFSET;
bounds.y = WINDOW_OFFSET;
panel.setBounds(bounds);
return panel;
}
panel.setProgram(null);
// At this point we have a program location, but we could not go there. This can happen
// if the location is not in memory.

View File

@ -128,7 +128,7 @@ public abstract class AbstractMergeTest extends AbstractGhidraHeadedIntegrationT
protected void waitForMergeCompletion() {
int totalTime = 0;
while (!mergeMgr.processingCompleted()) {
while (mergeMgr != null && !mergeMgr.processingCompleted()) {
Window win = getWindowByTitleContaining(null, "Merge Information");
if (win != null) {

View File

@ -24,8 +24,6 @@ import java.util.concurrent.TimeUnit;
import javax.swing.*;
import org.junit.Assert;
import ghidra.app.merge.*;
import ghidra.program.model.data.DataType;
import ghidra.program.model.data.DataTypeManager;
@ -222,26 +220,7 @@ public abstract class AbstractDataTypeMergeTest extends AbstractMergeTest {
}
protected void waitForCompletion() throws Exception {
long total = 0;
while (mergeMgr != null && !mergeMgr.processingCompleted()) {
total += sleep(DEFAULT_WAIT_DELAY);
if (total >= MAX_MERGE_TIMEOUT) {
Assert.fail("Timed-out waiting for merge mangager to finish!");
}
}
if (window != null) {
while (window.isShowing()) {
total += sleep(DEFAULT_WAIT_DELAY);
if (total >= MAX_MERGE_TIMEOUT) {
Assert.fail("Timed-out waiting for merge window to close");
}
}
}
waitForSwing();
waitForMergeCompletion();
}
protected void checkConflictCount(int expectedCount) {

View File

@ -25,19 +25,14 @@ import ghidra.program.database.ProgramModifierListener;
import ghidra.program.model.data.*;
import ghidra.util.InvalidNameException;
import ghidra.util.exception.DuplicateNameException;
import ghidra.util.task.TaskMonitorAdapter;
import ghidra.util.task.TaskMonitor;
/**
* Test category merge conflicts.
*
*
*/
public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
public static final int MAX_WAIT = 5000;
@Test
public void testEditFuncSig() throws Exception {
public void testEditFuncSig() throws Exception {
// test is here to see what the FunctionDefinition looks like
mtf.initialize("notepad3", new ProgramModifierListener() {
@ -96,7 +91,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testCategoryDeleteMoveConflicts() throws Exception {
public void testCategoryDeleteMoveConflicts() throws Exception {
// move category in Latest program; delete same category in My Program
mtf.initialize("notepad", new ProgramModifierListener() {
@ -113,7 +108,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category destCat =
dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
try {
destCat.moveCategory(miscCat, TaskMonitorAdapter.DUMMY_MONITOR);
destCat.moveCategory(miscCat, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -135,7 +130,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
int transactionID = program.startTransaction("test");
Category root = dtm.getCategory(CategoryPath.ROOT);
try {
root.removeCategory("MISC", TaskMonitorAdapter.DUMMY_MONITOR);
root.removeCategory("MISC", TaskMonitor.DUMMY);
commit = true;
}
finally {
@ -159,7 +154,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testCategoryMoveRenameConflict() throws Exception {
public void testCategoryMoveRenameConflict() throws Exception {
//Latest: move Category1/Category2/Category3 to Root; rename
// /Category3 to "Other Category3"
@ -179,7 +174,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category root = dtm.getCategory(CategoryPath.ROOT);
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
try {
root.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
root.moveCategory(c, TaskMonitor.DUMMY);
c = root.getCategory(c.getName());
c.setName("Other Category3");
commit = true;
@ -208,7 +203,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
try {
c.setName("My Category3");
miscCat.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
miscCat.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -236,7 +231,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testCategoryMoveRename() throws Exception {
public void testCategoryMoveRename() throws Exception {
//Latest: move Category1/Category2/Category3 to Root
//My Program: rename Category1/Category2/Category3 to "My Category3",
@ -254,7 +249,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category root = dtm.getCategory(CategoryPath.ROOT);
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
try {
root.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
root.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -300,7 +295,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testCategoryMoveRename2() throws Exception {
public void testCategoryMoveRename2() throws Exception {
//Latest: move Category1/Category2/Category3 to Root
//My Program: rename Category1/Category2/Category3 to "My Category3",
@ -318,7 +313,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category root = dtm.getCategory(CategoryPath.ROOT);
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
try {
root.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
root.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -366,7 +361,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testCategoryMove() throws Exception {
public void testCategoryMove() throws Exception {
//Latest: move Category1/Category2/Category3 to Root
//My: move Category1/Category2/Category3 to /MISC
@ -384,7 +379,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category root = dtm.getCategory(CategoryPath.ROOT);
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
try {
root.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
root.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -406,7 +401,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
misc.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
misc.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -429,7 +424,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testCategoryMove2() throws Exception {
public void testCategoryMove2() throws Exception {
//Latest: move Category1/Category2/Category3 to Root
//My: move Category1/Category2/Category3 to /MISC
@ -447,7 +442,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category root = dtm.getCategory(CategoryPath.ROOT);
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
try {
root.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
root.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -469,7 +464,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
misc.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
misc.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -492,7 +487,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testCategoryMove3() throws Exception {
public void testCategoryMove3() throws Exception {
//Latest: move Category1/Category2/Category3 to Root
//My: move Category1/Category2/Category3 to /MISC
@ -510,7 +505,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category root = dtm.getCategory(CategoryPath.ROOT);
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
try {
root.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
root.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -532,7 +527,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
misc.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
misc.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -556,7 +551,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testMoveCategoriesAndDataTypes() throws Exception {
public void testMoveCategoriesAndDataTypes() throws Exception {
// Latest: move data type
// My: move same data type
@ -587,7 +582,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
newc.moveDataType(td, DataTypeConflictHandler.DEFAULT_HANDLER);
c1.moveDataType(dll, DataTypeConflictHandler.DEFAULT_HANDLER);
c3.moveCategory(misc, TaskMonitorAdapter.DUMMY_MONITOR);
c3.moveCategory(misc, TaskMonitor.DUMMY);
commit = true;
}
@ -625,7 +620,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
c3.moveDataType(td, DataTypeConflictHandler.DEFAULT_HANDLER);
c3.moveDataType(dll, DataTypeConflictHandler.DEFAULT_HANDLER);
foo.setName("MY_Foo");
c1.moveCategory(misc, TaskMonitorAdapter.DUMMY_MONITOR);
c1.moveCategory(misc, TaskMonitor.DUMMY);
commit = true;
}
@ -681,7 +676,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testMoveCategory() throws Exception {
public void testMoveCategory() throws Exception {
// move same category in Latest and My
@ -698,7 +693,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c = dtm.getCategory(new CategoryPath("/Category1/Category2/Category3"));
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
misc.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
misc.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -721,7 +716,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c5 = dtm.getCategory(new CategoryPath("/Category1/Category2/Category5"));
try {
c5.moveCategory(c, TaskMonitorAdapter.DUMMY_MONITOR);
c5.moveCategory(c, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -747,7 +742,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testMoveCategory2() throws Exception {
public void testMoveCategory2() throws Exception {
// Latest: move /Category1/Category2/Category5 to
// /Category5; move Category1 to /Category5
@ -769,8 +764,8 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c5 = dtm.getCategory(new CategoryPath("/Category1/Category2/Category5"));
Category root = dtm.getCategory(CategoryPath.ROOT);
try {
root.moveCategory(c5, TaskMonitorAdapter.DUMMY_MONITOR);
c5.moveCategory(c1, TaskMonitorAdapter.DUMMY_MONITOR);
root.moveCategory(c5, TaskMonitor.DUMMY);
c5.moveCategory(c1, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -800,7 +795,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
s.add(new FloatDataType());
newc.addDataType(s, DataTypeConflictHandler.DEFAULT_HANDLER);
root.moveCategory(c2, TaskMonitorAdapter.DUMMY_MONITOR);
root.moveCategory(c2, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -832,8 +827,8 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
c5 = dtm.getCategory(new CategoryPath("/Category5"));
DataType[] dts = c5.getDataTypes();
int count = 0;
for (int i = 0; i < dts.length; i++) {
if ((dts[i] instanceof Array) || dts[i] instanceof Pointer) {
for (DataType dt : dts) {
if ((dt instanceof Array) || dt instanceof Pointer) {
continue;
}
++count;
@ -844,7 +839,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testMoveCategory3() throws Exception {
public void testMoveCategory3() throws Exception {
// Latest: rename /Category1/Category2 to myCategory2;
// move data types in /Category1/myCategory2/Category4 to
@ -870,8 +865,8 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
c2.setName("myCategory2");
Category newc = c1.createCategory("Category2");
DataType[] dts = c4.getDataTypes();
for (int i = 0; i < dts.length; i++) {
newc.moveDataType(dts[i], DataTypeConflictHandler.DEFAULT_HANDLER);
for (DataType dt : dts) {
newc.moveDataType(dt, DataTypeConflictHandler.DEFAULT_HANDLER);
}
commit = true;
}
@ -902,8 +897,8 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
try {
DataType[] dts = c4.getDataTypes();
for (int i = 0; i < dts.length; i++) {
c2.moveDataType(dts[i], DataTypeConflictHandler.DEFAULT_HANDLER);
for (DataType dt : dts) {
c2.moveDataType(dt, DataTypeConflictHandler.DEFAULT_HANDLER);
}
commit = true;
@ -928,8 +923,8 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c2 = dtm.getCategory(new CategoryPath("/Category1/Category2"));
DataType[] dts = c2.getDataTypes();
int count = 0;
for (int i = 0; i < dts.length; i++) {
if ((dts[i] instanceof Array) || dts[i] instanceof Pointer) {
for (DataType dt : dts) {
if ((dt instanceof Array) || dt instanceof Pointer) {
continue;
}
++count;
@ -939,7 +934,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testMoveMultipleCategories() throws Exception {
public void testMoveMultipleCategories() throws Exception {
// move same category in Latest and My
@ -957,8 +952,8 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c5 = dtm.getCategory(new CategoryPath("/Category1/Category2/Category5"));
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
misc.moveCategory(c3, TaskMonitorAdapter.DUMMY_MONITOR);
c5.moveCategory(misc, TaskMonitorAdapter.DUMMY_MONITOR);
misc.moveCategory(c3, TaskMonitor.DUMMY);
c5.moveCategory(misc, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -983,8 +978,8 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
c4.moveCategory(c3, TaskMonitorAdapter.DUMMY_MONITOR);
c5.moveCategory(misc, TaskMonitorAdapter.DUMMY_MONITOR);
c4.moveCategory(c3, TaskMonitor.DUMMY);
c5.moveCategory(misc, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -1009,7 +1004,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testMoveMultipleCategories2() throws Exception {
public void testMoveMultipleCategories2() throws Exception {
// move same category in Latest and My
@ -1027,8 +1022,8 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c4 = dtm.getCategory(new CategoryPath("/Category1/Category2/Category4"));
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
misc.moveCategory(c3, TaskMonitorAdapter.DUMMY_MONITOR);
c4.moveCategory(misc, TaskMonitorAdapter.DUMMY_MONITOR);
misc.moveCategory(c3, TaskMonitor.DUMMY);
c4.moveCategory(misc, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -1053,8 +1048,8 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
c4.moveCategory(c3, TaskMonitorAdapter.DUMMY_MONITOR);
c5.moveCategory(misc, TaskMonitorAdapter.DUMMY_MONITOR);
c4.moveCategory(c3, TaskMonitor.DUMMY);
c5.moveCategory(misc, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -1081,7 +1076,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
}
@Test
public void testMoveCategories() throws Exception {
public void testMoveCategories() throws Exception {
//Latest: Move /Category1/Category2/Category5 to /MISC
// My: Move /MISC to /Category1/Category2/Category5
@ -1099,7 +1094,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category c5 = dtm.getCategory(new CategoryPath("/Category1/Category2/Category5"));
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
misc.moveCategory(c5, TaskMonitorAdapter.DUMMY_MONITOR);
misc.moveCategory(c5, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {
@ -1122,7 +1117,7 @@ public class CategoryMerge3Test extends AbstractDataTypeMergeTest {
Category misc = dtm.getCategory(new CategoryPath("/MISC"));
try {
c5.moveCategory(misc, TaskMonitorAdapter.DUMMY_MONITOR);
c5.moveCategory(misc, TaskMonitor.DUMMY);
commit = true;
}
catch (DuplicateNameException e) {

View File

@ -52,7 +52,6 @@ import ghidra.program.model.util.CodeUnitInsertionException;
import ghidra.program.util.*;
import ghidra.util.exception.*;
import ghidra.util.task.TaskMonitor;
import ghidra.util.task.TaskMonitorAdapter;
/**
* Test the merge of the versioned program's listing.
@ -79,7 +78,7 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
protected AddressFactory resultAddressFactory;
protected ListingMergeManager listingMergeMgr;
protected TaskMonitor monitor = TaskMonitorAdapter.DUMMY_MONITOR;
protected TaskMonitor monitor = TaskMonitor.DUMMY;
protected Instruction createInstruction(Program program, Address atAddress) {
@ -274,7 +273,7 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
AddressSetView diffs;
try {
diffs = diff.getDifferences(new ProgramDiffFilter(ProgramDiffFilter.CODE_UNIT_DIFFS),
TaskMonitorAdapter.DUMMY_MONITOR);
TaskMonitor.DUMMY);
assertTrue("Not same code units at " + diffs.toString(), diffs.isEmpty());
}
catch (CancelledException e) {
@ -286,9 +285,8 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
throws ProgramConflictException {
ProgramDiff diff = new ProgramDiff(p1, p2, addrs);
try {
AddressSetView diffs =
diff.getDifferences(new ProgramDiffFilter(ProgramDiffFilter.BYTE_DIFFS),
TaskMonitorAdapter.DUMMY_MONITOR);
AddressSetView diffs = diff.getDifferences(
new ProgramDiffFilter(ProgramDiffFilter.BYTE_DIFFS), TaskMonitor.DUMMY);
assertTrue("Not same bytes at " + diffs.toString(), diffs.isEmpty());
}
catch (CancelledException e) {
@ -416,7 +414,8 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
/**
* Starts the merge and sets "window" to the merge dialog.
* @decision the conflict decision
* @param decision the conflict decision
* @param waitForVisibleWindow true to wait
* @throws Exception if the sleep for the automatic merge was interrupted.
*/
protected void executeMerge(int decision, boolean waitForVisibleWindow) throws Exception {
@ -439,7 +438,7 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
Thread t = new Thread((Runnable) () -> {
try {
startLatch.countDown();
mergeMgr.merge(TaskMonitorAdapter.DUMMY_MONITOR);
mergeMgr.merge(TaskMonitor.DUMMY);
endLatch.countDown();
}
catch (CancelledException e1) {
@ -1161,7 +1160,7 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
/**
* Checks for the indicated bookmark in the Result program.
* @param addr indicates the address of the bookmark.
* @param address indicates the address of the bookmark.
* @param type the bookmark type.
* @param category the bookmark category.
* @param comment the expected comment.
@ -1609,8 +1608,8 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
}
protected void disassemble(Program pgm, AddressSetView addrSet) {
Disassembler disassembler = Disassembler.getDisassembler(pgm,
TaskMonitorAdapter.DUMMY_MONITOR, DisassemblerMessageListener.IGNORE);
Disassembler disassembler = Disassembler.getDisassembler(pgm, TaskMonitor.DUMMY,
DisassemblerMessageListener.IGNORE);
disassembler.disassemble(addrSet.getMinAddress(), addrSet, false);
}
@ -1618,13 +1617,13 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
// 0100194b FUN_0100194b body:100194b-1001977
// 01001978 FUN_01001978 body:1001978-1001ae2
// 01001ae3 FUN_01001ae3 body:1001ae3-100219b
// 01002950 FUN_01002950 body:1002950-100299d
// 0100299e FUN_0100299e body:100299e-1002a90
// 01002a91 FUN_01002a91 body:1002a91-1002b43
mtf.initialize("NotepadMergeListingTest", new ProgramModifierListener() {
/* (non-Javadoc)
* @see ghidra.framework.data.ProgramModifierListener#modifyLatest(ghidra.program.database.ProgramDB)
*/
@ -1636,18 +1635,18 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
AddressSet body1001979 =
new AddressSet(addr(program, "0x1001979"), addr(program, "0x100199a"));
createFunction(program, "0x1001979", "FUN_01001979", body1001979);
AddressSet body10029a1 =
new AddressSet(addr(program, "0x10029a1"), addr(program, "0x10029ca"));
createFunction(program, "0x10029a1", "FUN_010029a1", body10029a1);
commit = true;
}
finally {
program.endTransaction(txId, commit);
}
}
/* (non-Javadoc)
* @see ghidra.framework.data.ProgramModifierListener#modifyPrivate(ghidra.program.database.ProgramDB)
*/
@ -1659,11 +1658,11 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
AddressSet body1001984 =
new AddressSet(addr(program, "0x1001984"), addr(program, "0x100198a"));
createFunction(program, "0x1001984", "FUN_01001984", body1001984);
AddressSet body10029bc =
new AddressSet(addr(program, "0x10029bc"), addr(program, "0x10029d3"));
createFunction(program, "0x10029bc", "FUN_010029bc", body10029bc);
commit = true;
}
finally {
@ -1675,7 +1674,7 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
protected void setupRemoveConflictUseForAll() throws Exception {
mtf.initialize("NotepadMergeListingTest", new ProgramModifierListener() {
/* (non-Javadoc)
* @see ghidra.framework.data.ProgramModifierListener#modifyLatest(ghidra.program.database.ProgramDB)
*/
@ -1692,7 +1691,7 @@ public abstract class AbstractListingMergeManagerTest extends AbstractMergeTest
program.endTransaction(txId, commit);
}
}
/* (non-Javadoc)
* @see ghidra.framework.data.ProgramModifierListener#modifyPrivate(ghidra.program.database.ProgramDB)
*/

View File

@ -21,148 +21,19 @@ import java.awt.*;
import javax.swing.*;
import org.junit.*;
import org.junit.Assert;
import org.junit.Test;
import ghidra.app.merge.MergeConstants;
import ghidra.app.merge.ProgramMultiUserMergeManager;
import ghidra.app.merge.*;
import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.store.LockException;
import ghidra.program.database.*;
import ghidra.program.model.listing.Program;
import ghidra.program.model.listing.ProgramChangeSet;
import ghidra.program.model.mem.MemoryBlock;
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
import ghidra.util.exception.*;
/**
*
* To change the template for this generated type comment go to
* Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
*
*
*/
public class MemoryMergeManagerTest extends AbstractGhidraHeadedIntegrationTest {
public class MemoryMergeManagerTest extends AbstractMergeTest {
private MergeTestFacilitator mtf;
private Program origProgram;
private Program privateProgram;
private Program resultProgram;
private Program latestProgram;
private PluginTool mergeTool;
private ProgramMultiUserMergeManager mergeMgr;
@Before
public void setUp() throws Exception {
mtf = new MergeTestFacilitator();
}
@After
public void tearDown() throws Exception {
resultProgram.flushEvents();
waitForPostedSwingRunnables();
int count = 0;
while (!mergeMgr.processingCompleted() && count < 100) {
Thread.sleep(100);
++count;
}
if (mergeTool != null) {
SwingUtilities.invokeLater(() -> mergeTool.setVisible(false));
}
waitForPostedSwingRunnables();
mtf.dispose();
}
// public void testImageBaseConflict() throws Exception {
// mtf.initialize("notepad", new ProgramModifierListener() {
// /* (non-Javadoc)
// * @see ghidra.framework.data.ProgramModifierListener#modifyLatest(ghidra.program.database.ProgramDB)
// */
// public void modifyLatest(ProgramDB program) {
// boolean commit=false;
// MemoryBlock[] blocks = program.getMemory().getBlocks();
// int transactionID = program.startTransaction("test");
// Address baseAddr = program.getMinAddress().getNewAddress(0x03002000L);
// try {
// program.setImageBase(baseAddr, true);
// commit = true;
// } catch (AddressOverflowException e) {
// Assert.fail(e.toString());
// }finally {
// program.endTransaction(transactionID, commit);
// }
//
// }
// /* (non-Javadoc)
// * @see ghidra.framework.data.ProgramModifierListener#modifyPrivate(ghidra.program.database.ProgramDB)
// */
// public void modifyPrivate(ProgramDB program) {
// boolean commit=false;
// MemoryBlock[] blocks = program.getMemory().getBlocks();
// Address baseAddr = program.getMinAddress().getNewAddress(0x03006000L);
// int transactionID = program.startTransaction("test");
// try {
// program.setImageBase(baseAddr, true);
// } catch (AddressOverflowException e) {
// Assert.fail(e.toString());
// }finally {
// program.endTransaction(transactionID, true);
// }
// }
// });
// merge();
//
// // select my image base
// selectButtonAndApply(MergeConstants.MY_TITLE);
//
// Address baseAddr = resultProgram.getMinAddress().getNewAddress(0x03006000L);
// assertEquals(baseAddr, resultProgram.getImageBase());
// }
// public void testImageBaseConflict2() throws Exception {
// mtf.initialize("notepad", new ProgramModifierListener() {
// /* (non-Javadoc)
// * @see ghidra.framework.data.ProgramModifierListener#modifyLatest(ghidra.program.database.ProgramDB)
// */
// public void modifyLatest(ProgramDB program) {
// boolean commit=false;
// MemoryBlock[] blocks = program.getMemory().getBlocks();
// int transactionID = program.startTransaction("test");
// Address baseAddr = program.getMinAddress().getNewAddress(0x03002000L);
// try {
// program.setImageBase(baseAddr, true);
// commit = true;
// } catch (AddressOverflowException e) {
// Assert.fail(e.toString());
// }finally {
// program.endTransaction(transactionID, commit);
// }
//
// }
// /* (non-Javadoc)
// * @see ghidra.framework.data.ProgramModifierListener#modifyPrivate(ghidra.program.database.ProgramDB)
// */
// public void modifyPrivate(ProgramDB program) {
// boolean commit=false;
// MemoryBlock[] blocks = program.getMemory().getBlocks();
// Address baseAddr = program.getMinAddress().getNewAddress(0x03006000L);
// int transactionID = program.startTransaction("test");
// try {
// program.setImageBase(baseAddr, true);
// } catch (AddressOverflowException e) {
// Assert.fail(e.toString());
// }finally {
// program.endTransaction(transactionID, true);
// }
// }
// });
// merge();
//
// // select my image base
// selectButtonAndApply(MergeConstants.ORIGINAL_TITLE);
//
// Address baseAddr = resultProgram.getMinAddress().getNewAddress(0);
// assertEquals(baseAddr, resultProgram.getImageBase());
// }
//
@Test
public void testNameConflict() throws Exception {
mtf.initialize("notepad", new ProgramModifierListener() {
@ -881,18 +752,16 @@ public class MemoryMergeManagerTest extends AbstractGhidraHeadedIntegrationTest
});
}
////////////////////////////////////////////////////////////////
private void merge() throws Exception {
origProgram = mtf.getOriginalProgram();
privateProgram = mtf.getPrivateProgram();// my program
originalProgram = mtf.getOriginalProgram();
myProgram = mtf.getPrivateProgram();// my program
resultProgram = mtf.getResultProgram();// destination program
latestProgram = mtf.getLatestProgram();// latest version (results and latest start out the same);
ProgramChangeSet resultChangeSet = mtf.getResultChangeSet();
ProgramChangeSet myChangeSet = mtf.getPrivateChangeSet();
mergeMgr = new ProgramMultiUserMergeManager(resultProgram, privateProgram, origProgram,
mergeMgr = new ProgramMultiUserMergeManager(resultProgram, myProgram, originalProgram,
latestProgram, resultChangeSet, myChangeSet);
Thread t = new Thread(() -> {
try {
@ -907,25 +776,11 @@ public class MemoryMergeManagerTest extends AbstractGhidraHeadedIntegrationTest
}
private void waitForCompletion() throws Exception {
while (!mergeMgr.processingCompleted()) {
Thread.sleep(300);
}
waitForMergeCompletion();
}
private PluginTool getMergeTool() {
if (mergeTool == null) {
int sleepyTime = 50;
int total = 0;
while (mergeTool == null && total < 100) {
mergeTool = mergeMgr.getMergeTool();
sleep(sleepyTime);
}
}
if (mergeTool == null) {
throw new AssertException("Unable to find merge tool!");
}
waitForMergeTool();
return mergeTool;
}

View File

@ -21,52 +21,22 @@ import java.awt.*;
import javax.swing.*;
import org.junit.*;
import org.junit.Test;
import ghidra.app.merge.DummyMergeManager;
import ghidra.app.merge.ProgramMultiUserMergeManager;
import ghidra.app.merge.*;
import ghidra.framework.options.Options;
import ghidra.framework.plugintool.PluginTool;
import ghidra.program.database.*;
import ghidra.program.model.listing.Program;
import ghidra.program.database.ProgramDB;
import ghidra.program.database.ProgramModifierListener;
import ghidra.program.model.listing.ProgramChangeSet;
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
import ghidra.util.exception.AssertException;
import ghidra.util.exception.CancelledException;
import ghidra.util.task.TaskMonitorAdapter;
import ghidra.util.task.TaskMonitor;
/**
* Tests for the property list merge manager.
*
*
*/
public class PropertyListMergeManager1Test extends AbstractGhidraHeadedIntegrationTest {
public class PropertyListMergeManager1Test extends AbstractMergeTest {
private MergeTestFacilitator mtf;
private Program origProgram;
private Program privateProgram;
private Program resultProgram;
private Program latestProgram;
private PluginTool mergeTool;
private ProgramMultiUserMergeManager multiUserMergeManager;
/*
* @see TestCase#setUp()
*/
@Before
public void setUp() throws Exception {
mtf = new MergeTestFacilitator();
}
/*
* @see TestCase#tearDown()
*/
@After
public void tearDown() throws Exception {
mtf.dispose();
}
@Test
public void testAddNewProperty() throws Exception {
// test case #2: property list does not exist in latest version;
@ -582,34 +552,34 @@ public class PropertyListMergeManager1Test extends AbstractGhidraHeadedIntegrati
}
private void executeMerge(int option) {
origProgram = mtf.getOriginalProgram();
privateProgram = mtf.getPrivateProgram();// my program
originalProgram = mtf.getOriginalProgram();
myProgram = mtf.getPrivateProgram();// my program
resultProgram = mtf.getResultProgram();// destination program
latestProgram = mtf.getLatestProgram();// latest version (results and latest start out the same);
ProgramChangeSet resultChangeSet = mtf.getResultChangeSet();
ProgramChangeSet myChangeSet = mtf.getPrivateChangeSet();
ProgramMultiUserMergeManager dummyMergeManager = new DummyMergeManager(resultProgram,
privateProgram, origProgram, latestProgram, resultChangeSet, myChangeSet);
PropertyListMergeManager mergeMgr = new PropertyListMergeManager(dummyMergeManager,
resultProgram, privateProgram, origProgram, latestProgram);
myProgram, originalProgram, latestProgram, resultChangeSet, myChangeSet);
PropertyListMergeManager merger = new PropertyListMergeManager(dummyMergeManager,
resultProgram, myProgram, originalProgram, latestProgram);
if (option >= 0) {
mergeMgr.setConflictResolution(option);
merger.setConflictResolution(option);
}
mergeMgr.merge(TaskMonitorAdapter.DUMMY_MONITOR);
merger.merge(TaskMonitor.DUMMY);
}
private void merge() throws Exception {
origProgram = mtf.getOriginalProgram();
privateProgram = mtf.getPrivateProgram();// my program
originalProgram = mtf.getOriginalProgram();
myProgram = mtf.getPrivateProgram();// my program
resultProgram = mtf.getResultProgram();// destination program
latestProgram = mtf.getLatestProgram();// latest version (results and latest start out the same);
ProgramChangeSet resultChangeSet = mtf.getResultChangeSet();
ProgramChangeSet myChangeSet = mtf.getPrivateChangeSet();
multiUserMergeManager = new ProgramMultiUserMergeManager(resultProgram, privateProgram,
origProgram, latestProgram, resultChangeSet, myChangeSet);
multiUserMergeManager = new ProgramMultiUserMergeManager(resultProgram, myProgram,
originalProgram, latestProgram, resultChangeSet, myChangeSet);
Thread t = new Thread(() -> {
try {
multiUserMergeManager.merge();
@ -640,9 +610,7 @@ public class PropertyListMergeManager1Test extends AbstractGhidraHeadedIntegrati
}
private void waitForCompletion() throws Exception {
while (!multiUserMergeManager.processingCompleted()) {
Thread.sleep(300);
}
waitForMergeCompletion();
}
private void selectButtonAndUseForAllThenApply(String partialButtonText,

View File

@ -23,16 +23,14 @@ import java.util.Set;
import javax.swing.*;
import org.junit.*;
import org.junit.Test;
import generic.util.WindowUtilities;
import ghidra.app.merge.MergeConstants;
import ghidra.app.merge.ProgramMultiUserMergeManager;
import ghidra.app.merge.*;
import ghidra.framework.options.Options;
import ghidra.program.database.*;
import ghidra.program.model.listing.Program;
import ghidra.program.model.listing.ProgramChangeSet;
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
import ghidra.util.Msg;
import ghidra.util.exception.CancelledException;
@ -42,31 +40,11 @@ import ghidra.util.exception.CancelledException;
*
*/
public class PropertyListMergeManager2Test extends AbstractGhidraHeadedIntegrationTest {
public class PropertyListMergeManager2Test extends AbstractMergeTest {
// TODO this may need to be modified for parallel mode
private static final int MAX_MERGE_TIMEOUT = 10000;
private MergeTestFacilitator mtf;
private Program origProgram;
private Program privateProgram;
private Program resultProgram;
private Program latestProgram;
private Window window;
private ProgramMultiUserMergeManager mergeMgr;
private Date currentDate;
@Before
public void setUp() throws Exception {
mtf = new MergeTestFacilitator();
fixupGUI();
}
@After
public void tearDown() throws Exception {
mtf.dispose();
}
@Test
public void testTypeMismatchAskTheUserOpt1() throws Exception {
// test case 9: types do not match for the same property name
@ -843,15 +821,15 @@ public class PropertyListMergeManager2Test extends AbstractGhidraHeadedIntegrati
}
private void merge(boolean waitForConflict) throws Exception {
origProgram = mtf.getOriginalProgram();
privateProgram = mtf.getPrivateProgram();// my program
originalProgram = mtf.getOriginalProgram();
myProgram = mtf.getPrivateProgram();// my program
resultProgram = mtf.getResultProgram();// destination program
latestProgram = mtf.getLatestProgram();// latest version (results and latest start out the same);
ProgramChangeSet resultChangeSet = mtf.getResultChangeSet();
ProgramChangeSet myChangeSet = mtf.getPrivateChangeSet();
mergeMgr = new ProgramMultiUserMergeManager(resultProgram, privateProgram, origProgram,
mergeMgr = new ProgramMultiUserMergeManager(resultProgram, myProgram, originalProgram,
latestProgram, resultChangeSet, myChangeSet);
Thread t = new Thread(() -> {
try {
@ -902,26 +880,7 @@ public class PropertyListMergeManager2Test extends AbstractGhidraHeadedIntegrati
}
private void waitForCompletion() throws Exception {
long total = 0;
while (!mergeMgr.processingCompleted()) {
total += sleep(DEFAULT_WAIT_DELAY);
if (total >= MAX_MERGE_TIMEOUT) {
Assert.fail("Timed-out waiting for merge mangager to finish!");
}
}
if (window != null) {
while (window.isVisible()) {
total += sleep(DEFAULT_WAIT_DELAY);
if (total >= MAX_MERGE_TIMEOUT) {
Assert.fail("Timed-out waiting for merge window to close");
}
}
}
waitForSwing();
waitForMergeCompletion();
}
private void selectButtonAndApply(String text, boolean doWait) throws Exception {

View File

@ -684,7 +684,7 @@ public class InstructionSearchTest extends AbstractGhidraHeadedIntegrationTest {
assertEquals(0, dialog.getSearchData().getInstructions().size());
assertEquals(0, instructionTable.getRowCount());
Window errorDialog = waitForWindowByTitleContaining(null, "Input Error", 2000);
Window errorDialog = waitForWindowByTitleContaining("Input Error");
assertNotNull(errorDialog);
runSwing(() -> errorDialog.setVisible(false));
}
@ -708,7 +708,7 @@ public class InstructionSearchTest extends AbstractGhidraHeadedIntegrationTest {
waitForSwing();
dialog = waitForDialogComponent(tool.getToolFrame(), InstructionSearchDialog.class, 2000);
dialog = waitForDialogComponent(InstructionSearchDialog.class);
component = dialog.getComponent();
instructionTable = dialog.getTablePanel().getTable();
@ -744,7 +744,7 @@ public class InstructionSearchTest extends AbstractGhidraHeadedIntegrationTest {
waitForSwing();
dialog = waitForDialogComponent(tool.getToolFrame(), InstructionSearchDialog.class, 2000);
dialog = waitForDialogComponent(InstructionSearchDialog.class);
component = dialog.getComponent();
instructionTable = dialog.getTablePanel().getTable();
@ -778,19 +778,19 @@ public class InstructionSearchTest extends AbstractGhidraHeadedIntegrationTest {
private void loadBytes(String byteString) {
dialog.clear();
runSwing(() -> dialog.loadBytes(byteString));
runSwing(() -> {
dialog.clear();
dialog.loadBytes(byteString);
});
// the call above uses an invokeLater
waitForSwing();
}
private void assertResultsTableRowCount(int rowCount) {
// Wait for the results window...
Window window = waitForWindowByTitleContaining(null, "Addresses", 2000);
Window window = waitForWindowByTitleContaining("Addresses");
GhidraTable gTable = findComponent(window, GhidraTable.class, true);
// (the results dialog is shown using the TableService, which uses a ThreadedTableModel)

View File

@ -1344,6 +1344,11 @@ public class DockingWindowManager implements PropertyChangeListener, Placeholder
private void setFocusedComponent(ComponentPlaceholder placeholder) {
RootNode rootNode = root;
if (rootNode == null) {
return; // we have been disposed
}
if (focusedPlaceholder != null) {
if (focusedPlaceholder == placeholder) {
return; // ignore if we are already focused
@ -1362,8 +1367,9 @@ public class DockingWindowManager implements PropertyChangeListener, Placeholder
if (topLevelNode == null) {
return;
}
topLevelNode.setLastFocusedProviderInWindow(focusedPlaceholder);
root.notifyWindowFocusChanged(topLevelNode);
rootNode.notifyWindowFocusChanged(topLevelNode);
}
private ComponentPlaceholder findNextFocusedComponent() {

View File

@ -500,11 +500,13 @@ class RootNode extends WindowNode {
@Override
void dispose() {
dockingWindowListeners.clear();
if (child != null) {
child.dispose();
}
super.dispose();
if (rootDropTargetHandler != null) {
rootDropTargetHandler.dispose();
}

View File

@ -208,9 +208,12 @@ class StringDiffUtils {
start += l.text.length();
}
// strip off the trailing newline that we added above
if (result.isEmpty()) {
result.add(new Line("", 0));
}
Line last = result.peekLast();
last.markAsLast();
last.markAsLast(); // this will signal to remove the trailing newline for the last line
return result;
}

View File

@ -159,6 +159,39 @@ public class StringDiffTest {
assertEquals(v2, restoredV2);
}
@Test
public void testGetLineDiffs_Empty() {
String v1 = "";
String v2 = "";
StringDiff[] diffs = StringDiffUtils.getLineDiffs(v1, v2, 0);
String restoredV2 = StringDiffUtils.applyDiffs(v1, Arrays.asList(diffs));
assertEquals(v2, restoredV2);
}
@Test
public void testGetLineDiffs_EmptyInitial() {
String v1 = "";
String v2 = "This is not empty";
StringDiff[] diffs = StringDiffUtils.getLineDiffs(v1, v2, 0);
String restoredV2 = StringDiffUtils.applyDiffs(v1, Arrays.asList(diffs));
assertEquals(v2, restoredV2);
}
@Test
public void testGetLineDiffs_EmptyReplacement() {
String v1 = "This is not empty";
String v2 = "";
StringDiff[] diffs = StringDiffUtils.getLineDiffs(v1, v2, 0);
String restoredV2 = StringDiffUtils.applyDiffs(v1, Arrays.asList(diffs));
assertEquals(v2, restoredV2);
}
@Test
public void testReplace() {
String[] a1 = new String[] { "In", "the", "beginning" };