Skip to content

Commit ccda308

Browse files
Copilotrubensworks
andauthored
Stabilize ScriptingData watcher tests for CI matrix reliability
Agent-Logs-Url: https://github.com/CyclopsMC/IntegratedScripting/sessions/8f7f33aa-51b9-40b9-874b-0b54dd8b5af7 Co-authored-by: rubensworks <440384+rubensworks@users.noreply.github.com>
1 parent 64b20a9 commit ccda308

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

src/test/java/org/cyclops/integratedscripting/core/network/ScriptingDataTest.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
import org.junit.Test;
66

77
import java.io.IOException;
8+
import java.lang.reflect.Field;
89
import java.nio.file.Files;
910
import java.nio.file.Path;
11+
import java.util.Map;
1012

1113
import static org.hamcrest.CoreMatchers.equalTo;
1214
import static org.hamcrest.CoreMatchers.hasItem;
@@ -15,20 +17,22 @@
1517

1618
public 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

Comments
 (0)