michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: subscriptLoader.loadSubScript("resource://gre/modules/ril_consts.js", this); michael@0: michael@0: function run_test() { michael@0: run_next_test(); michael@0: } michael@0: michael@0: /** michael@0: * Helper function. michael@0: */ michael@0: function newUint8Worker() { michael@0: let worker = newWorker(); michael@0: let index = 0; // index for read michael@0: let buf = []; michael@0: let context = worker.ContextPool._contexts[0]; michael@0: michael@0: context.Buf.writeUint8 = function(value) { michael@0: buf.push(value); michael@0: }; michael@0: michael@0: context.Buf.readUint8 = function() { michael@0: return buf[index++]; michael@0: }; michael@0: michael@0: context.Buf.seekIncoming = function(offset) { michael@0: index += offset; michael@0: }; michael@0: michael@0: worker.debug = do_print; michael@0: michael@0: return worker; michael@0: } michael@0: michael@0: function newUint8SupportOutgoingIndexWorker() { michael@0: let worker = newWorker(); michael@0: let index = 4; // index for read michael@0: let buf = [0, 0, 0, 0]; // Preserved parcel size michael@0: let context = worker.ContextPool._contexts[0]; michael@0: michael@0: context.Buf.writeUint8 = function(value) { michael@0: if (context.Buf.outgoingIndex >= buf.length) { michael@0: buf.push(value); michael@0: } else { michael@0: buf[context.Buf.outgoingIndex] = value; michael@0: } michael@0: michael@0: context.Buf.outgoingIndex++; michael@0: }; michael@0: michael@0: context.Buf.readUint8 = function() { michael@0: return buf[index++]; michael@0: }; michael@0: michael@0: context.Buf.seekIncoming = function(offset) { michael@0: index += offset; michael@0: }; michael@0: michael@0: worker.debug = do_print; michael@0: michael@0: return worker; michael@0: } michael@0: michael@0: // Test RIL requests related to STK. michael@0: /** michael@0: * Verify if RIL.sendStkTerminalProfile be called. michael@0: */ michael@0: add_test(function test_if_send_stk_terminal_profile() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let profileSend = false; michael@0: context.RIL.sendStkTerminalProfile = function(data) { michael@0: profileSend = true; michael@0: }; michael@0: michael@0: let iccStatus = { michael@0: gsmUmtsSubscriptionAppIndex: 0, michael@0: apps: [{ michael@0: app_state: CARD_APPSTATE_READY, michael@0: app_type: CARD_APPTYPE_USIM michael@0: }], michael@0: }; michael@0: worker.RILQUIRKS_SEND_STK_PROFILE_DOWNLOAD = false; michael@0: michael@0: context.RIL._processICCStatus(iccStatus); michael@0: michael@0: do_check_eq(profileSend, false); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify RIL.sendStkTerminalProfile michael@0: */ michael@0: add_test(function test_send_stk_terminal_profile() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let ril = context.RIL; michael@0: let buf = context.Buf; michael@0: michael@0: ril.sendStkTerminalProfile(STK_SUPPORTED_TERMINAL_PROFILE); michael@0: michael@0: buf.seekIncoming(8); michael@0: let profile = buf.readString(); michael@0: for (let i = 0; i < STK_SUPPORTED_TERMINAL_PROFILE.length; i++) { michael@0: do_check_eq(parseInt(profile.substring(2 * i, 2 * i + 2), 16), michael@0: STK_SUPPORTED_TERMINAL_PROFILE[i]); michael@0: } michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify STK terminal response michael@0: */ michael@0: add_test(function test_stk_terminal_response() { michael@0: let worker = newUint8SupportOutgoingIndexWorker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let buf = context.Buf; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: michael@0: buf.sendParcel = function() { michael@0: // Type michael@0: do_check_eq(this.readInt32(), REQUEST_STK_SEND_TERMINAL_RESPONSE); michael@0: michael@0: // Token : we don't care michael@0: this.readInt32(); michael@0: michael@0: // Data Size, 44 = 2 * (TLV_COMMAND_DETAILS_SIZE(5) + michael@0: // TLV_DEVICE_ID_SIZE(4) + michael@0: // TLV_RESULT_SIZE(3) + michael@0: // TEXT LENGTH(10)) michael@0: do_check_eq(this.readInt32(), 44); michael@0: michael@0: // Command Details, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_COMMAND_DETAILS | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 3); michael@0: do_check_eq(pduHelper.readHexOctet(), 0x01); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_CMD_PROVIDE_LOCAL_INFO); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_LOCAL_INFO_NNA); michael@0: michael@0: // Device Identifies, Type-Length-Value(Source ID-Destination ID) michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID); michael@0: do_check_eq(pduHelper.readHexOctet(), 2); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); michael@0: michael@0: // Result michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_RESULT | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 1); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_RESULT_OK); michael@0: michael@0: // Text michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_TEXT_STRING | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 8); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_TEXT_CODING_GSM_7BIT_PACKED); michael@0: do_check_eq(pduHelper.readSeptetsToString(7, 0, PDU_NL_IDENTIFIER_DEFAULT, michael@0: PDU_NL_IDENTIFIER_DEFAULT), "Mozilla"); michael@0: michael@0: run_next_test(); michael@0: }; michael@0: michael@0: let response = { michael@0: command: { michael@0: commandNumber: 0x01, michael@0: typeOfCommand: STK_CMD_PROVIDE_LOCAL_INFO, michael@0: commandQualifier: STK_LOCAL_INFO_NNA, michael@0: options: { michael@0: isPacked: true michael@0: } michael@0: }, michael@0: input: "Mozilla", michael@0: resultCode: STK_RESULT_OK michael@0: }; michael@0: context.RIL.sendStkTerminalResponse(response); michael@0: }); michael@0: michael@0: // Test ComprehensionTlvHelper michael@0: michael@0: /** michael@0: * Verify ComprehensionTlvHelper.writeLocationInfoTlv michael@0: */ michael@0: add_test(function test_write_location_info_tlv() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let tlvHelper = context.ComprehensionTlvHelper; michael@0: michael@0: // Test with 2-digit mnc, and gsmCellId obtained from UMTS network. michael@0: let loc = { michael@0: mcc: "466", michael@0: mnc: "92", michael@0: gsmLocationAreaCode : 10291, michael@0: gsmCellId: 19072823 michael@0: }; michael@0: tlvHelper.writeLocationInfoTlv(loc); michael@0: michael@0: let tag = pduHelper.readHexOctet(); michael@0: do_check_eq(tag, COMPREHENSIONTLV_TAG_LOCATION_INFO | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: michael@0: let length = pduHelper.readHexOctet(); michael@0: do_check_eq(length, 9); michael@0: michael@0: let mcc_mnc = pduHelper.readSwappedNibbleBcdString(3); michael@0: do_check_eq(mcc_mnc, "46692"); michael@0: michael@0: let lac = (pduHelper.readHexOctet() << 8) | pduHelper.readHexOctet(); michael@0: do_check_eq(lac, 10291); michael@0: michael@0: let cellId = (pduHelper.readHexOctet() << 24) | michael@0: (pduHelper.readHexOctet() << 16) | michael@0: (pduHelper.readHexOctet() << 8) | michael@0: (pduHelper.readHexOctet()); michael@0: do_check_eq(cellId, 19072823); michael@0: michael@0: // Test with 1-digit mnc, and gsmCellId obtained from GSM network. michael@0: loc = { michael@0: mcc: "466", michael@0: mnc: "02", michael@0: gsmLocationAreaCode : 10291, michael@0: gsmCellId: 65534 michael@0: }; michael@0: tlvHelper.writeLocationInfoTlv(loc); michael@0: michael@0: tag = pduHelper.readHexOctet(); michael@0: do_check_eq(tag, COMPREHENSIONTLV_TAG_LOCATION_INFO | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: michael@0: length = pduHelper.readHexOctet(); michael@0: do_check_eq(length, 7); michael@0: michael@0: mcc_mnc = pduHelper.readSwappedNibbleBcdString(3); michael@0: do_check_eq(mcc_mnc, "46602"); michael@0: michael@0: lac = (pduHelper.readHexOctet() << 8) | pduHelper.readHexOctet(); michael@0: do_check_eq(lac, 10291); michael@0: michael@0: cellId = (pduHelper.readHexOctet() << 8) | (pduHelper.readHexOctet()); michael@0: do_check_eq(cellId, 65534); michael@0: michael@0: // Test with 3-digit mnc, and gsmCellId obtained from GSM network. michael@0: loc = { michael@0: mcc: "466", michael@0: mnc: "222", michael@0: gsmLocationAreaCode : 10291, michael@0: gsmCellId: 65534 michael@0: }; michael@0: tlvHelper.writeLocationInfoTlv(loc); michael@0: michael@0: tag = pduHelper.readHexOctet(); michael@0: do_check_eq(tag, COMPREHENSIONTLV_TAG_LOCATION_INFO | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: michael@0: length = pduHelper.readHexOctet(); michael@0: do_check_eq(length, 7); michael@0: michael@0: mcc_mnc = pduHelper.readSwappedNibbleBcdString(3); michael@0: do_check_eq(mcc_mnc, "466222"); michael@0: michael@0: lac = (pduHelper.readHexOctet() << 8) | pduHelper.readHexOctet(); michael@0: do_check_eq(lac, 10291); michael@0: michael@0: cellId = (pduHelper.readHexOctet() << 8) | (pduHelper.readHexOctet()); michael@0: do_check_eq(cellId, 65534); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify ComprehensionTlvHelper.writeErrorNumber michael@0: */ michael@0: add_test(function test_write_disconnecting_cause() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let tlvHelper = context.ComprehensionTlvHelper; michael@0: michael@0: tlvHelper.writeCauseTlv(RIL_ERROR_TO_GECKO_ERROR[ERROR_GENERIC_FAILURE]); michael@0: let tag = pduHelper.readHexOctet(); michael@0: do_check_eq(tag, COMPREHENSIONTLV_TAG_CAUSE | COMPREHENSIONTLV_FLAG_CR); michael@0: let len = pduHelper.readHexOctet(); michael@0: do_check_eq(len, 2); // We have one cause. michael@0: let standard = pduHelper.readHexOctet(); michael@0: do_check_eq(standard, 0x60); michael@0: let cause = pduHelper.readHexOctet(); michael@0: do_check_eq(cause, 0x80 | ERROR_GENERIC_FAILURE); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify ComprehensionTlvHelper.getSizeOfLengthOctets michael@0: */ michael@0: add_test(function test_get_size_of_length_octets() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let tlvHelper = context.ComprehensionTlvHelper; michael@0: michael@0: let length = 0x70; michael@0: do_check_eq(tlvHelper.getSizeOfLengthOctets(length), 1); michael@0: michael@0: length = 0x80; michael@0: do_check_eq(tlvHelper.getSizeOfLengthOctets(length), 2); michael@0: michael@0: length = 0x180; michael@0: do_check_eq(tlvHelper.getSizeOfLengthOctets(length), 3); michael@0: michael@0: length = 0x18000; michael@0: do_check_eq(tlvHelper.getSizeOfLengthOctets(length), 4); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify ComprehensionTlvHelper.writeLength michael@0: */ michael@0: add_test(function test_write_length() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let tlvHelper = context.ComprehensionTlvHelper; michael@0: michael@0: let length = 0x70; michael@0: tlvHelper.writeLength(length); michael@0: do_check_eq(pduHelper.readHexOctet(), length); michael@0: michael@0: length = 0x80; michael@0: tlvHelper.writeLength(length); michael@0: do_check_eq(pduHelper.readHexOctet(), 0x81); michael@0: do_check_eq(pduHelper.readHexOctet(), length); michael@0: michael@0: length = 0x180; michael@0: tlvHelper.writeLength(length); michael@0: do_check_eq(pduHelper.readHexOctet(), 0x82); michael@0: do_check_eq(pduHelper.readHexOctet(), (length >> 8) & 0xff); michael@0: do_check_eq(pduHelper.readHexOctet(), length & 0xff); michael@0: michael@0: length = 0x18000; michael@0: tlvHelper.writeLength(length); michael@0: do_check_eq(pduHelper.readHexOctet(), 0x83); michael@0: do_check_eq(pduHelper.readHexOctet(), (length >> 16) & 0xff); michael@0: do_check_eq(pduHelper.readHexOctet(), (length >> 8) & 0xff); michael@0: do_check_eq(pduHelper.readHexOctet(), length & 0xff); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: // Test Proactive commands. michael@0: /** michael@0: * Verify Proactive command helper : searchForNextTag michael@0: */ michael@0: add_test(function test_stk_proactive_command_search_next_tag() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: let tag_test = [ michael@0: 0xD0, michael@0: 0x3C, michael@0: 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x31, michael@0: 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x32, michael@0: 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x33, michael@0: 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x34, michael@0: 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x35]; michael@0: michael@0: for (let i = 0; i < tag_test.length; i++) { michael@0: pduHelper.writeHexOctet(tag_test[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(tag_test.length); michael@0: let iter = Iterator(berTlv.value); michael@0: let tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); michael@0: do_check_eq(tlv.value.identifier, "alpha id 1"); michael@0: michael@0: tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); michael@0: do_check_eq(tlv.value.identifier, "alpha id 2"); michael@0: michael@0: tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); michael@0: do_check_eq(tlv.value.identifier, "alpha id 3"); michael@0: michael@0: tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); michael@0: do_check_eq(tlv.value.identifier, "alpha id 4"); michael@0: michael@0: tlv = stkHelper.searchForNextTag(COMPREHENSIONTLV_TAG_ALPHA_ID, iter); michael@0: do_check_eq(tlv.value.identifier, "alpha id 5"); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : Refresh michael@0: */ michael@0: add_test(function test_stk_proactive_command_refresh() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: let refresh_1 = [ michael@0: 0xD0, michael@0: 0x10, michael@0: 0x81, 0x03, 0x01, 0x01, 0x01, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x92, 0x05, 0x01, 0x3F, 0x00, 0x2F, 0xE2]; michael@0: michael@0: for (let i = 0; i < refresh_1.length; i++) { michael@0: pduHelper.writeHexOctet(refresh_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(refresh_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, 0x01); michael@0: do_check_eq(tlv.value.commandQualifier, 0x01); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_FILE_LIST, ctlvs); michael@0: do_check_eq(tlv.value.fileList, "3F002FE2"); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : Play Tone michael@0: */ michael@0: add_test(function test_stk_proactive_command_play_tone() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: let tone_1 = [ michael@0: 0xD0, michael@0: 0x1B, michael@0: 0x81, 0x03, 0x01, 0x20, 0x00, michael@0: 0x82, 0x02, 0x81, 0x03, michael@0: 0x85, 0x09, 0x44, 0x69, 0x61, 0x6C, 0x20, 0x54, 0x6F, 0x6E, 0x65, michael@0: 0x8E, 0x01, 0x01, michael@0: 0x84, 0x02, 0x01, 0x05]; michael@0: michael@0: for (let i = 0; i < tone_1.length; i++) { michael@0: pduHelper.writeHexOctet(tone_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(tone_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, 0x20); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_ALPHA_ID, ctlvs); michael@0: do_check_eq(tlv.value.identifier, "Dial Tone"); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_TONE, ctlvs); michael@0: do_check_eq(tlv.value.tone, STK_TONE_TYPE_DIAL_TONE); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_DURATION, ctlvs); michael@0: do_check_eq(tlv.value.timeUnit, STK_TIME_UNIT_SECOND); michael@0: do_check_eq(tlv.value.timeInterval, 5); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : Poll Interval michael@0: */ michael@0: add_test(function test_stk_proactive_command_poll_interval() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: let poll_1 = [ michael@0: 0xD0, michael@0: 0x0D, michael@0: 0x81, 0x03, 0x01, 0x03, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x84, 0x02, 0x01, 0x14]; michael@0: michael@0: for (let i = 0; i < poll_1.length; i++) { michael@0: pduHelper.writeHexOctet(poll_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(poll_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, 0x03); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_DURATION, ctlvs); michael@0: do_check_eq(tlv.value.timeUnit, STK_TIME_UNIT_SECOND); michael@0: do_check_eq(tlv.value.timeInterval, 0x14); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command: Display Text michael@0: */ michael@0: add_test(function test_read_septets_to_string() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: let display_text_1 = [ michael@0: 0xd0, michael@0: 0x28, michael@0: 0x81, 0x03, 0x01, 0x21, 0x80, michael@0: 0x82, 0x02, 0x81, 0x02, michael@0: 0x0d, 0x1d, 0x00, 0xd3, 0x30, 0x9b, 0xfc, 0x06, 0xc9, 0x5c, 0x30, 0x1a, michael@0: 0xa8, 0xe8, 0x02, 0x59, 0xc3, 0xec, 0x34, 0xb9, 0xac, 0x07, 0xc9, 0x60, michael@0: 0x2f, 0x58, 0xed, 0x15, 0x9b, 0xb9, 0x40, michael@0: ]; michael@0: michael@0: for (let i = 0; i < display_text_1.length; i++) { michael@0: pduHelper.writeHexOctet(display_text_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(display_text_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_TEXT_STRING, ctlvs); michael@0: do_check_eq(tlv.value.textString, "Saldo 2.04 E. Validez 20/05/13. "); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command: Set Up Event List. michael@0: */ michael@0: add_test(function test_stk_proactive_command_event_list() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: let event_1 = [ michael@0: 0xD0, michael@0: 0x0F, michael@0: 0x81, 0x03, 0x01, 0x05, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x99, 0x04, 0x00, 0x01, 0x02, 0x03]; michael@0: michael@0: for (let i = 0; i < event_1.length; i++) { michael@0: pduHelper.writeHexOctet(event_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(event_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, 0x05); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_EVENT_LIST, ctlvs); michael@0: do_check_eq(Array.isArray(tlv.value.eventList), true); michael@0: for (let i = 0; i < tlv.value.eventList.length; i++) { michael@0: do_check_eq(tlv.value.eventList[i], i); michael@0: } michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : Get Input michael@0: */ michael@0: add_test(function test_stk_proactive_command_get_input() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: let stkCmdHelper = context.StkCommandParamsFactory; michael@0: michael@0: let get_input_1 = [ michael@0: 0xD0, michael@0: 0x1E, michael@0: 0x81, 0x03, 0x01, 0x23, 0x8F, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x8D, 0x05, 0x04, 0x54, 0x65, 0x78, 0x74, michael@0: 0x91, 0x02, 0x01, 0x10, michael@0: 0x17, 0x08, 0x04, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74]; michael@0: michael@0: for (let i = 0; i < get_input_1.length; i++) { michael@0: pduHelper.writeHexOctet(get_input_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(get_input_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_GET_INPUT); michael@0: michael@0: let input = stkCmdHelper.createParam(tlv.value, ctlvs); michael@0: do_check_eq(input.text, "Text"); michael@0: do_check_eq(input.isAlphabet, true); michael@0: do_check_eq(input.isUCS2, true); michael@0: do_check_eq(input.hideInput, true); michael@0: do_check_eq(input.isPacked, true); michael@0: do_check_eq(input.isHelpAvailable, true); michael@0: do_check_eq(input.minLength, 0x01); michael@0: do_check_eq(input.maxLength, 0x10); michael@0: do_check_eq(input.defaultText, "Default"); michael@0: michael@0: let get_input_2 = [ michael@0: 0xD0, michael@0: 0x11, michael@0: 0x81, 0x03, 0x01, 0x23, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x8D, 0x00, michael@0: 0x91, 0x02, 0x01, 0x10, michael@0: 0x17, 0x00]; michael@0: michael@0: for (let i = 0; i < get_input_2.length; i++) { michael@0: pduHelper.writeHexOctet(get_input_2[i]); michael@0: } michael@0: michael@0: berTlv = berHelper.decode(get_input_2.length); michael@0: ctlvs = berTlv.value; michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_GET_INPUT); michael@0: michael@0: input = stkCmdHelper.createParam(tlv.value, ctlvs); michael@0: do_check_eq(input.text, null); michael@0: do_check_eq(input.minLength, 0x01); michael@0: do_check_eq(input.maxLength, 0x10); michael@0: do_check_eq(input.defaultText, null); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : More Time michael@0: */ michael@0: add_test(function test_stk_proactive_command_more_time() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: let more_time_1 = [ michael@0: 0xD0, michael@0: 0x09, michael@0: 0x81, 0x03, 0x01, 0x02, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82]; michael@0: michael@0: for(let i = 0 ; i < more_time_1.length; i++) { michael@0: pduHelper.writeHexOctet(more_time_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(more_time_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_MORE_TIME); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : Select Item michael@0: */ michael@0: add_test(function test_stk_proactive_command_select_item() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: let stkFactory = context.StkCommandParamsFactory; michael@0: michael@0: let select_item_1 = [ michael@0: 0xD0, michael@0: 0x33, michael@0: 0x81, 0x03, 0x01, 0x24, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x85, 0x05, 0x54, 0x69, 0x74, 0x6C, 0x65, michael@0: 0x8F, 0x07, 0x01, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x31, michael@0: 0x8F, 0x07, 0x02, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x32, michael@0: 0x8F, 0x07, 0x03, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x33, michael@0: 0x18, 0x03, 0x10, 0x15, 0x20, michael@0: 0x90, 0x01, 0x01 michael@0: ]; michael@0: michael@0: for(let i = 0 ; i < select_item_1.length; i++) { michael@0: pduHelper.writeHexOctet(select_item_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(select_item_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_SELECT_ITEM); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: let menu = stkFactory.createParam(tlv.value, ctlvs); michael@0: do_check_eq(menu.title, "Title"); michael@0: do_check_eq(menu.items[0].identifier, 1); michael@0: do_check_eq(menu.items[0].text, "item 1"); michael@0: do_check_eq(menu.items[1].identifier, 2); michael@0: do_check_eq(menu.items[1].text, "item 2"); michael@0: do_check_eq(menu.items[2].identifier, 3); michael@0: do_check_eq(menu.items[2].text, "item 3"); michael@0: do_check_eq(menu.nextActionList[0], STK_CMD_SET_UP_CALL); michael@0: do_check_eq(menu.nextActionList[1], STK_CMD_LAUNCH_BROWSER); michael@0: do_check_eq(menu.nextActionList[2], STK_CMD_PLAY_TONE); michael@0: do_check_eq(menu.defaultItem, 0x00); michael@0: michael@0: let select_item_2 = [ michael@0: 0xD0, michael@0: 0x33, michael@0: 0x81, 0x03, 0x01, 0x24, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x85, 0x05, 0x54, 0x69, 0x74, 0x6C, 0x65, michael@0: 0x8F, 0x07, 0x01, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x31, michael@0: 0x8F, 0x07, 0x02, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x32, michael@0: 0x8F, 0x07, 0x03, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x33, michael@0: 0x18, 0x03, 0x00, 0x15, 0x81, michael@0: 0x90, 0x01, 0x03 michael@0: ]; michael@0: michael@0: for(let i = 0 ; i < select_item_2.length; i++) { michael@0: pduHelper.writeHexOctet(select_item_2[i]); michael@0: } michael@0: michael@0: berTlv = berHelper.decode(select_item_2.length); michael@0: ctlvs = berTlv.value; michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_SELECT_ITEM); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: menu = stkFactory.createParam(tlv.value, ctlvs); michael@0: do_check_eq(menu.title, "Title"); michael@0: do_check_eq(menu.items[0].identifier, 1); michael@0: do_check_eq(menu.items[0].text, "item 1"); michael@0: do_check_eq(menu.items[1].identifier, 2); michael@0: do_check_eq(menu.items[1].text, "item 2"); michael@0: do_check_eq(menu.items[2].identifier, 3); michael@0: do_check_eq(menu.items[2].text, "item 3"); michael@0: do_check_eq(menu.nextActionList[0], STK_NEXT_ACTION_NULL); michael@0: do_check_eq(menu.nextActionList[1], STK_CMD_LAUNCH_BROWSER); michael@0: do_check_eq(menu.nextActionList[2], STK_NEXT_ACTION_END_PROACTIVE_SESSION); michael@0: do_check_eq(menu.defaultItem, 0x02); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : Set Up Menu michael@0: */ michael@0: add_test(function test_stk_proactive_command_set_up_menu() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: let stkFactory = context.StkCommandParamsFactory; michael@0: michael@0: let set_up_menu_1 = [ michael@0: 0xD0, michael@0: 0x30, michael@0: 0x81, 0x03, 0x01, 0x25, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x85, 0x05, 0x54, 0x69, 0x74, 0x6C, 0x65, michael@0: 0x8F, 0x07, 0x01, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x31, michael@0: 0x8F, 0x07, 0x02, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x32, michael@0: 0x8F, 0x07, 0x03, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x33, michael@0: 0x18, 0x03, 0x10, 0x15, 0x20 michael@0: ]; michael@0: michael@0: for(let i = 0 ; i < set_up_menu_1.length; i++) { michael@0: pduHelper.writeHexOctet(set_up_menu_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(set_up_menu_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_SET_UP_MENU); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: let menu = stkFactory.createParam(tlv.value, ctlvs); michael@0: do_check_eq(menu.title, "Title"); michael@0: do_check_eq(menu.items[0].identifier, 1); michael@0: do_check_eq(menu.items[0].text, "item 1"); michael@0: do_check_eq(menu.items[1].identifier, 2); michael@0: do_check_eq(menu.items[1].text, "item 2"); michael@0: do_check_eq(menu.items[2].identifier, 3); michael@0: do_check_eq(menu.items[2].text, "item 3"); michael@0: do_check_eq(menu.nextActionList[0], STK_CMD_SET_UP_CALL); michael@0: do_check_eq(menu.nextActionList[1], STK_CMD_LAUNCH_BROWSER); michael@0: do_check_eq(menu.nextActionList[2], STK_CMD_PLAY_TONE); michael@0: michael@0: let set_up_menu_2 = [ michael@0: 0xD0, michael@0: 0x30, michael@0: 0x81, 0x03, 0x01, 0x25, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x85, 0x05, 0x54, 0x69, 0x74, 0x6C, 0x65, michael@0: 0x8F, 0x07, 0x01, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x31, michael@0: 0x8F, 0x07, 0x02, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x32, michael@0: 0x8F, 0x07, 0x03, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x33, michael@0: 0x18, 0x03, 0x81, 0x00, 0x00 michael@0: ]; michael@0: michael@0: for(let i = 0 ; i < set_up_menu_2.length; i++) { michael@0: pduHelper.writeHexOctet(set_up_menu_2[i]); michael@0: } michael@0: michael@0: berTlv = berHelper.decode(set_up_menu_2.length); michael@0: ctlvs = berTlv.value; michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_SET_UP_MENU); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: let menu = stkFactory.createParam(tlv.value, ctlvs); michael@0: do_check_eq(menu.title, "Title"); michael@0: do_check_eq(menu.items[0].identifier, 1); michael@0: do_check_eq(menu.items[0].text, "item 1"); michael@0: do_check_eq(menu.items[1].identifier, 2); michael@0: do_check_eq(menu.items[1].text, "item 2"); michael@0: do_check_eq(menu.items[2].identifier, 3); michael@0: do_check_eq(menu.items[2].text, "item 3"); michael@0: do_check_eq(menu.nextActionList[0], STK_NEXT_ACTION_END_PROACTIVE_SESSION); michael@0: do_check_eq(menu.nextActionList[1], STK_NEXT_ACTION_NULL); michael@0: do_check_eq(menu.nextActionList[2], STK_NEXT_ACTION_NULL); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : Set Up Call michael@0: */ michael@0: add_test(function test_stk_proactive_command_set_up_call() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: let cmdFactory = context.StkCommandParamsFactory; michael@0: michael@0: let set_up_call_1 = [ michael@0: 0xD0, michael@0: 0x29, michael@0: 0x81, 0x03, 0x01, 0x10, 0x04, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x05, 0x0A, 0x44, 0x69, 0x73, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, michael@0: 0x86, 0x09, 0x81, 0x10, 0x32, 0x04, 0x21, 0x43, 0x65, 0x1C, 0x2C, michael@0: 0x05, 0x07, 0x4D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65]; michael@0: michael@0: for (let i = 0 ; i < set_up_call_1.length; i++) { michael@0: pduHelper.writeHexOctet(set_up_call_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(set_up_call_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_SET_UP_CALL); michael@0: michael@0: let setupCall = cmdFactory.createParam(tlv.value, ctlvs); michael@0: do_check_eq(setupCall.address, "012340123456,1,2"); michael@0: do_check_eq(setupCall.confirmMessage, "Disconnect"); michael@0: do_check_eq(setupCall.callMessage, "Message"); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : Timer Management michael@0: */ michael@0: add_test(function test_stk_proactive_command_timer_management() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: // Timer Management - Start michael@0: let timer_management_1 = [ michael@0: 0xD0, michael@0: 0x11, michael@0: 0x81, 0x03, 0x01, 0x27, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0xA4, 0x01, 0x01, michael@0: 0xA5, 0x03, 0x10, 0x20, 0x30 michael@0: ]; michael@0: michael@0: for(let i = 0 ; i < timer_management_1.length; i++) { michael@0: pduHelper.writeHexOctet(timer_management_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(timer_management_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_TIMER_MANAGEMENT); michael@0: do_check_eq(tlv.value.commandQualifier, STK_TIMER_START); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_TIMER_IDENTIFIER, ctlvs); michael@0: do_check_eq(tlv.value.timerId, 0x01); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_TIMER_VALUE, ctlvs); michael@0: do_check_eq(tlv.value.timerValue, (0x01 * 60 * 60) + (0x02 * 60) + 0x03); michael@0: michael@0: // Timer Management - Deactivate michael@0: let timer_management_2 = [ michael@0: 0xD0, michael@0: 0x0C, michael@0: 0x81, 0x03, 0x01, 0x27, 0x01, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0xA4, 0x01, 0x01 michael@0: ]; michael@0: michael@0: for(let i = 0 ; i < timer_management_2.length; i++) { michael@0: pduHelper.writeHexOctet(timer_management_2[i]); michael@0: } michael@0: michael@0: berTlv = berHelper.decode(timer_management_2.length); michael@0: ctlvs = berTlv.value; michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_TIMER_MANAGEMENT); michael@0: do_check_eq(tlv.value.commandQualifier, STK_TIMER_DEACTIVATE); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_TIMER_IDENTIFIER, ctlvs); michael@0: do_check_eq(tlv.value.timerId, 0x01); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive Command : Provide Local Information michael@0: */ michael@0: add_test(function test_stk_proactive_command_provide_local_information() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: // Verify IMEI michael@0: let local_info_1 = [ michael@0: 0xD0, michael@0: 0x09, michael@0: 0x81, 0x03, 0x01, 0x26, 0x01, michael@0: 0x82, 0x02, 0x81, 0x82]; michael@0: michael@0: for (let i = 0; i < local_info_1.length; i++) { michael@0: pduHelper.writeHexOctet(local_info_1[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(local_info_1.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_PROVIDE_LOCAL_INFO); michael@0: do_check_eq(tlv.value.commandQualifier, STK_LOCAL_INFO_IMEI); michael@0: michael@0: // Verify Date and Time Zone michael@0: let local_info_2 = [ michael@0: 0xD0, michael@0: 0x09, michael@0: 0x81, 0x03, 0x01, 0x26, 0x03, michael@0: 0x82, 0x02, 0x81, 0x82]; michael@0: michael@0: for (let i = 0; i < local_info_2.length; i++) { michael@0: pduHelper.writeHexOctet(local_info_2[i]); michael@0: } michael@0: michael@0: berTlv = berHelper.decode(local_info_2.length); michael@0: ctlvs = berTlv.value; michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_PROVIDE_LOCAL_INFO); michael@0: do_check_eq(tlv.value.commandQualifier, STK_LOCAL_INFO_DATE_TIME_ZONE); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Proactive command : BIP Messages michael@0: */ michael@0: add_test(function test_stk_proactive_command_open_channel() { michael@0: let worker = newUint8Worker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let berHelper = context.BerTlvHelper; michael@0: let stkHelper = context.StkProactiveCmdHelper; michael@0: michael@0: // Open Channel michael@0: let open_channel = [ michael@0: 0xD0, michael@0: 0x0F, michael@0: 0x81, 0x03, 0x01, 0x40, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x85, 0x04, 0x4F, 0x70, 0x65, 0x6E //alpha id: "Open" michael@0: ]; michael@0: michael@0: for (let i = 0; i < open_channel.length; i++) { michael@0: pduHelper.writeHexOctet(open_channel[i]); michael@0: } michael@0: michael@0: let berTlv = berHelper.decode(open_channel.length); michael@0: let ctlvs = berTlv.value; michael@0: let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_OPEN_CHANNEL); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_ALPHA_ID, ctlvs); michael@0: do_check_eq(tlv.value.identifier, "Open"); michael@0: michael@0: // Close Channel michael@0: let close_channel = [ michael@0: 0xD0, michael@0: 0x10, michael@0: 0x81, 0x03, 0x01, 0x41, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x85, 0x05, 0x43, 0x6C, 0x6F, 0x73, 0x65 //alpha id: "Close" michael@0: ]; michael@0: michael@0: for (let i = 0; i < close_channel.length; i++) { michael@0: pduHelper.writeHexOctet(close_channel[i]); michael@0: } michael@0: michael@0: berTlv = berHelper.decode(close_channel.length); michael@0: ctlvs = berTlv.value; michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_CLOSE_CHANNEL); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_ALPHA_ID, ctlvs); michael@0: do_check_eq(tlv.value.identifier, "Close"); michael@0: michael@0: // Receive Data michael@0: let receive_data = [ michael@0: 0XD0, michael@0: 0X12, michael@0: 0x81, 0x03, 0x01, 0x42, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x85, 0x07, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65 //alpha id: "Receive" michael@0: ]; michael@0: michael@0: for (let i = 0; i < receive_data.length; i++) { michael@0: pduHelper.writeHexOctet(receive_data[i]); michael@0: } michael@0: michael@0: berTlv = berHelper.decode(receive_data.length); michael@0: ctlvs = berTlv.value; michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_RECEIVE_DATA); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_ALPHA_ID, ctlvs); michael@0: do_check_eq(tlv.value.identifier, "Receive"); michael@0: michael@0: // Send Data michael@0: let send_data = [ michael@0: 0xD0, michael@0: 0x0F, michael@0: 0x81, 0x03, 0x01, 0x43, 0x00, michael@0: 0x82, 0x02, 0x81, 0x82, michael@0: 0x85, 0x04, 0x53, 0x65, 0x6E, 0x64 //alpha id: "Send" michael@0: ]; michael@0: michael@0: for (let i = 0; i < send_data.length; i++) { michael@0: pduHelper.writeHexOctet(send_data[i]); michael@0: } michael@0: michael@0: berTlv = berHelper.decode(send_data.length); michael@0: ctlvs = berTlv.value; michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); michael@0: do_check_eq(tlv.value.commandNumber, 0x01); michael@0: do_check_eq(tlv.value.typeOfCommand, STK_CMD_SEND_DATA); michael@0: do_check_eq(tlv.value.commandQualifier, 0x00); michael@0: michael@0: tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_ALPHA_ID, ctlvs); michael@0: do_check_eq(tlv.value.identifier, "Send"); michael@0: michael@0: run_next_test(); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Event Download Command : Location Status michael@0: */ michael@0: add_test(function test_stk_event_download_location_status() { michael@0: let worker = newUint8SupportOutgoingIndexWorker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let buf = context.Buf; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: michael@0: buf.sendParcel = function() { michael@0: // Type michael@0: do_check_eq(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); michael@0: michael@0: // Token : we don't care michael@0: this.readInt32(); michael@0: michael@0: // Data Size, 42 = 2 * (2 + TLV_DEVICE_ID_SIZE(4) + michael@0: // TLV_EVENT_LIST_SIZE(3) + michael@0: // TLV_LOCATION_STATUS_SIZE(3) + michael@0: // TLV_LOCATION_INFO_GSM_SIZE(9)) michael@0: do_check_eq(this.readInt32(), 42); michael@0: michael@0: // BER tag michael@0: do_check_eq(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); michael@0: michael@0: // BER length, 19 = TLV_DEVICE_ID_SIZE(4) + michael@0: // TLV_EVENT_LIST_SIZE(3) + michael@0: // TLV_LOCATION_STATUS_SIZE(3) + michael@0: // TLV_LOCATION_INFO_GSM_SIZE(9) michael@0: do_check_eq(pduHelper.readHexOctet(), 19); michael@0: michael@0: // Device Identifies, Type-Length-Value(Source ID-Destination ID) michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 2); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); michael@0: michael@0: // Event List, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 1); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_EVENT_TYPE_LOCATION_STATUS); michael@0: michael@0: // Location Status, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_LOCATION_STATUS | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 1); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_SERVICE_STATE_NORMAL); michael@0: michael@0: // Location Info, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_LOCATION_INFO | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 7); michael@0: michael@0: do_check_eq(pduHelper.readHexOctet(), 0x21); // MCC + MNC michael@0: do_check_eq(pduHelper.readHexOctet(), 0x63); michael@0: do_check_eq(pduHelper.readHexOctet(), 0x54); michael@0: do_check_eq(pduHelper.readHexOctet(), 0); // LAC michael@0: do_check_eq(pduHelper.readHexOctet(), 0); michael@0: do_check_eq(pduHelper.readHexOctet(), 0); // Cell ID michael@0: do_check_eq(pduHelper.readHexOctet(), 0); michael@0: michael@0: run_next_test(); michael@0: }; michael@0: michael@0: let event = { michael@0: eventType: STK_EVENT_TYPE_LOCATION_STATUS, michael@0: locationStatus: STK_SERVICE_STATE_NORMAL, michael@0: locationInfo: { michael@0: mcc: "123", michael@0: mnc: "456", michael@0: gsmLocationAreaCode: 0, michael@0: gsmCellId: 0 michael@0: } michael@0: }; michael@0: context.RIL.sendStkEventDownload({ michael@0: event: event michael@0: }); michael@0: }); michael@0: michael@0: // Test Event Download commands. michael@0: michael@0: /** michael@0: * Verify Event Download Command : Language Selection michael@0: */ michael@0: add_test(function test_stk_event_download_language_selection() { michael@0: let worker = newUint8SupportOutgoingIndexWorker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let buf = context.Buf; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: let iccHelper = context.ICCPDUHelper; michael@0: michael@0: buf.sendParcel = function() { michael@0: // Type michael@0: do_check_eq(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); michael@0: michael@0: // Token : we don't care michael@0: this.readInt32(); michael@0: michael@0: // Data Size, 26 = 2 * (2 + TLV_DEVICE_ID_SIZE(4) + michael@0: // TLV_EVENT_LIST_SIZE(3) + michael@0: // TLV_LANGUAGE(4)) michael@0: do_check_eq(this.readInt32(), 26); michael@0: michael@0: // BER tag michael@0: do_check_eq(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); michael@0: michael@0: // BER length, 19 = TLV_DEVICE_ID_SIZE(4) + michael@0: // TLV_EVENT_LIST_SIZE(3) + michael@0: // TLV_LANGUAGE(4) michael@0: do_check_eq(pduHelper.readHexOctet(), 11); michael@0: michael@0: // Device Identifies, Type-Length-Value(Source ID-Destination ID) michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 2); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); michael@0: michael@0: // Event List, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 1); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_EVENT_TYPE_LANGUAGE_SELECTION); michael@0: michael@0: // Language, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_LANGUAGE); michael@0: do_check_eq(pduHelper.readHexOctet(), 2); michael@0: do_check_eq(iccHelper.read8BitUnpackedToString(2), "zh"); michael@0: michael@0: run_next_test(); michael@0: }; michael@0: michael@0: let event = { michael@0: eventType: STK_EVENT_TYPE_LANGUAGE_SELECTION, michael@0: language: "zh" michael@0: }; michael@0: context.RIL.sendStkEventDownload({ michael@0: event: event michael@0: }); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Event Download Command : User Activity michael@0: */ michael@0: add_test(function test_stk_event_download_user_activity() { michael@0: let worker = newUint8SupportOutgoingIndexWorker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let buf = context.Buf; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: michael@0: buf.sendParcel = function() { michael@0: // Type michael@0: do_check_eq(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); michael@0: michael@0: // Token : we don't care michael@0: this.readInt32(); michael@0: michael@0: // Data Size, 18 = 2 * (2 + TLV_DEVICE_ID_SIZE(4) + TLV_EVENT_LIST_SIZE(3)) michael@0: do_check_eq(this.readInt32(), 18); michael@0: michael@0: // BER tag michael@0: do_check_eq(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); michael@0: michael@0: // BER length, 7 = TLV_DEVICE_ID_SIZE(4) + TLV_EVENT_LIST_SIZE(3) michael@0: do_check_eq(pduHelper.readHexOctet(), 7); michael@0: michael@0: // Device Identities, Type-Length-Value(Source ID-Destination ID) michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 2); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); michael@0: michael@0: // Event List, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 1); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_EVENT_TYPE_USER_ACTIVITY); michael@0: michael@0: run_next_test(); michael@0: }; michael@0: michael@0: let event = { michael@0: eventType: STK_EVENT_TYPE_USER_ACTIVITY michael@0: }; michael@0: context.RIL.sendStkEventDownload({ michael@0: event: event michael@0: }); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Event Download Command : Idle Screen Available michael@0: */ michael@0: add_test(function test_stk_event_download_idle_screen_available() { michael@0: let worker = newUint8SupportOutgoingIndexWorker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let buf = context.Buf; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: michael@0: buf.sendParcel = function() { michael@0: // Type michael@0: do_check_eq(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); michael@0: michael@0: // Token : we don't care michael@0: this.readInt32(); michael@0: michael@0: // Data Size, 18 = 2 * (2 + TLV_DEVICE_ID_SIZE(4) + TLV_EVENT_LIST_SIZE(3)) michael@0: do_check_eq(this.readInt32(), 18); michael@0: michael@0: // BER tag michael@0: do_check_eq(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); michael@0: michael@0: // BER length, 7 = TLV_DEVICE_ID_SIZE(4) + TLV_EVENT_LIST_SIZE(3) michael@0: do_check_eq(pduHelper.readHexOctet(), 7); michael@0: michael@0: // Device Identities, Type-Length-Value(Source ID-Destination ID) michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 2); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_DISPLAY); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); michael@0: michael@0: // Event List, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 1); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_EVENT_TYPE_IDLE_SCREEN_AVAILABLE); michael@0: michael@0: run_next_test(); michael@0: }; michael@0: michael@0: let event = { michael@0: eventType: STK_EVENT_TYPE_IDLE_SCREEN_AVAILABLE michael@0: }; michael@0: context.RIL.sendStkEventDownload({ michael@0: event: event michael@0: }); michael@0: }); michael@0: michael@0: /** michael@0: * Verify Event Downloaded Command :Browser Termination michael@0: */ michael@0: add_test(function test_stk_event_download_browser_termination() { michael@0: let worker = newUint8SupportOutgoingIndexWorker(); michael@0: let context = worker.ContextPool._contexts[0]; michael@0: let buf = context.Buf; michael@0: let pduHelper = context.GsmPDUHelper; michael@0: michael@0: buf.sendParcel = function() { michael@0: // Type michael@0: do_check_eq(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); michael@0: michael@0: // Token : we don't care michael@0: this.readInt32(); michael@0: michael@0: // Data Size, 24 = 2 * ( 2+TLV_DEVICE_ID(4)+TLV_EVENT_LIST_SIZE(3) michael@0: // +TLV_BROWSER_TERMINATION_CAUSE(3) ) michael@0: do_check_eq(this.readInt32(), 24); michael@0: michael@0: // BER tag michael@0: do_check_eq(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); michael@0: michael@0: // BER length, 10 = TLV_DEVICE_ID(4)+TLV_EVENT_LIST_SIZE(3) michael@0: // ++TLV_BROWSER_TERMINATION_CAUSE(3) michael@0: do_check_eq(pduHelper.readHexOctet(), 10); michael@0: michael@0: // Device Identities, Type-Length-Value(Source ID-Destination ID) michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 2); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); michael@0: michael@0: // Event List, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 1); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_EVENT_TYPE_BROWSER_TERMINATION); michael@0: michael@0: // Browser Termination Case, Type-Length-Value michael@0: do_check_eq(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_BROWSER_TERMINATION_CAUSE | michael@0: COMPREHENSIONTLV_FLAG_CR); michael@0: do_check_eq(pduHelper.readHexOctet(), 1); michael@0: do_check_eq(pduHelper.readHexOctet(), STK_BROWSER_TERMINATION_CAUSE_USER); michael@0: michael@0: run_next_test(); michael@0: }; michael@0: michael@0: let event = { michael@0: eventType: STK_EVENT_TYPE_BROWSER_TERMINATION, michael@0: terminationCause: STK_BROWSER_TERMINATION_CAUSE_USER michael@0: }; michael@0: context.RIL.sendStkEventDownload({ michael@0: event: event michael@0: }); michael@0: });