Skip to content

Commit 8bdd409

Browse files
committed
Add unit test for Mandrel.getPkgFromJson
Test parsing of GitHub release JSON using 5 representative Mandrel releases (JDK 17/21/23/24/25). Verifies asset filtering, platform detection, archive types, JDK version extraction, prerelease skipping, and non-matching filename handling. Requires FOOJAY_API_ENVIRONMENT=test to avoid MQTT initialization.
1 parent f3ccc80 commit 8bdd409

1 file changed

Lines changed: 213 additions & 0 deletions

File tree

Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
/*
2+
* Copyright (c) 2026.
3+
*
4+
* This file is part of DiscoAPI.
5+
*
6+
* DiscoAPI is free software: you can redistribute it and/or modify
7+
* it under the terms of the GNU General Public License as published by
8+
* the Free Software Foundation, either version 2 of the License, or
9+
* (at your option) any later version.
10+
*
11+
* DiscoAPI is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+
* GNU General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU General Public License
17+
* along with DiscoAPI. If not, see <http://www.gnu.org/licenses/>.
18+
*/
19+
20+
package io.foojay.api.distribution;
21+
22+
import com.google.gson.JsonArray;
23+
import com.google.gson.JsonObject;
24+
import eu.hansolo.jdktools.Architecture;
25+
import eu.hansolo.jdktools.ArchiveType;
26+
import eu.hansolo.jdktools.OperatingSystem;
27+
import eu.hansolo.jdktools.PackageType;
28+
import eu.hansolo.jdktools.ReleaseStatus;
29+
import io.foojay.api.pkg.Distro;
30+
import io.foojay.api.pkg.Pkg;
31+
import org.junit.jupiter.api.Test;
32+
33+
import java.util.List;
34+
35+
import static org.junit.jupiter.api.Assertions.assertEquals;
36+
import static org.junit.jupiter.api.Assertions.assertFalse;
37+
import static org.junit.jupiter.api.Assertions.assertTrue;
38+
39+
public class MandrelTest {
40+
41+
private static final Mandrel MANDREL = new Mandrel();
42+
43+
/**
44+
* Builds a GitHub-release-style JsonObject for a Mandrel release.
45+
*/
46+
private JsonObject buildReleaseJson(String tagName, boolean prerelease, String[][] assets) {
47+
JsonObject release = new JsonObject();
48+
release.addProperty("tag_name", tagName);
49+
release.addProperty("prerelease", prerelease);
50+
51+
JsonArray assetsArray = new JsonArray();
52+
for (String[] asset : assets) {
53+
JsonObject assetObj = new JsonObject();
54+
assetObj.addProperty("name", asset[0]);
55+
assetObj.addProperty("browser_download_url", asset[1]);
56+
assetsArray.add(assetObj);
57+
}
58+
release.add("assets", assetsArray);
59+
return release;
60+
}
61+
62+
/**
63+
* Builds a standard set of assets for a Mandrel release, including
64+
* the .sha1 and .sha256 files that should be filtered out.
65+
*/
66+
private String[][] buildStandardAssets(String tagName, int javaVersion) {
67+
String version = tagName.replace("mandrel-", "");
68+
String base = "https://github.com/graalvm/mandrel/releases/download/" + tagName + "/";
69+
return new String[][] {
70+
{ "mandrel-java" + javaVersion + "-linux-aarch64-" + version + ".tar.gz",
71+
base + "mandrel-java" + javaVersion + "-linux-aarch64-" + version + ".tar.gz" },
72+
{ "mandrel-java" + javaVersion + "-linux-aarch64-" + version + ".tar.gz.sha1",
73+
base + "mandrel-java" + javaVersion + "-linux-aarch64-" + version + ".tar.gz.sha1" },
74+
{ "mandrel-java" + javaVersion + "-linux-aarch64-" + version + ".tar.gz.sha256",
75+
base + "mandrel-java" + javaVersion + "-linux-aarch64-" + version + ".tar.gz.sha256" },
76+
{ "mandrel-java" + javaVersion + "-linux-amd64-" + version + ".tar.gz",
77+
base + "mandrel-java" + javaVersion + "-linux-amd64-" + version + ".tar.gz" },
78+
{ "mandrel-java" + javaVersion + "-linux-amd64-" + version + ".tar.gz.sha1",
79+
base + "mandrel-java" + javaVersion + "-linux-amd64-" + version + ".tar.gz.sha1" },
80+
{ "mandrel-java" + javaVersion + "-linux-amd64-" + version + ".tar.gz.sha256",
81+
base + "mandrel-java" + javaVersion + "-linux-amd64-" + version + ".tar.gz.sha256" },
82+
{ "mandrel-java" + javaVersion + "-macos-aarch64-" + version + ".tar.gz",
83+
base + "mandrel-java" + javaVersion + "-macos-aarch64-" + version + ".tar.gz" },
84+
{ "mandrel-java" + javaVersion + "-macos-aarch64-" + version + ".tar.gz.sha1",
85+
base + "mandrel-java" + javaVersion + "-macos-aarch64-" + version + ".tar.gz.sha1" },
86+
{ "mandrel-java" + javaVersion + "-macos-aarch64-" + version + ".tar.gz.sha256",
87+
base + "mandrel-java" + javaVersion + "-macos-aarch64-" + version + ".tar.gz.sha256" },
88+
{ "mandrel-java" + javaVersion + "-windows-amd64-" + version + ".zip",
89+
base + "mandrel-java" + javaVersion + "-windows-amd64-" + version + ".zip" },
90+
{ "mandrel-java" + javaVersion + "-windows-amd64-" + version + ".zip.sha1",
91+
base + "mandrel-java" + javaVersion + "-windows-amd64-" + version + ".zip.sha1" },
92+
{ "mandrel-java" + javaVersion + "-windows-amd64-" + version + ".zip.sha256",
93+
base + "mandrel-java" + javaVersion + "-windows-amd64-" + version + ".zip.sha256" },
94+
};
95+
}
96+
97+
@Test
98+
public void getPkgFromJsonParsesLatest10Releases() {
99+
String[][] releases = {
100+
{ "mandrel-25.0.2.0-Final", "25" },
101+
{ "mandrel-24.2.2.0-Final", "24" },
102+
{ "mandrel-24.1.2.0-Final", "23" },
103+
{ "mandrel-23.1.10.0-Final", "21" },
104+
{ "mandrel-23.0.6.0-Final", "17" },
105+
};
106+
107+
for (String[] release : releases) {
108+
String tagName = release[0];
109+
int javaVer = Integer.parseInt(release[1]);
110+
111+
String[][] assets = buildStandardAssets(tagName, javaVer);
112+
JsonObject releaseJson = buildReleaseJson(tagName, false, assets);
113+
114+
List<Pkg> pkgs = MANDREL.getPkgFromJson(
115+
releaseJson, null, false, null, null, null, null, null, false, null, null, false);
116+
117+
// Each release has 4 actual binaries (sha1/sha256 filtered out)
118+
assertEquals(4, pkgs.size(), "Expected 4 packages for " + tagName);
119+
120+
for (Pkg pkg : pkgs) {
121+
// Distribution
122+
assertEquals(Distro.MANDREL.get(), pkg.getDistribution(),
123+
"Distribution mismatch for " + pkg.getFilename());
124+
125+
// Package type is always JDK
126+
assertEquals(PackageType.JDK, pkg.getPackageType(),
127+
"PackageType mismatch for " + pkg.getFilename());
128+
129+
// Release status is always GA
130+
assertEquals(ReleaseStatus.GA, pkg.getReleaseStatus(),
131+
"ReleaseStatus mismatch for " + pkg.getFilename());
132+
133+
// Free use in production
134+
assertTrue(pkg.getFreeUseInProduction(),
135+
"FreeUseInProduction should be true for " + pkg.getFilename());
136+
137+
// JDK version matches the java version in the filename
138+
assertEquals(javaVer, pkg.getJdkVersion().getAsInt(),
139+
"JDK version mismatch for " + pkg.getFilename());
140+
141+
// Filename should start with mandrel-java
142+
assertTrue(pkg.getFilename().startsWith("mandrel-java" + javaVer),
143+
"Filename prefix mismatch: " + pkg.getFilename());
144+
145+
// Direct download URI should be set
146+
assertFalse(pkg.getDirectDownloadUri().isEmpty(),
147+
"Download URI should not be empty for " + pkg.getFilename());
148+
149+
// Architecture and OS should be resolved
150+
assertTrue(pkg.getArchitecture() != Architecture.NONE,
151+
"Architecture should be resolved for " + pkg.getFilename());
152+
assertTrue(pkg.getOperatingSystem() != OperatingSystem.NONE,
153+
"OS should be resolved for " + pkg.getFilename());
154+
}
155+
156+
// Verify specific platform combinations
157+
long linuxAarch64 = pkgs.stream()
158+
.filter(p -> p.getOperatingSystem() == OperatingSystem.LINUX
159+
&& p.getArchitecture() == Architecture.AARCH64)
160+
.count();
161+
long linuxAmd64 = pkgs.stream()
162+
.filter(p -> p.getOperatingSystem() == OperatingSystem.LINUX
163+
&& p.getArchitecture() == Architecture.AMD64)
164+
.count();
165+
long macosAarch64 = pkgs.stream()
166+
.filter(p -> p.getOperatingSystem() == OperatingSystem.MACOS
167+
&& p.getArchitecture() == Architecture.AARCH64)
168+
.count();
169+
long windowsAmd64 = pkgs.stream()
170+
.filter(p -> p.getOperatingSystem() == OperatingSystem.WINDOWS
171+
&& p.getArchitecture() == Architecture.AMD64)
172+
.count();
173+
174+
assertEquals(1, linuxAarch64, "Expected 1 linux-aarch64 pkg for " + tagName);
175+
assertEquals(1, linuxAmd64, "Expected 1 linux-amd64 pkg for " + tagName);
176+
assertEquals(1, macosAarch64, "Expected 1 macos-aarch64 pkg for " + tagName);
177+
assertEquals(1, windowsAmd64, "Expected 1 windows-amd64 pkg for " + tagName);
178+
179+
// Verify archive types
180+
long tarGzCount = pkgs.stream().filter(p -> p.getArchiveType() == ArchiveType.TAR_GZ).count();
181+
long zipCount = pkgs.stream().filter(p -> p.getArchiveType() == ArchiveType.ZIP).count();
182+
assertEquals(3, tarGzCount, "Expected 3 tar.gz packages for " + tagName);
183+
assertEquals(1, zipCount, "Expected 1 zip package for " + tagName);
184+
}
185+
}
186+
187+
@Test
188+
public void getPkgFromJsonSkipsPrerelease() {
189+
String[][] assets = buildStandardAssets("mandrel-25.0.2.0-Final", 25);
190+
JsonObject releaseJson = buildReleaseJson("mandrel-25.0.2.0-Final", true, assets);
191+
192+
List<Pkg> pkgs = MANDREL.getPkgFromJson(
193+
releaseJson, null, false, null, null, null, null, null, false, null, null, false);
194+
195+
assertTrue(pkgs.isEmpty(), "Prerelease should produce no packages");
196+
}
197+
198+
@Test
199+
public void getPkgFromJsonSkipsNonMatchingFilenames() {
200+
String base = "https://github.com/graalvm/mandrel/releases/download/mandrel-25.0.2.0-Final/";
201+
String[][] assets = {
202+
{ "some-random-file.txt", base + "some-random-file.txt" },
203+
{ "mandrel-sources-25.0.2.0.source.tar.gz", base + "mandrel-sources.source.tar.gz" },
204+
{ "release-notes.jar", base + "release-notes.jar" },
205+
};
206+
JsonObject releaseJson = buildReleaseJson("mandrel-25.0.2.0-Final", false, assets);
207+
208+
List<Pkg> pkgs = MANDREL.getPkgFromJson(
209+
releaseJson, null, false, null, null, null, null, null, false, null, null, false);
210+
211+
assertTrue(pkgs.isEmpty(), "Non-matching filenames should produce no packages");
212+
}
213+
}

0 commit comments

Comments
 (0)