Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/payload-parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ module.exports = function parseSiprecPayload(opts) {
debug(`parsed user ${user} from callee aor ${opts.callee.aor}`);
opts.callee.number = user;
}
opts.recordingSessionId = opts.recordingData[`${prefix}recording`][`${prefix}session`][0].$.session_id;
opts.recordingSessionId = opts.recordingData[`${prefix}recording`][`${prefix}session`][0].$.session_id ? opts.recordingData[`${prefix}recording`][`${prefix}session`][0].$.session_id: opts.recordingData[`${prefix}recording`][`${prefix}session`][0].$.id;
}
}
catch (err) {
Expand Down
93 changes: 93 additions & 0 deletions test/call_tests_freeswitch.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
const test = require('blue-tape');
const { exec } = require('child_process');
const debug = require('debug')('drachtio:siprec-recording-server');
const clearRequire = require('clear-require');
//const test = require('tape').test ;
//const exec = require('child_process').exec ;
const fs = require('fs-extra');


const execCmd = (cmd, opts) => {
opts = opts || {} ;
return new Promise((resolve, reject) => {
setTimeout(() => {
exec(cmd, opts, (err, stdout, stderr) => {
if (stdout) debug(stdout);
if (stderr) console.log(stderr);
if (err) return reject(err);
resolve();
});
}, 7500);
});
};

test('starting docker network..', (t) => {
t.timeoutAfter(180000);

// clear log and output directories
fs.emptyDir(`${__dirname}/tmp/log`)
.then(fs.emptyDir(`${__dirname}/tmp/rtpengine`))
.catch((err) => {
console.log(`Error cleaning tmp folders: ${err}`);
t.end(err);
});
exec(`docker-compose -p test -f ${__dirname}/docker-compose-freeswitch.yaml up -d`, (err, stdout, stderr) => {
if (-1 != stderr.indexOf('is up-to-date')) return t.end() ;
console.log('docker network started, giving extra time for freeswitch to initialize...');
setTimeout(() => {
exec('docker exec freeswitch fs_cli -x "console loglevel debug"', (err, stdout, stderr) => {
t.end(err) ;
});
}, 18000);
});
});

test('siprec with freeswitch recorder', (t) => {
t.timeoutAfter(20000);

clearRequire('..');
clearRequire('../lib/utils');
clearRequire('config');
process.env.NODE_CONFIG_ENV = 'test2';

const vmap = `-v ${__dirname}/scenarios:/tmp`;
const args = 'drachtio/sipp sipp -m 1 -sf /tmp/uac_siprec_pcap2.xml drachtio';
const cmd = `docker run -t --rm --name sipp1 --net test_siprec ${vmap} ${args}`;

const srf = require('..');
srf
.on('connect', () => {

console.log(`cmd: ${cmd}`);
execCmd(cmd)
.then(() => {
t.pass('siprec with freeswitch passed');
srf.disconnect();
return t.end();
})
.catch((err) => {
srf.disconnect();
t.end(err, 'test failed');
});
})
.on('error', (err) => {
t.end(err, 'error connecting to drachtio');
});
}) ;

test('stopping docker network..', (t) => {
t.timeoutAfter(20000);
exec(`docker-compose -p test -f ${__dirname}/docker-compose-freeswitch.yaml down`, (err, stdout, stderr) => {
console.log(stdout);
//console.log(stderr);
t.pass('Stopped docker compose') ;
});
exec('docker rm -f sipp1', (err, stdout) => {
console.log(stdout);
t.pass('Forced down sipp1');
});
setTimeout(() => {
console.log("Give docker time to stop the images");
t.end() ;
}, 10000);
});
96 changes: 46 additions & 50 deletions test/call_tests.js → test/call_tests_rtpengine.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,47 +2,52 @@ const test = require('blue-tape');
const { exec } = require('child_process');
const debug = require('debug')('drachtio:siprec-recording-server');
const clearRequire = require('clear-require');
//const test = require('tape').test ;
//const exec = require('child_process').exec ;
const fs = require('fs-extra');


const execCmd = (cmd, opts) => {
opts = opts || {} ;
return new Promise((resolve, reject) => {
setTimeout(() => {
exec(cmd, opts, (err, stdout, stderr) => {
if (stdout) debug(stdout);
if (stderr) debug(stderr);
if (stderr) console.log(stderr);
if (err) return reject(err);
resolve();
});
}, 750);
}, 7500);
});
};

test.skip('docker pull sipp', (t) => {
t.timeoutAfter(120000);
execCmd('docker pull drachtio/sipp:latest')
.then(() => {
t.pass('pulled drachtio/sipp:latest image');
return ;
})
.then(() => {
return execCmd('docker ps');
})
.then(() => {
return t.end();
})
test('starting docker network..', (t) => {
t.timeoutAfter(20000);

// clear log and output directores
fs.emptyDir(`${__dirname}/tmp/log`)
.then(fs.emptyDir(`${__dirname}/tmp/rtpengine`))
.catch((err) => {
console.log(`Error cleaning tmp folders: ${err}`);
t.end(err);
});
exec(`docker-compose -p test -f ${__dirname}/docker-compose-rtpengine.yaml up -d`, (err, stdout, stderr) => {
if (-1 != stderr.indexOf('is up-to-date')) return t.end();
console.log(stdout);
//console.log(stderr);
t.pass('Docker rtpengine started');
t.end();
});
});

test('siprec with rtpengine recorder', (t) => {
t.timeoutAfter(20000);

const vmap = `-v ${__dirname}/scenarios:/tmp`;
const args = 'drachtio/sipp sipp -m 1 -sf /tmp/uac_siprec_pcap.xml drachtio';
const cmd = `docker run -t --rm --net test_siprec ${vmap} ${args}`;
const cmd = `docker run -t --rm --name sipp1 --net test_siprec ${vmap} ${args}`;

const srf = require('..');
const srf = require('../app');
srf
.on('connect', () => {

Expand All @@ -54,38 +59,7 @@ test('siprec with rtpengine recorder', (t) => {
return t.end();
})
.catch((err) => {
t.end(err, 'test failed');
});
})
.on('error', (err) => {
t.end(err, 'error connecting to drachtio');
});
}) ;

test('siprec with freeswitch recorder', (t) => {
t.timeoutAfter(20000);

clearRequire('..');
clearRequire('../lib/utils');
clearRequire('config');
process.env.NODE_CONFIG_ENV = 'test2';

const vmap = `-v ${__dirname}/scenarios:/tmp`;
const args = 'drachtio/sipp sipp -m 1 -sf /tmp/uac_siprec_pcap2.xml drachtio';
const cmd = `docker run -t --rm --net test_siprec ${vmap} ${args}`;

const srf = require('..');
srf
.on('connect', () => {

console.log(`cmd: ${cmd}`);
execCmd(cmd)
.then(() => {
t.pass('siprec with freeswitch passed');
srf.disconnect();
return t.end();
})
.catch((err) => {
t.end(err, 'test failed');
});
})
Expand All @@ -105,9 +79,9 @@ test('siprec with multiple rtpengines', (t) => {

const vmap = `-v ${__dirname}/scenarios:/tmp`;
const args = 'drachtio/sipp sipp -m 2 -sf /tmp/uac_siprec_pcap.xml drachtio';
const cmd = `docker run -t --rm --net test_siprec ${vmap} ${args}`;
const cmd = `docker run -t --rm --name sipp2 --net test_siprec ${vmap} ${args}`;

const srf = require('..');
const srf = require('../app');
srf
.on('connect', () => {

Expand All @@ -119,10 +93,32 @@ test('siprec with multiple rtpengines', (t) => {
return t.end();
})
.catch((err) => {
srf.disconnect();
t.end(err, 'test failed');
});
})
.on('error', (err) => {
t.end(err, 'error connecting to drachtio');
});
}) ;

test('stopping docker network..', (t) => {
t.timeoutAfter(20000);
exec(`docker-compose -p test -f ${__dirname}/docker-compose-rtpengine.yaml down`, (err, stdout, stderr) => {
console.log(stdout);
//console.log(stderr);
t.pass('Stopped docker compose') ;
});
exec('docker rm -f sipp1', (err, stdout) => {
console.log(stdout);
t.pass('Forced down sipp1');
});
exec('docker rm -f sipp2', (err, stdout) => {
console.log(stdout);
t.pass('Forced down sipp2');
});
setTimeout(() => {
console.log("Give docker time to stop the images");
t.end() ;
}, 10000);
});
74 changes: 74 additions & 0 deletions test/data/avaya-siprec-offer.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@

--unique-boundary-1
Content-Type: application/sdp

v=0
o=- 15345885 220 IN IP4 10.89.88.243
s=-
c=IN IP4 10.89.88.244
t=0 0
m=audio 33802 RTP/AVP 8 18 101
a=rtpmap:8 PCMA/8000
a=rtpmap:18 G729/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=ptime:20
a=label:201835599
a=sendonly
m=audio 33806 RTP/AVP 8 101
a=rtpmap:101 telephone-event/8000
a=ptime:20
a=label:201835600
a=sendonly

--unique-boundary-1
Content-Type: application/rs-metadata+xml
Content-Disposition: recording-session

<?xml version='1.0' encoding='UTF-8'?>
<recording xmlns='urn:ietf:params:xml:ns:recording'>
<datamode>complete</datamode>
<session id="0rBXFi0CTBB0j8HyGBBrlg==">
<associate-time>2020-03-27T13:56:05</associate-time>
<extensiondata xmlns:apkt="http://acmepacket.com/siprec/extensiondata">
<apkt:ucid>00FA081003B9CF5E7DF7E5;encoding=hex</apkt:ucid>
<apkt:callerOrig>true</apkt:callerOrig>
</extensiondata>
</session>
<participant id="ARlTfnirTkxisET9jl8njg==" session="0rBXFi0CTBB0j8HyGBBrlg==">
<nameID aor="sip:[email protected]">
<name>31624895902</name>
</nameID>
<send>0CWQGFVzQf5hAGoO9gnx8g==</send>
<associate-time>2020-03-27T13:56:05</associate-time>
<extensiondata xmlns:apkt="http://acmepacket.com/siprec/extensiondata">
<apkt:callingParty>true</apkt:callingParty>
<apkt:request-uri>sip:[email protected]:5060</apkt:request-uri>
<apkt:realm>Avaya-GR-REC</apkt:realm>
<apkt:header label="Call-ID">
<value>[email protected]</value>
</apkt:header>
</extensiondata>
</participant>
<participant id="L1OKBsjoTO11Pn5uow6ptQ==" session="0rBXFi0CTBB0j8HyGBBrlg==">
<nameID aor="sip:[email protected]">
<name>33187164021</name>
</nameID>
<send>oOmIeCrQRZ1zaHo/DHE5og==</send>
<associate-time>2020-03-27T13:56:05</associate-time>
<extensiondata xmlns:apkt="http://acmepacket.com/siprec/extensiondata">
<apkt:callingParty>false</apkt:callingParty>
</extensiondata>
</participant>
<stream id="0CWQGFVzQf5hAGoO9gnx8g==" session="0rBXFi0CTBB0j8HyGBBrlg==">
<label>201835599</label>
<mode>separate</mode>
<associate-time>2020-03-27T13:56:05</associate-time>
</stream>
<stream id="oOmIeCrQRZ1zaHo/DHE5og==" session="0rBXFi0CTBB0j8HyGBBrlg==">
<label>201835600</label>
<mode>separate</mode>
<associate-time>2020-03-27T13:56:05</associate-time>
</stream>
</recording>
--unique-boundary-1--
50 changes: 50 additions & 0 deletions test/docker-compose-freeswitch.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
version: '2'

networks:
siprec:
driver: bridge
ipam:
config:
- subnet: 172.32.0.0/16

services:
drachtio:
image: drachtio/drachtio-server:latest
command: drachtio --contact "sip:*;transport=udp" --loglevel debug
container_name: drachtio
ports:
- "9023:9022/tcp"
networks:
siprec:
ipv4_address: 172.32.0.2

redis:
image: redis
container_name: redis
ports:
- "9379:6379/tcp"
networks:
siprec:
ipv4_address: 172.32.0.3

freeswitch:
image: davehorton/freeswitch-hairpin:latest
command: freeswitch
container_name: freeswitch
volumes:
- ./tmp/log:/tmp/freeswitch/log
- ./tmp/recordings:/tmp/freeswitch/recordings
networks:
siprec:
ipv4_address: 172.32.0.4

freeswitch2:
image: davehorton/freeswitch-hairpin:latest
command: freeswitch
container_name: freeswitch2
volumes:
- ./tmp/log:/tmp/freeswitch/log2
- ./tmp/recordings:/tmp/freeswitch/recordings2
networks:
siprec:
ipv4_address: 172.32.0.5
Loading