30 lines
2.4 KiB
JavaScript
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;});
|