RFR: 8306137: Open source several AWT ScrollPane related tests [v6]
Alexey Ivanov
aivanov at openjdk.org
Fri May 5 12:53:35 UTC 2023
On Wed, 3 May 2023 16:00:39 GMT, Tejesh R <tr at openjdk.org> wrote:
>> Open source few AWT ScrollPane related tests.
>
> Tejesh R has updated the pull request incrementally with one additional commit since the last revision:
>
> Removed whitespace error
Changes requested by aivanov (Reviewer).
test/jdk/java/awt/ScrollPane/ComponentScrollTest.java line 42:
> 40: import java.awt.event.AdjustmentListener;
> 41:
> 42: import java.lang.reflect.InvocationTargetException;
`InvocationTargetException` is unused, remove unused imports, please.
test/jdk/java/awt/ScrollPane/ComponentScrollTest.java line 72:
> 70: @Override
> 71: public void adjustmentValueChanged(AdjustmentEvent adjustmentEvent) {
> 72: count++;
IDE warns that we're changing a volatile field in a non-atomic fashion… but it's probably okay here.
test/jdk/java/awt/ScrollPane/ComponentScrollTest.java line 87:
> 85: });
> 86:
> 87: Thread.sleep(5000);
Sleeping for 5 seconds could be too much.
It would be great to ensure the updated test reproduces the problem that was fixed by [JDK-4342129](https://bugs.openjdk.org/browse/JDK-4342129) in 1.3.0 and 1.4.0. Otherwise, these 5 seconds could be a waste of time.
test/jdk/java/awt/ScrollPane/ScrollPaneLimitation.java line 52:
> 50:
> 51: public class ScrollPaneLimitation {
> 52: final static int SCROLL_POS = 50000;
Suggestion:
static final int SCROLL_POS = 50000;
Address the missorted modifiers.
test/jdk/java/awt/ScrollPane/ScrollPaneLimitation.java line 91:
> 89: lock.notify();
> 90: }
> 91: }
Suggestion:
if (e.getID() == MouseEvent.MOUSE_PRESSED
&& e.getSource() == ScrollPaneLimitation.child
&& e.getY() > SCROLL_POS) {
go.countDown();
}
I meant replacing synchronisation with `lock` by `CountDownLatch`. You created a mix of them.
(Here, I moved the first `&&` operator to wrapped line — you should be consistent: either move binary operators to wrapped line or leave them on the previous line.
test/jdk/java/awt/ScrollPane/ScrollPaneLimitation.java line 106:
> 104:
> 105: EventQueue.invokeAndWait(() -> {
> 106: p = child.getLocation();
The synchronization here doesn't look correct.
`p` is later used on main thread. It is safer to create a local variable inside the lambda expression, print the positions etc. As the last statement create a new `Point` instance with the computed coordinates for mouse click and assign it to `p` which will be used on the main thread to move the mouse cursor.
It is not necessary to mark the field as `volatile` because `invokeAndWait` serves a the synchronisation point between the two thread.
test/jdk/java/awt/ScrollPane/ScrollPaneLimitation.java line 144:
> 142: if (!mouseWasPressed) {
> 143: throw new RuntimeException("mouse was not pressed");
> 144: }
Suggestion:
if (!go.await(3, TimeUnit.SECONDS)) {
throw new RuntimeException("mouse was not pressed");
}
If mouse is clicked and the event is sent, the `go` reaches zero and `await` returns `true`; otherwise `await` returns `false` and the test fails.
The `lock` and `mouseWasPressed` are to be removed.
test/jdk/java/awt/ScrollPane/ScrollPaneRemoveAdd.java line 39:
> 37: import java.awt.Robot;
> 38: import java.awt.ScrollPane;
> 39: import java.awt.Toolkit;
`BorderLayout` and `Toolkit` are unused, remove unused imports, please.
test/jdk/java/awt/ScrollPane/ScrollPaneRemoveAdd.java line 71:
> 69: button.addActionListener(new ActionListener() {
> 70: public void actionPerformed(ActionEvent e) {
> 71: actionSema.raise();
The entire thing with a custom `Semaphore` is overly complicated and unnecessary. What it verifies is that the button is clicked, isn't it. Use the standard `CountDownLatch` for it.
So, here it'll be:
Suggestion:
latch.countDown();
test/jdk/java/awt/ScrollPane/ScrollPaneRemoveAdd.java line 111:
> 109: throw new RuntimeException("ScrollPane doesn't handle " +
> 110: "correctly add after remove");
> 111: }
All this code will be as simple as this:
Suggestion:
if (!latch.await(1, TimeUnit.SECONDS)) {
throw new RuntimeException("ScrollPane doesn't handle " +
"correctly add after remove");
}
No need to `waitForIdle` because the latch will be released only after the clicked event gets handled.
Then remove the `Semaphore` class which is not implemented correctly.
test/jdk/java/awt/ScrollPane/ScrollPaneWindowsTest.java line 98:
> 96:
> 97: robot.mouseMove(sp.getLocationOnScreen().x + sp.getWidth() - paneInsets.right / 2,
> 98: sp.getLocationOnScreen().y + sp.getHeight() / 2);
You should get the location on the scroll pane and its size inside `invokeAndWait` and use these two new fields to move the mouse.
test/jdk/java/awt/ScrollPane/ScrollPaneWindowsTest.java line 174:
> 172: } catch (InterruptedException e) {
> 173: throw new RuntimeException("Test interrupted while keys being pressed.", e);
> 174: }
You can remove the try-catch block here, the throws clause in the method declaration allows throwing `InterruptedException`. Since this exception is unlikely to be thrown ever, the additional detail message isn't as useful.
test/jdk/java/awt/ScrollPane/ScrollPaneWindowsTest.java line 178:
> 176:
> 177: public void adjustmentValueChanged(AdjustmentEvent e) {
> 178: notifyReceived = true;
`notifyReceived` should be modified and read inside `synchronized (ScrollPaneWindowsTest.LOCK)` block.
test/jdk/java/awt/ScrollPane/ScrollPositionIntact.java line 74:
> 72: robot.delay(1000);
> 73: robot.waitForIdle();
> 74: EventQueue.invokeAndWait(() -> {
Suggestion:
});
Robot robot = new Robot();
robot.delay(1000);
robot.waitForIdle();
EventQueue.invokeAndWait(() -> {
Let's add blank lines to separate the code portions visually.
-------------
PR Review: https://git.openjdk.org/jdk/pull/13621#pullrequestreview-1414573417
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1185984003
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1185994523
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1186039141
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1186052205
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1185957430
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1185966007
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1185961134
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1185984651
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1185986092
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1185988584
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1186046722
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1186051071
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1186048121
PR Review Comment: https://git.openjdk.org/jdk/pull/13621#discussion_r1186056045
More information about the client-libs-dev
mailing list