Skip to content

Commit 7f237fd

Browse files
authored
feat(exit): throw TronError if the JDK does not support (#6455)
1 parent ac6bc5f commit 7f237fd

File tree

4 files changed

+45
-5
lines changed

4 files changed

+45
-5
lines changed

common/src/main/java/org/tron/core/exception/TronError.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public enum ErrCode {
4747
LOG_LOAD(1),
4848
WITNESS_INIT(1),
4949
RATE_LIMITER_INIT(1),
50+
JDK_VERSION(1),
5051
SOLID_NODE_INIT(0);
5152

5253
private final int code;

framework/src/main/java/org/tron/core/config/args/Args.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.tron.core.config.args;
22

33
import static java.lang.System.exit;
4+
import static org.fusesource.jansi.Ansi.ansi;
45
import static org.tron.common.math.Maths.max;
56
import static org.tron.common.math.Maths.min;
67
import static org.tron.core.Constant.ADD_PRE_FIX_BYTE_MAINNET;
@@ -45,6 +46,7 @@
4546
import lombok.extern.slf4j.Slf4j;
4647
import org.apache.commons.collections4.CollectionUtils;
4748
import org.apache.commons.lang3.StringUtils;
49+
import org.fusesource.jansi.AnsiConsole;
4850
import org.springframework.beans.factory.annotation.Autowired;
4951
import org.springframework.stereotype.Component;
5052
import org.tron.common.arch.Arch;
@@ -374,7 +376,17 @@ private static Map<String, String[]> getOptionGroup() {
374376
* set parameters.
375377
*/
376378
public static void setParam(final String[] args, final String confFileName) {
377-
Arch.throwIfUnsupportedJavaVersion();
379+
try {
380+
Arch.throwIfUnsupportedJavaVersion();
381+
} catch (UnsupportedOperationException e) {
382+
AnsiConsole.systemInstall();
383+
// To avoid confusion caused by silent execution when using -h or -v flags,
384+
// errors are explicitly logged to the console in this context.
385+
// Console output is not required for errors in other scenarios.
386+
System.out.println(ansi().fgRed().a(e.getMessage()).reset());
387+
AnsiConsole.systemUninstall();
388+
throw new TronError(e, TronError.ErrCode.JDK_VERSION);
389+
}
378390
clearParam(); // reset all parameters to avoid the influence in test
379391
JCommander.newBuilder().addObject(PARAMETER).build().parse(args);
380392
if (PARAMETER.version) {

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

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.mockito.MockedStatic;
2525
import org.mockito.Mockito;
2626
import org.mockito.junit.MockitoJUnitRunner;
27+
import org.tron.common.arch.Arch;
2728
import org.tron.common.log.LogService;
2829
import org.tron.common.parameter.RateLimiterInitialization;
2930
import org.tron.common.utils.ReflectUtils;
@@ -41,7 +42,7 @@ public class TronErrorTest {
4142
public TemporaryFolder temporaryFolder = new TemporaryFolder();
4243

4344
@After
44-
public void clearMocks() {
45+
public void clearMocks() {
4546
Mockito.clearAllCaches();
4647
Args.clearParam();
4748
}
@@ -115,12 +116,38 @@ public void rateLimiterServletInitTest() {
115116

116117
@Test
117118
public void shutdownBlockTimeInitTest() {
118-
Map<String,String> params = new HashMap<>();
119+
Map<String, String> params = new HashMap<>();
119120
params.put(Constant.NODE_SHUTDOWN_BLOCK_TIME, "0");
120121
params.put("storage.db.directory", "database");
121122
Config config = ConfigFactory.defaultOverrides().withFallback(
122123
ConfigFactory.parseMap(params));
123124
TronError thrown = assertThrows(TronError.class, () -> Args.setParam(config));
124125
assertEquals(TronError.ErrCode.AUTO_STOP_PARAMS, thrown.getErrCode());
125126
}
127+
128+
@Test
129+
public void testThrowIfUnsupportedJavaVersion() {
130+
runArchTest(true, false, true);
131+
runArchTest(true, true, false);
132+
runArchTest(false, false, false);
133+
}
134+
135+
private void runArchTest(boolean isX86, boolean isJava8, boolean expectThrow) {
136+
try (MockedStatic<Arch> mocked = mockStatic(Arch.class)) {
137+
mocked.when(Arch::isX86).thenReturn(isX86);
138+
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("");
142+
mocked.when(Arch::throwIfUnsupportedJavaVersion).thenCallRealMethod();
143+
144+
if (expectThrow) {
145+
assertEquals(TronError.ErrCode.JDK_VERSION, assertThrows(
146+
TronError.class, () -> Args.setParam(new String[]{}, Constant.TEST_CONF)).getErrCode());
147+
} else {
148+
Arch.throwIfUnsupportedJavaVersion();
149+
}
150+
}
151+
}
152+
126153
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ public static void throwIfUnsupportedJavaVersion() {
7373
if (isX86() && !isJava8()) {
7474
logger.info(withAll());
7575
throw new UnsupportedOperationException(String.format(
76-
"Java %s is required for %s architecture. Detected version %s",
77-
"1.8 ", getOsArch(), javaSpecificationVersion()));
76+
"Java %s is required for %s architecture. Detected version %s", "1.8",
77+
getOsArch(), javaSpecificationVersion()));
7878
}
7979
}
8080

0 commit comments

Comments
 (0)