diff --git a/src/test/java/com/google/devtools/build/lib/util/ThreadUtilsTest.java b/src/test/java/com/google/devtools/build/lib/util/ThreadUtilsTest.java index a0c37ac349aeff..da90826233bc90 100644 --- a/src/test/java/com/google/devtools/build/lib/util/ThreadUtilsTest.java +++ b/src/test/java/com/google/devtools/build/lib/util/ThreadUtilsTest.java @@ -74,10 +74,17 @@ public void handleCrash(Crash crash, CrashContext ctx) { .hasCauseThat() .hasMessageThat() .isEqualTo("(Wrapper exception for longest stack trace) interrupt message"); - assertThat(reportedException.get().getCause().getStackTrace()[0].getMethodName()) - .isEqualTo("sleep"); - assertThat(reportedException.get().getCause().getStackTrace()[1].getMethodName()) - .isEqualTo("recursiveMethodNoPark"); + // The topmost method is either "sleep" or "sleep0". For example, in JDK 21, "Thread.sleep" + // calls a "sleep0" native method. + StackTraceElement[] stackTrace = reportedException.get().getCause().getStackTrace(); + if (stackTrace[0].getMethodName().equals("sleep0")) { + assertThat(stackTrace[1].getMethodName()).isEqualTo("sleep"); + assertThat(stackTrace[2].getMethodName()).isEqualTo("recursiveMethodNoPark"); + } else { + assertThat(stackTrace[0].getMethodName()).isEqualTo("sleep"); + assertThat(stackTrace[1].getMethodName()).isEqualTo("recursiveMethodNoPark"); + } + future.set(1); for (Thread thread : parkThreads) { thread.join();