You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
301 lines
13 KiB
301 lines
13 KiB
/* |
|
* 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.dolphinscheduler.plugin.task.java; |
|
|
|
import static org.apache.dolphinscheduler.plugin.task.api.enums.DataType.VARCHAR; |
|
import static org.apache.dolphinscheduler.plugin.task.api.enums.Direct.IN; |
|
import static org.apache.dolphinscheduler.plugin.task.java.JavaConstants.RUN_TYPE_JAR; |
|
import static org.apache.dolphinscheduler.plugin.task.java.JavaConstants.RUN_TYPE_JAVA; |
|
|
|
import org.apache.dolphinscheduler.common.utils.JSONUtils; |
|
import org.apache.dolphinscheduler.plugin.task.api.TaskCallBack; |
|
import org.apache.dolphinscheduler.plugin.task.api.TaskExecutionContext; |
|
import org.apache.dolphinscheduler.plugin.task.api.model.ApplicationInfo; |
|
import org.apache.dolphinscheduler.plugin.task.api.model.Property; |
|
import org.apache.dolphinscheduler.plugin.task.api.model.ResourceInfo; |
|
import org.apache.dolphinscheduler.plugin.task.api.resource.ResourceContext; |
|
import org.apache.dolphinscheduler.plugin.task.java.exception.JavaSourceFileExistException; |
|
import org.apache.dolphinscheduler.plugin.task.java.exception.PublicClassNotFoundException; |
|
import org.apache.dolphinscheduler.plugin.task.java.exception.RunTypeNotFoundException; |
|
|
|
import java.io.File; |
|
import java.io.IOException; |
|
import java.lang.reflect.Field; |
|
import java.nio.file.Files; |
|
import java.nio.file.Path; |
|
import java.nio.file.Paths; |
|
import java.util.ArrayList; |
|
|
|
import org.junit.jupiter.api.Assertions; |
|
import org.junit.jupiter.api.Test; |
|
|
|
public class JavaTaskTest { |
|
|
|
private TaskCallBack taskCallBack = new TaskCallBack() { |
|
|
|
@Override |
|
public void updateRemoteApplicationInfo(int taskInstanceId, ApplicationInfo applicationInfo) { |
|
|
|
} |
|
|
|
@Override |
|
public void updateTaskInstanceInfo(int taskInstanceId) { |
|
|
|
} |
|
}; |
|
|
|
@Test |
|
public void testGetPubllicClassName() { |
|
JavaTask javaTask = runJavaType(); |
|
Assertions.assertEquals(javaTask.getPublicClassName("import java.io.IOException;\n" + |
|
"public class JavaTaskTest {\n" + |
|
" public static void main(String[] args) throws IOException {\n" + |
|
" StringBuilder builder = new StringBuilder(\"Hello: \");\n" + |
|
" for (String arg : args) {\n" + |
|
" builder.append(arg).append(\" \");\n" + |
|
" }\n" + |
|
" System.out.println(builder);\n" + |
|
" }\n" + |
|
"}\n"), "JavaTaskTest"); |
|
} |
|
|
|
/** |
|
* Construct a java -jar command |
|
* |
|
* @return void |
|
**/ |
|
@Test |
|
public void buildJarCommand() { |
|
String homeBinPath = JavaConstants.JAVA_HOME_VAR + File.separator + "bin" + File.separator; |
|
JavaTask javaTask = runJarType(); |
|
Assertions.assertEquals(javaTask.buildJarCommand(), homeBinPath |
|
+ "java --class-path .:/tmp/dolphinscheduler/test/executepath:/tmp/dolphinscheduler/test/executepath/opt/share/jar/resource2.jar -jar /tmp/dolphinscheduler/test/executepath/opt/share/jar/main.jar -host 127.0.0.1 -port 8080 -xms:50m"); |
|
} |
|
|
|
/** |
|
* Construct the compile command |
|
* |
|
* @return void |
|
**/ |
|
@Test |
|
public void buildJavaCompileCommand() throws IOException { |
|
JavaTask javaTask = runJavaType(); |
|
String sourceCode = javaTask.buildJavaSourceContent(); |
|
String publicClassName = javaTask.getPublicClassName(sourceCode); |
|
Assertions.assertEquals("JavaTaskTest", publicClassName); |
|
String fileName = javaTask.buildJavaSourceCodeFileFullName(publicClassName); |
|
try { |
|
String homeBinPath = JavaConstants.JAVA_HOME_VAR + File.separator + "bin" + File.separator; |
|
Path path = Paths.get(fileName); |
|
if (Files.exists(path)) { |
|
Files.delete(path); |
|
} |
|
Assertions.assertEquals(homeBinPath |
|
+ "javac --class-path .:/tmp/dolphinscheduler/test/executepath:/tmp/dolphinscheduler/test/executepath/opt/share/jar/resource2.jar /tmp/dolphinscheduler/test/executepath/JavaTaskTest.java", |
|
javaTask.buildJavaCompileCommand(sourceCode)); |
|
} finally { |
|
Path path = Paths.get(fileName); |
|
if (Files.exists(path)) { |
|
Files.delete(path); |
|
} |
|
} |
|
|
|
} |
|
|
|
/** |
|
* Construct java to run the command |
|
* |
|
* @return void |
|
**/ |
|
@Test |
|
public void buildJavaCommand() throws Exception { |
|
String wantJavaCommand = |
|
"${JAVA_HOME}/bin/javac --class-path .:/tmp/dolphinscheduler/test/executepath:/tmp/dolphinscheduler/test/executepath/opt/share/jar/resource2.jar /tmp/dolphinscheduler/test/executepath/JavaTaskTest.java;${JAVA_HOME}/bin/java --class-path .:/tmp/dolphinscheduler/test/executepath:/tmp/dolphinscheduler/test/executepath/opt/share/jar/resource2.jar JavaTaskTest -host 127.0.0.1 -port 8080 -xms:50m"; |
|
JavaTask javaTask = runJavaType(); |
|
String sourceCode = javaTask.buildJavaSourceContent(); |
|
String publicClassName = javaTask.getPublicClassName(sourceCode); |
|
Assertions.assertEquals("JavaTaskTest", publicClassName); |
|
String fileName = javaTask.buildJavaSourceCodeFileFullName(publicClassName); |
|
Path path = Paths.get(fileName); |
|
if (Files.exists(path)) { |
|
Files.delete(path); |
|
} |
|
Assertions.assertEquals(wantJavaCommand, javaTask.buildJavaCommand()); |
|
} |
|
|
|
/** |
|
* There is no exception to overwriting the Java source file |
|
* @return void |
|
* @throws IOException |
|
**/ |
|
@Test |
|
public void coverJavaSourceFileExistException() throws IOException { |
|
JavaTask javaTask = runJavaType(); |
|
String sourceCode = javaTask.buildJavaSourceContent(); |
|
String publicClassName = javaTask.getPublicClassName(sourceCode); |
|
Assertions.assertEquals("JavaTaskTest", publicClassName); |
|
String fileName = javaTask.buildJavaSourceCodeFileFullName(publicClassName); |
|
|
|
Assertions.assertThrows(JavaSourceFileExistException.class, () -> { |
|
try { |
|
Path path = Paths.get(fileName); |
|
if (!Files.exists(path)) { |
|
Files.createDirectories(path); |
|
} |
|
javaTask.createJavaSourceFileIfNotExists(sourceCode, fileName); |
|
} finally { |
|
Path path = Paths.get(fileName); |
|
if (Files.exists(path)) { |
|
Files.delete(path); |
|
} |
|
} |
|
}); |
|
} |
|
|
|
/** |
|
* The override class name could not find an exception |
|
* |
|
* @return void |
|
**/ |
|
@Test |
|
public void coverPublicClassNotFoundException() { |
|
Assertions.assertThrows(PublicClassNotFoundException.class, () -> { |
|
JavaTask javaTask = runJavaType(); |
|
javaTask.getPublicClassName(""); |
|
}); |
|
} |
|
|
|
/** |
|
* The override run mode could not find an exception |
|
* |
|
* @return void |
|
* @throws Exception |
|
**/ |
|
@Test |
|
public void coverRunTypeNotFoundException() throws Exception { |
|
JavaTask javaTask = runJavaType(); |
|
Field javaParameters = JavaTask.class.getDeclaredField("javaParameters"); |
|
javaParameters.setAccessible(true); |
|
((JavaParameters) (javaParameters.get(javaTask))).setRunType(""); |
|
|
|
Assertions.assertThrows(RunTypeNotFoundException.class, () -> { |
|
javaTask.handle(taskCallBack); |
|
javaTask.getPublicClassName(""); |
|
}); |
|
} |
|
|
|
/** |
|
* Create a Java task parameter mock object |
|
* |
|
* @param runType |
|
* @return JavaParameters |
|
**/ |
|
public JavaParameters createJavaParametersObject(String runType) { |
|
JavaParameters javaParameters = new JavaParameters(); |
|
javaParameters.setRunType(runType); |
|
javaParameters.setModulePath(false); |
|
javaParameters.setJvmArgs("-xms:50m"); |
|
javaParameters.setMainArgs("-host 127.0.0.1 -port 8080"); |
|
ResourceInfo resourceJar = new ResourceInfo(); |
|
resourceJar.setResourceName("/opt/share/jar/resource2.jar"); |
|
ArrayList<ResourceInfo> resourceInfoArrayList = new ArrayList<>(); |
|
resourceInfoArrayList.add(resourceJar); |
|
javaParameters.setResourceList(resourceInfoArrayList); |
|
javaParameters.setRawScript( |
|
"import java.io.IOException;\n" + |
|
"public class JavaTaskTest {\n" + |
|
" public static void main(String[] args) throws IOException {\n" + |
|
" StringBuilder builder = new StringBuilder(\"Hello: \");\n" + |
|
" for (String arg : args) {\n" + |
|
" builder.append(arg).append(\" \");\n" + |
|
" }\n" + " System.out.println(builder);\n" + |
|
" }\n" + |
|
"}\n"); |
|
ArrayList<Property> localParams = new ArrayList<>(); |
|
Property property = new Property(); |
|
property.setProp("name"); |
|
property.setValue("zhangsan"); |
|
property.setDirect(IN); |
|
property.setType(VARCHAR); |
|
javaParameters.setLocalParams(localParams); |
|
ResourceInfo mainJar = new ResourceInfo(); |
|
mainJar.setResourceName("/opt/share/jar/main.jar"); |
|
javaParameters.setMainJar(mainJar); |
|
return javaParameters; |
|
} |
|
|
|
/** |
|
* A Java task that constructs the Java runtime pattern |
|
* |
|
* @return JavaTask |
|
**/ |
|
public JavaTask runJavaType() { |
|
TaskExecutionContext taskExecutionContext = new TaskExecutionContext(); |
|
taskExecutionContext.setTaskParams(JSONUtils.toJsonString(createJavaParametersObject(RUN_TYPE_JAVA))); |
|
taskExecutionContext.setExecutePath("/tmp/dolphinscheduler/test/executepath"); |
|
taskExecutionContext.setTaskAppId("runJavaType"); |
|
ResourceContext.ResourceItem resourceItem1 = new ResourceContext.ResourceItem(); |
|
resourceItem1.setResourceAbsolutePathInStorage("/opt/share/jar/resource2.jar"); |
|
resourceItem1.setResourceAbsolutePathInLocal("opt/share/jar/resource2.jar"); |
|
|
|
ResourceContext.ResourceItem resourceItem2 = new ResourceContext.ResourceItem(); |
|
resourceItem2.setResourceAbsolutePathInStorage("/opt/share/jar/main.jar"); |
|
resourceItem2.setResourceAbsolutePathInLocal("opt/share/jar/main.jar"); |
|
|
|
ResourceContext.ResourceItem resourceItem3 = new ResourceContext.ResourceItem(); |
|
resourceItem2.setResourceAbsolutePathInStorage("/JavaTaskTest.java"); |
|
resourceItem2.setResourceAbsolutePathInLocal("JavaTaskTest.java"); |
|
|
|
ResourceContext resourceContext = new ResourceContext(); |
|
resourceContext.addResourceItem(resourceItem1); |
|
resourceContext.addResourceItem(resourceItem2); |
|
resourceContext.addResourceItem(resourceItem3); |
|
taskExecutionContext.setResourceContext(resourceContext); |
|
JavaTask javaTask = new JavaTask(taskExecutionContext); |
|
javaTask.init(); |
|
return javaTask; |
|
} |
|
|
|
/** |
|
* The Java task to construct the jar run mode |
|
* |
|
* @return JavaTask |
|
**/ |
|
private JavaTask runJarType() { |
|
TaskExecutionContext taskExecutionContext = new TaskExecutionContext(); |
|
taskExecutionContext.setTaskParams(JSONUtils.toJsonString(createJavaParametersObject(RUN_TYPE_JAR))); |
|
taskExecutionContext.setExecutePath("/tmp/dolphinscheduler/test/executepath"); |
|
taskExecutionContext.setTaskAppId("runJavaType"); |
|
ResourceContext.ResourceItem resourceItem1 = new ResourceContext.ResourceItem(); |
|
resourceItem1.setResourceAbsolutePathInStorage("/opt/share/jar/resource2.jar"); |
|
resourceItem1.setResourceAbsolutePathInLocal("opt/share/jar/resource2.jar"); |
|
|
|
ResourceContext.ResourceItem resourceItem2 = new ResourceContext.ResourceItem(); |
|
resourceItem2.setResourceAbsolutePathInStorage("/opt/share/jar/main.jar"); |
|
resourceItem2.setResourceAbsolutePathInLocal("opt/share/jar/main.jar"); |
|
|
|
ResourceContext resourceContext = new ResourceContext(); |
|
resourceContext.addResourceItem(resourceItem1); |
|
resourceContext.addResourceItem(resourceItem2); |
|
taskExecutionContext.setResourceContext(resourceContext); |
|
|
|
JavaTask javaTask = new JavaTask(taskExecutionContext); |
|
javaTask.init(); |
|
return javaTask; |
|
} |
|
}
|
|
|