Files
sbc-sip-sidecar/test/regbot-tests.js
Dave Horton e94ae431d8 add support for registration trunks which result in a set of ephemera… (#112)
* add support for registration trunks which result in a set of ephemeral sip gateways to be stored in redis

* wip

* refactor createEphemeralGateways into realtime dbhelpers

* minor

* update eslint
2025-10-21 07:32:06 -04:00

206 lines
6.1 KiB
JavaScript

const test = require('tape');
const {
JAMBONES_REDIS_HOST,
JAMBONES_REDIS_PORT,
JAMBONES_LOGLEVEL,
JAMBONES_CLUSTER_ID,
} = require('../lib/config');
const clearModule = require('clear-module');
const exec = require('child_process').exec;
const opts = Object.assign({
timestamp: () => { return `, "time": "${new Date().toISOString()}"`; }
}, { level:JAMBONES_LOGLEVEL || 'info' });
const logger = require('pino')(opts);
const {
addToSet,
removeFromSet } = require('@jambonz/realtimedb-helpers')({
host: JAMBONES_REDIS_HOST || 'localhost',
port: JAMBONES_REDIS_PORT || 6379
}, logger);
const setName = `${(JAMBONES_CLUSTER_ID || 'default')}:active-sip`;
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
function connect(connectable) {
return new Promise((resolve, reject) => {
connectable.on('connect', () => {
return resolve();
});
});
}
const wait = (duration) => {
return new Promise((resolve) => {
setTimeout(resolve, duration);
});
};
test('populating more test case data', (t) => {
exec(`mysql -h 127.0.0.1 -u root --protocol=tcp -D jambones_test < ${__dirname}/db/populate-test-data2.sql`, (err, stdout, stderr) => {
if (err) return t.end(err);
t.pass('test data set created');
t.end();
});
});
test('trunk register tests', (t) => {
clearModule.all();
const { srf } = require('../app');
t.timeoutAfter(180000);
console.log('waiting 15 seconds for regbot to start up');
connect(srf)
.then(wait.bind(null, 15000))
.then(() => {
const obj = srf.locals.regbotStatus();
return t.ok(obj.total === 1 && obj.registered === 1, 'initial regbot running and successfully registered to trunk');
})
.then(() => {
return new Promise((resolve, reject) => {
exec(`mysql -h 127.0.0.1 -u root --protocol=tcp -D jambones_test < ${__dirname}/db/populate-test-data3.sql`, (err, stdout, stderr) => {
if (err) return reject(err);
t.pass('added new gateway');
resolve();
});
});
})
.then(() => {
console.log('waiting 65 seconds for regbot to come around to check for new gateways');
return wait(65000);
})
.then(() => {
const obj = srf.locals.regbotStatus();
//console.log({obj}, 'regbot status after adding new gateway');
return t.ok(obj.total === 2 && obj.registered === 1, 'successfully added gateway that tests failure result');
})
.then(() => {
return new Promise((resolve, reject) => {
exec(`mysql -h 127.0.0.1 -u root --protocol=tcp -D jambones_test < ${__dirname}/db/populate-test-data4.sql`, (err, stdout, stderr) => {
if (err) return reject(err);
t.pass('added new reg trunk');
resolve();
});
});
})
.then(() => {
console.log('waiting 65 seconds for regbot to come around to check for new reg trunk');
return wait(65000);
})
.then(() => {
if (srf.locals.lb) srf.locals.lb.disconnect();
srf.disconnect();
t.end();
return;
})
.catch((err) => {
if (srf.locals.lb) srf.locals.lb.disconnect();
if (srf) srf.disconnect();
console.log(`error received: ${err}`);
t.error(err);
});
});
/*
test('trunk register tests when its IP in redis cache', (t) => {
clearModule.all();
const { srf } = require('../app');
t.timeoutAfter(90000);
addToSet(setName, "172.39.0.10:5060");
connect(srf)
.then(wait.bind(null, 1500))
.then(() => {
const obj = srf.locals.regbotStatus();
return t.ok(obj.total === 1 && obj.registered === 1, 'initial regbot running and successfully registered to trunk');
})
.then(() => {
if (srf.locals.lb) srf.locals.lb.disconnect();
srf.disconnect();
t.end();
removeFromSet(setName, "172.39.0.10:5060");
return;
})
.catch((err) => {
if (srf.locals.lb) srf.locals.lb.disconnect();
if (srf) srf.disconnect();
removeFromSet(setName, "172.39.0.10:5060");
console.log(`error received: ${err}`);
t.error(err);
});
});
test('trunk register with sbc public IP address', (t) => {
clearModule.all();
const { srf } = require('../app');
t.timeoutAfter(60000);
JAMBONES_REGBOT_CONTACT_USE_IP = true;
addToSet(setName, "172.39.0.10:5060");
connect(srf)
.then(wait.bind(null, 1500))
.then(() => {
const obj = srf.locals.regbotStatus();
return t.ok(obj.total === 1 && obj.registered === 1, 'initial regbot running and successfully registered to trunk');
})
.then(() => {
if (srf.locals.lb) srf.locals.lb.disconnect();
srf.disconnect();
t.end();
removeFromSet(setName, "172.39.0.10:5060");
return;
})
.catch((err) => {
if (srf.locals.lb) srf.locals.lb.disconnect();
if (srf) srf.disconnect();
removeFromSet(setName, "172.39.0.10:5060");
console.log(`error received: ${err}`);
t.error(err);
});
});
test('trunk not register tests when its IP is not in redis cache', (t) => {
clearModule.all();
const { srf } = require('../app');
t.timeoutAfter(60000);
addToSet(setName, "172.39.0.11:5060")
connect(srf)
.then(wait.bind(null, 1500))
.then(() => {
return t.ok(!srf.locals.regbotStatus, 'No Regbot initiated');
})
.then(()=> {
return removeFromSet(setName, "172.39.0.11:5060");
})
.then(() => {
return addToSet(setName, "172.39.0.10:5060")
})
.then(() => {
return wait(35000);
})
.then(()=> {
const obj = srf.locals.regbotStatus();
return t.ok(obj.total === 1 && obj.registered === 1, 'initial regbot running and successfully registered to trunk');
})
.then(() => {
if (srf.locals.lb) srf.locals.lb.disconnect();
srf.disconnect();
t.end();
removeFromSet(setName, "172.39.0.11:5060");
return;
})
.catch((err) => {
if (srf.locals.lb) srf.locals.lb.disconnect();
if (srf) srf.disconnect();
removeFromSet(setName, "172.39.0.11:5060");
console.log(`error received: ${err}`);
t.error(err);
});
});
*/