PLWL/test/e2e-wine.js
2026-09-25 17:09:38 +02:00

80 lines
3.3 KiB
JavaScript

'use strict'
const path = require('path')
const fs = require('fs')
const prefixes = require('../src/prefixes')
const runner = require('../src/runner')
const wines = require('../src/wines')
async function main() {
const created = prefixes.createPrefix('e2e-test')
if (!created.ok && created.error !== 'alreadyExists') throw new Error('prefix create failed: ' + created.error)
const game = {
id: 'e2e-test',
name: 'E2E Test',
mode: 'leave',
path: '.',
exePath: 'C:\\windows\\system32\\cmd.exe',
workdir: path.resolve('.'),
wine: 'system',
prefix: 'e2e-test',
args: '/c echo PLGL-E2E-OK > C:\\plgl-e2e-out.txt',
dllOverrides: [{ dll: 'dinput8', setting: 'native' }],
env: { E2E_MARKER: '1' }
}
const { env } = runner.buildEnv({ game, wine: { id: 'system', type: 'system' }, systemWine: true })
if (!env.WINEPREFIX.includes('e2e-test')) throw new Error('WINEPREFIX mismatch: ' + env.WINEPREFIX)
if (env.WINEDLLOVERRIDES !== 'dinput8=native') throw new Error('dll overrides mismatch: ' + env.WINEDLLOVERRIDES)
if (env.E2E_MARKER !== '1') throw new Error('game env not applied')
console.log('PASS: system wine env', { WINEPREFIX: env.WINEPREFIX, WINEDLLOVERRIDES: env.WINEDLLOVERRIDES })
const protonDir = path.join(require('../src/paths').DIRS.WINES, 'e2e-fake-proton')
fs.mkdirSync(protonDir, { recursive: true })
fs.writeFileSync(path.join(protonDir, 'proton'), '#!/usr/bin/env python3\n')
await wines.refreshWines()
const proton = wines.getWines().find(w => w.id === 'e2e-fake-proton')
if (!proton) throw new Error('proton build not detected')
if (proton.type !== 'proton') throw new Error('wrong type: ' + proton.type)
const penv = runner.buildEnv({ game, wine: proton, systemWine: false }).env
if (penv.STEAM_COMPAT_DATA_PATH !== path.join(require('../src/paths').DIRS.DATA, 'compat', 'e2e-test')) {
throw new Error('compat path mismatch: ' + penv.STEAM_COMPAT_DATA_PATH)
}
if (penv.WINEPREFIX !== path.join(penv.STEAM_COMPAT_DATA_PATH, 'pfx')) throw new Error('proton WINEPREFIX mismatch')
if (fs.readlinkSync(penv.STEAM_COMPAT_DATA_PATH) !== prefixes.prefixPath('e2e-test')) {
throw new Error('compatdata is not symlinked to the prefix')
}
if (!fs.existsSync(penv.STEAM_COMPAT_CLIENT_INSTALL_PATH)) throw new Error('fake steam missing')
console.log('PASS: proton env', {
STEAM_COMPAT_DATA_PATH: penv.STEAM_COMPAT_DATA_PATH,
CLIENT_INSTALL_PATH: penv.STEAM_COMPAT_CLIENT_INSTALL_PATH
})
console.log('launching real wine...')
await runner.runGame({ game, wine: { id: 'system', type: 'system' }, systemWine: true })
for (let i = 0; i < 45; i++) {
await new Promise(r => setTimeout(r, 2000))
const outFile = path.join(env.WINEPREFIX, 'drive_c', 'plgl-e2e-out.txt')
if (fs.existsSync(outFile)) {
console.log('OUTPUT FILE CONTENT:', fs.readFileSync(outFile, 'utf8').trim())
console.log('E2E PASS: wine executed the exe and wrote the file')
prefixes.deletePrefix('e2e-test')
fs.rmSync(protonDir, { recursive: true, force: true })
await wines.refreshWines()
return
}
}
console.log('E2E SOFT-FAIL: prefix init not finished in time (first wine run can be slow)')
prefixes.deletePrefix('e2e-test')
fs.rmSync(protonDir, { recursive: true, force: true })
await wines.refreshWines()
}
main().catch(e => {
console.error(e)
process.exit(1)
})