On Fri, 12 Mar 2021 15:11:42 GMT, Florian Kirmaier <fkirma...@openjdk.org> 
wrote:

>> tests/system/src/test/java/test/javafx/scene/StyleMemoryLeakTest.java line 
>> 106:
>> 
>>> 104:         });
>>> 105:     }
>>> 106: }
>> 
>> In order to make this test similar to existing system tests, I made some 
>> relevant changes. Modified test is added below.
>> The modified test fails with this fix, but I expected it to pass. Can you 
>> please check this.
>> 
>> Changes are 
>> 1. `Thread.sleep()` is removed.
>> 2. `root` and `toBeRemoved` button are now class members.
>> 3. Scenegraph is constructed and shown in `TestApp.start()` method.
>> 
>> 
>> public class StyleMemoryLeakTest {
>> 
>>     static CountDownLatch startupLatch;
>>     static Stage stage;
>>     static Button toBeRemoved;
>>     static Group root;
>> 
>>     public static class TestApp extends Application {
>> 
>>         @Override
>>         public void start(Stage primaryStage) throws Exception {
>>             stage = primaryStage;
>>             toBeRemoved = new Button();
>>             root = new Group();
>>             root.getChildren().add(toBeRemoved);
>>             stage.setScene(new Scene(root));
>>             stage.setOnShown(l -> {
>>                 Platform.runLater(() -> startupLatch.countDown());
>>             });
>>             stage.show();
>>         }
>>     }
>> 
>>     @BeforeClass
>>     public static void initFX() throws Exception {
>>         startupLatch = new CountDownLatch(1);
>>         new Thread(() -> 
>> Application.launch(StyleMemoryLeakTest.TestApp.class, 
>> (String[])null)).start();
>>         assertTrue("Timeout waiting for FX runtime to start", 
>> startupLatch.await(15, TimeUnit.SECONDS));
>>     }
>> 
>>     @Test
>>     public void testRootNodeMemoryLeak() throws Exception {
>>         Util.runAndWait(() -> {
>>             root.getChildren().clear();
>>             stage.hide();
>>         });
>>         JMemoryBuddy.memoryTest((checker) -> {
>>             checker.assertCollectable(stage);
>>             checker.setAsReferenced(toBeRemoved);
>>             stage = null;
>>         });
>>     }
>> 
>>     @AfterClass
>>     public static void teardownOnce() {
>>         Platform.runLater(() -> {
>>             Platform.exit();
>>         });
>>     }
>> }
>
> I've added your verison of the unit-test. You forgot `root = null;` which was 
> why the test failed.
> 
> If I would rewrite the test, I would put everything into the TestMethod. 
> Because this way it's not necessary to set all the class-variables to null. 
> It also wouldn't reuse the Stage of the Application. The scope of the test 
> would be much smaller, because the actual test and the initialization of 
> JavaFX would be separated. 
> 
> Should I change it that way?

I am fine with that too. In that case my only suggestion would be, use method 
`Stage.setOnShown()` like in the current version to make sure that `Stage` is 
shown and not to rely on `Thread.sleep()`.




> It also wouldn't reuse the Stage of the Application.

In that case, test will not require the `TestApp` class. You can use 
`Platform.startup()` method to start JavaFX runtime and also **may** need a 
call to `Platform.setImplicitExit​(false)` to make sure JavaFX runtime does not 
exit when Stage is hidden. This way we can add multiple tests that create and 
hide stage in a same test file.

-------------

PR: https://git.openjdk.java.net/jfx/pull/424

Reply via email to