mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-02-16 15:40:14 +00:00
Tests - fixed failing tests
This commit is contained in:
parent
c004a11c6b
commit
a4609c50f2
@ -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.
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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)
|
||||
*/
|
||||
|
@ -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>Preferences>Java>Code Generation>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;
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
|
@ -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() {
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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" };
|
||||
|
Loading…
Reference in New Issue
Block a user