diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 71f576a..063bc97 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -20,4 +20,6 @@ jobs: go-version: '1.24.0' cache: false - name: Test Java version resolution with vfox's Lua interpreter - run: go run github.com/yuin/gopher-lua/cmd/glua@v1.1.1 tests/pre_use_test.lua + run: | + go run github.com/yuin/gopher-lua/cmd/glua@v1.1.1 tests/pre_use_test.lua + go run github.com/yuin/gopher-lua/cmd/glua@v1.1.1 tests/loongnix_test.lua diff --git a/README.md b/README.md index ba20d25..0c06321 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,25 @@ In an interactive terminal, run `vfox search java tem` to select and install a v For a known version, use `vfox install java@17.0.17-tem`. Space-separated arguments to `install` identify multiple SDKs, so `vfox install java tem` does not pass `tem` as a Java distribution filter. +## LoongArch (Linux) + +On Linux `loong64`, `vfox search java` (or `vfox search java loongnix`) lists JDKs from the [Loongnix official archive](https://ftp.loongnix.cn/Java/). Other architectures continue to use Foojay. + +Choose the ABI matching your operating system; the plugin does not guess it: + +- `lnxabi1` / `loongnix_abi1`: Linux 4.19 UAPI builds, intended for systems such as Loongnix 20 and Loongnix Server 8.4. +- `lnxabi2` / `loongnix_abi2`: Linux 5.10 UAPI builds, named `glibc2.34` upstream, intended for systems such as Debian 12 and openEuler. + +See the [upstream compatibility notes](https://www.loongnix.cn/zh/api/java/) for your system. Do not choose solely from the running kernel version. This source provides glibc builds, not musl builds. + +```shell +vfox search java lnxabi2 +vfox install java@21-lnxabi2-fx # latest matching Java 21 with JavaFX, ABI2 +vfox install java@21.0.12+8-lnxabi2-fx +``` + +Versions use the Java version and build number, not the Loongson release number. ABI and JavaFX suffixes are preserved when switching versions. Only GA LoongArch tarballs listed in the archive are supported; MIPS packages are excluded. Select `-fx` only for JavaFX builds. Bare installation requests require an explicit ABI; selecting a search result supplies it automatically. + ## JavaFX Support Some distributions provide JDK versions bundled with JavaFX. These versions are displayed with the `-fx` suffix after the distribution name in the version list and marked with "JavaFX" in the notes. To install a JavaFX bundled version, add `-fx` after the distribution name: diff --git a/README_CN.md b/README_CN.md index 55b6700..702cef1 100644 --- a/README_CN.md +++ b/README_CN.md @@ -34,6 +34,25 @@ vfox search java graal # 查看所有graalvm版本 已知版本时,使用 `vfox install java@17.0.17-tem`。`install` 的空格分隔参数用于指定多个 SDK,因此 `vfox install java tem` 不会将 `tem` 作为 Java 发行版筛选条件。 +## 龙架构(Linux) + +在 Linux `loong64` 上,`vfox search java`(或 `vfox search java loongnix`)从 [Loongnix 官方归档](https://ftp.loongnix.cn/Java/)列出 JDK。其他架构继续使用 Foojay。 + +请按操作系统选择 ABI,插件不会自动猜测: + +- `lnxabi1` / `loongnix_abi1`:Linux 4.19 UAPI 构建,适用于 Loongnix 20、Loongnix Server 8.4 等系统。 +- `lnxabi2` / `loongnix_abi2`:Linux 5.10 UAPI 构建,上游文件名标记为 `glibc2.34`,适用于 Debian 12、openEuler 等系统。 + +请核对[上游兼容性说明](https://www.loongnix.cn/zh/api/java/),不能仅凭当前内核版本选择 ABI。该源提供 glibc 构建,不提供 musl 构建。 + +```shell +vfox search java lnxabi2 +vfox install java@21-lnxabi2-fx # 匹配最新的 Java 21,带 JavaFX,使用 ABI2 +vfox install java@21.0.12+8-lnxabi2-fx +``` + +版本号采用 Java 版本及构建号,不是 Loongson 发行版本号。切换版本时保留 ABI 和 JavaFX 后缀。仅支持归档中的正式版 LoongArch tar 包,排除 MIPS 包;JavaFX 构建需使用 `-fx`。直接安装时必须明确 ABI,从搜索结果选择安装则会自动带上该标识。 + ## JavaFX 支持 部分发行版提供了捆绑 JavaFX 的 JDK 版本。这些版本在版本列表中会在发行版名称后显示 `-fx` 后缀,并在备注中标注 "JavaFX"。安装带 JavaFX 的版本时,需要在发行版名称后添加 `-fx`: diff --git a/hooks/available.lua b/hooks/available.lua index fad3171..8f5a7c0 100644 --- a/hooks/available.lua +++ b/hooks/available.lua @@ -1,17 +1,27 @@ local foojay = require("foojay") +local loongnix = require("loongnix") local distribution_version_parser = require("distribution_version") --- Return all available versions provided by this plugin --- @param ctx table Empty table used as context, for future extension --- @return table Descriptions of available versions and accompanying tool descriptions function PLUGIN:Available(ctx) - local query = ctx.args[1] or "open" + local query = ctx.args[1] or (loongnix.supported() and "loongnix" or "open") + if query == "loongnix" or loongnix.is_distribution(query) or (loongnix.supported() and query == "all") then + return loongnix.available(query) + end + if loongnix.supported() then + error("Foojay does not support loong64; use vfox search java loongnix") + end local jdks = {} local distribution = nil if query == "all" then for _, dist in ipairs(distribution_version_parser.distributions) do - local tempJdks = foojay.fetchtJdkList(dist.name, "") + local tempJdks = {} + if not loongnix.is_distribution(dist.name) then + tempJdks = foojay.fetchtJdkList(dist.name, "") + end for _, jdk in ipairs(tempJdks) do jdk.short = dist.short_name table.insert(jdks, jdk) diff --git a/hooks/pre_install.lua b/hooks/pre_install.lua index 5666e7d..33234bf 100644 --- a/hooks/pre_install.lua +++ b/hooks/pre_install.lua @@ -2,6 +2,7 @@ local http = require("http") local json = require("json") local foojay = require("foojay") +local loongnix = require("loongnix") local distribution_version_parser = require("distribution_version") --- Returns some pre-installed information, such as version number, download address, local files, etc. --- If checksum is provided, vfox will automatically check it for you. @@ -13,6 +14,9 @@ function PLUGIN:PreInstall(ctx) if not distribution_version then error("Could not extract a valid distribution: " .. ctx.version) end + if loongnix.supported() or loongnix.is_distribution(distribution_version.distribution.name) then + return loongnix.pre_install(distribution_version) + end local jdks = foojay.fetchtJdkList(distribution_version.distribution.name, distribution_version.version) if not jdks or #jdks == 0 then error("No JDK found for " .. ctx.version .. " on " .. RUNTIME.osType .. "/" .. RUNTIME.archType .. ". Please check available versions with 'vfox search java'") diff --git a/lib/distribution_version.lua b/lib/distribution_version.lua index 63609a7..9b2e799 100644 --- a/lib/distribution_version.lua +++ b/lib/distribution_version.lua @@ -2,6 +2,8 @@ local strings = require("vfox.strings") local short_name = { ["open"] = "openjdk", + ["lnxabi1"] = "loongnix_abi1", + ["lnxabi2"] = "loongnix_abi2", ["bsg"] = "bisheng", ["amzn"] = "corretto", ["albba"] = "dragonwell", diff --git a/lib/loongnix.lua b/lib/loongnix.lua new file mode 100644 index 0000000..8f8d7b6 --- /dev/null +++ b/lib/loongnix.lua @@ -0,0 +1,143 @@ +local http = require('http') +local loongnix = {} +local base_url = 'https://ftp.loongnix.cn/Java/' + +function loongnix.supported() + return RUNTIME.osType == 'linux' and RUNTIME.archType == 'loong64' +end + +function loongnix.is_distribution(name) + return name == 'lnxabi1' or name == 'lnxabi2' + or name == 'loongnix_abi1' or name == 'loongnix_abi2' +end + +local function require_platform() + if not loongnix.supported() then + error('Loongnix JDKs require linux/loong64') + end +end + +local function get(url) + local response, err = http.get({url = url}) + if err then error('Failed to fetch Loongnix JDKs: ' .. err) end + if response.status_code ~= 200 then + error('Failed to fetch Loongnix JDKs: status_code => ' .. response.status_code) + end + return response.body +end + +local function numbers(version) + local result = {} + for number in version:gmatch('%d+') do table.insert(result, tonumber(number)) end + return result +end + +local function newer(left, right) + local a, b = numbers(left), numbers(right) + for i = 1, math.max(#a, #b) do + if (a[i] or 0) ~= (b[i] or 0) then return (a[i] or 0) > (b[i] or 0) end + end + return false +end + +local function newer_java(left, right) + local av, ab = left:match('^(.-)%+(%d+)$') + local bv, bb = right:match('^(.-)%+(%d+)$') + if newer(av, bv) then return true end + if newer(bv, av) then return false end + return tonumber(ab) > tonumber(bb) +end + +-- Parse only GA LoongArch tarballs; exclude MIPS, EA, installers and checksum files. +local function parse(filename, major) + local release, rest = filename:match('^loongson([%d%.]+)%-(.+)$') + if not release then release, rest = filename:match('^loongson_openjdk([%d%.]+)%-(.+)$') end + if not release then return nil end + local fx = rest:sub(1, 3) == 'fx-' + if fx then rest = rest:sub(4) end + local jdk, suffix = rest:match('^jdk([%w%._]+)%-linux%-loongarch64(.*)$') + local abi + if suffix == '.tar.gz' then abi = 'lnxabi1' + elseif suffix == '-glibc2.34.tar.gz' then abi = 'lnxabi2' + else return nil end + local version, build = jdk:match('^(%d+%.?[%d%.]*)_(%d+)$') + if not version then + local update + update, build = jdk:match('^8u(%d+)b(%d+)$') + if update then version = '8.0.' .. update end + end + if not version or tonumber(version:match('^%d+')) ~= tonumber(major) then return nil end + version = version .. '+' .. tonumber(build) + return { + version = version .. '-' .. abi .. (fx and '-fx' or ''), + java_version = version, release = release, abi = abi, fx = fx, + url = base_url .. 'openjdk' .. major .. '/' .. filename, + note = 'JDK ' .. version .. '; ' .. (abi == 'lnxabi1' and 'ABI1 (Linux 4.19 UAPI)' or 'ABI2 (Linux 5.10 UAPI, glibc 2.34)') + .. (fx and '; JavaFX' or ''), + } +end + +local function packages(version) + require_platform() + local index = get(base_url) + local majors, seen = {}, {} + local requested_major = version and version:match('^(%d+)') + for major in index:gmatch('href=["\']openjdk(%d+)/["\']') do + if not seen[major] and (not requested_major or tonumber(major) == tonumber(requested_major)) then + seen[major] = true + table.insert(majors, major) + end + end + local result, by_version = {}, {} + for _, major in ipairs(majors) do + local body = get(base_url .. 'openjdk' .. major .. '/') + for filename in body:gmatch('href=["\']([^"\'/]+)["\']') do + local item = parse(filename, major) + if item then + local previous = by_version[item.version] + if not previous or newer(item.release, previous.release) then by_version[item.version] = item end + end + end + end + for _, item in pairs(by_version) do table.insert(result, item) end + table.sort(result, function(a, b) + if a.java_version ~= b.java_version then return newer_java(a.java_version, b.java_version) end + return a.version < b.version + end) + if #result == 0 then error('No Loongnix JDK packages found; check the requested version and upstream directory format') end + return result +end + +function loongnix.available(query) + local abi = query == 'loongnix_abi1' and 'lnxabi1' or query == 'loongnix_abi2' and 'lnxabi2' or query + local result = {} + for _, item in ipairs(packages()) do + if not loongnix.is_distribution(abi) or item.abi == abi then + table.insert(result, {version = item.version, note = item.note}) + end + end + return result +end + +local function matches(candidate, requested) + if candidate == requested then return true end + if candidate:sub(1, #requested) ~= requested then return false end + local boundary = candidate:sub(#requested + 1, #requested + 1) + return boundary == '.' or boundary == '+' +end + +function loongnix.pre_install(parsed) + require_platform() + local abi = parsed.distribution.short_name + if not loongnix.is_distribution(abi) then + error('Choose a Loongnix ABI explicitly: run vfox search java and select lnxabi1 or lnxabi2') + end + for _, item in ipairs(packages(parsed.version)) do + if item.abi == abi and item.fx == parsed.javafx_bundled and matches(item.java_version, parsed.version) then + return {version = item.version, url = item.url, note = item.note} + end + end + error('No Loongnix JDK found for ' .. parsed.version .. '-' .. abi .. (parsed.javafx_bundled and '-fx' or '')) +end + +return loongnix diff --git a/tests/fixtures/loongnix/README.md b/tests/fixtures/loongnix/README.md new file mode 100644 index 0000000..8cd46ac --- /dev/null +++ b/tests/fixtures/loongnix/README.md @@ -0,0 +1,4 @@ +These fixtures preserve the tarball link names from https://ftp.loongnix.cn/Java/ +and its openjdk*/ directories, retrieved on 2026-09-12. Styling and unrelated +links were removed. They include both LoongArch ABIs, MIPS and early-access +packages so the tests can verify filtering without network access. diff --git a/tests/fixtures/loongnix/index.html b/tests/fixtures/loongnix/index.html new file mode 100644 index 0000000..098eb07 --- /dev/null +++ b/tests/fixtures/loongnix/index.html @@ -0,0 +1,9 @@ +openjdk11/ +openjdk17/ +openjdk21/ +openjdk22/ +openjdk23/ +openjdk24/ +openjdk25/ +openjdk26/ +openjdk8/ diff --git a/tests/fixtures/loongnix/openjdk11.html b/tests/fixtures/loongnix/openjdk11.html new file mode 100644 index 0000000..c5900cc --- /dev/null +++ b/tests/fixtures/loongnix/openjdk11.html @@ -0,0 +1,41 @@ +loongson11.0.2138-ea-jdk11.0.12_7-linux-loongarch64.tar.gz +loongson11.0.2138-ea-jdk11.0.12_7-linux-loongson3a.tar.gz +loongson11.1.0-jdk11.0.13_8-linux-loongarch64.tar.gz +loongson11.1.0-jdk11.0.13_8-linux-loongson3a.tar.gz +loongson11.10.0-fx-jdk11.0.23_9-linux-loongarch64.tar.gz +loongson11.10.0-fx-jdk11.0.23_9-linux-loongson3a.tar.gz +loongson11.11.25-fx-jdk11.0.24_8-linux-loongarch64.tar.gz +loongson11.11.25-fx-jdk11.0.24_8-linux-loongson3a.tar.gz +loongson11.12.20-fx-jdk11.0.25_9-linux-loongarch64-glibc2.34.tar.gz +loongson11.12.20-fx-jdk11.0.25_9-linux-loongarch64.tar.gz +loongson11.12.20-fx-jdk11.0.25_9-linux-loongson3a.tar.gz +loongson11.13.21-fx-jdk11.0.26_4-linux-loongarch64-glibc2.34.tar.gz +loongson11.13.21-fx-jdk11.0.26_4-linux-loongarch64.tar.gz +loongson11.13.21-fx-jdk11.0.26_4-linux-loongson3a.tar.gz +loongson11.14.18-fx-jdk11.0.27_6-linux-loongarch64-glibc2.34.tar.gz +loongson11.14.18-fx-jdk11.0.27_6-linux-loongarch64.tar.gz +loongson11.15.21-fx-jdk11.0.28_6-linux-loongarch64-glibc2.34.tar.gz +loongson11.15.21-fx-jdk11.0.28_6-linux-loongarch64.tar.gz +loongson11.16.22-fx-jdk11.0.29_7-linux-loongarch64-glibc2.34.tar.gz +loongson11.16.22-fx-jdk11.0.29_7-linux-loongarch64.tar.gz +loongson11.17.26-fx-jdk11.0.30_7-linux-loongarch64-glibc2.34.tar.gz +loongson11.17.26-fx-jdk11.0.30_7-linux-loongarch64.tar.gz +loongson11.18.27-fx-jdk11.0.31_11-linux-loongarch64-glibc2.34.tar.gz +loongson11.18.27-fx-jdk11.0.31_11-linux-loongarch64.tar.gz +loongson11.19.27-fx-jdk11.0.32_9-linux-loongarch64-glibc2.34.tar.gz +loongson11.19.27-fx-jdk11.0.32_9-linux-loongarch64.tar.gz +loongson11.2.0-jdk11.0.15_10-linux-loongarch64.tar.gz +loongson11.2.0-jdk11.0.15_10-linux-loongson3a.tar.gz +loongson11.3.0-fx-jdk11.0.17_8-linux-loongarch64.tar.gz +loongson11.3.0-fx-jdk11.0.17_8-linux-loongson3a.tar.gz +loongson11.4.0-fx-jdk11.0.18_10-linux-loongarch64.tar.gz +loongson11.4.0-fx-jdk11.0.18_10-linux-loongson3a.tar.gz +loongson11.5.0-fx-jdk11.0.19_7-linux-loongarch64.tar.gz +loongson11.5.0-fx-jdk11.0.19_7-linux-loongson3a.tar.gz +loongson11.6.0-fx-jdk11.0.19_7-linux-loongarch64.tar.gz +loongson11.7.0-fx-jdk11.0.20_8-linux-loongarch64.tar.gz +loongson11.7.0-fx-jdk11.0.20_8-linux-loongson3a.tar.gz +loongson11.8.0-fx-jdk11.0.21_9-linux-loongarch64.tar.gz +loongson11.8.0-fx-jdk11.0.21_9-linux-loongson3a.tar.gz +loongson11.9.0-fx-jdk11.0.22_7-linux-loongarch64.tar.gz +loongson11.9.0-fx-jdk11.0.22_7-linux-loongson3a.tar.gz diff --git a/tests/fixtures/loongnix/openjdk17.html b/tests/fixtures/loongnix/openjdk17.html new file mode 100644 index 0000000..2a7b2ef --- /dev/null +++ b/tests/fixtures/loongnix/openjdk17.html @@ -0,0 +1,39 @@ +loongson17.1.0-jdk17_35-linux-loongarch64.tar.gz +loongson17.1.0-jdk17_35-linux-loongson3a.tar.gz +loongson17.10.0-fx-jdk17.0.11_9-linux-loongarch64.tar.gz +loongson17.10.0-fx-jdk17.0.11_9-linux-loongson3a.tar.gz +loongson17.11.21-fx-jdk17.0.12_7-linux-loongarch64.tar.gz +loongson17.11.21-fx-jdk17.0.12_7-linux-loongson3a.tar.gz +loongson17.12.16-fx-jdk17.0.13_11-linux-loongarch64-glibc2.34.tar.gz +loongson17.12.16-fx-jdk17.0.13_11-linux-loongarch64.tar.gz +loongson17.12.16-fx-jdk17.0.13_11-linux-loongson3a.tar.gz +loongson17.13.21-fx-jdk17.0.14_7-linux-loongarch64-glibc2.34.tar.gz +loongson17.13.21-fx-jdk17.0.14_7-linux-loongarch64.tar.gz +loongson17.13.21-fx-jdk17.0.14_7-linux-loongson3a.tar.gz +loongson17.14.18-fx-jdk17.0.15_6-linux-loongarch64-glibc2.34.tar.gz +loongson17.14.18-fx-jdk17.0.15_6-linux-loongarch64.tar.gz +loongson17.15.20-fx-jdk17.0.16_8-linux-loongarch64-glibc2.34.tar.gz +loongson17.15.20-fx-jdk17.0.16_8-linux-loongarch64.tar.gz +loongson17.16.27-fx-jdk17.0.17_10-linux-loongarch64-glibc2.34.tar.gz +loongson17.16.27-fx-jdk17.0.17_10-linux-loongarch64.tar.gz +loongson17.17.26-fx-jdk17.0.18_8-linux-loongarch64-glibc2.34.tar.gz +loongson17.17.26-fx-jdk17.0.18_8-linux-loongarch64.tar.gz +loongson17.18.25-fx-jdk17.0.19_10-linux-loongarch64-glibc2.34.tar.gz +loongson17.18.25-fx-jdk17.0.19_10-linux-loongarch64.tar.gz +loongson17.19.26-fx-jdk17.0.20_8-linux-loongarch64-glibc2.34.tar.gz +loongson17.19.26-fx-jdk17.0.20_8-linux-loongarch64.tar.gz +loongson17.2.0-jdk17.0.3_7-linux-loongarch64.tar.gz +loongson17.2.0-jdk17.0.3_7-linux-loongson3a.tar.gz +loongson17.3.0-fx-jdk17.0.5_8-linux-loongarch64.tar.gz +loongson17.3.0-fx-jdk17.0.5_8-linux-loongson3a.tar.gz +loongson17.4.0-fx-jdk17.0.6_10-linux-loongarch64.tar.gz +loongson17.4.0-fx-jdk17.0.6_10-linux-loongson3a.tar.gz +loongson17.5.0-fx-jdk17.0.7_7-linux-loongarch64.tar.gz +loongson17.5.0-fx-jdk17.0.7_7-linux-loongson3a.tar.gz +loongson17.6.0-fx-jdk17.0.7_7-linux-loongarch64.tar.gz +loongson17.7.0-fx-jdk17.0.8_7-linux-loongarch64.tar.gz +loongson17.7.0-fx-jdk17.0.8_7-linux-loongson3a.tar.gz +loongson17.8.0-fx-jdk17.0.9_9-linux-loongarch64.tar.gz +loongson17.8.0-fx-jdk17.0.9_9-linux-loongson3a.tar.gz +loongson17.9.0-fx-jdk17.0.10_7-linux-loongarch64.tar.gz +loongson17.9.0-fx-jdk17.0.10_7-linux-loongson3a.tar.gz diff --git a/tests/fixtures/loongnix/openjdk21.html b/tests/fixtures/loongnix/openjdk21.html new file mode 100644 index 0000000..b53f8a2 --- /dev/null +++ b/tests/fixtures/loongnix/openjdk21.html @@ -0,0 +1,20 @@ +loongson21.1.0-fx-jdk21_35-linux-loongarch64.tar.gz +loongson21.10.25-fx-jdk21.0.10_7-linux-loongarch64-glibc2.34.tar.gz +loongson21.10.25-fx-jdk21.0.10_7-linux-loongarch64.tar.gz +loongson21.11.38-fx-jdk21.0.11_10-linux-loongarch64-glibc2.34.tar.gz +loongson21.11.38-fx-jdk21.0.11_10-linux-loongarch64.tar.gz +loongson21.12.26-fx-jdk21.0.12_8-linux-loongarch64-glibc2.34.tar.gz +loongson21.12.26-fx-jdk21.0.12_8-linux-loongarch64.tar.gz +loongson21.2.0-fx-jdk21.0.2_13-linux-loongarch64.tar.gz +loongson21.3.0-fx-jdk21.0.3_9-linux-loongarch64.tar.gz +loongson21.4.17-fx-jdk21.0.4_7-linux-loongarch64.tar.gz +loongson21.5.15-fx-jdk21.0.5_11-linux-loongarch64-glibc2.34.tar.gz +loongson21.5.15-fx-jdk21.0.5_11-linux-loongarch64.tar.gz +loongson21.6.21-fx-jdk21.0.6_7-linux-loongarch64-glibc2.34.tar.gz +loongson21.6.21-fx-jdk21.0.6_7-linux-loongarch64.tar.gz +loongson21.7.15-fx-jdk21.0.7_6-linux-loongarch64-glibc2.34.tar.gz +loongson21.7.15-fx-jdk21.0.7_6-linux-loongarch64.tar.gz +loongson21.8.16-fx-jdk21.0.8_9-linux-loongarch64-glibc2.34.tar.gz +loongson21.8.16-fx-jdk21.0.8_9-linux-loongarch64.tar.gz +loongson21.9.21-fx-jdk21.0.9_10-linux-loongarch64-glibc2.34.tar.gz +loongson21.9.21-fx-jdk21.0.9_10-linux-loongarch64.tar.gz diff --git a/tests/fixtures/loongnix/openjdk22.html b/tests/fixtures/loongnix/openjdk22.html new file mode 100644 index 0000000..c4a7d4e --- /dev/null +++ b/tests/fixtures/loongnix/openjdk22.html @@ -0,0 +1 @@ +loongson22.1.0-fx-jdk22_36-linux-loongarch64.tar.gz diff --git a/tests/fixtures/loongnix/openjdk23.html b/tests/fixtures/loongnix/openjdk23.html new file mode 100644 index 0000000..d5662bc --- /dev/null +++ b/tests/fixtures/loongnix/openjdk23.html @@ -0,0 +1,2 @@ +loongson23.1.17-fx-jdk23_37-linux-loongarch64-glibc2.34.tar.gz +loongson23.1.17-fx-jdk23_37-linux-loongarch64.tar.gz diff --git a/tests/fixtures/loongnix/openjdk24.html b/tests/fixtures/loongnix/openjdk24.html new file mode 100644 index 0000000..fe010d9 --- /dev/null +++ b/tests/fixtures/loongnix/openjdk24.html @@ -0,0 +1,2 @@ +loongson24.1.26-fx-jdk24_36-linux-loongarch64-glibc2.34.tar.gz +loongson24.1.26-fx-jdk24_36-linux-loongarch64.tar.gz diff --git a/tests/fixtures/loongnix/openjdk25.html b/tests/fixtures/loongnix/openjdk25.html new file mode 100644 index 0000000..a6f1339 --- /dev/null +++ b/tests/fixtures/loongnix/openjdk25.html @@ -0,0 +1,10 @@ +loongson25.1.5-fx-jdk25_36-linux-loongarch64-glibc2.34.tar.gz +loongson25.1.5-fx-jdk25_36-linux-loongarch64.tar.gz +loongson25.2.22-fx-jdk25.0.1_8-linux-loongarch64-glibc2.34.tar.gz +loongson25.2.22-fx-jdk25.0.1_8-linux-loongarch64.tar.gz +loongson25.3.20-fx-jdk25.0.2_10-linux-loongarch64-glibc2.34.tar.gz +loongson25.3.20-fx-jdk25.0.2_10-linux-loongarch64.tar.gz +loongson25.4.28-fx-jdk25.0.3_9-linux-loongarch64-glibc2.34.tar.gz +loongson25.4.28-fx-jdk25.0.3_9-linux-loongarch64.tar.gz +loongson25.5.22-fx-jdk25.0.4_7-linux-loongarch64-glibc2.34.tar.gz +loongson25.5.22-fx-jdk25.0.4_7-linux-loongarch64.tar.gz diff --git a/tests/fixtures/loongnix/openjdk26.html b/tests/fixtures/loongnix/openjdk26.html new file mode 100644 index 0000000..857c74f --- /dev/null +++ b/tests/fixtures/loongnix/openjdk26.html @@ -0,0 +1,2 @@ +loongson26.1.11-fx-jdk26_35-linux-loongarch64-glibc2.34.tar.gz +loongson26.1.11-fx-jdk26_35-linux-loongarch64.tar.gz diff --git a/tests/fixtures/loongnix/openjdk8.html b/tests/fixtures/loongnix/openjdk8.html new file mode 100644 index 0000000..86be49b --- /dev/null +++ b/tests/fixtures/loongnix/openjdk8.html @@ -0,0 +1,52 @@ +jdk8-mips64-8.1.tar.gz +jdk8-mips64-8.tar.gz +loongson8.1.10-jdk8u312b07-linux-loongarch64.tar.gz +loongson8.1.10-jdk8u312b07-linux-loongson3a.tar.gz +loongson8.1.11-jdk8u332b09-linux-loongarch64.tar.gz +loongson8.1.11-jdk8u332b09-linux-loongson3a.tar.gz +loongson8.1.12-fx-jdk8u352b08-linux-loongarch64.tar.gz +loongson8.1.12-fx-jdk8u352b08-linux-loongson3a.tar.gz +loongson8.1.13-fx-jdk8u362b09-linux-loongarch64.tar.gz +loongson8.1.13-fx-jdk8u362b09-linux-loongson3a.tar.gz +loongson8.1.14-fx-jdk8u372b07-linux-loongarch64.tar.gz +loongson8.1.14-fx-jdk8u372b07-linux-loongson3a.tar.gz +loongson8.1.15-fx-jdk8u372b07-linux-loongarch64.tar.gz +loongson8.1.16-fx-jdk8u382b05-linux-loongarch64.tar.gz +loongson8.1.16-fx-jdk8u382b05-linux-loongson3a.tar.gz +loongson8.1.17-fx-jdk8u392b08-linux-loongarch64.tar.gz +loongson8.1.17-fx-jdk8u392b08-linux-loongson3a.tar.gz +loongson8.1.18-fx-jdk8u402b06-linux-loongarch64.tar.gz +loongson8.1.18-fx-jdk8u402b06-linux-loongson3a.tar.gz +loongson8.1.19-fx-jdk8u412b08-linux-loongarch64.tar.gz +loongson8.1.19-fx-jdk8u412b08-linux-loongson3a.tar.gz +loongson8.1.20-fx-jdk8u422b05-linux-loongarch64.tar.gz +loongson8.1.20-fx-jdk8u422b05-linux-loongson3a.tar.gz +loongson8.1.21-fx-jdk8u432b06-linux-loongarch64-glibc2.34.tar.gz +loongson8.1.21-fx-jdk8u432b06-linux-loongarch64.tar.gz +loongson8.1.21-fx-jdk8u432b06-linux-loongson3a.tar.gz +loongson8.1.22-fx-jdk8u442b06-linux-loongarch64-glibc2.34.tar.gz +loongson8.1.22-fx-jdk8u442b06-linux-loongarch64.tar.gz +loongson8.1.22-fx-jdk8u442b06-linux-loongson3a.tar.gz +loongson8.1.23-fx-jdk8u452b09-linux-loongarch64-glibc2.34.tar.gz +loongson8.1.23-fx-jdk8u452b09-linux-loongarch64.tar.gz +loongson8.1.24-fx-jdk8u462b08-linux-loongarch64-glibc2.34.tar.gz +loongson8.1.24-fx-jdk8u462b08-linux-loongarch64.tar.gz +loongson8.1.25-fx-jdk8u472b08-linux-loongarch64-glibc2.34.tar.gz +loongson8.1.25-fx-jdk8u472b08-linux-loongarch64.tar.gz +loongson8.1.26-fx-jdk8u482b08-linux-loongarch64-glibc2.34.tar.gz +loongson8.1.26-fx-jdk8u482b08-linux-loongarch64.tar.gz +loongson8.1.27-fx-jdk8u492b09-linux-loongarch64-glibc2.34.tar.gz +loongson8.1.27-fx-jdk8u492b09-linux-loongarch64.tar.gz +loongson8.1.28-fx-jdk8u502b07-linux-loongarch64-glibc2.34.tar.gz +loongson8.1.28-fx-jdk8u502b07-linux-loongarch64.tar.gz +loongson_openjdk8.1.1-jdk8u192b12-linux-loongson3a.tar.gz +loongson_openjdk8.1.2-jdk8u202b08-linux-loongson3a.tar.gz +loongson_openjdk8.1.3-jdk8u212b03-linux-loongson3a.tar.gz +loongson_openjdk8.1.4-jdk8u242b08-linux-loongson3a.tar.gz +loongson_openjdk8.1.5-jdk8u252b09-linux-loongson3a.tar.gz +loongson_openjdk8.1.6-jdk8u275b01-linux-loongson3a.tar.gz +loongson_openjdk8.1.7-jdk8u282b08-linux-loongson3a.tar.gz +loongson_openjdk8.1.8-jdk8u292b10-linux-loongarch64.tar.gz +loongson_openjdk8.1.8-jdk8u292b10-linux-loongson3a.tar.gz +loongson_openjdk8.1.9-jdk8u302b08-linux-loongarch64.tar.gz +loongson_openjdk8.1.9-jdk8u302b08-linux-loongson3a.tar.gz diff --git a/tests/loongnix_test.lua b/tests/loongnix_test.lua new file mode 100644 index 0000000..ee1e87c --- /dev/null +++ b/tests/loongnix_test.lua @@ -0,0 +1,83 @@ +dofile('tests/support.lua') +local calls = {} +local state = {} +package.preload.http = function() + return {get = function(request) + table.insert(calls, request.url) + assert(request.url:match('^https://ftp%.loongnix%.cn/Java/'), 'unexpected provider: ' .. request.url) + if state.failure then return state.failure.response, state.failure.err end + local path = request.url:gsub('https://ftp%.loongnix%.cn/Java/', '') + if path == '' then path = 'index' else path = path:gsub('/$', '') end + local f = assert(io.open('tests/fixtures/loongnix/' .. path .. '.html')) + local body = f:read('*a'); f:close() + return {status_code = 200, body = body}, nil + end} +end +package.preload.json = function() return {decode = function() error('Foojay must not be called') end} end +RUNTIME = {osType = 'linux', archType = 'loong64'} +PLUGIN = {} +dofile('hooks/available.lua') +dofile('hooks/pre_install.lua') +dofile('hooks/pre_use.lua') +local versions = PLUGIN:Available({args = {}}) +assert(#versions > 0, 'default loong64 search must return versions') +local found = {} +for _, item in ipairs(versions) do + assert(item.version:match('%-lnxabi[12]'), item.version) + assert(not found[item.version], 'duplicate version ' .. item.version) + found[item.version] = true + local result = PLUGIN:PreUse({version = item.version}) + assert(result.version == item.version, 'PreUse changed ABI or JavaFX suffix') +end +assert(found['21.0.12+8-lnxabi1-fx']) +assert(found['21.0.12+8-lnxabi2-fx']) +assert(found['8.0.502+7-lnxabi2-fx']) +local function check(version, expected, tail) + local result = PLUGIN:PreInstall({version = version}) + assert(result.version == expected, result.version) + assert(result.url:sub(-#tail) == tail, result.url) +end +check('21-lnxabi2-fx', '21.0.12+8-lnxabi2-fx', '-loongarch64-glibc2.34.tar.gz') +check('21.0.9+10-lnxabi1-fx', '21.0.9+10-lnxabi1-fx', '-loongarch64.tar.gz') +check('21.0.12+8-loongnix_abi2-fx', '21.0.12+8-lnxabi2-fx', '-loongarch64-glibc2.34.tar.gz') +check('25-lnxabi2-fx', '25.0.4+7-lnxabi2-fx', '-loongarch64-glibc2.34.tar.gz') +check('8-lnxabi2-fx', '8.0.502+7-lnxabi2-fx', '-loongarch64-glibc2.34.tar.gz') +check('17-lnxabi1', '17.0.3+7-lnxabi1', '-loongarch64.tar.gz') +local function rejects(fn, message) + local ok, err = pcall(fn) + assert(not ok and tostring(err):find(message, 1, true), tostring(err)) +end +rejects(function() PLUGIN:PreInstall({version='999-lnxabi2-fx'}) end, 'No Loongnix JDK') +rejects(function() PLUGIN:PreInstall({version='21'}) end, 'ABI') +rejects(function() PLUGIN:Available({args={'tem'}}) end, 'Foojay') +for _, abi in ipairs({'lnxabi1','lnxabi2'}) do + for _, item in ipairs(PLUGIN:Available({args={abi}})) do + assert(item.version:find('-' .. abi, 1, true)) + end +end +assert(#PLUGIN:Available({args={'all'}}) == #versions) +RUNTIME.archType = 'arm64' +rejects(function() PLUGIN:Available({args={'loongnix'}}) end, 'linux/loong64') +RUNTIME.archType = 'loong64'; RUNTIME.osType = 'darwin' +rejects(function() PLUGIN:PreInstall({version='21-lnxabi2-fx'}) end, 'linux/loong64') +RUNTIME.osType = 'linux' +state.failure = {err = 'network unavailable'} +rejects(function() PLUGIN:Available({args={}}) end, 'network unavailable') +state.failure = {response = {status_code=503, body='unavailable'}} +rejects(function() PLUGIN:Available({args={}}) end, '503') +state.failure = {response = {status_code=200, body='unexpected upstream page'}} +rejects(function() PLUGIN:Available({args={}}) end, 'No Loongnix JDK') +state.failure = nil +rejects(function() PLUGIN:PreInstall({version='21.0.1-lnxabi2-fx'}) end, 'No Loongnix JDK') +RUNTIME.archType = 'arm64' +local foojay_calls = {} +require('foojay').fetchtJdkList = function(distribution, version) + assert(not distribution:match('loongnix'), 'Loongnix leaked into Foojay') + table.insert(foojay_calls, distribution) + return {{java_version='21.0.1', term_of_support='lts'}} +end +assert(PLUGIN:Available({args={}})[1].version == '21.0.1') +assert(PLUGIN:Available({args={'tem'}})[1].version == '21.0.1-tem') +assert(#PLUGIN:Available({args={'all'}}) > 0) +assert(#foojay_calls > 2) +print('PASS: Loongnix hook regression tests (' .. #versions .. ' fixture versions)') diff --git a/tests/pre_use_test.lua b/tests/pre_use_test.lua index b513cac..8bb33b2 100644 --- a/tests/pre_use_test.lua +++ b/tests/pre_use_test.lua @@ -1,19 +1,4 @@ -package.path = './lib/?.lua;' .. package.path -package.preload['vfox.strings'] = function() - return { split = function(value, separator) - local result = {} - local start = 1 - while true do - local position = value:find(separator, start, true) - if not position then - table.insert(result, value:sub(start)) - return result - end - table.insert(result, value:sub(start, position - 1)) - start = position + #separator - end - end } -end +dofile('tests/support.lua') PLUGIN = {} dofile('hooks/pre_use.lua') local cases = { diff --git a/tests/support.lua b/tests/support.lua new file mode 100644 index 0000000..09bd15a --- /dev/null +++ b/tests/support.lua @@ -0,0 +1,16 @@ +package.path = './lib/?.lua;' .. package.path +package.preload['vfox.strings'] = function() + return { split = function(value, separator) + local result = {} + local start = 1 + while true do + local position = value:find(separator, start, true) + if not position then + table.insert(result, value:sub(start)) + return result + end + table.insert(result, value:sub(start, position - 1)) + start = position + #separator + end + end } +end