|
|
<!doctype html> |
|
|
<html lang="en-us"> |
|
|
<head> |
|
|
<meta charset="utf-8"> |
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
|
|
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon"> |
|
|
<link rel="stylesheet" href="../../../common/emscripten.css"/> |
|
|
<link rel="stylesheet" href="../../../common/testing.css"/> |
|
|
<title>sqlite3 tester: OpfsSAHPool Digest</title> |
|
|
<style></style> |
|
|
</head> |
|
|
<body><h1 id='color-target'></h1> |
|
|
|
|
|
<p> |
|
|
This is a test app for the digest calculation of the OPFS |
|
|
SAHPool VFS. It requires running it with a new database created using |
|
|
v3.49.0 or older, then running it again with a newer version, then |
|
|
again with 3.49.0 or older. |
|
|
</p> |
|
|
<div class='input-wrapper'> |
|
|
<input type='checkbox' id='cb-log-reverse'> |
|
|
<label for='cb-log-reverse'>Reverse log order?</label> |
|
|
</div> |
|
|
<div id='test-output'></div> |
|
|
<script> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(function(){ |
|
|
'use strict'; |
|
|
document.querySelector('h1').innerHTML = |
|
|
document.querySelector('title').innerHTML; |
|
|
const mapToString = (v)=>{ |
|
|
switch(typeof v){ |
|
|
case 'number': case 'string': case 'boolean': |
|
|
case 'undefined': case 'bigint': |
|
|
return ''+v; |
|
|
default: break; |
|
|
} |
|
|
if(null===v) return 'null'; |
|
|
if(v instanceof Error){ |
|
|
v = { |
|
|
message: v.message, |
|
|
stack: v.stack, |
|
|
errorClass: v.name |
|
|
}; |
|
|
} |
|
|
return JSON.stringify(v,undefined,2); |
|
|
}; |
|
|
const normalizeArgs = (args)=>args.map(mapToString); |
|
|
const logTarget = document.querySelector('#test-output'); |
|
|
const logClass = function(cssClass,...args){ |
|
|
const ln = document.createElement('div'); |
|
|
if(cssClass){ |
|
|
for(const c of (Array.isArray(cssClass) ? cssClass : [cssClass])){ |
|
|
ln.classList.add(c); |
|
|
} |
|
|
} |
|
|
ln.append(document.createTextNode(normalizeArgs(args).join(' '))); |
|
|
logTarget.append(ln); |
|
|
}; |
|
|
const cbReverse = document.querySelector('#cb-log-reverse'); |
|
|
|
|
|
const cbReverseKey = 'tester1:cb-log-reverse'; |
|
|
const cbReverseIt = ()=>{ |
|
|
logTarget.classList[cbReverse.checked ? 'add' : 'remove']('reverse'); |
|
|
|
|
|
}; |
|
|
cbReverse.addEventListener('change', cbReverseIt, true); |
|
|
|
|
|
|
|
|
|
|
|
cbReverseIt(); |
|
|
|
|
|
const log = (...args)=>{ |
|
|
|
|
|
logClass('',...args); |
|
|
} |
|
|
const warn = (...args)=>{ |
|
|
console.warn(...args); |
|
|
logClass('warning',...args); |
|
|
} |
|
|
const error = (...args)=>{ |
|
|
console.error(...args); |
|
|
logClass('error',...args); |
|
|
}; |
|
|
|
|
|
const toss = (...args)=>{ |
|
|
error(...args); |
|
|
throw new Error(args.join(' ')); |
|
|
}; |
|
|
|
|
|
const endOfWork = (passed=true)=>{ |
|
|
const eH = document.querySelector('#color-target'); |
|
|
const eT = document.querySelector('title'); |
|
|
if(passed){ |
|
|
log("End of work chain. If you made it this far, you win."); |
|
|
eH.innerText = 'PASS: '+eH.innerText; |
|
|
eH.classList.add('tests-pass'); |
|
|
eT.innerText = 'PASS: '+eT.innerText; |
|
|
}else{ |
|
|
eH.innerText = 'FAIL: '+eH.innerText; |
|
|
eH.classList.add('tests-fail'); |
|
|
eT.innerText = 'FAIL: '+eT.innerText; |
|
|
} |
|
|
}; |
|
|
|
|
|
log("Running opfs-sahpool digest tests..."); |
|
|
const W1 = new Worker('digest-worker.js?sqlite3.dir=../../../jswasm'); |
|
|
W1.onmessage = function({data}){ |
|
|
|
|
|
switch(data.type){ |
|
|
case 'log': |
|
|
log('worker says:', ...data.payload); |
|
|
break; |
|
|
case 'error': |
|
|
error('worker says:', ...data.payload); |
|
|
endOfWork(false); |
|
|
break; |
|
|
case 'initialized': |
|
|
log(data.workerId, ': Worker initialized',...data.payload); |
|
|
break; |
|
|
} |
|
|
}; |
|
|
})(); |
|
|
</script> |
|
|
</body> |
|
|
</html> |
|
|
|