Test timinig fixes

This commit is contained in:
dragonmacher 2022-03-17 14:40:12 -04:00
parent cf95afc23d
commit 900513ba93
9 changed files with 111 additions and 95 deletions

View File

@ -177,7 +177,9 @@ public class ClearTest extends AbstractGhidraHeadedIntegrationTest {
public void testClearActionEnablement() throws Exception {
closeProgram();
assertTrue(!clearAction.isEnabledForContext(new ActionContext()));
assertFalse(isEnabled(clearAction, cb.getProvider()));
assertFalse(clearAction.isEnabledForContext(new ActionContext()));
showTool(tool);
loadProgram("notepad");
@ -185,10 +187,10 @@ public class ClearTest extends AbstractGhidraHeadedIntegrationTest {
waitForSwing();
assertTrue(cb.goToField(addr("0x10026f0"), "Address", 0, 0));
assertTrue(clearAction.isEnabled());
assertTrue(isEnabled(clearAction, cb.getProvider()));
closeProgram();
assertTrue(!clearAction.isEnabledForContext(new ActionContext()));
assertFalse(isEnabled(clearAction, cb.getProvider()));
}
@Test
@ -201,7 +203,6 @@ public class ClearTest extends AbstractGhidraHeadedIntegrationTest {
doClearAction(true);
assertEquals(numInstructions, program.getListing().getNumInstructions());
}
@Test
@ -284,7 +285,7 @@ public class ClearTest extends AbstractGhidraHeadedIntegrationTest {
}
/*
* This tests that a selection that includes the outermost header of does not change the
* This tests that a selection that includes the outermost header of does not change the
* selection, but instead removes the structure from the listing at that address.
*/
@Test
@ -453,7 +454,7 @@ public class ClearTest extends AbstractGhidraHeadedIntegrationTest {
Symbol[] symbols = program.getSymbolTable().getSymbols(addr("0x01001010"));
assertEquals(1, symbols.length);
assertTrue(!symbols[0].isDynamic());
assertFalse(symbols[0].isDynamic());
int id = program.startTransaction("Anchor");
symbols[0].setPinned(true);
program.endTransaction(id, true);
@ -467,7 +468,7 @@ public class ClearTest extends AbstractGhidraHeadedIntegrationTest {
symbols = program.getSymbolTable().getSymbols(addr("0x01001010"));
assertEquals(1, symbols.length);
assertTrue(!symbols[0].isDynamic());
assertFalse(symbols[0].isDynamic());
}
@Test
@ -639,7 +640,7 @@ public class ClearTest extends AbstractGhidraHeadedIntegrationTest {
assertTrue(l.getNumInstructions() > 0);
assertTrue(l.getNumDefinedData() > 0);
assertTrue(!program.getListing().getFunctions(true).hasNext());
assertFalse(program.getListing().getFunctions(true).hasNext());
assertTrue(program.getSymbolTable().getNumSymbols() > 0);
undo(program);
@ -674,7 +675,7 @@ public class ClearTest extends AbstractGhidraHeadedIntegrationTest {
okOnClearDialog();
assertTrue(!context.hasValueOverRange(ax, BigInteger.valueOf(5),
assertFalse(context.hasValueOverRange(ax, BigInteger.valueOf(5),
new AddressSet(addr("0x10022cc"))));
undo(program);
assertTrue(context.hasValueOverRange(ax, BigInteger.valueOf(5),

View File

@ -94,8 +94,6 @@ public class QualifiedSelectionPluginTest extends AbstractGhidraHeadedIntegratio
}
private void showProgramTree() {
ProgramTreePlugin ptree = env.getPlugin(ProgramTreePlugin.class);
programTreeProvider = (ComponentProvider) getInstanceField("viewProvider", pt);
tool.showComponentProvider(programTreeProvider, true);
}
@ -219,7 +217,7 @@ public class QualifiedSelectionPluginTest extends AbstractGhidraHeadedIntegratio
@Test
public void testSelectWithView() throws Exception {
AddressSet rsrcSet = new AddressSet(addr("0100a000"), addr("0100f3ff"));
JTree tree = findComponent(tool.getToolFrame(), JTree.class);
JTree tree = waitFor(() -> findComponent(tool.getToolFrame(), JTree.class));
// Replace view with .rsrc
selectTreeNodeByText(tree, ".rsrc", true);
@ -396,9 +394,6 @@ public class QualifiedSelectionPluginTest extends AbstractGhidraHeadedIntegratio
}, wait);
}
/**
* @param instructionSet
*/
private void checkForInstructions(ProgramSelection instructionSet) {
Listing listing = program.getListing();
AddressIterator iter = instructionSet.getAddresses(true);
@ -409,9 +404,6 @@ public class QualifiedSelectionPluginTest extends AbstractGhidraHeadedIntegratio
}
}
/**
* @param dataSet
*/
private void checkForDefinedData(ProgramSelection dataSet) {
Listing listing = program.getListing();
AddressIterator iter = dataSet.getAddresses(true);
@ -422,9 +414,6 @@ public class QualifiedSelectionPluginTest extends AbstractGhidraHeadedIntegratio
}
}
/**
* @param undefinedSet
*/
private void checkForUndefined(ProgramSelection undefinedSet) {
Listing listing = program.getListing();
AddressIterator iter = undefinedSet.getAddresses(true);

View File

@ -97,7 +97,8 @@ public class TableChooserDialogTest extends AbstractGhidraHeadedIntegrationTest
Program program = builder.getProgram();
Navigatable navigatable = null;
dialog = new TableChooserDialog(tool, executor, program, "Dialog Title", navigatable);
runSwing(() -> dialog =
new TableChooserDialog(tool, executor, program, "Dialog Title", navigatable));
testAction = new TestAction();
dialog.addAction(testAction);

View File

@ -43,7 +43,6 @@ public class CloseToolTest extends AbstractGhidraHeadedIntegrationTest {
@Before
public void setUp() throws Exception {
env = new TestEnv();
}
@ -62,7 +61,6 @@ public class CloseToolTest extends AbstractGhidraHeadedIntegrationTest {
assertNotNull(tool.getToolFrame());
closeTool(tool);
assertNull("Tool did not close after task", tool.getToolFrame());
}
@Test
@ -87,7 +85,7 @@ public class CloseToolTest extends AbstractGhidraHeadedIntegrationTest {
assertNotNull(closeOthersAction);
ProgramActionContext context = new ProgramActionContext(null, program1);
assertEquals(true, closeOthersAction.isEnabledForContext(context));
performAction(closeOthersAction, true);
performAction(closeOthersAction, context, true);
allOpenPrograms = pm.getAllOpenPrograms();
assertEquals(1, allOpenPrograms.length);
@ -185,8 +183,8 @@ public class CloseToolTest extends AbstractGhidraHeadedIntegrationTest {
}
//==================================================================================================
// Inner Classes
//==================================================================================================
// Inner Classes
//==================================================================================================
private class ControllableBackgroundCommand extends BackgroundCommand {

View File

@ -60,10 +60,11 @@ public class DefaultGraphDisplayProvider implements GraphDisplayProvider {
return visibleGraph;
}
DefaultGraphDisplay display =
Swing.runNow(() -> new DefaultGraphDisplay(this, displayCounter++));
displays.add(display);
return display;
return Swing.runNow(() -> {
DefaultGraphDisplay display = new DefaultGraphDisplay(this, displayCounter++);
displays.add(display);
return display;
});
}
@Override
@ -76,10 +77,11 @@ public class DefaultGraphDisplayProvider implements GraphDisplayProvider {
@Override
public List<GraphDisplay> getAllGraphDisplays() {
return displays.stream()
.filter(d -> d.getComponent().isShowing())
.sorted((d1, d2) -> -(d1.getId() - d2.getId())) // largest/newest IDs come first
.collect(Collectors.toList());
return Swing.runNow(() -> {
return displays.stream()
.sorted((d1, d2) -> -(d1.getId() - d2.getId())) // largest/newest IDs come first
.collect(Collectors.toList());
});
}
@Override

View File

@ -38,8 +38,7 @@ import org.apache.commons.lang3.StringUtils;
import org.junit.*;
import docking.*;
import docking.action.DockingActionIf;
import docking.action.ToggleDockingActionIf;
import docking.action.*;
import docking.actions.DockingToolActions;
import docking.dnd.GClipboard;
import docking.framework.DockingApplicationConfiguration;
@ -105,7 +104,7 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
// timing issues.
// Note: this doesn't quite work as intended. This should be run before each other
// tearDown() method, but junit offers no way to do that. If you can figure
// tearDown() method, but junit offers no way to do that. If you can figure
// out how to make that work, then update this code.
ConcurrentTestExceptionHandler.disable();
}
@ -322,7 +321,7 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
}
/**
* Check for and display message component text associated with OptionDialog windows
* Check for and display message component text associated with OptionDialog windows
* @param w any window
* @return the message string if one can be found; <code>null</code> otherwise
*/
@ -756,7 +755,7 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
/**
* Allows you to find a component provider <b>with the given title</b>. Most plugins will
* only ever have a single provider. In those cases, use
* only ever have a single provider. In those cases, use
* {@link #waitForComponentProvider(Class)}. This version of that method is to allow you to
* differentiate between multiple instances of a given provider that have different titles.
*
@ -1121,7 +1120,7 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
}
/**
* A helper method to find all actions by name, with the given owner's name (this will not
* A helper method to find all actions by name, with the given owner's name (this will not
* include reserved system actions)
*
* @param tool the tool containing all system actions
@ -1164,12 +1163,12 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
}
/**
* Finds the action by the given owner name and action name.
* If you do not know the owner name, then use
* Finds the action by the given owner name and action name.
* If you do not know the owner name, then use
* the call {@link #getActionsByName(Tool, String)} instead (this will not include
* reserved system actions).
*
* <P>Note: more specific test case subclasses provide other methods for finding actions
* <P>Note: more specific test case subclasses provide other methods for finding actions
* when you have an owner name (which is usually the plugin name).
*
* @param tool the tool containing all system actions
@ -1522,8 +1521,8 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
triggerText(c, "\010");
}
/**
* Simulates the user pressing the 'Enter' key on the given text field
/**
* Simulates the user pressing the 'Enter' key on the given text field
* @param c the component
*/
public static void triggerEnter(Component c) {
@ -1715,7 +1714,7 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
}
/**
* Fires a {@link KeyListener#keyPressed(KeyEvent)},
* Fires a {@link KeyListener#keyPressed(KeyEvent)},
* {@link KeyListener#keyTyped(KeyEvent)}
* and {@link KeyListener#keyReleased(KeyEvent)} for the given key stroke
*
@ -2020,7 +2019,7 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
private static <T> void doWaitForTableModel(ThreadedTableModel<T, ?> model) {
// Always wait for Swing at least once. There seems to be a race condition for
// Always wait for Swing at least once. There seems to be a race condition for
// incremental threaded models where the table is not busy at the time this method
// is called, but there is an update pending via an invokeLater().
waitForSwing();
@ -2142,6 +2141,11 @@ public abstract class AbstractDockingTest extends AbstractGenericTest {
return runSwing(() -> action.isEnabledForContext(new ActionContext()));
}
public static boolean isEnabled(DockingActionIf action,
ActionContextProvider contextProvider) {
return runSwing(() -> action.isEnabledForContext(contextProvider.getActionContext(null)));
}
public static boolean isEnabled(AbstractButton button) {
return runSwing(() -> button.isEnabled());
}

View File

@ -27,7 +27,7 @@ import resources.icons.EmptyIcon;
/**
* Creates a panel that displays an {@link Image}. Users may pan the image as desired and zoom the
* image according to specific zoom levels.
* image according to specific zoom levels.
*/
public class ImagePanel extends JPanel {
@ -40,7 +40,7 @@ public class ImagePanel extends JPanel {
// neutral
1.0f,
// expanding scales
1.5f, 2f, 2.5f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 10f
1.5f, 2f, 2.5f, 3f, 4f, 5f, 6f, 7f, 8f, 9f, 10f
// @formatter:on
};
@ -127,6 +127,7 @@ public class ImagePanel extends JPanel {
/**
* Create an NavigableImagePanel with the specified image
* @param image the image
*/
public ImagePanel(Image image) {
initUI();
@ -174,7 +175,7 @@ public class ImagePanel extends JPanel {
firePropertyChange(IMAGE_PROPERTY, oldImage, this.image);
}
/**
/**
* Get the currently-displayed image
* @return the current image
*/
@ -183,7 +184,7 @@ public class ImagePanel extends JPanel {
}
/**
* Set the background color of the panel. If the specified color is null, the
* Set the background color of the panel. If the specified color is null, the
* default color for panel backgrounds is used.
* @param color the new background color
*/
@ -202,12 +203,24 @@ public class ImagePanel extends JPanel {
return imagePanel.getBackground();
}
/**
* Unused
* @param text unused
* @deprecated unused
*/
@Deprecated(since = "10.2", forRemoval = true) // unused
public void setText(String text) {
label.setText(text);
// unused
}
/**
* Unused
* @return unused
* @deprecated unused
*/
@Deprecated(since = "10.2", forRemoval = true) // unused
public String getText() {
return label.getText();
return null;
}
/**
@ -219,11 +232,11 @@ public class ImagePanel extends JPanel {
}
/**
* Set the magnification factor of the image. The zoom parameter is aligned to the
* nearest pre-configured magnification factor, rounding down for zoom factors less than
* Set the magnification factor of the image. The zoom parameter is aligned to the
* nearest pre-configured magnification factor, rounding down for zoom factors less than
* 1.0, and up for factors greater than 1.0. Zoom factors outside the pre-configured range
* are limited to the nearest range extent.
* @param zoom
* are limited to the nearest range extent.
* @param zoom the zoom
*/
public void setZoomFactor(float zoom) {
@ -250,7 +263,7 @@ public class ImagePanel extends JPanel {
// idx is now the index for where zoom should be inserted into levels...
if (idx == 0) {
// Smaller zoom factor than our minimum-supported; just provide
// Smaller zoom factor than our minimum-supported; just provide
// our minimum-supported
return 0;
}
@ -269,17 +282,17 @@ public class ImagePanel extends JPanel {
return idx;
}
/**
* Get the default zoom level
* @return
/**
* Get the default zoom factory
* @return the zoom factor
*/
public float getDefaultZoomFactor() {
return defaultZoomFactor;
}
/**
* Set the default zoom level, adhering to the same set of constrains as {@link #setZoomFactor(float)}
* @param zoom
* Set the default zoom level, adhering to the same set of constrains as {@link #setZoomFactor(float)}
* @param zoom the zoom
* @see #setZoomFactor(float)
* @see #resetZoom()
*/
@ -309,14 +322,14 @@ public class ImagePanel extends JPanel {
}
/**
* Determine if the image can zoom in further based on current magnification levels
* Determine if the image can zoom in further based on current magnification levels
* @return True if magnification steps are available, false otherwise
*/
public boolean canZoomIn() {
return image != null && zoomLevelIndex < ZOOM_LEVELS.length - 1;
}
/**
/**
* Enlarge the image about the image center
*/
public void zoomIn() {
@ -354,7 +367,7 @@ public class ImagePanel extends JPanel {
}
/**
* Determine if the image can zoom out further based on current magnification levels
* Determine if the image can zoom out further based on current magnification levels
* @return True if (de-)magnification steps are available, false otherwise
*/
@ -452,7 +465,7 @@ public class ImagePanel extends JPanel {
}
/**
* Move the image back to the center. Zoom factor is unmodified.
* Move the image back to the center. Zoom factor is unmodified.
*/
public void resetImageTranslation() {
label.resetTranslation();

View File

@ -15,7 +15,7 @@
*/
package docking.widgets.imagepanel;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.*;
import java.awt.Image;
@ -39,84 +39,92 @@ public class ImagePanelTest extends AbstractDockingTest {
Image emptyImage = ResourceManager.getImageIcon(emptyIcon).getImage();
imagePanel = new ImagePanel(emptyImage);
frame = new JFrame("ImagePanel Test");
frame.getContentPane().add(imagePanel);
frame.setSize(400, 400);
runSwing(() -> {
frame = new JFrame("ImagePanel Test");
frame.getContentPane().add(imagePanel);
frame.setSize(400, 400);
frame.setVisible(true);
frame.setVisible(true);
});
}
@After
public void tearDown() throws Exception {
frame.dispose();
runSwing(() -> frame.dispose());
}
private void reset() {
imagePanel.setZoomFactor(1.0f);
setZoom(1.0f);
assertTrue("Unable to reset zoom factor",
Float.compare(imagePanel.getZoomFactor(), 1.0f) == 0);
Float.compare(getZoom(), 1.0f) == 0);
}
@Test
public void testZoom_Neutral() {
reset();
imagePanel.setZoomFactor(1.0f);
setZoom(1.0f);
assertTrue("Zoom factor not set to 1.0x",
Float.compare(imagePanel.getZoomFactor(), 1.0f) == 0);
Float.compare(getZoom(), 1.0f) == 0);
}
@Test
public void testZoom_10Point0f() {
reset();
imagePanel.setZoomFactor(10.0f);
setZoom(10.0f);
assertTrue("Zoom factor not set to 10.0x",
Float.compare(imagePanel.getZoomFactor(), 10.0f) == 0);
Float.compare(getZoom(), 10.0f) == 0);
}
@Test
public void testZoom_0Point05() {
reset();
imagePanel.setZoomFactor(0.05f);
setZoom(0.05f);
assertTrue("Zoom factor not set to 0.05x",
Float.compare(imagePanel.getZoomFactor(), 0.05f) == 0);
Float.compare(getZoom(), 0.05f) == 0);
}
@Test
public void testZoom_20Point0() {
reset();
imagePanel.setZoomFactor(20.0f);
setZoom(20.0f);
assertTrue("Zoom factor not set to 20.0x; should be 10.0x",
Float.compare(imagePanel.getZoomFactor(), 10.0f) == 0);
Float.compare(getZoom(), 10.0f) == 0);
}
@Test
public void testZoom_0Point001() {
reset();
imagePanel.setZoomFactor(0.001f);
setZoom(0.001f);
assertTrue("Zoom factor not set to 0.001x; should be 0.05x",
Float.compare(imagePanel.getZoomFactor(), 0.05f) == 0);
Float.compare(getZoom(), 0.05f) == 0);
}
@Test
public void testZoom_3Point75() {
reset();
imagePanel.setZoomFactor(3.75f);
setZoom(3.75f);
assertTrue("Zoom factor not set to 3.75x; should be 4.0x",
Float.compare(imagePanel.getZoomFactor(), 4.0f) == 0);
Float.compare(getZoom(), 4.0f) == 0);
}
private void setZoom(float zoom) {
runSwing(() -> imagePanel.setZoomFactor(zoom));
}
private float getZoom() {
return runSwing(() -> imagePanel.getZoomFactor());
}
}

View File

@ -416,30 +416,30 @@ public class GraphActionsTest extends AbstractGhidraHeadedIntegrationTest {
@Test
public void testGetActiveGraph() throws Exception {
GraphDisplayBroker broker = tool.getService(GraphDisplayBroker.class);
GraphDisplayProvider service = broker.getGraphDisplayProvider("Default Graph Display");
GraphDisplay firstDisplay = service.getActiveGraphDisplay();
assertNotNull(firstDisplay);
showGraph();
GraphDisplay secondDisplay = service.getActiveGraphDisplay();
assertNotNull(secondDisplay);
assertNotSame(firstDisplay, secondDisplay);
showGraph();
GraphDisplay thirdDisplay = service.getActiveGraphDisplay();
assertNotNull(thirdDisplay);
assertNotSame(firstDisplay, thirdDisplay);
assertNotSame(secondDisplay, thirdDisplay);
close(thirdDisplay);
close(firstDisplay);
GraphDisplay activeDisplay = service.getActiveGraphDisplay();
assertNotNull(activeDisplay);
assertSame(secondDisplay, activeDisplay);
close(secondDisplay);
activeDisplay = service.getActiveGraphDisplay();
assertNull(activeDisplay);