From 806ad6043b1b50b606ac5e8c36da5103913f9e87 Mon Sep 17 00:00:00 2001 From: Martin Todorov Date: Fri, 30 Jan 2026 20:19:37 +0200 Subject: [PATCH] feat: upgrade to a more recent JDK (21 or higher) * Upgraded the GitHub actions. * Upgraded the JDK to 22 or higher. * Upgraded Gradle to newest possible 9.x. * Upgraded Mockito. * Upgraded JUnit. * Fixed tests. * Set the Java language level to 21. --- .github/workflows/build.yml | 2 +- build.gradle.kts | 40 ++++++++++++++----- gradle.properties | 2 + gradle/wrapper/gradle-wrapper.properties | 2 +- .../java/com/uploadcare/api/FileTest.java | 10 ++--- .../com/uploadcare/api/RequestHelperTest.java | 20 +++++----- .../uploadcare/upload/FileUploaderTest.java | 24 ++++------- .../uploadcare/urls/CdnPathBuilderTest.java | 26 ++++++------ 8 files changed, 72 insertions(+), 54 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3735cb5..900bf63 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,7 +19,7 @@ jobs: strategy: matrix: # https://en.wikipedia.org/wiki/Java_version_history - java: [ '8', '11' ] # LTS + java: [ '22' ] # LTS steps: - name: Checkout diff --git a/build.gradle.kts b/build.gradle.kts index bf62e79..a3dc2ea 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,12 +7,12 @@ plugins { group = "com.uploadcare" - val isReleaseVersion = !version.toString().lowercase().endsWith("snapshot") java { - sourceCompatibility = JavaVersion.VERSION_1_7 - targetCompatibility = JavaVersion.VERSION_1_7 + toolchain { + languageVersion.set(JavaLanguageVersion.of(22)) + } withSourcesJar() withJavadocJar() } @@ -21,12 +21,34 @@ dependencies { implementation("org.apache.httpcomponents:httpclient:4.5.13") implementation("org.apache.httpcomponents:httpmime:4.5.13") implementation("com.fasterxml.jackson.core:jackson-databind:2.16.2") - implementation("commons-codec:commons-codec:1.10") - implementation("commons-io:commons-io:2.7") + implementation("commons-codec:commons-codec:1.19.0") + implementation("commons-io:commons-io:2.21.0") implementation("com.sun.activation:javax.activation:1.2.0") - testImplementation("junit:junit:4.13.1") - testImplementation("org.mockito:mockito-all:1.10.19") + testImplementation(platform("org.junit:junit-bom:6.0.1")) + testImplementation("org.junit.jupiter:junit-jupiter") + + // Ensure the launcher/engine are aligned at runtime + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") + + testImplementation("org.hamcrest:hamcrest:2.2") + testImplementation("org.mockito:mockito-core:5.21.0") + testImplementation("org.mockito:mockito-junit-jupiter:5.21.0") +} + +tasks { + withType().configureEach { + options.release.set(21) + } + + withType { + useJUnitPlatform() + } + + withType().configureEach { + jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") + } } // Setup global publishing repository settings. @@ -88,8 +110,8 @@ publishing { properties = mapOf( "project.build.sourceEncoding" to "UTF-8", "project.reporting.outputEncoding" to "UTF-8", - "maven.compiler.target" to "1.7", - "maven.compiler.source" to "1.7" + "maven.compiler.target" to "22", + "maven.compiler.source" to "21" ) organization { name.set("Uploadcare") diff --git a/gradle.properties b/gradle.properties index b82d278..afaa58e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,3 +15,5 @@ kotlin.parallel.tasks.in.project=true org.gradle.parallel=true org.gradle.caching=true org.gradle.daemon.idletimeout=3600000 + +org.gradle.jvmargs=--add-opens java.base/java.lang=ALL-UNNAMED diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 62f495d..23449a2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/src/test/java/com/uploadcare/api/FileTest.java b/src/test/java/com/uploadcare/api/FileTest.java index 747d424..1762d47 100644 --- a/src/test/java/com/uploadcare/api/FileTest.java +++ b/src/test/java/com/uploadcare/api/FileTest.java @@ -3,14 +3,14 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; -public class FileTest +class FileTest { @Test - public void enumFails() throws Exception { + void enumFails() throws Exception { String json = "{ \"color_mode\": \"RGBa\"}"; // duplicate the way the mapper is configured in uploadcare @@ -20,7 +20,7 @@ public void enumFails() throws Exception { Bug bug = mapper.readValue(json, Bug.class); - Assert.assertTrue("Color mode was not properly converted!", File.ColorMode.RGBa.equals(bug.colorMode)); + assertEquals(File.ColorMode.RGBa, bug.colorMode, "Color mode was not properly converted!"); } static class Bug { diff --git a/src/test/java/com/uploadcare/api/RequestHelperTest.java b/src/test/java/com/uploadcare/api/RequestHelperTest.java index 6867f77..fcecaa9 100644 --- a/src/test/java/com/uploadcare/api/RequestHelperTest.java +++ b/src/test/java/com/uploadcare/api/RequestHelperTest.java @@ -2,8 +2,8 @@ import com.uploadcare.urls.Urls; import org.apache.http.client.methods.HttpGet; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.net.URI; import java.security.InvalidKeyException; @@ -11,33 +11,35 @@ import java.util.Calendar; import java.util.GregorianCalendar; -import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; -public class RequestHelperTest { +class RequestHelperTest { private static final String FILE_ID = "27c7846b-a019-4516-a5e4-de635f822161"; private static final String FORMATTED_DATE = "Fri, 17 Nov 1989 00:00:00 +0000"; private RequestHelper requestHelper; - @Before - public void setUp() { + @BeforeEach + void setUp() { Client client = Client.demoClient(); requestHelper = new RequestHelper(client); } @Test - public void test_rfc2822() { + void testRfc2822() { Calendar calendar = new GregorianCalendar(RequestHelper.UTC); calendar.set(1989, Calendar.NOVEMBER, 17, 0, 0, 0); String formattedDate = RequestHelper.rfc2822(calendar.getTime()); - assertEquals(formattedDate, formattedDate); + + assertEquals(FORMATTED_DATE, formattedDate); } @Test - public void test_makeSignature() throws InvalidKeyException, NoSuchAlgorithmException { + void testMakeSignature() throws InvalidKeyException, NoSuchAlgorithmException { URI url = Urls.apiFile(FILE_ID); String signature = requestHelper.makeSignature(new HttpGet(url), FORMATTED_DATE, null); + assertEquals("535e263808dd38599343f04aab3c9f34bb15573c", signature); } diff --git a/src/test/java/com/uploadcare/upload/FileUploaderTest.java b/src/test/java/com/uploadcare/upload/FileUploaderTest.java index 1c67891..cee22e6 100644 --- a/src/test/java/com/uploadcare/upload/FileUploaderTest.java +++ b/src/test/java/com/uploadcare/upload/FileUploaderTest.java @@ -9,25 +9,23 @@ import com.uploadcare.urls.Urls; import org.apache.commons.io.IOUtils; import org.apache.http.client.methods.HttpUriRequest; -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.InOrder; import java.io.IOException; import java.io.InputStream; import java.net.URI; -import static org.mockito.Matchers.argThat; -import static org.mockito.Matchers.eq; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -public class FileUploaderTest { +class FileUploaderTest { public static final String FILE_ID = "unique_file_id"; @Test - public void test_upload() throws UploadFailureException, IOException { + void testUpload() throws UploadFailureException, IOException { final RequestHelper requestHelper = mock(RequestHelper.class); when(requestHelper.executeQuery(requestThat(Urls.uploadBase()), eq(false), eq(UploadBaseData.class))) @@ -52,7 +50,7 @@ public RequestHelper get(Client client) { } @Test - public void test_upload_stream() throws UploadFailureException, IOException { + void testUploadStream() throws UploadFailureException, IOException { final RequestHelper requestHelper = mock(RequestHelper.class); when(requestHelper.executeQuery(requestThat(Urls.uploadBase()), eq(false), eq(UploadBaseData.class))) @@ -76,15 +74,7 @@ public RequestHelper get(Client client) { } private HttpUriRequest requestThat(final URI uri) { - return argThat(new BaseMatcher() { - public boolean matches(Object o) { - HttpUriRequest request = (HttpUriRequest) o; - return request.getURI().equals(uri); - } - - public void describeTo(Description description) { - } - }); + return argThat((HttpUriRequest request) -> request != null && uri.equals(request.getURI())); } private UploadBaseData uploadBaseData() { diff --git a/src/test/java/com/uploadcare/urls/CdnPathBuilderTest.java b/src/test/java/com/uploadcare/urls/CdnPathBuilderTest.java index fdac63d..c50345c 100644 --- a/src/test/java/com/uploadcare/urls/CdnPathBuilderTest.java +++ b/src/test/java/com/uploadcare/urls/CdnPathBuilderTest.java @@ -2,23 +2,23 @@ import com.uploadcare.api.File; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.awt.*; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.fail; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class CdnPathBuilderTest { +class CdnPathBuilderTest { private static final String FILE_ID = "27c7846b-a019-4516-a5e4-de635f822161"; private CdnPathBuilder builder; - @Before - public void setUp() { + @BeforeEach + void setUp() { File file = mock(File.class); when(file.getFileId()).thenReturn(FILE_ID); @@ -26,13 +26,14 @@ public void setUp() { } @Test - public void test_fileUrl() { + void testFileUrl() { String path = builder.build(); + assertEquals("/" + FILE_ID + "/", path); } @Test - public void test_allOperations() { + void testAllOperations() { String path = builder .crop(100, 110) .cropColor(120, 130, Color.BLACK) @@ -82,13 +83,14 @@ public void test_allOperations() { } @Test - public void test_detectFaces() { + void testDetectFaces() { String path = builder.detectFaces().build(); + assertEquals("/" + FILE_ID + "/detect_faces/", path); } @Test - public void test_dimensionGuard() { + void testDimensionGuard() { builder.resizeWidth(1); builder.resizeWidth(2048); try { @@ -104,7 +106,7 @@ public void test_dimensionGuard() { } @Test - public void test_dimensionsGuard() { + void testDimensionsGuard() { builder.resize(1024, 634); builder.resize(634, 1024); try {