From 3c9d04aacc777e66eee723c80a6a95ba86a9714c Mon Sep 17 00:00:00 2001 From: lilleman Date: Fri, 1 May 2015 14:28:30 +0200 Subject: [PATCH] More support for return PDUs params and tlvs and more tests --- lib/client.js | 2 +- lib/server.js | 2 +- lib/session.js | 20 ++++++++++++++++---- lib/utils.js | 39 ++++++++++++++++++++++++++++----------- test/03_pdu.js | 46 +++++++++++++++++++++++++++++++++++++++++++++- 5 files changed, 91 insertions(+), 18 deletions(-) diff --git a/lib/client.js b/lib/client.js index e466a38..4a39cbb 100644 --- a/lib/client.js +++ b/lib/client.js @@ -67,7 +67,7 @@ function clientSession(sock, options) { } else if (pduObj.cmdName === 'submit_sm') { returnObj.submitSm(pduObj); } else if (pduObj.cmdName === 'unbind') { - returnObj.sendReturn(pduObj, 'ESME_ROK', true); + returnObj.sendReturn(pduObj, 'ESME_ROK', undefined, true); } else { // All other commands we do not support returnObj.sendReturn(pduObj, 'ESME_RINVCMDID'); diff --git a/lib/server.js b/lib/server.js index 596842c..9f8943f 100644 --- a/lib/server.js +++ b/lib/server.js @@ -95,7 +95,7 @@ function serverSession(sock, options) { returnObj.on('incomingPdu', function(pduObj) { if (pduObj.cmdName === 'unbind') { - returnObj.sendReturn(pduObj, 'ESME_ROK', true); + returnObj.sendReturn(pduObj, 'ESME_ROK', undefined, true); } else if (returnObj.loggedIn === false) { log.debug('larvitsmpp: lib/server.js: serverSession() - returnObj.handleIncomingPdu() - Not logged in, running login function'); returnObj.login(pduObj); diff --git a/lib/session.js b/lib/session.js index ee9f9bd..50eb6c0 100644 --- a/lib/session.js +++ b/lib/session.js @@ -160,16 +160,23 @@ function session(sock) { * * @param obj or buf pdu * @param str status - see list at defs.errors - defaults to 'ESME_ROK' - no error (OPTIONAL) + * @param obj params (OPTIONAL) * @param bol closeAfterSend - if true will close the socket after sending (OPTIONAL) - * @param func callback(err) (OPTIONAL) + * @param func callback(err, retPdu) (OPTIONAL) */ - returnObj.sendReturn = function(pdu, status, closeAfterSend, callback) { + returnObj.sendReturn = function(pdu, status, params, closeAfterSend, callback) { + if (typeof params === 'function') { + callback = params; + params = undefined; + closeAfterSend = undefined; + } + if (typeof closeAfterSend === 'function') { callback = closeAfterSend; closeAfterSend = undefined; } - smppUtils.pduReturn(pdu, status, function(err, retPdu) { + smppUtils.pduReturn(pdu, status, params, function(err, retPdu) { if (err) { log.error('larvitsmpp: lib/session.js: session() - returnObj.sendReturn() - Could not create return PDU: ' + err.message); returnObj.closeSocket(); @@ -184,7 +191,7 @@ function session(sock) { returnObj.sockWrite(retPdu, closeAfterSend); if (typeof callback === 'function') { - callback(); + callback(null, retPdu); } }); }; @@ -215,6 +222,11 @@ function session(sock) { } returnObj.send(pduObj, function(err, retPduObj) { + +console.log('RAAAV'); +console.log(retPduObj); + + if (typeof callback === 'function') { callback(err, retPduObj.params.message_id, retPduObj); } diff --git a/lib/utils.js b/lib/utils.js index 5d660a2..be31219 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -323,10 +323,11 @@ function objToPdu(obj, callback) { * * @param obj or buf pdu * @param str status - see list at defs.errors - defaults to 'ESME_ROK' - no error (OPTIONAL) + * @param obj params (OPTIONAL) * @param obj tlvs (OPTIONAL) * @param func callback(err, pduBuffer) (OPTIONAL) */ -function pduReturn(pdu, status, tlvs, callback) { +function pduReturn(pdu, status, params, tlvs, callback) { var err = null, retPdu = {}, param; @@ -340,23 +341,28 @@ function pduReturn(pdu, status, tlvs, callback) { return; } - pduReturn(pduObj, status, callback); + pduReturn(pduObj, status, params, tlvs, callback); }); return; } log.silly('larvitsmpp: lib/utils.js: pduReturn() - ran'); - // If status is a function, it is the callback. - // Default to OK status and sett callback correctly - if (typeof status === 'function') { - callback = status; - status = 'ESME_ROK'; + if (typeof tlvs === 'function') { + callback = tlvs; tlvs = undefined; } - if (typeof tlvs === 'function') { - callback = tlvs; + if (typeof params === 'function') { + callback = params; + params = {}; + tlvs = undefined; + } + + if (typeof status === 'function') { + callback = status; + status = 'ESME_ROK'; + params = {}; tlvs = undefined; } @@ -364,6 +370,13 @@ function pduReturn(pdu, status, tlvs, callback) { status = 'ESME_ROK'; } + if (callback === undefined) { + callback = function() {}; + } + + if (params === undefined) { + params = {}; + } if (pdu === undefined || pdu.cmdName === undefined || pdu.seqNr === undefined) { err = new Error('larvitsmpp: lib/utils.js: pduReturn() - Invalid call PDU, cannot create response PDU'); @@ -386,12 +399,16 @@ function pduReturn(pdu, status, tlvs, callback) { retPdu.cmdName = pdu.cmdName + '_resp'; retPdu.cmdStatus = status; retPdu.seqNr = pdu.seqNr; - retPdu.params = {}; + retPdu.params = params; retPdu.tlvs = tlvs; // Populate parameters that should exist in the response for (param in defs.cmds[pdu.cmdName + '_resp'].params) { - retPdu.params[param] = pdu.params[param]; + + // Do not override the manually supplied parameters + if (retPdu.params[param] === undefined) { + retPdu.params[param] = pdu.params[param]; + } } objToPdu(retPdu, function(err, retPdu) { diff --git a/test/03_pdu.js b/test/03_pdu.js index ec592f3..44e1808 100644 --- a/test/03_pdu.js +++ b/test/03_pdu.js @@ -200,8 +200,52 @@ describe('PDU convertion', function() { done(); }); }); - }); }); + describe('Return PDUs', function() { + + it('should create a basic and valid return PDU', function(done) { + var pduObj = { + 'cmdName': 'deliver_sm', + 'seqNr': 393, + 'cmdStatus': 'ESME_ROK', + 'params': { + 'source_addr': '46701113311', + 'destination_addr': '46709771337', + 'esm_class': 4, + 'short_message': 'random stuff', + 'message_id': 'od9s2' + }, + 'tlvs': { + 'receipted_message_id': { + 'tagId': 0x001E, + 'tagName': 'receipted_message_id', + 'tagValue': '293f293' + }, + '5142': { + 'tagId': 5142, + 'tagName': 'Nils', + 'tagValue': new Buffer('blajfoo', 'ascii') + } + } + }; + + larvitsmpp.utils.pduReturn(pduObj, function(err, pduBuffer) { + assert( ! err, 'Error should be negative'); + + larvitsmpp.utils.pduToObj(pduBuffer, function(err, retPduObj) { + assert( ! err, 'Error should be negative'); + + assert(retPduObj.cmdName === 'deliver_sm_resp', 'Command name should be "deliver_sm_resp"'); + assert(retPduObj.cmdStatus === 'ESME_ROK', 'Command status should be ESME_ROK'); + assert(retPduObj.params.message_id === 'od9s2', 'message_id should be correct'); + + done(); + }); + }); + }); + + }); + }); \ No newline at end of file