GP-4634 Refactored Function Compare Service and added action to add

functions to the last comparison window.
This commit is contained in:
ghidragon 2024-06-04 15:33:20 -04:00
parent c19facf226
commit ddd2f22c28
45 changed files with 2086 additions and 3015 deletions

View file

@ -25,7 +25,7 @@ import javax.swing.table.TableColumnModel;
import org.junit.Test;
import docking.action.DockingActionIf;
import docking.widgets.dialogs.TableChooserDialog;
import docking.widgets.dialogs.TableSelectionDialog;
import docking.widgets.table.GFilterTable;
import docking.widgets.table.GTable;
import ghidra.app.cmd.disassemble.DisassembleCommand;
@ -94,12 +94,11 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
f2.setName("FunctionB", SourceType.USER_DEFINED);
destListing.setComment(addr(0x004118c0), CodeUnit.PLATE_COMMENT, null);
FunctionComparisonProviderManager providerMgr =
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
FunctionComparisonProvider functionComparisonProvider =
providerMgr.compareFunctions(f1, f2);
plugin.createComparison(f1, f2);
FunctionComparisonProvider provider =
waitForComponentProvider(FunctionComparisonProvider.class);
FunctionComparisonPanel functionComparisonPanel =
functionComparisonProvider.getComponent();
provider.getComponent();
runSwing(() -> {
functionComparisonPanel.setCurrentTabbedComponent("Listing View");
ListingCodeComparisonPanel dualListing =
@ -125,9 +124,7 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
FunctionComparisonProviderManager providerMgr =
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
providerMgr.compareFunctions(f1, f2);
plugin.createComparison(f1, f2);
captureActionIcon("Add Functions To Comparison");
}
@ -137,9 +134,7 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
FunctionComparisonProviderManager providerMgr =
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
providerMgr.compareFunctions(f1, f2);
plugin.createComparison(f1, f2);
captureActionIcon("Remove Functions");
}
@ -149,9 +144,7 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
FunctionComparisonProviderManager providerMgr =
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
providerMgr.compareFunctions(CollectionUtils.asSet(f1, f2));
plugin.createComparison(CollectionUtils.asSet(f1, f2));
captureActionIcon("Compare Next Function");
}
@ -161,13 +154,7 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
FunctionComparisonProviderManager providerMgr =
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
FunctionComparisonProvider functionComparisonProvider =
providerMgr.compareFunctions(CollectionUtils.asSet(f1, f2));
MultiFunctionComparisonPanel panel =
(MultiFunctionComparisonPanel) functionComparisonProvider.getComponent();
panel.getFocusedComponent().setSelectedIndex(1);
plugin.createComparison(CollectionUtils.asSet(f1, f2));
captureActionIcon("Compare Previous Function");
}
@ -177,21 +164,18 @@ public class FunctionComparisonScreenShots extends GhidraScreenShotGenerator {
Function f1 = getFunction(sourceProgram, addr(0x004118f0));
Function f2 = getFunction(destinationProgram, addr(0x004118c0));
FunctionComparisonProviderManager providerMgr =
getInstanceFieldByClassType(FunctionComparisonProviderManager.class, plugin);
providerMgr.compareFunctions(CollectionUtils.asSet(f1, f2));
plugin.createComparison(CollectionUtils.asSet(f1, f2));
waitForSwing();
DockingActionIf openTableAction = getAction(plugin, "Add Functions To Comparison");
DockingActionIf openTableAction = getAction(tool, "Add Functions To Comparison");
performAction(openTableAction, false);
TableChooserDialog<?> dialog =
waitForDialogComponent(TableChooserDialog.class);
TableSelectionDialog<?> dialog = waitForDialogComponent(TableSelectionDialog.class);
setColumnSizes(dialog);
captureDialog(dialog);
}
private void setColumnSizes(TableChooserDialog<?> dialog) {
private void setColumnSizes(TableSelectionDialog<?> dialog) {
// note: these values are rough values found by trial-and-error
GFilterTable<?> filter = (GFilterTable<?>) getInstanceField("gFilterTable", dialog);

View file

@ -15,18 +15,23 @@
*/
package ghidra.app.plugin.compare;
import static ghidra.util.datastruct.Duo.Side.*;
import static org.junit.Assert.*;
import java.util.List;
import java.util.Set;
import org.junit.*;
import ghidra.app.plugin.core.functioncompare.*;
import ghidra.app.plugin.core.functioncompare.FunctionComparisonPlugin;
import ghidra.app.plugin.core.functioncompare.FunctionComparisonProvider;
import ghidra.app.services.FunctionComparisonModel;
import ghidra.codecompare.decompile.CDisplay;
import ghidra.codecompare.decompile.DecompilerCodeComparisonPanel;
import ghidra.program.model.address.Address;
import ghidra.program.model.listing.*;
import ghidra.test.*;
import ghidra.util.datastruct.Duo.Side;
/**
* Tests for the {@link FunctionComparisonPlugin function comparison plugin}
@ -39,7 +44,6 @@ public class CompareFunctionsDecompilerViewTest extends AbstractGhidraHeadedInte
private Function fun1;
private Function fun2;
private FunctionComparisonPlugin plugin;
private FunctionComparisonProvider provider;
@Before
public void setUp() throws Exception {
@ -65,10 +69,13 @@ public class CompareFunctionsDecompilerViewTest extends AbstractGhidraHeadedInte
@Test
public void testDecompDifView() throws Exception {
Set<Function> functions = CompareFunctionsTestUtility.getFunctionsAsSet(fun1, fun2);
provider = compareFunctions(functions);
Set<Function> functions = Set.of(fun1, fun2);
compareFunctions(functions);
CompareFunctionsTestUtility.checkSourceFunctions(provider, fun1, fun2);
FunctionComparisonProvider provider =
waitForComponentProvider(FunctionComparisonProvider.class);
checkFunctions(provider, LEFT, fun1, fun1, fun2);
DecompilerCodeComparisonPanel panel =
(DecompilerCodeComparisonPanel) provider
.getCodeComparisonPanelByName(DecompilerCodeComparisonPanel.NAME);
@ -78,6 +85,18 @@ public class CompareFunctionsDecompilerViewTest extends AbstractGhidraHeadedInte
assertHasLines(panel.getRightPanel(), 23);
}
private void checkFunctions(FunctionComparisonProvider provider, Side side,
Function activeFunction, Function... functions) {
Set<Function> funcs = Set.of(functions);
FunctionComparisonModel model = provider.getModel();
assertEquals(activeFunction, model.getActiveFunction(side));
List<Function> fcs = model.getFunctions(side);
assertEquals(fcs.size(), funcs.size());
assertTrue(fcs.containsAll(funcs));
}
private void assertHasLines(CDisplay panel, int lineCount) {
assertEquals(lineCount, panel.getDecompilerPanel().getLines().size());
}
@ -88,11 +107,9 @@ public class CompareFunctionsDecompilerViewTest extends AbstractGhidraHeadedInte
waitForSwing();
}
private FunctionComparisonProvider compareFunctions(Set<Function> functions) {
provider = runSwing(() -> plugin.compareFunctions(functions));
provider.setVisible(true);
private void compareFunctions(Set<Function> functions) {
runSwing(() -> plugin.createComparison(functions));
waitForSwing();
return provider;
}
private Program buildTestProgram() throws Exception {