blob: 182bf9fda6392ca74dcbd32e478843a956184311 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.servicecomb.foundation.common.utils;
import mockit.Mock;
import mockit.MockUp;
import org.apache.servicecomb.foundation.test.scaffolding.exception.RuntimeExceptionWithoutStackTrace;
import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledOnJre;
import org.junit.jupiter.api.condition.JRE;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;
public class TestJvmUtils {
@Test
@Disabled
public void findMainClass_notExist() {
System.clearProperty(JvmUtils.SUN_JAVA_COMMAND);
Assertions.assertNull(JvmUtils.findMainClass());
}
@Test
@Disabled
public void findMainClass_existButEmpty() {
System.setProperty(JvmUtils.SUN_JAVA_COMMAND, "");
Assertions.assertNull(JvmUtils.findMainClass());
}
@Test
@Disabled
public void findMainClass_invalid() {
LogCollector logCollector = new LogCollector();
System.setProperty(JvmUtils.SUN_JAVA_COMMAND, "invalidCls");
Assertions.assertNull(JvmUtils.findMainClass());
Assertions.assertEquals("\"invalidCls\" is not a valid class.", logCollector.getEvents().get(0).getMessage());
logCollector.teardown();
}
@Test
@Disabled
public void findMainClass_class_normal() {
System.setProperty(JvmUtils.SUN_JAVA_COMMAND, TestJvmUtils.class.getName() + " arg");
Assertions.assertEquals(TestJvmUtils.class, JvmUtils.findMainClass());
}
@Test
@Disabled
public void findMainClass_jar_normal() throws Exception {
String command = "a.jar";
String content = String.format("Manifest-Version: 1.0\nMain-Class: %s\n", TestJvmUtils.class.getName());
InputStream inputStream = new ByteArrayInputStream(content.getBytes());
new MockUp<URL>() {
@Mock
InputStream openStream() throws Exception {
return inputStream;
}
};
System.setProperty(JvmUtils.SUN_JAVA_COMMAND, command + " arg");
Assertions.assertEquals(TestJvmUtils.class, JvmUtils.findMainClass());
}
@Test
@Disabled
public void findMainClass_jar_null() throws Exception {
String content = "Manifest-Version: 1.0\n";
InputStream inputStream = new ByteArrayInputStream(content.getBytes());
String command = "a.jar";
new MockUp<URL>() {
@Mock
InputStream openStream() throws Exception {
return inputStream;
}
};
System.setProperty(JvmUtils.SUN_JAVA_COMMAND, command + " arg");
Assertions.assertNull(JvmUtils.findMainClass());
}
@Test
@Disabled
@EnabledOnJre(JRE.JAVA_17)
public void findMainClass_jar_readFailed() throws Exception {
String command = "a.jar";
new MockUp<URL>() {
@Mock
InputStream openStream() throws Exception {
throw new RuntimeExceptionWithoutStackTrace();
}
};
System.setProperty(JvmUtils.SUN_JAVA_COMMAND, command + " arg");
Assertions.assertNull(JvmUtils.findMainClass());
}
@Test
@Disabled
public void findMainClassByStackTrace_normal() throws Exception{
StackTraceElement[] stackTraceElements = {
new StackTraceElement("declaring.class.fileName", "methodName", "fileName", 100),
new StackTraceElement("java.lang.String", "main", "fileName", 120)
};
new MockUp<RuntimeException>() {
@Mock
public StackTraceElement[] getStackTrace() {
return stackTraceElements;
}
};
Assertions.assertEquals(String.class, JvmUtils.findMainClassByStackTrace());
}
@Test
public void findMainClassByStackTrace_invalidClass() throws Exception{
StackTraceElement[] stackTraceElements = {
new StackTraceElement("declaring.class.fileName", "methodName", "fileName", 100),
new StackTraceElement("InvalidClass", "main", "fileName", 120)
};
new MockUp<RuntimeException>() {
@Mock
public StackTraceElement[] getStackTrace() {
return stackTraceElements;
}
};
Assertions.assertNull(JvmUtils.findMainClassByStackTrace());
}
@Test
public void findMainClassByStackTrace_withoutMainMethod() throws Exception{
StackTraceElement[] stackTraceElements = {
new StackTraceElement("declaring.class.fileName", "methodName", "fileName", 100),
new StackTraceElement("InvalidClass", "methodName", "fileName", 120)
};
new MockUp<RuntimeException>() {
@Mock
public StackTraceElement[] getStackTrace() {
return stackTraceElements;
}
};
Assertions.assertNull(JvmUtils.findMainClassByStackTrace());
}
@Test
public void findMainClassByStackTrace_emptyStackTrace() throws Exception{
new MockUp<RuntimeException>() {
@Mock
public StackTraceElement[] getStackTrace() {
return new StackTraceElement[]{};
}
};
Assertions.assertNull(JvmUtils.findMainClassByStackTrace());
}
@Test
public void findMainClassByStackTrace_nullStackTrace() throws Exception{
new MockUp<RuntimeException>() {
@Mock
public StackTraceElement[] getStackTrace() {
return null;
}
};
Assertions.assertNull(JvmUtils.findMainClassByStackTrace());
}
}