43 lines
2.6 KiB
JavaScript
43 lines
2.6 KiB
JavaScript
import {test} from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import {readFileSync} from 'node:fs';
|
|
import vm from 'node:vm';
|
|
const source=readFileSync(new URL('../host/gaia-mobile-settings.js',import.meta.url),'utf8').split('// Expose the single native SIM')[0];
|
|
function load(call,hooks={}) {
|
|
const navigator={};
|
|
vm.runInNewContext(source,{window:{VulpesNativeRadioStatus:true},location:{hostname:'system.localhost'},
|
|
navigator,VulpesCompat:{call},EventTarget,Event,DOMException,
|
|
document:{documentElement:{setAttribute(){},toggleAttribute(){},append(){}},createElement:()=>({})},addEventListener(type,fn){hooks.start=fn;},setInterval(fn){hooks.tick=fn;}});
|
|
return navigator.mozMobileConnections;
|
|
}
|
|
test('Nokia Gaia radio requests preserve DOMRequest callbacks and awaitable completion',async()=>{
|
|
const calls=[];
|
|
const connections=load(async(method,params)=>{calls.push({method,...params});return {slot:params.slot,radioState:'disabled'};});
|
|
let events=0;connections[1].addEventListener('radiostatechange',()=>events++);
|
|
const request=connections[1].setRadioEnabled(false);
|
|
let success=false;request.onsuccess=()=>success=true;
|
|
await request;
|
|
assert.deepEqual(calls,[{method:'platform.radioPower',slot:1,enabled:false}]);
|
|
assert.equal(request.readyState,'done');assert.equal(request.result,null);
|
|
assert.equal(success,true);assert.equal(events,1);assert.equal(connections[1].radioState,'disabled');
|
|
assert.equal(connections[0].radioState,'unknown');
|
|
});
|
|
test('a modem refusal propagates without claiming a new radio state',async()=>{
|
|
const connections=load(async()=>{throw Error('RADIO_BUSY');});
|
|
const request=connections[0].setRadioEnabled(false);
|
|
let failed=false;request.onerror=()=>failed=true;
|
|
await assert.rejects(Promise.resolve(request),/RADIO_BUSY/);
|
|
assert.equal(failed,true);assert.equal(connections[0].radioState,'unknown');
|
|
});
|
|
|
|
test('unchanged and cached modem snapshots do not cancel Gaia airplane mode',async()=>{
|
|
const hooks={},stamp=Date.now()/1000;
|
|
const conn=load(async(method)=>method==='platform.snapshot' ? {recordedAt:stamp,radio:[0,1].map(slot=>({slot,available:true,radioState:'enabled',sim:{present:false}}))} : {radioState:'disabled'},hooks)[0];
|
|
let events=0;conn.addEventListener('radiostatechange',()=>events++);
|
|
hooks.start();await new Promise(setImmediate);
|
|
assert.equal(events,1);assert.equal(conn.radioState,'enabled');
|
|
await hooks.tick();assert.equal(events,1);
|
|
await new Promise(r=>setTimeout(r,5));
|
|
await conn.setRadioEnabled(false);assert.equal(events,2);
|
|
await hooks.tick();assert.equal(conn.radioState,'disabled');assert.equal(events,2);
|
|
});
|