Files
juzi/h5/test/wrinkle-jobs.js
T

30 lines
2.4 KiB
JavaScript

'use strict';
const assert=require('node:assert/strict'),fs=require('node:fs'),os=require('node:os'),path=require('node:path');
const create=require('../lib/wrinkle-jobs');
const dir=fs.mkdtempSync(path.join(os.tmpdir(),'juzi-wrinkle-jobs-'));
const owner={id:'owner',kind:'wechat'},guest={id:'guest',kind:'browser'};
const ready={version:'independent-side-wrinkles-v1',left:{status:'ready'},right:{status:'ready'}};
(async()=>{
let calls=0,finish,completed=0;
const deps={dir,collect:()=>{calls++;return new Promise(r=>{finish=r;});},load:()=>({}),complete:()=>{completed++;}};
const jobs=create(deps),job=jobs.register(owner,'Rtest',{});assert.equal(calls,0,'registration cannot start paid work');
assert.equal(await jobs.run({id:'intruder',kind:'wechat'},job.token),null);
const a=jobs.run(owner,job.token),b=jobs.run(owner,job.token);assert.equal(calls,1);finish(ready);
assert.deepEqual(await a,ready);assert.deepEqual(await b,ready);assert.equal(completed,1);
assert.deepEqual(await jobs.run(owner,job.token),ready);assert.equal(calls,1);
const restarted=create({...deps,collect:()=>{throw Error('must use persistent cache');}});
assert.deepEqual(await restarted.run(owner,job.token),ready);
const before=fs.readdirSync(dir);const g=jobs.register(guest,'Rguest',{});
const gr=jobs.run(guest,g.token);finish(ready);await gr;
assert.deepEqual(fs.readdirSync(dir),before,'guest jobs/photos/results never persist');
const pending=jobs.register(owner,'Rpending',{});
const reload=create({...deps,collect:async()=>ready});assert.deepEqual(await reload.run(owner,pending.token),ready,'pending restart reloads own saved snapshot');
const running=jobs.register(owner,'Rrunning',{});const old=jobs.run(owner,running.token);
const afterCrash=create({...deps,collect:()=>{throw Error('must not charge twice');}});
assert.equal((await afterCrash.run(owner,running.token)).left.error_code,'WRINKLE_JOB_INTERRUPTED');finish(ready);await old;
const failed=create({...deps,collect:async()=>{throw Error('provider failed');}});const f=failed.register(owner,'Rfailed',{});
assert.equal((await failed.run(owner,f.token)).left.error_code,'WRINKLE_JOB_FAILED');
assert.equal(await failed.run(owner,'../bad'),null);
console.log('PASS: lazy owner-bound single-flight jobs, durable success/failure cache, crash no-duplicate-charge policy, pending recovery, guest RAM-only');
})().catch(e=>{console.error(e);process.exitCode=1;});