test: add jetty ee8 ~ ee10 cases

This commit is contained in:
ReaJason
2025-05-14 00:34:32 +08:00
parent 838bfa0e8a
commit d52f4726aa
14 changed files with 379 additions and 550 deletions
@@ -0,0 +1,7 @@
FROM jetty:12.0-jre21
RUN java -jar /usr/local/jetty/start.jar --add-modules=ee10-deploy
EXPOSE 8080
CMD ["java", "-jar", "/usr/local/jetty/start.jar"]
@@ -0,0 +1,7 @@
FROM jetty:12.0-jre21
RUN java -jar /usr/local/jetty/start.jar --add-modules=ee8-deploy
EXPOSE 8080
CMD ["java", "-jar", "/usr/local/jetty/start.jar"]
@@ -0,0 +1,7 @@
FROM jetty:12.0-jre21
RUN java -jar /usr/local/jetty/start.jar --add-modules=ee9-deploy
EXPOSE 8080
CMD ["java", "-jar", "/usr/local/jetty/start.jar"]
@@ -0,0 +1,12 @@
services:
jetty1221ee10:
build:
dockerfile: ./Dockerfile-ee10
context: .
ports:
- "8080:8080"
- "5005:5005"
environment:
JAVA_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
volumes:
- ../../../vul/vul-webapp-jakarta/build/libs/vul-webapp-jakarta.war:/var/lib/jetty/webapps/app.war
@@ -0,0 +1,12 @@
services:
jetty1221ee8:
build:
dockerfile: ./Dockerfile-ee8
context: .
ports:
- "8080:8080"
- "5005:5005"
environment:
JAVA_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
volumes:
- ../../../vul/vul-webapp/build/libs/vul-webapp.war:/var/lib/jetty/webapps/app.war
@@ -0,0 +1,12 @@
services:
jetty1221ee9:
build:
dockerfile: ./Dockerfile-ee9
context: .
ports:
- "8080:8080"
- "5005:5005"
environment:
JAVA_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
volumes:
- ../../../vul/vul-webapp-jakarta/build/libs/vul-webapp-jakarta.war:/var/lib/jetty/webapps/app.war
@@ -17,6 +17,7 @@ import org.testcontainers.containers.wait.strategy.Wait;
import org.testcontainers.images.builder.ImageFromDockerfile;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.shaded.org.apache.commons.lang3.tuple.Triple;
import java.util.List;
import java.util.stream.Stream;
@@ -33,7 +34,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
@Slf4j
@Testcontainers
public class Jetty11ContainerTest {
public static final String imageName = "jetty:11-jre11";
public static final String imageName = "jetty:11.0-jre17";
static Network network = Network.newNetwork();
@Container
public final static GenericContainer<?> python = new GenericContainer<>(new ImageFromDockerfile()
@@ -52,12 +53,19 @@ public class Jetty11ContainerTest {
static Stream<Arguments> casesProvider() {
Server server = Server.Jetty;
List<String> supportedShellTypes = List.of(
ShellType.JAKARTA_SERVLET, ShellType.JAKARTA_FILTER, ShellType.JAKARTA_LISTENER,
ShellType.JETTY_AGENT_HANDLER,ShellType.JETTY_AGENT_HANDLER_ASM
ShellType.JAKARTA_SERVLET,
ShellType.JAKARTA_FILTER,
ShellType.JAKARTA_LISTENER,
ShellType.JETTY_AGENT_HANDLER,
ShellType.JETTY_AGENT_HANDLER_ASM
);
List<Packers> testPackers = List.of(Packers.JSP);
List<Triple<String, ShellTool, Packers>> unSupportedCases = List.of(
Triple.of(ShellType.JETTY_AGENT_HANDLER, ShellTool.Godzilla, Packers.AgentJar), // jdk module
Triple.of(ShellType.JETTY_AGENT_HANDLER, ShellTool.Behinder, Packers.AgentJar) // jdk module
);
List<Packers> testPackers = List.of(Packers.JSP, Packers.JSPX, Packers.JavaDeserialize);
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers,
null, List.of(ShellTool.AntSword) // AntSword not supported Jakarta
unSupportedCases, List.of(ShellTool.AntSword)
);
}
@@ -70,6 +78,6 @@ public class Jetty11ContainerTest {
@ParameterizedTest(name = "{0}|{1}{2}|{3}")
@MethodSource("casesProvider")
void test(String imageName, String shellType, ShellTool shellTool, Packers packer) {
testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V11, packer, container, python);
testShellInjectAssertOk(getUrl(container), Server.Jetty, shellType, shellTool, Opcodes.V17, packer, container, python);
}
}
@@ -0,0 +1,73 @@
package com.reajason.javaweb.integration.jetty;
import com.reajason.javaweb.integration.TestCasesProvider;
import com.reajason.javaweb.memshell.Packers;
import com.reajason.javaweb.memshell.Server;
import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.ShellType;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.jar.asm.Opcodes;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.testcontainers.containers.DockerComposeContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import java.io.File;
import java.util.List;
import java.util.stream.Stream;
import static com.reajason.javaweb.integration.DoesNotContainExceptionMatcher.doesNotContainException;
import static com.reajason.javaweb.integration.ShellAssertionTool.testShellInjectAssertOk;
import static org.hamcrest.MatcherAssert.assertThat;
/**
* @author ReaJason
* @since 2024/12/7
*/
@Slf4j
@Testcontainers
public class Jetty12ee10ContainerTest {
public static final String imageName = "jetty:12.0-jre21-ee10";
public static final String serviceName = "jetty1221ee10";
@Container
public static final DockerComposeContainer<?> compose =
new DockerComposeContainer<>(new File("docker-compose/jetty/docker-compose-12-jre21-ee10.yaml"))
.withExposedService(serviceName, 8080);
static Stream<Arguments> casesProvider() {
Server server = Server.Jetty;
List<String> supportedShellTypes = List.of(
ShellType.JAKARTA_SERVLET,
ShellType.JAKARTA_FILTER,
ShellType.JAKARTA_LISTENER
);
List<Packers> testPackers = List.of(Packers.Base64);
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers,
null, List.of(ShellTool.AntSword, ShellTool.NeoreGeorg) // AntSword not supported Jakarta
);
}
@AfterAll
static void tearDown() {
String logs = compose.getContainerByServiceName(serviceName).get().getLogs();
assertThat("Logs should not contain any exceptions", logs, doesNotContainException());
}
public static String getUrl() {
String host = compose.getServiceHost(serviceName, 8080);
int port = compose.getServicePort(serviceName, 8080);
String url = "http://" + host + ":" + port + "/app";
log.info("container started, app url is : {}", url);
return url;
}
@ParameterizedTest(name = "{0}|{1}{2}|{3}")
@MethodSource("casesProvider")
void test(String imageName, String shellType, ShellTool shellTool, Packers packer) {
testShellInjectAssertOk(getUrl(), Server.Jetty, shellType, shellTool, Opcodes.V21, packer, null);
}
}
@@ -0,0 +1,73 @@
package com.reajason.javaweb.integration.jetty;
import com.reajason.javaweb.integration.TestCasesProvider;
import com.reajason.javaweb.memshell.Packers;
import com.reajason.javaweb.memshell.Server;
import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.ShellType;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.jar.asm.Opcodes;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.testcontainers.containers.DockerComposeContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import java.io.File;
import java.util.List;
import java.util.stream.Stream;
import static com.reajason.javaweb.integration.DoesNotContainExceptionMatcher.doesNotContainException;
import static com.reajason.javaweb.integration.ShellAssertionTool.testShellInjectAssertOk;
import static org.hamcrest.MatcherAssert.assertThat;
/**
* @author ReaJason
* @since 2024/12/7
*/
@Slf4j
@Testcontainers
public class Jetty12ee8ContainerTest {
public static final String imageName = "jetty:12.0-jre21-ee8";
public static final String serviceName = "jetty1221ee8";
@Container
public static final DockerComposeContainer<?> compose =
new DockerComposeContainer<>(new File("docker-compose/jetty/docker-compose-12-jre21-ee8.yaml"))
.withExposedService(serviceName, 8080);
static Stream<Arguments> casesProvider() {
Server server = Server.Jetty;
List<String> supportedShellTypes = List.of(
ShellType.SERVLET,
ShellType.FILTER,
ShellType.LISTENER
);
List<Packers> testPackers = List.of(Packers.Base64);
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers,
null, List.of(ShellTool.AntSword, ShellTool.NeoreGeorg) // AntSword not supported Jakarta
);
}
@AfterAll
static void tearDown() {
String logs = compose.getContainerByServiceName(serviceName).get().getLogs();
assertThat("Logs should not contain any exceptions", logs, doesNotContainException());
}
public static String getUrl() {
String host = compose.getServiceHost(serviceName, 8080);
int port = compose.getServicePort(serviceName, 8080);
String url = "http://" + host + ":" + port + "/app";
log.info("container started, app url is : {}", url);
return url;
}
@ParameterizedTest(name = "{0}|{1}{2}|{3}")
@MethodSource("casesProvider")
void test(String imageName, String shellType, ShellTool shellTool, Packers packer) {
testShellInjectAssertOk(getUrl(), Server.Jetty, shellType, shellTool, Opcodes.V21, packer, null);
}
}
@@ -0,0 +1,73 @@
package com.reajason.javaweb.integration.jetty;
import com.reajason.javaweb.integration.TestCasesProvider;
import com.reajason.javaweb.memshell.Packers;
import com.reajason.javaweb.memshell.Server;
import com.reajason.javaweb.memshell.ShellTool;
import com.reajason.javaweb.memshell.ShellType;
import lombok.extern.slf4j.Slf4j;
import net.bytebuddy.jar.asm.Opcodes;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.testcontainers.containers.DockerComposeContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import java.io.File;
import java.util.List;
import java.util.stream.Stream;
import static com.reajason.javaweb.integration.DoesNotContainExceptionMatcher.doesNotContainException;
import static com.reajason.javaweb.integration.ShellAssertionTool.testShellInjectAssertOk;
import static org.hamcrest.MatcherAssert.assertThat;
/**
* @author ReaJason
* @since 2024/12/7
*/
@Slf4j
@Testcontainers
public class Jetty12ee9ContainerTest {
public static final String imageName = "jetty:12.0-jre21-ee9";
public static final String serviceName = "jetty1221ee9";
@Container
public static final DockerComposeContainer<?> compose =
new DockerComposeContainer<>(new File("docker-compose/jetty/docker-compose-12-jre21-ee9.yaml"))
.withExposedService(serviceName, 8080);
static Stream<Arguments> casesProvider() {
Server server = Server.Jetty;
List<String> supportedShellTypes = List.of(
ShellType.JAKARTA_SERVLET,
ShellType.JAKARTA_FILTER,
ShellType.JAKARTA_LISTENER
);
List<Packers> testPackers = List.of(Packers.Base64);
return TestCasesProvider.getTestCases(imageName, server, supportedShellTypes, testPackers,
null, List.of(ShellTool.AntSword, ShellTool.NeoreGeorg) // AntSword not supported Jakarta
);
}
@AfterAll
static void tearDown() {
String logs = compose.getContainerByServiceName(serviceName).get().getLogs();
assertThat("Logs should not contain any exceptions", logs, doesNotContainException());
}
public static String getUrl() {
String host = compose.getServiceHost(serviceName, 8080);
int port = compose.getServicePort(serviceName, 8080);
String url = "http://" + host + ":" + port + "/app";
log.info("container started, app url is : {}", url);
return url;
}
@ParameterizedTest(name = "{0}|{1}{2}|{3}")
@MethodSource("casesProvider")
void test(String imageName, String shellType, ShellTool shellTool, Packers packer) {
testShellInjectAssertOk(getUrl(), Server.Jetty, shellType, shellTool, Opcodes.V21, packer, null);
}
}