michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: * http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: MARIONETTE_TIMEOUT = 60000; michael@0: MARIONETTE_HEAD_JS = 'head.js'; michael@0: michael@0: const PDU_SMSC_NONE = "00"; // no SMSC Address michael@0: michael@0: const PDU_FIRST_OCTET = "40"; // RP:no, UDHI:yes, SRI:no, MMS:no, MTI:SMS-DELIVER michael@0: michael@0: const PDU_SENDER = "0A912143658709"; // +1234567890 michael@0: const SENDER = "+1234567890"; michael@0: michael@0: const PDU_PID_NORMAL = "00"; michael@0: michael@0: const PDU_DCS_NORMAL_UCS2 = "08"; michael@0: const PDU_DCS_CLASS0_UCS2 = "18"; michael@0: const PDU_DCS_NORMAL_8BIT = "04"; michael@0: const PDU_DCS_CLASS0_8BIT = "14"; michael@0: michael@0: const PDU_TIMESTAMP = "00101000000000"; // 2000/01/01 michael@0: michael@0: function byteValueToHexString(aValue) { michael@0: let str = Number(aValue).toString(16).toUpperCase(); michael@0: return str.length == 1 ? "0" + str : str; michael@0: } michael@0: michael@0: let ref_num = 0; michael@0: function buildTextPdus(aDcs) { michael@0: ref_num++; michael@0: michael@0: let IEI_CONCATE_1 = "0003" + byteValueToHexString(ref_num) + "0301"; michael@0: let IEI_CONCATE_2 = "0003" + byteValueToHexString(ref_num) + "0302"; michael@0: let IEI_CONCATE_3 = "0003" + byteValueToHexString(ref_num) + "0303"; michael@0: let PDU_UDL = "08"; // UDHL(1) + UDH(5) + UCS2 Char (2) michael@0: let PDU_UDHL = "05"; michael@0: michael@0: let PDU_UD_A = "0041"; // "A" michael@0: let PDU_UD_B = "0042"; // "B" michael@0: let PDU_UD_C = "0043"; // "C" michael@0: michael@0: let PDU_COMMON = PDU_SMSC_NONE + PDU_FIRST_OCTET + PDU_SENDER + michael@0: PDU_PID_NORMAL + aDcs + PDU_TIMESTAMP + PDU_UDL + PDU_UDHL; michael@0: michael@0: return [ michael@0: PDU_COMMON + IEI_CONCATE_1 + PDU_UD_A, michael@0: PDU_COMMON + IEI_CONCATE_2 + PDU_UD_B, michael@0: PDU_COMMON + IEI_CONCATE_3 + PDU_UD_C michael@0: ]; michael@0: } michael@0: michael@0: function buildBinaryPdus(aDcs) { michael@0: ref_num++; michael@0: let IEI_PORT = "05040B8423F0"; michael@0: michael@0: let PDU_DATA1 = "C106316170706C69636174696F6E2F76" + michael@0: "6E642E7761702E6D6D732D6D65737361" + michael@0: "676500B131302E382E3133302E313800" + michael@0: "AF84B4818C82986B4430595538595347" + michael@0: "77464E446741416B4876736C58303141" + michael@0: "41414141414141008D90890380310096" + michael@0: "05EA4D4D53008A808E02024188058103" + michael@0: "015F9083687474703A2F2F6D6D732E65"; michael@0: michael@0: let PDU_DATA2 = "6D6F6D652E6E65743A383030322F6B44" + michael@0: "3059553859534777464E446741416B48" + michael@0: "76736C583031414141414141414100"; michael@0: michael@0: let PDU_COMMON = PDU_SMSC_NONE + PDU_FIRST_OCTET + PDU_SENDER + michael@0: PDU_PID_NORMAL + aDcs + PDU_TIMESTAMP; michael@0: michael@0: function construstBinaryUserData(aBinaryData, aSeqNum) { michael@0: let ieiConcat = "0003" + byteValueToHexString(ref_num) + "02" + michael@0: byteValueToHexString(aSeqNum); michael@0: michael@0: let udh = IEI_PORT + ieiConcat; michael@0: let udhl = byteValueToHexString(udh.length / 2); michael@0: let ud = udhl + udh + aBinaryData; michael@0: let udl = byteValueToHexString(ud.length / 2); michael@0: michael@0: return udl + ud; michael@0: } michael@0: michael@0: return [ michael@0: PDU_COMMON + construstBinaryUserData(PDU_DATA1, 1), michael@0: PDU_COMMON + construstBinaryUserData(PDU_DATA2, 2) michael@0: ]; michael@0: } michael@0: michael@0: function verifyTextMessage(aMessage, aMessageClass) { michael@0: is(aMessage.messageClass, aMessageClass, "SmsMessage class"); michael@0: is(aMessage.sender, SENDER, "SmsMessage sender"); michael@0: is(aMessage.body, "ABC", "SmsMessage body"); michael@0: } michael@0: michael@0: function verifyBinaryMessage(aMessage) { michael@0: is(aMessage.type, "mms", "MmsMessage type"); michael@0: is(aMessage.delivery, "not-downloaded", "MmsMessage delivery"); michael@0: michael@0: // remove duplicated M-Notification.ind for next test. michael@0: return deleteMessagesById([aMessage.id]); michael@0: } michael@0: michael@0: function testText(aDcs, aClass) { michael@0: log("testText(): aDcs = " + aDcs + ", aClass = " + aClass); michael@0: return sendMultipleRawSmsToEmulatorAndWait(buildTextPdus(aDcs)) michael@0: .then((results) => verifyTextMessage(results[0].message, aClass)); michael@0: } michael@0: michael@0: function testBinary(aDcs) { michael@0: log("testBinary(): aDcs = " + aDcs); michael@0: return sendMultipleRawSmsToEmulatorAndWait(buildBinaryPdus(aDcs)) michael@0: .then((results) => verifyBinaryMessage(results[0].message)); michael@0: } michael@0: michael@0: SpecialPowers.pushPrefEnv( michael@0: {"set": [["dom.mms.retrieval_mode", "manual"]]}, michael@0: function startTest() { michael@0: startTestCommon(function testCaseMain() { michael@0: return Promise.resolve() michael@0: .then(() => testText(PDU_DCS_NORMAL_UCS2, "normal")) michael@0: .then(() => testText(PDU_DCS_CLASS0_UCS2, "class-0")) michael@0: .then(() => testBinary(PDU_DCS_NORMAL_8BIT)) michael@0: .then(() => testBinary(PDU_DCS_CLASS0_8BIT)); michael@0: }); michael@0: } michael@0: );