Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test classes appear to affect each other #173

Closed
zerocool947 opened this issue Dec 8, 2014 · 29 comments
Closed

Test classes appear to affect each other #173

zerocool947 opened this issue Dec 8, 2014 · 29 comments

Comments

@zerocool947
Copy link

Create two test classes, A and B; ensure class A always runs first. Both of these test classes succeed when independently.

In class A, in BeforeClass register the primary stage, create a target stage. Then I setUp the stage, and then I wait for FX events. Like so:

    FxToolkit.registerPrimaryStage();
    fxRobot.target(FxToolkit.registerTargetStage(() -> {
                Stage stage = new Stage();
                stage.setTitle("Demo Stage");
                return stage;
            }
    ));
    FxToolkit.setupStage((stage) -> {
        stage.show();
        stage.toBack();
        stage.toFront();
    });
    WaitForAsyncUtils.waitForFxEvents();

Then I test the stage name and all is good.

In class B, in Before I register the primary stage, then I setUp the stage, then I setUp the scene root, then wait for FX events. getRootNode returns a simple anchorPane with a grid with a button and a comboBox.

    fxRobot.target(FxToolkit.registerPrimaryStage());   
    FxToolkit.toolkitContext().getTargetStage().getTitle());
    FxToolkit.setupStage((stage) -> {
        stage.show();
        stage.toBack();
        stage.toFront();
    });
    FxToolkit.setupSceneRoot(() -> {
                return getRootNode();
            }
    );
    WaitForAsyncUtils.waitForFxEvents();

Then my tests test the button and the combo box. They run into NPEs attempting to find the nodes:

java.lang.NullPointerException
at org.testfx.service.finder.impl.NodeFinderImpl.findNodesInParent(NodeFinderImpl.java:204)
at org.testfx.service.finder.impl.NodeFinderImpl.lambda$fromNodesCssSelectorFunction$28(NodeFinderImpl.java:191)
at org.testfx.service.finder.impl.NodeFinderImpl$$Lambda$182/1908923184.apply(Unknown Source)
at com.google.common.collect.Iterators$8.transform(Iterators.java:799)
at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
at com.google.common.collect.TransformedIterator.next(TransformedIterator.java:48)
at com.google.common.collect.Iterators$5.hasNext(Iterators.java:548)
at com.google.common.collect.Iterators$7.computeNext(Iterators.java:650)
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
at com.google.common.collect.ImmutableSet.copyOf(ImmutableSet.java:318)
at com.google.common.collect.ImmutableSet.copyOf(ImmutableSet.java:300)
at org.testfx.service.finder.impl.NodeFinderImpl.transformToResultNodes(NodeFinderImpl.java:178)
at org.testfx.service.finder.impl.NodeFinderImpl.nodesImpl(NodeFinderImpl.java:160)
at org.testfx.service.finder.impl.NodeFinderImpl.nodes(NodeFinderImpl.java:90)
at org.testfx.service.finder.impl.NodeFinderImpl.node(NodeFinderImpl.java:75)
at com.poorfellow.graphing.experimental.test.JavaFXViewsTest.testButtonClick(JavaFXViewsTest.java:67)

Here's where things get interesting: I tried to add an AfterClass method to class A that used WaitForAsyncUtils.asyncFx(() to find and close the stage I had set. This time when I ran the tests, class B hung on both setupStage() and setupSceneRoot(); I tried to alter the order.

It looks like some stale data is being left around in FxToolkit, but that's a wildly uninformed guess.

@hastebrot
Copy link
Member

Hi!

They run into NPEs attempting to find the nodes

The NullPointerException from NodeFinderImpl is very unexpected. From the stacktrace I can tell that you used clickOn("#buttonId"). I'll have to try to reproduce this.

and close the stage I had set. This time when I ran the tests, class B hung on both setupStage() and setupSceneRoot()

I assume you use

FxToolkit.setupStage((stage) -> { stage.close() })

There once was a similar hanging test that had to be @Ignored in StageSetupImplTest. The problem was a call to WaitForAsyncUtils.waitForFxEvents(); somewhere, that uses Semaphores to wait for the JavaFX thread and causes the hang when used together with stage.close(). The solution [1] was to use

Platform.runLater(() -> stage.close());

stage would be in your case FxToolkit.toolkitContext().getTargetStage().

[1]

Update: Here is the commit that fixed the hang. a1119eb516.

@zerocool947
Copy link
Author

Perfect! I'll convert it to Platform until your next snapshot release.

If you want to look into inducing the npe, look at the commit I made last night to graphing-experiments after posting this. Remove the AfterClass handling in the Stage Test to induce the behaviour

@hastebrot
Copy link
Member

javafx.application.Platform is part of Java. Thanks for the hint to graphing-experiments.

@hastebrot
Copy link
Member

Related to #152.

@zerocool947
Copy link
Author

Right, I may have worded that comment weird, I was on my phone.

It looks like if you intend to make the stage visible as part of your test, you'll need to manually handle closing that stage during test cleanup (which is fine, that makes enough sense). Tt looks like my second test should be able to run once I implement the Platform workaround. I expect the NPE is somehow related to the leftover stage, because I still see the stage when the scene UI controls appear for the test.

@zerocool947
Copy link
Author

So I tried using Platform#runLater() like you said.I tried a few different ways of getting the scene (setting it as a class variable, getting it through the FxService...) and all ways led to another hang. This time the hang got past FxToolkt#setUpStage(), but hung on FxToolkit#setUpSceneRoot().

Sorry I can't supply more. I'll push to graphing-experiments right after posting this with my updates

@hastebrot
Copy link
Member

I experimented a bit with Stage#close() and waitForFxEvent(). Both used together cause the hang; I guess a classical deadlock.

@After
public void cleanup() throws Exception {
    WaitForAsyncUtils.waitForFxEvents();
    setupStage((stage) -> stage.close());
}

@Test
public void should_wait_for_events() {
    WaitForAsyncUtils.waitForFxEvents();
    sleep(1000);
}

Here is the doc string for waitForFxEvents():

Waits the given {@code int} attempts for the event queue of JavaFX Application Thread to be
completed, as well as any new events triggered on it.

Here is some implementation detail:

private static void blockFxThreadWithSemaphore() {
    Semaphore semaphore = new Semaphore(0);
    runOnFxThread(semaphore::release);
    try {
        semaphore.acquire();
    }
    catch (InterruptedException ignore) {}
}

waitForFxEvents() is needed by the robot methods for user input simulation. Maybe we could try to detect if semaphore.acquire() are running and wait for them before Stage#close() is called. I'm not quite sure how to implement this. Maybe with a global context.

@hastebrot
Copy link
Member

Workaround: One thing you can do is to sleep() a while before you call Stage#close().

@After
public void cleanup() throws Exception {
    WaitForAsyncUtils.waitForFxEvents(); // not part of the workaround. called to force the deadlock.
    sleep(1000);
    setupStage((stage) -> stage.close());
}

@hastebrot
Copy link
Member

Here is a complete bug case:

package org.testfx.cases.bug;

import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.layout.Region;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import static org.testfx.api.FxToolkit.setupStage;

public class StageDeadlockTest extends FxRobotTestBase {

    @Before
    public void setup() throws Exception {
        setupStage((stage) -> {
            stage.setScene(new Scene(new Region(), 500, 500));
            stage.show();
            stage.toBack();
            stage.toFront();
        });
    }

    @After
    public void cleanup() throws Exception {
        Platform.runLater(() -> {});
        Platform.runLater(() -> {});
        Platform.runLater(() -> {});
        Platform.runLater(() -> {});
        Platform.runLater(() -> {});
        setupStage((stage) -> {
            stage.close();
        });
    }

    @Test
    public void should_call_After_once() {}

    @Test
    public void should_call_After_twice() {}

    @Test
    public void should_call_After_thrice() {}

}
package org.testfx.cases.bug;

import org.junit.BeforeClass;
import org.testfx.api.FxRobot;
import org.testfx.api.FxToolkit;

public class FxRobotTestBase extends FxRobot {

    @BeforeClass
    public static void setupSpec() throws Exception {
        FxToolkit.registerPrimaryStage();
    }

}

@hastebrot
Copy link
Member

Here are some lines printed out from println debugging:

*** cleanup ***
acquire before
release before
release after
acquire after
setupStage before
close before
close after
setupStage after
*** cleanup ***
acquire before

The last line (acquire before) was printed after a longer pause.

@zerocool947
Copy link
Author

I'm a little bit confused by your workaround. You're calling WaitForAsyncUtils#waitForFxEvents() and then calling FxToolkit#setUpStage()? Why not the other way around? Or why not surround setUpStage() with "waitForFxEvents()?

Unless the point is to try to short-circuit the deadlock by making sure everything has stopped happening by the time we get there. But then that raises the question of how do I know that Stage is closed when it moves on to the next test?

@hastebrot
Copy link
Member

waitForFxEvents() is not part of the workaround. I call it to force the deadlock. I could have called it in the @Tests to make it clearer.

@zerocool947
Copy link
Author

Oh I see now. I was a little bit confused because none of my tests require waitForFxEvents() because they only check the state of the stage/scene; they don't do any modification. So the waitForFxEvents() in my @BeforeClass is the equivalent. Got it.

@zerocool947
Copy link
Author

So then, forgive me if this sounds really stupid, in a typical use case, would I call waitForFxEvents() in the @After method after doing setUpStage((stage) -> stage.close()), to make sure that stage was closed before moving on to the next set of tests? Or am I fundamentally misunderstanding how waitForFxEvents() works?

@hastebrot
Copy link
Member

setupStage will wait until stage.close() is finished. It uses Platform.runLater() in combination with java.util.concurrent.Future. So there is no need to wait for the JavaFX thread's event queue with waitForFxEvents(). The main use case of waitForFxEvents() is to wait for JavaFX events triggered concurrently after user interactions.

Update: I could minimize the case more. The deadlock could also be reproduced with Platform.runLater(() -> {}) instead of waitForFxEvents(). That means, we don't have to worry about the Semaphores causing this issue. Now the problem is either stage.close() itself or setupStage() that internally uses java.util.concurrent.Future.

@hastebrot
Copy link
Member

This works. However it does not wait for the Stage to be closed.

@After
public void cleanup() throws Exception {
    Platform.runLater(() -> {});
    Platform.runLater(() -> {});
    Platform.runLater(() -> {});
    Platform.runLater(() -> {});
    Platform.runLater(() -> {});
    Platform.runLater(() -> FxToolkit.toolkitContext().getTargetStage().close());
}

@hastebrot
Copy link
Member

I'll postpone further investigations to tomorrow or the day after tomorrow. This is not really a blocker for TestFX 4.0.0-beta.1, but it would be nice to have this solved soon.

@zerocool947
Copy link
Author

Ohhh so if I'm just configuring stuff (Creating, FxToolkit.setupSceneRoot() etc) in my @Before methods and the referencing the objects in my tests I don't need to mess around with waitForFxEvents()? Good to know. Sorry if this seems like softball stuff, I'm pretty new to UI testing.

And yeah, Take it at your own pace; for now I can run the tests independently and it all works so this isn't critical for me at all.

@hastebrot
Copy link
Member

I don't need to mess around with waitForFxEvents()?

Most probably. The setupSceneRoot() example I gave you was a translation of the stuff GuiTest did. GuiTest uses org.loadui.testfx.utils.FXTestUtils.invokeAndWait() which is used for @Before stuff and for the Robots. It always calls waitForFxEvents() at the end. The new implementation in WaitForAsyncUtils splits invokeAndWait() into three independent methods (asyncFx(), waitFor() and waitForFxEvents()), so there is no need to always call waitForFxEvents().

@zerocool947
Copy link
Author

Sounds like the end result will be much cleaner than in 3.0 :)

@zerocool947
Copy link
Author

So I tried implementing a sleep before calling setupStage(), but it still deadlocked on

    FxToolkit.setupSceneRoot(() -> {
                return getRootNode();
            }
    );

I called setupSceneRoot() after calling setupStage() in class B's tests

@hastebrot
Copy link
Member

Hey.

I experimented a bit and called Toolkit.getToolkit().defer(() -> {}) before the stage.close(). It worked but not reliable. Toolkit.getToolkit().defer(null) also worked, but was even less reliable. Very annoying timing problem. It is very likely that I'll implement the utility methods FxToolkit.showStage() and FxToolkit.hideStage() when I found a solution.

@hastebrot
Copy link
Member

Hmm. In case you've never show()n the primary Stage and called hide() on your custom Stage, which is the only shown stage, it seems that the JavaFX Toolkit will implicitly exit.

I ran this and it sometimes gave me java.lang.IllegalStateException: Toolkit has exited.

@After
public void cleanup() throws Exception {
    FxToolkit.setupStage((stage) -> stage.close());
    PlatformImpl.runAndWait(() -> {});
}

The solution was to disable the implicit exit with Platform.setImplicitExit(false).

@After
public void cleanup() throws Exception {
    Platform.setImplicitExit(false);
    FxToolkit.setupStage((stage) -> stage.close());
}

@hastebrot
Copy link
Member

Funny thing is, that Platform.runLater(() -> stage.close()) in @After worked, because it does not wait for stage.close() to be finished and at the same time stage.show() in @Before for the next test case is called. So the Toolkit will not implicitly exit, since there remains at least one shown Stage.

@zerocool947
Copy link
Author

Great! So

@AfterClass
public static void teardownStage() throws Exception {
    Toolkit.getToolkit().defer(() -> {});
    Platform.runLater(stage::close);
}

Absolutely works (Edit: but wow you were not kidding about reliability). My tests run end to end now after I made one small adjustment.

In one of my tests' @Before (not the first one run), I tried to do this:

    primaryStage = FxToolkit.registerPrimaryStage();
    fxRobot.target(primaryStage);
    FxToolkit.setupStage((stage) -> {
        stage.initStyle(StageStyle.DECORATED);
        stage.show();
        stage.toBack();
        stage.toFront();
    });

stage.initStyle() threw an exception and caused a deadlock in the next test:

java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Cannot set style once stage has been set visible

This may be an unavoidable aspect of JavaFX, but I would expect the stage in each test to be a new stage ready to be initialized. I could be wrong with that expectation though.

I haven't run into the Toolkit has exited error yet

@hastebrot
Copy link
Member

This may be an unavoidable aspect of JavaFX, but I would expect the stage in each test to be a new stage ready to be initialized.

This is possible and should be documented as the second of two basic use cases for FxToolkit. Also the stage.initStyle() exception is solvable.

  1. Tests that reuse the primary Stage during the whole test run. They launch the Toolkit and the primary Stage with StageStyle.UNDECORATED in @BeforeClass. Then insert a root Node with JavaFX test fixtures into the primary Stage and ensure it is shown in @Before. That means no worries about handling Stage creation and destruction, and simple tests that only need JavaFX fixtures.

    // before test class:
    FxToolkit.registerPrimaryStage();
    FxToolkit.showStage(); // show the primary Stage, if was previously hidden.
    
    // before each test method:
    FxToolkit.setupStage(stage -> {
        stage.setScene(new Scene(new Label("within primary stage")));
    });
    FxToolkit.showStage();
    fxRobot.target(FxToolkit.toolkitContext().getRegisteredStage());
    
    // on test run complete (not needed in JUnit runs):
    FxToolkit.hideStage();
    Platform.setImplicitExit(true);
  2. Tests that create a new Stage in each tests case. They launch the Toolkit and the primary Stage with StageStyle.UNDECORATED in @BeforeClass. Then setup a custom Stage (which has StageStyle.DECORATED per default) and insert a root Node with JavaFX test fixture into that custom Stage, show it in @Before. And hide it in @After. That means they totally ignore the primary Stage.

    // before test class:
    FxToolkit.registerPrimaryStage();
    FxToolkit.hideStage(); // hide the primary Stage, if was previously shown.
    
    // before each test method:
    FxToolkit.registerStage(() -> new Stage());
    FxToolkit.setupStage(stage -> {
        stage.setScene(new Scene(new Label("within custom stage")));
    });
    FxToolkit.showStage();
    fxRobot.target(FxToolkit.toolkitContext().getRegisteredStage());
    
    // after each test method:
    FxToolkit.hideStage();
    
    // on test run complete (not needed in JUnit runs):
    Platform.setImplicitExit(true);

I'll see what I can do.

@zerocool947
Copy link
Author

Hm, okay, I'll play around with those design patterns. I might be doing some things pretty sloppy. The stage.initStyel() error is happening across test classes, not within a single test class.

@brcolow
Copy link
Collaborator

brcolow commented Mar 4, 2018

Closing due to inactivity.

@AnEmortalKid
Copy link

Just dropping some info here. I ran into this issue recently, here's a thread dump of what was stuck:


2019-12-03 12:48:03
Full thread dump OpenJDK 64-Bit Server VM (11.0.5+10 mixed mode):

Threads class SMR info:
_java_thread_list=0x00007ffbea10fed0, length=25, elements={
0x00007ffbec001000, 0x00007ffbe882d800, 0x00007ffbe8830800, 0x00007ffbe9042000,
0x00007ffbe9032800, 0x00007ffbe9801000, 0x00007ffbec000000, 0x00007ffbeb917000,
0x00007ffbe9170000, 0x00007ffbe9802800, 0x00007ffbe95ba800, 0x00007ffbe88b5000,
0x00007ffbe9ea2000, 0x00007ffbecacb000, 0x00007ffbe8833800, 0x00007ffbecadb800,
0x00007ffbeba9d800, 0x00007ffbe9f4c800, 0x00007ffbecb84800, 0x00007ffbed000800,
0x00007ffbe8f54000, 0x00007ffbed007000, 0x00007ffbea80a000, 0x00007ffbed0e5000,
0x00007ffbeb0a2000
}

"main" #1 prio=5 os_prio=31 cpu=1035.51ms elapsed=95.72s tid=0x00007ffbec001000 nid=0x2403 waiting on condition  [0x00007000056cd000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.5/Native Method)
        - parking to wait for  <0x00000007cf5061b0> (a java.util.concurrent.Semaphore$NonfairSync)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.5/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(java.base@11.0.5/AbstractQueuedSynchronizer.java:885)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(java.base@11.0.5/AbstractQueuedSynchronizer.java:1039)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(java.base@11.0.5/AbstractQueuedSynchronizer.java:1345)
        at java.util.concurrent.Semaphore.acquire(java.base@11.0.5/Semaphore.java:318)
        at org.testfx.util.WaitForAsyncUtils.blockFxThreadWithSemaphore(WaitForAsyncUtils.java:554)
        at org.testfx.util.WaitForAsyncUtils.waitForFxEvents(WaitForAsyncUtils.java:371)
        at org.testfx.util.WaitForAsyncUtils.waitForFxEvents(WaitForAsyncUtils.java:359)
        at org.testfx.api.FxToolkit.waitForSetup(FxToolkit.java:245)
        at org.testfx.api.FxToolkit.setupApplication(FxToolkit.java:153)
        at org.testfx.framework.junit5.ApplicationExtension.beforeEach(ApplicationExtension.java:85)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeEachCallbacks$1(TestMethodTestDescriptor.java:151)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$311/0x00000008001c8040.invoke(Unknown Source)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeBeforeMethodsOrCallbacksUntilExceptionOccurs$5(TestMethodTestDescriptor.java:187)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor$$Lambda$312/0x00000008001c8440.execute(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeMethodsOrCallbacksUntilExceptionOccurs(TestMethodTestDescriptor.java:187)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeBeforeEachCallbacks(TestMethodTestDescriptor.java:150)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:129)
        at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:69)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$235/0x0000000800193040.execute(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$234/0x0000000800192c40.invoke(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$233/0x0000000800192840.execute(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$239/0x0000000800194040.accept(Unknown Source)
        at java.util.ArrayList.forEach(java.base@11.0.5/ArrayList.java:1540)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$235/0x0000000800193040.execute(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$234/0x0000000800192c40.invoke(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$233/0x0000000800192840.execute(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService$$Lambda$239/0x0000000800194040.accept(Unknown Source)
        at java.util.ArrayList.forEach(java.base@11.0.5/ArrayList.java:1540)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$235/0x0000000800193040.execute(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$234/0x0000000800192c40.invoke(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask$$Lambda$233/0x0000000800192840.execute(Unknown Source)
        at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
        at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
        at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
        at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
        at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
        at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
        at org.junit.platform.launcher.core.DefaultLauncher$$Lambda$204/0x0000000800176840.accept(Unknown Source)
        at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
        at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
        at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invokeAllTests(JUnitPlatformProvider.java:150)
        at org.apache.maven.surefire.junitplatform.JUnitPlatformProvider.invoke(JUnitPlatformProvider.java:124)
        at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:384)
        at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:345)
        at org.apache.maven.surefire.booter.ForkedBooter.execute(ForkedBooter.java:126)
        at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:418)

   Locked ownable synchronizers:
        - None

"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=1.37ms elapsed=95.69s tid=0x00007ffbe882d800 nid=0x3403 waiting on condition  [0x0000700005de4000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.5/Native Method)
        at java.lang.ref.Reference.processPendingReferences(java.base@11.0.5/Reference.java:241)
        at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.5/Reference.java:213)

   Locked ownable synchronizers:
        - None

"Finalizer" #3 daemon prio=8 os_prio=31 cpu=0.35ms elapsed=95.69s tid=0x00007ffbe8830800 nid=0x4603 in Object.wait()  [0x0000700005ee7000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.5/Native Method)
        - waiting on <0x00000007c9d2b700> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x00000007c9d2b700> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.5/Finalizer.java:170)

   Locked ownable synchronizers:
        - None

"Signal Dispatcher" #4 daemon prio=9 os_prio=31 cpu=0.30ms elapsed=95.68s tid=0x00007ffbe9042000 nid=0x3903 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"C2 CompilerThread0" #5 daemon prio=9 os_prio=31 cpu=4845.13ms elapsed=95.68s tid=0x00007ffbe9032800 nid=0x3e03 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

   Locked ownable synchronizers:
        - None

"C1 CompilerThread0" #8 daemon prio=9 os_prio=31 cpu=1460.63ms elapsed=95.68s tid=0x00007ffbe9801000 nid=0x3c03 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

   Locked ownable synchronizers:
        - None

"Sweeper thread" #9 daemon prio=9 os_prio=31 cpu=32.94ms elapsed=95.68s tid=0x00007ffbec000000 nid=0xa903 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"Common-Cleaner" #10 daemon prio=8 os_prio=31 cpu=1.77ms elapsed=95.64s tid=0x00007ffbeb917000 nid=0x5803 in Object.wait()  [0x00007000063f6000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.5/Native Method)
        - waiting on <0x00000007c9d56ab0> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x00000007c9d56ab0> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run(java.base@11.0.5/CleanerImpl.java:148)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)
        at jdk.internal.misc.InnocuousThread.run(java.base@11.0.5/InnocuousThread.java:134)

   Locked ownable synchronizers:
        - None

"Service Thread" #12 daemon prio=9 os_prio=31 cpu=0.06ms elapsed=95.47s tid=0x00007ffbe9170000 nid=0xa603 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"surefire-forkedjvm-command-thread" #13 daemon prio=5 os_prio=31 cpu=10.07ms elapsed=95.39s tid=0x00007ffbe9802800 nid=0x5b03 runnable  [0x00007000066ff000]
   java.lang.Thread.State: RUNNABLE
        at java.io.FileInputStream.readBytes(java.base@11.0.5/Native Method)
        at java.io.FileInputStream.read(java.base@11.0.5/FileInputStream.java:279)
        at java.io.BufferedInputStream.fill(java.base@11.0.5/BufferedInputStream.java:252)
        at java.io.BufferedInputStream.read(java.base@11.0.5/BufferedInputStream.java:271)
        - locked <0x00000007c9d2de88> (a java.io.BufferedInputStream)
        at java.io.DataInputStream.readInt(java.base@11.0.5/DataInputStream.java:392)
        at org.apache.maven.surefire.booter.MasterProcessCommand.decode(MasterProcessCommand.java:115)
        at org.apache.maven.surefire.booter.CommandReader$CommandRunnable.run(CommandReader.java:391)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"surefire-forkedjvm-ping-30s" #14 daemon prio=5 os_prio=31 cpu=189.95ms elapsed=95.29s tid=0x00007ffbe95ba800 nid=0xa203 waiting on condition  [0x0000700006802000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.5/Native Method)
        - parking to wait for  <0x00000007c9dacdf8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.5/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.5/AbstractQueuedSynchronizer.java:2123)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.5/ScheduledThreadPoolExecutor.java:1182)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.5/ScheduledThreadPoolExecutor.java:899)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.5/ThreadPoolExecutor.java:1054)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.5/ThreadPoolExecutor.java:1114)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.5/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"process reaper" #15 daemon prio=10 os_prio=31 cpu=18.45ms elapsed=95.27s tid=0x00007ffbe88b5000 nid=0x6503 waiting on condition  [0x0000700006d38000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.5/Native Method)
        - parking to wait for  <0x00000007c9d82010> (a java.util.concurrent.SynchronousQueue$TransferStack)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.5/LockSupport.java:234)
        at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.base@11.0.5/SynchronousQueue.java:462)
        at java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.base@11.0.5/SynchronousQueue.java:361)
        at java.util.concurrent.SynchronousQueue.poll(java.base@11.0.5/SynchronousQueue.java:937)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.5/ThreadPoolExecutor.java:1053)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.5/ThreadPoolExecutor.java:1114)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.5/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"testfx-async-pool-thread-1" #17 daemon prio=5 os_prio=31 cpu=20.99ms elapsed=94.66s tid=0x00007ffbe9ea2000 nid=0x9a03 waiting on condition  [0x0000700006e3b000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.5/Native Method)
        - parking to wait for  <0x00000007c9d2e270> (a java.util.concurrent.CountDownLatch$Sync)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.5/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(java.base@11.0.5/AbstractQueuedSynchronizer.java:885)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(java.base@11.0.5/AbstractQueuedSynchronizer.java:1039)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(java.base@11.0.5/AbstractQueuedSynchronizer.java:1345)
        at java.util.concurrent.CountDownLatch.await(java.base@11.0.5/CountDownLatch.java:232)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:213)
        at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:156)
        at javafx.application.Application.launch(Application.java:227)
        at org.testfx.toolkit.impl.ApplicationLauncherImpl.launch(ApplicationLauncherImpl.java:30)
        at org.testfx.toolkit.impl.ToolkitServiceImpl.lambda$setupPrimaryStage$0(ToolkitServiceImpl.java:57)
        at org.testfx.toolkit.impl.ToolkitServiceImpl$$Lambda$315/0x00000008001c9040.run(Unknown Source)
        at java.util.concurrent.Executors$RunnableAdapter.call(java.base@11.0.5/Executors.java:515)
        at java.util.concurrent.FutureTask.run(java.base@11.0.5/FutureTask.java:264)
        at org.testfx.util.WaitForAsyncUtils$ASyncFXCallable.call(WaitForAsyncUtils.java:689)
        at java.util.concurrent.FutureTask.run(java.base@11.0.5/FutureTask.java:264)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.5/ThreadPoolExecutor.java:1128)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.5/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - <0x00000007c9dadcb0> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"JavaFX-Launcher" #18 daemon prio=5 os_prio=31 cpu=154.87ms elapsed=94.64s tid=0x00007ffbecacb000 nid=0x9903 waiting on condition  [0x0000700006f3e000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.5/Native Method)
        - parking to wait for  <0x00000007c9d56e38> (a java.util.concurrent.CountDownLatch$Sync)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.5/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(java.base@11.0.5/AbstractQueuedSynchronizer.java:885)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(java.base@11.0.5/AbstractQueuedSynchronizer.java:1039)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(java.base@11.0.5/AbstractQueuedSynchronizer.java:1345)
        at java.util.concurrent.CountDownLatch.await(java.base@11.0.5/CountDownLatch.java:232)
        at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:856)
        at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
        at com.sun.javafx.application.LauncherImpl$$Lambda$319/0x00000008001ca440.run(Unknown Source)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"QuantumRenderer-0" #19 daemon prio=5 os_prio=31 cpu=64.52ms elapsed=94.52s tid=0x00007ffbe8833800 nid=0x9803 waiting on condition  [0x0000700007041000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.5/Native Method)
        - parking to wait for  <0x00000007c9dad260> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.5/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@11.0.5/AbstractQueuedSynchronizer.java:2081)
        at java.util.concurrent.LinkedBlockingQueue.take(java.base@11.0.5/LinkedBlockingQueue.java:433)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.5/ThreadPoolExecutor.java:1054)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.5/ThreadPoolExecutor.java:1114)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.5/ThreadPoolExecutor.java:628)
        at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"JavaFX Application Thread" #21 daemon prio=5 os_prio=31 cpu=1835.09ms elapsed=94.42s tid=0x00007ffbecadb800 nid=0x9703 waiting on condition  [0x0000700007142000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.5/Native Method)
        - parking to wait for  <0x00000007cf139c80> (a java.util.concurrent.CountDownLatch$Sync)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.5/LockSupport.java:194)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(java.base@11.0.5/AbstractQueuedSynchronizer.java:885)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(java.base@11.0.5/AbstractQueuedSynchronizer.java:1039)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(java.base@11.0.5/AbstractQueuedSynchronizer.java:1345)
        at java.util.concurrent.CountDownLatch.await(java.base@11.0.5/CountDownLatch.java:232)
        at com.sun.javafx.tk.quantum.PaintCollector.waitForRenderingToComplete(PaintCollector.java:157)
        at com.sun.javafx.tk.quantum.GlassScene.waitForRenderingToComplete(GlassScene.java:122)
        at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2503)
        at com.sun.javafx.tk.Toolkit.lambda$runPulse$2(Toolkit.java:412)
        at com.sun.javafx.tk.Toolkit$$Lambda$831/0x0000000800518040.run(Unknown Source)
        at java.security.AccessController.doPrivileged(java.base@11.0.5/Native Method)
        at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:411)
        at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:438)
        at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:519)
        at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:499)
        at com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:492)
        at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:320)
        at com.sun.javafx.tk.quantum.QuantumToolkit$$Lambda$362/0x000000080020cc40.run(Unknown Source)
        at com.sun.glass.ui.monocle.RunnableProcessor.runLoop(RunnableProcessor.java:92)
        at com.sun.glass.ui.monocle.RunnableProcessor.run(RunnableProcessor.java:51)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"Timer-0" #23 daemon prio=5 os_prio=31 cpu=335.36ms elapsed=94.37s tid=0x00007ffbeba9d800 nid=0x6e03 in Object.wait()  [0x0000700007247000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.5/Native Method)
        - waiting on <no object reference available>
        at java.util.TimerThread.mainLoop(java.base@11.0.5/Timer.java:553)
        - waiting to re-lock in wait() <0x00000007c9dad628> (a java.util.TaskQueue)
        at java.util.TimerThread.run(java.base@11.0.5/Timer.java:506)

   Locked ownable synchronizers:
        - None

"ForkJoinPool.commonPool-worker-3" #25 daemon prio=5 os_prio=31 cpu=1.09ms elapsed=93.15s tid=0x00007ffbe9f4c800 nid=0x7503 waiting on condition  [0x0000700007550000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.5/Native Method)
        - parking to wait for  <0x00000007c9d57388> (a java.util.concurrent.ForkJoinPool)
        at java.util.concurrent.locks.LockSupport.park(java.base@11.0.5/LockSupport.java:194)
        at java.util.concurrent.ForkJoinPool.runWorker(java.base@11.0.5/ForkJoinPool.java:1628)
        at java.util.concurrent.ForkJoinWorkerThread.run(java.base@11.0.5/ForkJoinWorkerThread.java:177)

   Locked ownable synchronizers:
        - None

"Prism Font Disposer" #26 daemon prio=10 os_prio=31 cpu=0.18ms elapsed=92.89s tid=0x00007ffbecb84800 nid=0x7703 in Object.wait()  [0x0000700007653000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.5/Native Method)
        - waiting on <0x00000007c9d57920> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:155)
        - waiting to re-lock in wait() <0x00000007c9d57920> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:176)
        at com.sun.javafx.font.Disposer.run(Disposer.java:93)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"Attach Listener" #27 daemon prio=9 os_prio=31 cpu=141.61ms elapsed=29.03s tid=0x00007ffbed000800 nid=0x8b3b waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

   Locked ownable synchronizers:
        - None

"RMI TCP Accept-0" #28 daemon prio=9 os_prio=31 cpu=2.64ms elapsed=28.15s tid=0x00007ffbe8f54000 nid=0x9507 runnable  [0x0000700007756000]
   java.lang.Thread.State: RUNNABLE
        at java.net.PlainSocketImpl.socketAccept(java.base@11.0.5/Native Method)
        at java.net.AbstractPlainSocketImpl.accept(java.base@11.0.5/AbstractPlainSocketImpl.java:458)
        at java.net.ServerSocket.implAccept(java.base@11.0.5/ServerSocket.java:565)
        at java.net.ServerSocket.accept(java.base@11.0.5/ServerSocket.java:533)
        at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(jdk.management.agent@11.0.5/LocalRMIServerSocketFactory.java:52)
        at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(java.rmi@11.0.5/TCPTransport.java:394)
        at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(java.rmi@11.0.5/TCPTransport.java:366)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"RMI TCP Connection(1)-127.0.0.1" #29 daemon prio=9 os_prio=31 cpu=180.19ms elapsed=28.04s tid=0x00007ffbed007000 nid=0xe07 runnable  [0x0000700007857000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(java.base@11.0.5/Native Method)
        at java.net.SocketInputStream.socketRead(java.base@11.0.5/SocketInputStream.java:115)
        at java.net.SocketInputStream.read(java.base@11.0.5/SocketInputStream.java:168)
        at java.net.SocketInputStream.read(java.base@11.0.5/SocketInputStream.java:140)
        at java.io.BufferedInputStream.fill(java.base@11.0.5/BufferedInputStream.java:252)
        at java.io.BufferedInputStream.read(java.base@11.0.5/BufferedInputStream.java:271)
        - locked <0x00000007ce8f6de0> (a java.io.BufferedInputStream)
        at java.io.FilterInputStream.read(java.base@11.0.5/FilterInputStream.java:83)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(java.rmi@11.0.5/TCPTransport.java:544)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(java.rmi@11.0.5/TCPTransport.java:796)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(java.rmi@11.0.5/TCPTransport.java:677)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$875/0x0000000800574040.run(java.rmi@11.0.5/Unknown Source)
        at java.security.AccessController.doPrivileged(java.base@11.0.5/Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(java.rmi@11.0.5/TCPTransport.java:676)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.5/ThreadPoolExecutor.java:1128)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.5/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - <0x00000007ce807430> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"RMI Scheduler(0)" #30 daemon prio=9 os_prio=31 cpu=0.21ms elapsed=27.99s tid=0x00007ffbea80a000 nid=0x7a03 waiting on condition  [0x000070000795c000]
   java.lang.Thread.State: TIMED_WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@11.0.5/Native Method)
        - parking to wait for  <0x00000007ce97a690> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
        at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.5/LockSupport.java:234)
        at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@11.0.5/AbstractQueuedSynchronizer.java:2123)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.5/ScheduledThreadPoolExecutor.java:1182)
        at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(java.base@11.0.5/ScheduledThreadPoolExecutor.java:899)
        at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@11.0.5/ThreadPoolExecutor.java:1054)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.5/ThreadPoolExecutor.java:1114)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.5/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"JMX server connection timeout 31" #31 daemon prio=9 os_prio=31 cpu=10.23ms elapsed=27.97s tid=0x00007ffbed0e5000 nid=0x7c03 in Object.wait()  [0x0000700007a5f000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(java.base@11.0.5/Native Method)
        - waiting on <no object reference available>
        at com.sun.jmx.remote.internal.ServerCommunicatorAdmin$Timeout.run(java.management@11.0.5/ServerCommunicatorAdmin.java:171)
        - waiting to re-lock in wait() <0x00000007ce79c988> (a [I)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - None

"RMI TCP Connection(2)-127.0.0.1" #32 daemon prio=9 os_prio=31 cpu=61.73ms elapsed=25.67s tid=0x00007ffbeb0a2000 nid=0x8703 runnable  [0x0000700007b60000]
   java.lang.Thread.State: RUNNABLE
        at java.net.SocketInputStream.socketRead0(java.base@11.0.5/Native Method)
        at java.net.SocketInputStream.socketRead(java.base@11.0.5/SocketInputStream.java:115)
        at java.net.SocketInputStream.read(java.base@11.0.5/SocketInputStream.java:168)
        at java.net.SocketInputStream.read(java.base@11.0.5/SocketInputStream.java:140)
        at java.io.BufferedInputStream.fill(java.base@11.0.5/BufferedInputStream.java:252)
        at java.io.BufferedInputStream.read(java.base@11.0.5/BufferedInputStream.java:271)
        - locked <0x00000007ce380948> (a java.io.BufferedInputStream)
        at java.io.FilterInputStream.read(java.base@11.0.5/FilterInputStream.java:83)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(java.rmi@11.0.5/TCPTransport.java:544)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(java.rmi@11.0.5/TCPTransport.java:796)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(java.rmi@11.0.5/TCPTransport.java:677)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$875/0x0000000800574040.run(java.rmi@11.0.5/Unknown Source)
        at java.security.AccessController.doPrivileged(java.base@11.0.5/Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(java.rmi@11.0.5/TCPTransport.java:676)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@11.0.5/ThreadPoolExecutor.java:1128)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@11.0.5/ThreadPoolExecutor.java:628)
        at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)

   Locked ownable synchronizers:
        - <0x00000007ce807970> (a java.util.concurrent.ThreadPoolExecutor$Worker)

"VM Thread" os_prio=31 cpu=102.24ms elapsed=95.70s tid=0x00007ffbe8802000 nid=0x3203 runnable  

"GC Thread#0" os_prio=31 cpu=26.11ms elapsed=95.71s tid=0x00007ffbec010000 nid=0x5103 runnable  

"GC Thread#1" os_prio=31 cpu=26.50ms elapsed=95.28s tid=0x00007ffbe9994000 nid=0x5f03 runnable  

"GC Thread#2" os_prio=31 cpu=26.14ms elapsed=95.28s tid=0x00007ffbea804800 nid=0xa003 runnable  

"GC Thread#3" os_prio=31 cpu=26.84ms elapsed=95.28s tid=0x00007ffbea805800 nid=0x6003 runnable  

"GC Thread#4" os_prio=31 cpu=26.49ms elapsed=95.28s tid=0x00007ffbe95bf000 nid=0x9e03 runnable  

"GC Thread#5" os_prio=31 cpu=26.18ms elapsed=95.28s tid=0x00007ffbeb99d000 nid=0x6303 runnable  

"G1 Main Marker" os_prio=31 cpu=0.81ms elapsed=95.71s tid=0x00007ffbeb821000 nid=0x4f03 runnable  

"G1 Conc#0" os_prio=31 cpu=9.62ms elapsed=95.71s tid=0x00007ffbea804000 nid=0x4d03 runnable  

"G1 Conc#1" os_prio=31 cpu=8.54ms elapsed=94.18s tid=0x00007ffbeba9e800 nid=0x9203 runnable  

"G1 Refine#0" os_prio=31 cpu=0.29ms elapsed=95.71s tid=0x00007ffbeb8c1800 nid=0x4b03 runnable  

"G1 Young RemSet Sampling" os_prio=31 cpu=18.56ms elapsed=95.71s tid=0x00007ffbec011000 nid=0x4903 runnable  
"VM Periodic Task Thread" os_prio=31 cpu=65.39ms elapsed=95.47s tid=0x00007ffbeb9cd000 nid=0xa503 waiting on condition  

JNI global refs: 25, weak refs: 0

The tests would get stuck when running in headless mode through monocle, but never got stuck with actually displaying the graphics.

The one change I noticed caused the tests to get unstuck (might just be a read herring) was:

Not Stuck

 @Start
  void onStart(Stage testStage) throws Exception {
    testStage.setScene(new Scene(new GridPane(), 400, 400));
    testStage.show();
  }

Stuck

@Start
  void onStart(Stage testStage) throws Exception {
    testStage.show();
  }

Hopefully that can guide whoever lands on this sometime in the future.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants