Skip to content

Commit a86947c

Browse files
authored
feat(runtime): enforce Java 17 for ARM64 (#6459)
1 parent 6e5eda8 commit a86947c

File tree

2 files changed

+47
-12
lines changed

2 files changed

+47
-12
lines changed

framework/src/test/java/org/tron/core/exception/TronErrorTest.java

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
import static org.junit.Assert.assertEquals;
44
import static org.junit.Assert.assertThrows;
5+
import static org.junit.Assert.fail;
56
import static org.mockito.ArgumentMatchers.any;
67
import static org.mockito.Mockito.mockStatic;
8+
import static org.mockito.Mockito.never;
9+
import static org.mockito.Mockito.times;
710

811
import com.typesafe.config.Config;
912
import com.typesafe.config.ConfigFactory;
@@ -127,25 +130,53 @@ public void shutdownBlockTimeInitTest() {
127130

128131
@Test
129132
public void testThrowIfUnsupportedJavaVersion() {
130-
runArchTest(true, false, true);
131-
runArchTest(true, true, false);
132-
runArchTest(false, false, false);
133+
runArchTest("x86_64", "1.8", false);
134+
runArchTest("x86_64", "11", true);
135+
runArchTest("x86_64", "17", true);
136+
runArchTest("aarch64", "17", false);
137+
runArchTest("aarch64", "1.8", true);
138+
runArchTest("aarch64", "11", true);
133139
}
134140

135-
private void runArchTest(boolean isX86, boolean isJava8, boolean expectThrow) {
141+
private void runArchTest(String osArch, String javaVersion, boolean expectThrow) {
136142
try (MockedStatic<Arch> mocked = mockStatic(Arch.class)) {
143+
boolean isX86 = "x86_64".equals(osArch);
144+
boolean isArm64 = "aarch64".equals(osArch);
145+
146+
boolean isJava8 = "1.8".equals(javaVersion);
147+
boolean isJava17 = "17".equals(javaVersion);
148+
137149
mocked.when(Arch::isX86).thenReturn(isX86);
150+
mocked.when(Arch::isArm64).thenReturn(isArm64);
151+
138152
mocked.when(Arch::isJava8).thenReturn(isJava8);
139-
mocked.when(Arch::getOsArch).thenReturn("x86_64");
140-
mocked.when(Arch::javaSpecificationVersion).thenReturn("17");
141-
mocked.when(Arch::withAll).thenReturn("");
153+
mocked.when(Arch::isJava17).thenReturn(isJava17);
154+
155+
mocked.when(Arch::getOsArch).thenReturn(osArch);
156+
mocked.when(Arch::javaSpecificationVersion).thenReturn(javaVersion);
157+
mocked.when(Arch::withAll).thenReturn(String.format(
158+
"Architecture: %s, Java Version: %s", osArch, javaVersion));
159+
142160
mocked.when(Arch::throwIfUnsupportedJavaVersion).thenCallRealMethod();
143161

144162
if (expectThrow) {
145-
assertEquals(TronError.ErrCode.JDK_VERSION, assertThrows(
146-
TronError.class, () -> Args.setParam(new String[]{}, Constant.TEST_CONF)).getErrCode());
163+
TronError err = assertThrows(
164+
TronError.class, () -> Args.setParam(new String[]{}, Constant.TEST_CONF));
165+
166+
String expectedJavaVersion = isX86 ? "1.8" : "17";
167+
String expectedMessage = String.format(
168+
"Java %s is required for %s architecture. Detected version %s",
169+
expectedJavaVersion, osArch, javaVersion);
170+
assertEquals(expectedMessage, err.getCause().getMessage());
171+
assertEquals(TronError.ErrCode.JDK_VERSION, err.getErrCode());
172+
mocked.verify(Arch::withAll, times(1));
147173
} else {
148-
Arch.throwIfUnsupportedJavaVersion();
174+
try {
175+
Arch.throwIfUnsupportedJavaVersion();
176+
} catch (Exception e) {
177+
fail("Expected no exception, but got: " + e.getMessage());
178+
}
179+
mocked.verify(Arch::withAll, never());
149180
}
150181
}
151182
}

platform/src/main/java/common/org/tron/common/arch/Arch.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,15 @@ public static boolean isJava8() {
6969
return javaSpecificationVersion().equals("1.8");
7070
}
7171

72+
public static boolean isJava17() {
73+
return javaSpecificationVersion().equals("17");
74+
}
75+
7276
public static void throwIfUnsupportedJavaVersion() {
73-
if (isX86() && !isJava8()) {
77+
if ((isX86() && !isJava8()) || (isArm64() && !isJava17())) {
7478
logger.info(withAll());
7579
throw new UnsupportedOperationException(String.format(
76-
"Java %s is required for %s architecture. Detected version %s", "1.8",
80+
"Java %s is required for %s architecture. Detected version %s", isX86() ? "1.8" : "17",
7781
getOsArch(), javaSpecificationVersion()));
7882
}
7983
}

0 commit comments

Comments
 (0)