summaryrefslogtreecommitdiff
path: root/tests/utils.ts
diff options
context:
space:
mode:
Diffstat (limited to 'tests/utils.ts')
-rwxr-xr-xtests/utils.ts164
1 files changed, 119 insertions, 45 deletions
diff --git a/tests/utils.ts b/tests/utils.ts
index 028e0ff..9408f54 100755
--- a/tests/utils.ts
+++ b/tests/utils.ts
@@ -1,4 +1,18 @@
import { build$, CommandBuilder } from "jsr:@david/dax";
+import { dirname, join } from "jsr:@std/path";
+import {
+ downloadDependencies,
+ dylibInfos,
+ getFileInfo,
+ moneroCliInfo,
+ Target,
+ wowneroCliInfo,
+} from "./download_deps.ts";
+import { loadMoneroDylib, loadWowneroDylib, moneroSymbols, wowneroSymbols } from "../impls/monero.ts/mod.ts";
+
+export type Coin = "monero" | "wownero";
+
+const target = `${Deno.build.os}_${Deno.build.arch}` as const;
export const $ = build$({
commandBuilder: new CommandBuilder()
@@ -8,34 +22,83 @@ export const $ = build$({
.stderr("inherit"),
});
-type Coin = "monero" | "wownero";
+export const dylibNames = (coin: Coin, version: MoneroCVersion) => ({
+ linux_x86_64: `${coin}_x86_64-linux-gnu_libwallet2_api_c.so`,
+ darwin_aarch64: version === "next"
+ ? `${coin}_aarch64-apple-darwin_libwallet2_api_c.dylib`
+ : `${coin}_aarch64-apple-darwin11_libwallet2_api_c.dylib`,
+ windows_x86_64: `${coin}_x86_64-w64-mingw32_libwallet2_api_c.dll`,
+} as Partial<Record<Target, string>>);
+
+export const moneroTsDylibNames = (coin: Coin) => ({
+ linux_x86_64: `${coin}_libwallet2_api_c.so`,
+ darwin_aarch64: `${coin}_aarch64-apple-darwin11_libwallet2_api_c.dylib`,
+ windows_x86_64: `${coin}_libwallet2_api_c.dll`,
+} as Partial<Record<Target, string>>);
+
+export function loadDylib(coin: Coin, version: MoneroCVersion) {
+ const dylibName = moneroTsDylibNames(coin)[target]!;
+
+ if (coin === "monero") {
+ const dylib = Deno.dlopen(`tests/dependencies/libs/${version}/${dylibName}`, moneroSymbols);
+ loadMoneroDylib(dylib);
+ return dylib;
+ } else {
+ const dylib = Deno.dlopen(`tests/dependencies/libs/${version}/${dylibName}`, wowneroSymbols);
+ loadWowneroDylib(dylib);
+ return dylib;
+ }
+}
-export async function downloadMoneroCli() {
- const MONERO_CLI_FILE_NAME = "monero-linux-x64-v0.18.3.4";
- const MONERO_WALLET_CLI_URL = `https://downloads.getmonero.org/cli/${MONERO_CLI_FILE_NAME}.tar.bz2`;
+async function exists(path: string): Promise<boolean> {
+ try {
+ await Deno.stat(path);
+ return true;
+ } catch (error) {
+ if (error instanceof Deno.errors.NotFound) {
+ return false;
+ }
+ throw error;
+ }
+}
- await $`wget ${MONERO_WALLET_CLI_URL}`;
- await $
- .raw`tar -xvf ${MONERO_CLI_FILE_NAME}.tar.bz2 --one-top-level=monero-cli --strip-components=1 -C tests`;
- await $.raw`rm ${MONERO_CLI_FILE_NAME}.tar.bz2`;
+export async function extract(path: string, out: string) {
+ const outDir = out.endsWith("/") ? out : dirname(out);
+ await Deno.mkdir(outDir, { recursive: true });
+
+ if (path.endsWith(".tar.bz2")) {
+ let args = `-C ${dirname(out)}`;
+ if (outDir === out) {
+ args = `-C ${out} --strip-components=1`;
+ }
+ await $.raw`tar -xf ${path} ${args}`;
+ } else if (path.endsWith(".zip")) {
+ await $.raw`unzip ${path} -nu -d ${outDir}`;
+ } else if (path.endsWith(".xz")) {
+ await $.raw`xz -kd ${path}`;
+ await Deno.rename(path.slice(0, -3), out);
+ } else {
+ throw new Error("Unsupported archive file for:" + path);
+ }
}
-export async function downloadWowneroCli() {
- const WOWNERO_CLI_FILE_NAME = "wownero-x86_64-linux-gnu-59db3fe8d";
- const WOWNERO_WALLET_CLI_URL =
- `https://codeberg.org/wownero/wownero/releases/download/v0.11.2.0/wownero-x86_64-linux-gnu-59db3fe8d.tar.bz2`;
+export async function prepareMoneroCli() {
+ await downloadDependencies(moneroCliInfo);
+ const path = join("./tests/dependencies", moneroCliInfo.outDir ?? "", getFileInfo(moneroCliInfo).names[0]);
+ await extract(path, "./tests/dependencies/monero-cli/");
+}
- await $`wget ${WOWNERO_WALLET_CLI_URL}`;
- await $
- .raw`tar -xvf ${WOWNERO_CLI_FILE_NAME}.tar.bz2 --one-top-level=wownero-cli --strip-components=1 -C tests`;
- await $.raw`rm ${WOWNERO_CLI_FILE_NAME}.tar.bz2`;
+export async function prepareWowneroCli() {
+ await downloadDependencies(wowneroCliInfo);
+ const path = join("./tests/dependencies", wowneroCliInfo.outDir ?? "", getFileInfo(wowneroCliInfo).names[0]);
+ await extract(path, "./tests/dependencies/wownero-cli/");
}
-export function downloadCli(coin: Coin) {
+export function prepareCli(coin: Coin) {
if (coin === "wownero") {
- return downloadWowneroCli();
+ return prepareWowneroCli();
}
- return downloadMoneroCli();
+ return prepareMoneroCli();
}
interface WalletInfo {
@@ -54,7 +117,7 @@ export async function createWalletViaCli(
password: string,
): Promise<WalletInfo> {
const path = `./tests/wallets/${name}`;
- const cliPath = `./tests/${coin}-cli/${coin}-wallet-cli`;
+ const cliPath = `./tests/dependencies/${coin}-cli/${coin}-wallet-cli`;
await $
.raw`${cliPath} --generate-new-wallet ${path} --password ${password} --mnemonic-language English --command exit`
@@ -97,35 +160,46 @@ export async function createWalletViaCli(
export type MoneroCVersion = "next" | (string & {});
export async function getMoneroCTags(): Promise<string[]> {
- return ((
- await (await fetch(
- "https://api.github.com/repos/MrCyjanek/monero_c/releases",
- )).json()
- ) as { tag_name: string }[])
- .map(({ tag_name }) => tag_name);
+ const response = await fetch("https://static.mrcyjanek.net/monero_c/release.php");
+
+ if (!response.ok) {
+ throw new Error(`Could not receive monero_c release tags: ${await response.text()}`);
+ }
+
+ const json = await response.json() as { tag_name: string }[];
+ return json.map(({ tag_name }) => tag_name);
}
-export async function getMoneroC(coin: Coin, version: MoneroCVersion) {
- const dylibName = `${coin}_x86_64-linux-gnu_libwallet2_api_c.so`;
- const endpointDylibName = `${coin}_libwallet2_api_c.so`;
+
+export async function prepareMoneroC(coin: Coin, version: MoneroCVersion) {
+ const dylibName = dylibNames(coin, version)[target];
+ const moneroTsDylibName = moneroTsDylibNames(coin)[target];
+
+ if (!dylibName || !moneroTsDylibName) {
+ throw new Error(`Missing dylib name value for target: ${target}`);
+ }
+
const releaseDylibName = dylibName.slice(`${coin}_`.length);
if (version === "next") {
- await $.raw`xz -kd release/${coin}/${releaseDylibName}.xz`;
- await $`mkdir -p tests/libs/next`;
- await $`mv release/${coin}/${releaseDylibName} tests/libs/next/${endpointDylibName}`;
+ const outFileDir = `./tests/dependencies/libs/${version}/${moneroTsDylibName}`;
+
+ if (await exists(outFileDir)) {
+ return;
+ }
+
+ await extract(`./release/${coin}/${releaseDylibName}.xz`, outFileDir);
} else {
- const downloadUrl = `https://github.com/MrCyjaneK/monero_c/releases/download/${version}/${dylibName}.xz`;
-
- const file = await Deno.open(`./tests/${dylibName}.xz`, {
- create: true,
- write: true,
- });
- file.write(await (await fetch(downloadUrl)).bytes());
- file.close();
-
- await $.raw`xz -d ./tests/${dylibName}.xz`;
- await $.raw`mkdir -p ./tests/libs/${version}`;
- await $
- .raw`mv ./tests/${dylibName} ./tests/libs/${version}/${endpointDylibName}`;
+ const outFileDir = `./tests/dependencies/libs/${version}/${moneroTsDylibName}`;
+
+ if (await exists(outFileDir)) {
+ return;
+ }
+
+ const downloadInfo = dylibInfos[coin].find((info) => info.outDir?.endsWith(version));
+ if (downloadInfo) {
+ await downloadDependencies(downloadInfo);
+ }
+
+ await extract(`./tests/dependencies/libs/${version}/${dylibName}.xz`, outFileDir);
}
}