Panic tests for rod & radix.js try / catch (#1269)

* try/catch radix.js

* rod test/panic/chat.js

rod test/panic/holy-grail.js

rod panic tests
This commit is contained in:
Martti Malmi 2022-08-13 21:58:00 +03:00 committed by GitHub
parent d5c8a02980
commit 7123207c66
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 253 additions and 50 deletions

View File

@ -62,47 +62,50 @@
return radix; return radix;
}; };
Radix.map = function rap(radix, cb, opt, pre){ pre = pre || []; // TODO: BUG: most out-of-memory crashes come from here. Radix.map = function rap(radix, cb, opt, pre){
var t = ('function' == typeof radix)? radix.$ || {} : radix; try {
//!opt && console.log("WHAT IS T?", JSON.stringify(t).length); pre = pre || []; // TODO: BUG: most out-of-memory crashes come from here.
if(!t){ return } var t = ('function' == typeof radix)? radix.$ || {} : radix;
if('string' == typeof t){ if(Radix.debug){ throw ['BUG:', radix, cb, opt, pre] } return; } //!opt && console.log("WHAT IS T?", JSON.stringify(t).length);
var keys = (t[_]||no).sort || (t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }()).sort, rev; // ONLY 17% of ops are pre-sorted! if(!t){ return }
//var keys = Object.keys(t).sort(); if('string' == typeof t){ if(Radix.debug){ throw ['BUG:', radix, cb, opt, pre] } return; }
opt = (true === opt)? {branch: true} : (opt || {}); var keys = (t[_]||no).sort || (t[_] = function $(){ $.sort = Object.keys(t).sort(); return $ }()).sort, rev; // ONLY 17% of ops are pre-sorted!
if(rev = opt.reverse){ keys = keys.slice(0).reverse() } //var keys = Object.keys(t).sort();
var start = opt.start, end = opt.end, END = '\uffff'; opt = (true === opt)? {branch: true} : (opt || {});
var i = 0, l = keys.length; if(rev = opt.reverse){ keys = keys.slice(0).reverse() }
for(;i < l; i++){ var key = keys[i], tree = t[key], tmp, p, pt; var start = opt.start, end = opt.end, END = '\uffff';
if(!tree || '' === key || _ === key || 'undefined' === key){ continue } var i = 0, l = keys.length;
p = pre.slice(0); p.push(key); for(;i < l; i++){ var key = keys[i], tree = t[key], tmp, p, pt;
pt = p.join(''); if(!tree || '' === key || _ === key || 'undefined' === key){ continue }
if(u !== start && pt < (start||'').slice(0,pt.length)){ continue } p = pre.slice(0); p.push(key);
if(u !== end && (end || END) < pt){ continue } pt = p.join('');
if(rev){ // children must be checked first when going in reverse. if(u !== start && pt < (start||'').slice(0,pt.length)){ continue }
tmp = rap(tree, cb, opt, p); if(u !== end && (end || END) < pt){ continue }
if(u !== tmp){ return tmp } if(rev){ // children must be checked first when going in reverse.
} tmp = rap(tree, cb, opt, p);
if(u !== (tmp = tree[''])){
var yes = 1;
if(u !== start && pt < (start||'')){ yes = 0 }
if(u !== end && pt > (end || END)){ yes = 0 }
if(yes){
tmp = cb(tmp, pt, key, pre);
if(u !== tmp){ return tmp } if(u !== tmp){ return tmp }
} }
} else if(u !== (tmp = tree[''])){
if(opt.branch){ var yes = 1;
tmp = cb(u, pt, key, pre); if(u !== start && pt < (start||'')){ yes = 0 }
if(u !== tmp){ return tmp } if(u !== end && pt > (end || END)){ yes = 0 }
if(yes){
tmp = cb(tmp, pt, key, pre);
if(u !== tmp){ return tmp }
}
} else
if(opt.branch){
tmp = cb(u, pt, key, pre);
if(u !== tmp){ return tmp }
}
pre = p;
if(!rev){
tmp = rap(tree, cb, opt, pre);
if(u !== tmp){ return tmp }
}
pre.pop();
} }
pre = p; } catch (e) { console.error(e); }
if(!rev){
tmp = rap(tree, cb, opt, pre);
if(u !== tmp){ return tmp }
}
pre.pop();
}
}; };
if(typeof window !== "undefined"){ if(typeof window !== "undefined"){

View File

@ -85,6 +85,21 @@ describe("Put ACK", function(){
peers.push('http://'+ env.config.IP + ':' + tmp + '/gun'); peers.push('http://'+ env.config.IP + ':' + tmp + '/gun');
} }
} }
if (process.env.ROD_PATH) {
// currently fails because rod doesn't ack
console.log('testing with rod');
const sp = require('child_process').spawn(process.env.ROD_PATH, ['start', '--port', port, '--sled-storage=false', '--peers', peers.join(',').replaceAll('http', 'ws')]);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
console.log(port, " connect to ", peers); console.log(port, " connect to ", peers);
var gun = Gun({file: env.i+'data', peers: peers, web: server, axe: false}); // Note: test with AXE on & off. var gun = Gun({file: env.i+'data', peers: peers, web: server, axe: false}); // Note: test with AXE on & off.
server.listen(port, function(){ server.listen(port, function(){

View File

@ -78,6 +78,24 @@ describe("GET GET", function(){
} }
} }
console.log(port, " connect to ", peers); console.log(port, " connect to ", peers);
if (process.env.ROD_PATH) {
console.log('testing with rod');
var args = ['start', '--port', port, '--sled-storage=false'];
if (peers.length) {
args.push('--peers=' + peers.join(',').replaceAll('http', 'ws'));
}
const sp = require('child_process').spawn(process.env.ROD_PATH, args);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
var gun = Gun({file: env.i+'data', peers: peers, web: server}); var gun = Gun({file: env.i+'data', peers: peers, web: server});
server.listen(port, function(){ server.listen(port, function(){
test.done(); test.done();

View File

@ -74,6 +74,24 @@ describe("Put ACK", function(){
} }
} }
console.log(port, " connect to ", peers); console.log(port, " connect to ", peers);
if (process.env.ROD_PATH) {
console.log('testing with rod');
var args = ['start', '--port', port, '--sled-storage=false'];
if (peers.length) {
args.push('--peers=' + peers.join(',').replaceAll('http', 'ws'));
}
const sp = require('child_process').spawn(process.env.ROD_PATH, args);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
var gun = Gun({file: false, rad: false, localStorage: false, file: env.i+'data', peers: peers, web: server, axe: false}); var gun = Gun({file: false, rad: false, localStorage: false, file: env.i+'data', peers: peers, web: server, axe: false});
server.listen(port, function(){ server.listen(port, function(){
test.done(); test.done();

View File

@ -86,6 +86,24 @@ describe("Dedup load balancing GETs", function(){
peers.push('http://'+ env.config.IP + ':' + tmp + '/gun'); peers.push('http://'+ env.config.IP + ':' + tmp + '/gun');
} }
} }
if (process.env.ROD_PATH) {
console.log('testing with rod');
var args = ['start', '--port', port, '--sled-storage=false'];
if (peers.length) {
args.push('--peers=' + peers.join(',').replaceAll('http', 'ws'));
}
const sp = require('child_process').spawn(process.env.ROD_PATH, args);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
var gun = Gun({peers: peers, web: server, rad: false, radisk: false, file: false, localStorage: false, axe: false}); var gun = Gun({peers: peers, web: server, rad: false, radisk: false, file: false, localStorage: false, axe: false});
server.listen(port, function(){ server.listen(port, function(){
test.done(); test.done();

View File

@ -59,6 +59,24 @@ describe("Do not connect to self", function(){
// make sure to connect to self/same. // make sure to connect to self/same.
peers.push(self_url); peers.push(self_url);
console.log(port, " connect to ", peers); console.log(port, " connect to ", peers);
if (process.env.ROD_PATH) {
console.log('testing with rod');
var args = ['start', '--port', port, '--sled-storage=false'];
if (peers.length) {
args.push('--peers=' + peers.join(',').replaceAll('http', 'ws'));
}
const sp = require('child_process').spawn(process.env.ROD_PATH, args);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
var gun = Gun({file: env.i+'data', peers: peers, web: server, multicast: false}); var gun = Gun({file: env.i+'data', peers: peers, web: server, multicast: false});
global.gun = gun; global.gun = gun;
server.listen(port, function(){ server.listen(port, function(){

View File

@ -65,6 +65,24 @@ describe("Put ACK", function(){
} }
global.peerID = String.fromCharCode(64 + env.i); global.peerID = String.fromCharCode(64 + env.i);
console.log(env.i, port, " connect to ", peers); console.log(env.i, port, " connect to ", peers);
if (process.env.ROD_PATH) {
console.log('testing with rod');
var args = ['start', '--port', port, '--sled-storage=false'];
if (peers.length) {
args.push('--peers=' + peers.join(',').replaceAll('http', 'ws'));
}
const sp = require('child_process').spawn(process.env.ROD_PATH, args);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
// TODO what should gun be when testing on rod?
var gun = Gun({file: env.i+'data', pid: peerID, peers: peers, web: server}); var gun = Gun({file: env.i+'data', pid: peerID, peers: peers, web: server});
global.gun = gun; global.gun = gun;
server.listen(port, function(){ server.listen(port, function(){

View File

@ -78,6 +78,24 @@ describe("Dedup load balancing GETs", function(){
var tmp = (env.config.port + (i + 1)); var tmp = (env.config.port + (i + 1));
peers.push('http://'+ env.config.IP + ':' + tmp + '/gun'); peers.push('http://'+ env.config.IP + ':' + tmp + '/gun');
} }
if (process.env.ROD_PATH) {
console.log('testing with rod');
var args = ['start', '--port', port, '--sled-storage=false'];
if (peers.length) {
args.push('--peers=' + peers.join(',').replaceAll('http', 'ws'));
}
const sp = require('child_process').spawn(process.env.ROD_PATH, args);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
var gun = Gun({file: env.i+'data', peers: peers, web: server}); var gun = Gun({file: env.i+'data', peers: peers, web: server});
server.listen(port, function(){ server.listen(port, function(){
test.done(); test.done();

View File

@ -86,19 +86,50 @@ describe("Mob test.", function(){
relays.each(function(client){ relays.each(function(client){
tests.push(client.run(function(test){ tests.push(client.run(function(test){
var env = test.props; var env = test.props;
test.async();
try{ require('fs').unlinkSync(env.i+'data') }catch(e){}
try{ require('gun/lib/fsrm')(env.i+'data') }catch(e){}
var server = require('http').createServer(function(req, res){
res.end("I am "+ env.i +"!");
});
var port = env.config.port + env.i; var port = env.config.port + env.i;
var Gun; try{ Gun = require('gun') }catch(e){ console.log("GUN not found! You need to link GUN to PANIC. Nesting the `gun` repo inside a `node_modules` parent folder often fixes this.") } test.async();
var peers = [], i = env.config.relays; var peers = [], i = env.config.relays;
while(i--){ // make sure to connect to self/same. while(i--){ // make sure to connect to self/same.
var tmp = (env.config.port + (i + 1)); var tmp = (env.config.port + (i + 1));
peers.push('http://'+ env.config.IP + ':' + tmp + '/gun'); peers.push('http://'+ env.config.IP + ':' + tmp + '/gun');
} }
if (process.env.ROD_PATH) {
console.log('testing with rod');
var args = ['start', '--port', port, '--sled-storage=false'];
if (peers.length) {
args.push('--peers=' + peers.join(',').replaceAll('http', 'ws'));
}
const sp = require('child_process').spawn(process.env.ROD_PATH, args);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
try {
require('fs').unlinkSync(env.i + 'data')
} catch (e) {
}
try {
require('gun/lib/fsrm')(env.i + 'data')
} catch (e) {
}
var server = require('http').createServer(function (req, res) {
res.end("I am " + env.i + "!");
});
var Gun;
try {
Gun = require('gun')
} catch (e) {
console.log("GUN not found! You need to link GUN to PANIC. Nesting the `gun` repo inside a `node_modules` parent folder often fixes this.")
}
console.log(port, " connect to ", peers); console.log(port, " connect to ", peers);
var gun = Gun({file: env.i+'data', peers: peers, web: server, mob: 3, multicast: false}); var gun = Gun({file: env.i+'data', peers: peers, web: server, mob: 3, multicast: false});
global.gun = gun; global.gun = gun;
@ -107,7 +138,7 @@ describe("Mob test.", function(){
}); });
gun.get('a').on(function(){ }); // TODO: Wrong! This is an example of the test using GUN in weird ways to work around bugs at the time of writing. This line should not be necessary, AXE should still pass even if this line is commented out, however if it fails then that is a bug in GUN's logic, not AXE. gun.get('a').on(function(){ }); // TODO: Wrong! This is an example of the test using GUN in weird ways to work around bugs at the time of writing. This line should not be necessary, AXE should still pass even if this line is commented out, however if it fails then that is a bug in GUN's logic, not AXE.
}, {i: i += 1, config: config})); }, {i: i += 1, config: config}));
}); });
return Promise.all(tests); return Promise.all(tests);
}); });
@ -151,7 +182,7 @@ describe("Mob test.", function(){
test.done(); test.done();
} }
gun.TO = setTimeout(end, 3000); gun.TO = setTimeout(end, 3000);
}, {i: i += 1, config: config})); }, {i: i += 1, config: config}));
}); });
return Promise.all(tests); return Promise.all(tests);
}); });

View File

@ -84,6 +84,22 @@ describe("Load test "+ config.browsers +" browser(s) across "+ config.relays +"
var env = test.props; var env = test.props;
// As a result, we have to manually pass it scope. // As a result, we have to manually pass it scope.
test.async(); test.async();
if (process.env.ROD_PATH) {
try {
const sp = require('child_process').spawn(process.env.ROD_PATH, ['start', '--port', env.config.port + env.i, '--sled-storage=false']);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
} catch (e) {
console.log(e);
}
return;
}
// Clean up from previous test. // Clean up from previous test.
try{ require('fs').unlinkSync(env.i+'data.json') }catch(e){} try{ require('fs').unlinkSync(env.i+'data.json') }catch(e){}
var server = require('http').createServer(function(req, res){ var server = require('http').createServer(function(req, res){

View File

@ -51,12 +51,26 @@ describe("The Holy Grail Test!", function(){
it("GUN started!", function(){ it("GUN started!", function(){
return relay.run(function(test){ return relay.run(function(test){
var env = test.props; var env = test.props;
var port = env.config.port + env.i;
test.async(); test.async();
if (process.env.ROD_PATH) {
console.log('testing with rod');
const sp = require('child_process').spawn(process.env.ROD_PATH, ['start', '--port', port, '--sled-storage=false']);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
try{ require('fs').unlinkSync(env.i+'data') }catch(e){} try{ require('fs').unlinkSync(env.i+'data') }catch(e){}
try{ require('fs').unlinkSync((env.i+1)+'data') }catch(e){} try{ require('fs').unlinkSync((env.i+1)+'data') }catch(e){}
try{ require('gun/lib/fsrm')(env.i+'data') }catch(e){} try{ require('gun/lib/fsrm')(env.i+'data') }catch(e){}
try{ require('gun/lib/fsrm')((env.i+1)+'data') }catch(e){} try{ require('gun/lib/fsrm')((env.i+1)+'data') }catch(e){}
var port = env.config.port + env.i;
var server = require('http').createServer(function(req, res){ var server = require('http').createServer(function(req, res){
res.end("I am "+ env.i +"!"); res.end("I am "+ env.i +"!");
}); });
@ -186,10 +200,25 @@ describe("The Holy Grail Test!", function(){
it("GUN spawned!", function(){ it("GUN spawned!", function(){
return spawn.run(function(test){ return spawn.run(function(test){
var env = test.props; var env = test.props;
var port = env.config.port + env.i;
test.async(); test.async();
if (process.env.ROD_PATH) {
console.log('testing with rod');
const sp = require('child_process').spawn(process.env.ROD_PATH, ['start', '--port', port, '--sled-storage=false']);
sp.stdout.on('data', function(data){
console.log(data.toString());
});
sp.stderr.on('data', function(data){
console.log(data.toString());
});
test.done();
return;
}
try{ require('fs').unlinkSync(env.i+'data') }catch(e){} try{ require('fs').unlinkSync(env.i+'data') }catch(e){}
try{ require('gun/lib/fsrm')(env.i+'data') }catch(e){} try{ require('gun/lib/fsrm')(env.i+'data') }catch(e){}
var port = env.config.port + env.i;
var server = require('http').createServer(function(req, res){ var server = require('http').createServer(function(req, res){
res.end("I am "+ env.i +"!"); res.end("I am "+ env.i +"!");
}); });
@ -286,4 +315,5 @@ describe("The Holy Grail Test!", function(){
process.exit(); process.exit();
}); });
}); });
}); });