55import org .junit .Test ;
66
77import java .io .IOException ;
8+ import java .lang .reflect .Field ;
89import java .nio .file .Files ;
910import java .nio .file .Path ;
11+ import java .util .Map ;
1012
1113import static org .hamcrest .CoreMatchers .equalTo ;
1214import static org .hamcrest .CoreMatchers .hasItem ;
1517
1618public class ScriptingDataTest {
1719
18- private static final int AWAIT_TIMEOUT_MS = 5000 ;
20+ private static final int AWAIT_TIMEOUT_MS = 20000 ;
1921 private static final int POLLING_INTERVAL_MS = 25 ;
20- private static final int FILE_SYSTEM_STABILIZATION_DELAY_MS = 200 ;
2122
2223 @ Test
2324 public void testExternalUpdatesOnRuntimeCreatedDiskFolderSynced () throws IOException , InterruptedException {
2425 Path rootPath = Files .createTempDirectory ("integratedscripting-test" );
2526 ScriptingData scriptingData = new ScriptingData (rootPath );
2627 try {
2728 scriptingData .initialize ();
29+ Path disksPath = rootPath .resolve ("scripting-disks" );
30+ awaitCondition (() -> isWatcherRegistered (scriptingData , disksPath ));
2831
29- Path diskPath = rootPath . resolve ( "scripting-disks" ) .resolve ("123" );
32+ Path diskPath = disksPath .resolve ("123" );
3033 Files .createDirectories (diskPath );
3134 awaitCondition (() -> scriptingData .getDisks ().contains (123 ));
35+ awaitCondition (() -> isWatcherRegistered (scriptingData , diskPath ));
3236
3337 Files .writeString (diskPath .resolve ("main.js" ), "export const value = 1;" );
3438 awaitCondition (() -> "export const value = 1;" .equals (scriptingData .getScripts (123 ).get (Path .of ("main.js" ))));
@@ -47,13 +51,14 @@ public void testExternalUpdatesOnRuntimeFirstUsedDiskSynced() throws IOException
4751 ScriptingData scriptingData = new ScriptingData (rootPath );
4852 try {
4953 scriptingData .initialize ();
54+ Path diskPath = rootPath .resolve ("scripting-disks" ).resolve ("456" );
5055
5156 scriptingData .setScript (456 , Path .of ("main.js" ), "export const value = 1;" , IScriptingData .ChangeLocation .MEMORY );
5257 scriptingData .tick ();
53- assertTrue (Files .exists (rootPath . resolve ( "scripting-disks" ). resolve ( "456" ) .resolve ("main.js" )));
54- Thread . sleep ( FILE_SYSTEM_STABILIZATION_DELAY_MS );
58+ assertTrue (Files .exists (diskPath .resolve ("main.js" )));
59+ awaitCondition (() -> isWatcherRegistered ( scriptingData , diskPath ) );
5560
56- Files .writeString (rootPath . resolve ( "scripting-disks" ). resolve ( "456" ) .resolve ("main.js" ), "export const value = 2;" );
61+ Files .writeString (diskPath .resolve ("main.js" ), "export const value = 2;" );
5762 awaitCondition (() -> "export const value = 2;" .equals (scriptingData .getScripts (456 ).get (Path .of ("main.js" ))));
5863
5964 assertThat (scriptingData .getScripts (456 ).get (Path .of ("main.js" )), equalTo ("export const value = 2;" ));
@@ -74,6 +79,17 @@ private static void awaitCondition(Condition condition) throws InterruptedExcept
7479 assertTrue ("Timed out waiting for condition" , condition .matches ());
7580 }
7681
82+ private static boolean isWatcherRegistered (ScriptingData scriptingData , Path path ) {
83+ try {
84+ Field field = ScriptingData .class .getDeclaredField ("pathWatchers" );
85+ field .setAccessible (true );
86+ Map <Path , ?> pathWatchers = (Map <Path , ?>) field .get (scriptingData );
87+ return pathWatchers .containsKey (path );
88+ } catch (IllegalAccessException | NoSuchFieldException e ) {
89+ throw new RuntimeException (e );
90+ }
91+ }
92+
7793 @ FunctionalInterface
7894 private interface Condition {
7995 boolean matches ();
0 commit comments