Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/extra tests for issue 942 #945

Merged
merged 6 commits into from
Feb 21, 2024
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

25 changes: 24 additions & 1 deletion tests/e2e-vm-jdk/pom.xml
Expand Up @@ -2,7 +2,7 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>or.jobrunr.jdk</groupId>
<groupId>org.jobrunr.jdk</groupId>
<artifactId>jdk-testing</artifactId>
<version>1.0-SNAPSHOT</version>

Expand All @@ -24,6 +24,18 @@
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
<profile>
<id>jdk-11</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>11</jdk>
</activation>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
</properties>
</profile>
<profile>
<id>jdk-17</id>
<activation>
Expand All @@ -35,6 +47,17 @@
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>
<profile>
<id>jdk-21</id>
<activation>
<jdk>21</jdk>
</activation>
<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.compilerVersion>21</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>

<build>
Expand Down
@@ -1,5 +1,10 @@
package org.jobrunr.tests.e2e.services;

import org.jobrunr.jobs.context.JobContext;
import org.jobrunr.scheduling.BackgroundJob;

import java.util.UUID;

public class TestService {

public void doWork() {
Expand All @@ -10,4 +15,15 @@ public void doWork(Work work) {
System.out.println("This is a test service " + work.getSomeId() + "; " + work.getSomeString() + "; " + work.getSomeInt() + "; " + work.getSomeLong());
}

public void doWorkWithMultipleParameters(JobContext jobContext, long someLongValue, Work work) {
System.out.println("This is a test service with an extra long value: " + someLongValue + "; Work: " + work.getSomeId() + "; " + work.getSomeString() + "; " + work.getSomeInt() + "; " + work.getSomeLong());
}

public void run() {
Work work = new Work(123, "some string", 456L, UUID.randomUUID());
long someLongValue = 789L;

BackgroundJob.enqueue(() -> this.doWorkWithMultipleParameters(JobContext.Null, someLongValue, work));
}

}
Expand Up @@ -10,7 +10,11 @@
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.UUID;
Expand All @@ -19,11 +23,15 @@
import static java.time.Duration.ofMillis;
import static java.time.Instant.now;
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
import static org.assertj.core.api.Assertions.assertThat;
import static org.awaitility.Awaitility.await;
import static org.jobrunr.jobs.details.JobDetailsGeneratorUtils.toFQResource;
import static org.jobrunr.server.BackgroundJobServerConfiguration.usingStandardBackgroundJobServerConfiguration;
import static org.jobrunr.tests.fromhost.HttpClient.getJson;
import static org.jobrunr.utils.StringUtils.isNullOrEmpty;
import static org.jobrunr.utils.reflection.ReflectionUtils.getValueFromFieldOrProperty;

@EnabledIfEnvironmentVariable(named = "JDK_TEST", matches = "true")
class E2EJDKTest {

private static final TestService testService = new TestService();
Expand Down Expand Up @@ -55,6 +63,17 @@ public static void stopJobRunr() {
.destroy();
}

@Test
void testExpectedJavaClassMajorVersion() throws IOException {
String expectedJavaClassVersion = System.getenv("JAVA_CLASS_VERSION");
if(isNullOrEmpty(expectedJavaClassVersion)) throw new IllegalStateException("The environment variable 'JAVA_CLASS_VERSION' is missing");

String actualJavaClassVersion = getJavaClassMajorVersion(testService);
if(isNullOrEmpty(actualJavaClassVersion)) throw new IllegalStateException("The actual Java Class Version may not be null or empty. ");

assertThat(actualJavaClassVersion).isEqualTo(expectedJavaClassVersion);
}

@Test
void usingLambdaWithIoCLookupUsingInstance() {
BackgroundJob.enqueue(() -> testService.doWork(new Work(1, "Foo", 2L, UUID.randomUUID())));
Expand Down Expand Up @@ -98,6 +117,15 @@ void usingMethodReference() {
void usingMethodReferenceWithoutInstance() {
BackgroundJob.<TestService>enqueue(TestService::doWork);

await()
.atMost(30, TimeUnit.SECONDS)
.untilAsserted(() -> assertThatJson(getSucceededJobs()).inPath("$.items[0].jobHistory[2].state").asString().contains("SUCCEEDED"));
}

@Test
void replicatingJobRunrIssue() {
testService.run();

await()
.atMost(15, TimeUnit.SECONDS)
.untilAsserted(() -> {
Expand Down Expand Up @@ -127,4 +155,16 @@ private String getSucceededJobs() {
private static <T> T jobActivator(Class<T> clazz) {
return (T) testService;
}

private static String getJavaClassMajorVersion(Object object) throws IOException {
String classLocation = "/" + toFQResource(object.getClass().getName()) + ".class";
try (InputStream in = object.getClass().getResourceAsStream(classLocation); DataInputStream data = new DataInputStream(in)) {
if (0xCAFEBABE != data.readInt()) {
throw new IOException("invalid header");
}
int minor = data.readUnsignedShort();
int major = data.readUnsignedShort();
return major + "." + minor;
}
}
}
Expand Up @@ -19,44 +19,51 @@ class JdkTest {

@Test
void jdk8OpenJdk() {
assertThat(buildAndTestOnImage("adoptopenjdk:8-jdk-hotspot")).contains("BUILD SUCCESS");
assertThat(buildAndTestOnImage("adoptopenjdk:8-jdk-hotspot", "52.0")).contains("BUILD SUCCESS");
}

@Test
void jdk11OpenJdk() {
assertThat(buildAndTestOnImage("adoptopenjdk:11-jdk-hotspot")).contains("BUILD SUCCESS");
assertThat(buildAndTestOnImage("adoptopenjdk:11-jdk-hotspot", "55.0")).contains("BUILD SUCCESS");
}

@Test
void jdk17OpenJDK() {
assertThat(buildAndTestOnImage(("aarch64".equals(getProperty("os.arch")) ? "arm64v8" : "amd64") + "/openjdk:17"))
assertThat(buildAndTestOnImage(architecture() + "/openjdk:17", "61.0"))
.contains("BUILD SUCCESS")
.contains("ThreadManager of type 'ScheduledThreadPool' started");
}

@Test
void jdk21EclipseTemurin() {
assertThat(buildAndTestOnImage("eclipse-temurin:21"))
assertThat(buildAndTestOnImage("eclipse-temurin:21", "65.0"))
.contains("BUILD SUCCESS")
.contains("ThreadManager of type 'VirtualThreadPerTask' started");
}

@Test
void jdk21GraalVM() {
assertThat(buildAndTestOnImage("ghcr.io/graalvm/graalvm-community:21"))
assertThat(buildAndTestOnImage("ghcr.io/graalvm/graalvm-community:21", "65.0"))
.contains("BUILD SUCCESS")
.contains("ThreadManager of type 'VirtualThreadPerTask' started");
}

private String buildAndTestOnImage(String dockerfile) {
private String buildAndTestOnImage(String dockerfile, String javaClassVersion) {
final MavenBuildAndTestContainer buildAndTestContainer = new MavenBuildAndTestContainer(dockerfile);
try {
buildAndTestContainer
.withImagePullPolicy(PullPolicy.ageBased(Duration.ofDays(14)))
.withEnv("JAVA_CLASS_VERSION", javaClassVersion)
.withStartupTimeout(Duration.ofMinutes(2))
.start();
} finally {
return buildAndTestContainer.getLogs();
String logs = buildAndTestContainer.getLogs();
//System.out.println(logs);
return logs;
}
}

private static String architecture() {
return "aarch64".equals(getProperty("os.arch")) ? "arm64v8" : "amd64";
}
}