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; return null;
} }
panel.setProgram(program); // the program must be set in order for the goto to work
boolean validLocation = panel.goTo(previewLocation); boolean validLocation = panel.goTo(previewLocation);
if (validLocation) { if (validLocation) {
panel.setProgram(program);
Rectangle bounds = panel.getBounds(); Rectangle bounds = panel.getBounds();
bounds.x = WINDOW_OFFSET; bounds.x = WINDOW_OFFSET;
bounds.y = WINDOW_OFFSET; bounds.y = WINDOW_OFFSET;
panel.setBounds(bounds); panel.setBounds(bounds);
return panel; return panel;
} }
panel.setProgram(null);
// At this point we have a program location, but we could not go there. This can happen // At this point we have a program location, but we could not go there. This can happen
// if the location is not in memory. // if the location is not in memory.

View file

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

View file

@ -24,8 +24,6 @@ import java.util.concurrent.TimeUnit;
import javax.swing.*; import javax.swing.*;
import org.junit.Assert;
import ghidra.app.merge.*; import ghidra.app.merge.*;
import ghidra.program.model.data.DataType; import ghidra.program.model.data.DataType;
import ghidra.program.model.data.DataTypeManager; import ghidra.program.model.data.DataTypeManager;
@ -222,26 +220,7 @@ public abstract class AbstractDataTypeMergeTest extends AbstractMergeTest {
} }
protected void waitForCompletion() throws Exception { protected void waitForCompletion() throws Exception {
waitForMergeCompletion();
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();
} }
protected void checkConflictCount(int expectedCount) { protected void checkConflictCount(int expectedCount) {

View file

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

View file

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

View file

@ -21,148 +21,19 @@ import java.awt.*;
import javax.swing.*; import javax.swing.*;
import org.junit.*; import org.junit.Assert;
import org.junit.Test;
import ghidra.app.merge.MergeConstants; import ghidra.app.merge.*;
import ghidra.app.merge.ProgramMultiUserMergeManager;
import ghidra.framework.plugintool.PluginTool; import ghidra.framework.plugintool.PluginTool;
import ghidra.framework.store.LockException; import ghidra.framework.store.LockException;
import ghidra.program.database.*; import ghidra.program.database.*;
import ghidra.program.model.listing.Program;
import ghidra.program.model.listing.ProgramChangeSet; import ghidra.program.model.listing.ProgramChangeSet;
import ghidra.program.model.mem.MemoryBlock; import ghidra.program.model.mem.MemoryBlock;
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
import ghidra.util.exception.*; import ghidra.util.exception.*;
/** public class MemoryMergeManagerTest extends AbstractMergeTest {
*
* 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 {
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 @Test
public void testNameConflict() throws Exception { public void testNameConflict() throws Exception {
mtf.initialize("notepad", new ProgramModifierListener() { mtf.initialize("notepad", new ProgramModifierListener() {
@ -881,18 +752,16 @@ public class MemoryMergeManagerTest extends AbstractGhidraHeadedIntegrationTest
}); });
} }
////////////////////////////////////////////////////////////////
private void merge() throws Exception { private void merge() throws Exception {
origProgram = mtf.getOriginalProgram(); originalProgram = mtf.getOriginalProgram();
privateProgram = mtf.getPrivateProgram();// my program myProgram = mtf.getPrivateProgram();// my program
resultProgram = mtf.getResultProgram();// destination program resultProgram = mtf.getResultProgram();// destination program
latestProgram = mtf.getLatestProgram();// latest version (results and latest start out the same); latestProgram = mtf.getLatestProgram();// latest version (results and latest start out the same);
ProgramChangeSet resultChangeSet = mtf.getResultChangeSet(); ProgramChangeSet resultChangeSet = mtf.getResultChangeSet();
ProgramChangeSet myChangeSet = mtf.getPrivateChangeSet(); ProgramChangeSet myChangeSet = mtf.getPrivateChangeSet();
mergeMgr = new ProgramMultiUserMergeManager(resultProgram, privateProgram, origProgram, mergeMgr = new ProgramMultiUserMergeManager(resultProgram, myProgram, originalProgram,
latestProgram, resultChangeSet, myChangeSet); latestProgram, resultChangeSet, myChangeSet);
Thread t = new Thread(() -> { Thread t = new Thread(() -> {
try { try {
@ -907,25 +776,11 @@ public class MemoryMergeManagerTest extends AbstractGhidraHeadedIntegrationTest
} }
private void waitForCompletion() throws Exception { private void waitForCompletion() throws Exception {
while (!mergeMgr.processingCompleted()) { waitForMergeCompletion();
Thread.sleep(300);
}
} }
private PluginTool getMergeTool() { private PluginTool getMergeTool() {
if (mergeTool == null) { waitForMergeTool();
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!");
}
return mergeTool; return mergeTool;
} }

View file

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

View file

@ -23,16 +23,14 @@ import java.util.Set;
import javax.swing.*; import javax.swing.*;
import org.junit.*; import org.junit.Test;
import generic.util.WindowUtilities; import generic.util.WindowUtilities;
import ghidra.app.merge.MergeConstants; import ghidra.app.merge.*;
import ghidra.app.merge.ProgramMultiUserMergeManager;
import ghidra.framework.options.Options; import ghidra.framework.options.Options;
import ghidra.program.database.*; import ghidra.program.database.*;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
import ghidra.program.model.listing.ProgramChangeSet; import ghidra.program.model.listing.ProgramChangeSet;
import ghidra.test.AbstractGhidraHeadedIntegrationTest;
import ghidra.util.Msg; import ghidra.util.Msg;
import ghidra.util.exception.CancelledException; 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 Window window;
private ProgramMultiUserMergeManager mergeMgr;
private Date currentDate; private Date currentDate;
@Before
public void setUp() throws Exception {
mtf = new MergeTestFacilitator();
fixupGUI();
}
@After
public void tearDown() throws Exception {
mtf.dispose();
}
@Test @Test
public void testTypeMismatchAskTheUserOpt1() throws Exception { public void testTypeMismatchAskTheUserOpt1() throws Exception {
// test case 9: types do not match for the same property name // 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 { private void merge(boolean waitForConflict) throws Exception {
origProgram = mtf.getOriginalProgram(); originalProgram = mtf.getOriginalProgram();
privateProgram = mtf.getPrivateProgram();// my program myProgram = mtf.getPrivateProgram();// my program
resultProgram = mtf.getResultProgram();// destination program resultProgram = mtf.getResultProgram();// destination program
latestProgram = mtf.getLatestProgram();// latest version (results and latest start out the same); latestProgram = mtf.getLatestProgram();// latest version (results and latest start out the same);
ProgramChangeSet resultChangeSet = mtf.getResultChangeSet(); ProgramChangeSet resultChangeSet = mtf.getResultChangeSet();
ProgramChangeSet myChangeSet = mtf.getPrivateChangeSet(); ProgramChangeSet myChangeSet = mtf.getPrivateChangeSet();
mergeMgr = new ProgramMultiUserMergeManager(resultProgram, privateProgram, origProgram, mergeMgr = new ProgramMultiUserMergeManager(resultProgram, myProgram, originalProgram,
latestProgram, resultChangeSet, myChangeSet); latestProgram, resultChangeSet, myChangeSet);
Thread t = new Thread(() -> { Thread t = new Thread(() -> {
try { try {
@ -902,26 +880,7 @@ public class PropertyListMergeManager2Test extends AbstractGhidraHeadedIntegrati
} }
private void waitForCompletion() throws Exception { private void waitForCompletion() throws Exception {
waitForMergeCompletion();
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();
} }
private void selectButtonAndApply(String text, boolean doWait) throws Exception { 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, dialog.getSearchData().getInstructions().size());
assertEquals(0, instructionTable.getRowCount()); assertEquals(0, instructionTable.getRowCount());
Window errorDialog = waitForWindowByTitleContaining(null, "Input Error", 2000); Window errorDialog = waitForWindowByTitleContaining("Input Error");
assertNotNull(errorDialog); assertNotNull(errorDialog);
runSwing(() -> errorDialog.setVisible(false)); runSwing(() -> errorDialog.setVisible(false));
} }
@ -708,7 +708,7 @@ public class InstructionSearchTest extends AbstractGhidraHeadedIntegrationTest {
waitForSwing(); waitForSwing();
dialog = waitForDialogComponent(tool.getToolFrame(), InstructionSearchDialog.class, 2000); dialog = waitForDialogComponent(InstructionSearchDialog.class);
component = dialog.getComponent(); component = dialog.getComponent();
instructionTable = dialog.getTablePanel().getTable(); instructionTable = dialog.getTablePanel().getTable();
@ -744,7 +744,7 @@ public class InstructionSearchTest extends AbstractGhidraHeadedIntegrationTest {
waitForSwing(); waitForSwing();
dialog = waitForDialogComponent(tool.getToolFrame(), InstructionSearchDialog.class, 2000); dialog = waitForDialogComponent(InstructionSearchDialog.class);
component = dialog.getComponent(); component = dialog.getComponent();
instructionTable = dialog.getTablePanel().getTable(); instructionTable = dialog.getTablePanel().getTable();
@ -778,19 +778,19 @@ public class InstructionSearchTest extends AbstractGhidraHeadedIntegrationTest {
private void loadBytes(String byteString) { private void loadBytes(String byteString) {
dialog.clear(); runSwing(() -> {
dialog.clear();
runSwing(() -> dialog.loadBytes(byteString)); dialog.loadBytes(byteString);
});
// the call above uses an invokeLater // the call above uses an invokeLater
waitForSwing(); waitForSwing();
} }
private void assertResultsTableRowCount(int rowCount) { private void assertResultsTableRowCount(int rowCount) {
// Wait for the results window... // Wait for the results window...
Window window = waitForWindowByTitleContaining(null, "Addresses", 2000); Window window = waitForWindowByTitleContaining("Addresses");
GhidraTable gTable = findComponent(window, GhidraTable.class, true); GhidraTable gTable = findComponent(window, GhidraTable.class, true);
// (the results dialog is shown using the TableService, which uses a ThreadedTableModel) // (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) { private void setFocusedComponent(ComponentPlaceholder placeholder) {
RootNode rootNode = root;
if (rootNode == null) {
return; // we have been disposed
}
if (focusedPlaceholder != null) { if (focusedPlaceholder != null) {
if (focusedPlaceholder == placeholder) { if (focusedPlaceholder == placeholder) {
return; // ignore if we are already focused return; // ignore if we are already focused
@ -1362,8 +1367,9 @@ public class DockingWindowManager implements PropertyChangeListener, Placeholder
if (topLevelNode == null) { if (topLevelNode == null) {
return; return;
} }
topLevelNode.setLastFocusedProviderInWindow(focusedPlaceholder); topLevelNode.setLastFocusedProviderInWindow(focusedPlaceholder);
root.notifyWindowFocusChanged(topLevelNode); rootNode.notifyWindowFocusChanged(topLevelNode);
} }
private ComponentPlaceholder findNextFocusedComponent() { private ComponentPlaceholder findNextFocusedComponent() {

View file

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

View file

@ -208,9 +208,12 @@ class StringDiffUtils {
start += l.text.length(); 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(); Line last = result.peekLast();
last.markAsLast(); last.markAsLast(); // this will signal to remove the trailing newline for the last line
return result; return result;
} }

View file

@ -159,6 +159,39 @@ public class StringDiffTest {
assertEquals(v2, restoredV2); 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 @Test
public void testReplace() { public void testReplace() {
String[] a1 = new String[] { "In", "the", "beginning" }; String[] a1 = new String[] { "In", "the", "beginning" };