mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
Tests - fixed failing tests
This commit is contained in:
parent
c004a11c6b
commit
a4609c50f2
13 changed files with 166 additions and 367 deletions
|
@ -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.
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -25,13 +25,8 @@ 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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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>Preferences>Java>Code Generation>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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
||||||
|
runSwing(() -> {
|
||||||
dialog.clear();
|
dialog.clear();
|
||||||
|
dialog.loadBytes(byteString);
|
||||||
runSwing(() -> 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)
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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" };
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue