diff options
Diffstat (limited to 'dom/system/gonk/tests/test_ril_worker_stk.js')
-rw-r--r-- | dom/system/gonk/tests/test_ril_worker_stk.js | 1698 |
1 files changed, 1698 insertions, 0 deletions
diff --git a/dom/system/gonk/tests/test_ril_worker_stk.js b/dom/system/gonk/tests/test_ril_worker_stk.js new file mode 100644 index 000000000..49b914e89 --- /dev/null +++ b/dom/system/gonk/tests/test_ril_worker_stk.js @@ -0,0 +1,1698 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +subscriptLoader.loadSubScript("resource://gre/modules/ril_consts.js", this); + +function run_test() { + run_next_test(); +} + +/** + * Helper function. + */ +function newUint8SupportOutgoingIndexWorker() { + let worker = newWorker(); + let index = 4; // index for read + let buf = [0, 0, 0, 0]; // Preserved parcel size + let context = worker.ContextPool._contexts[0]; + + context.Buf.writeUint8 = function(value) { + if (context.Buf.outgoingIndex >= buf.length) { + buf.push(value); + } else { + buf[context.Buf.outgoingIndex] = value; + } + + context.Buf.outgoingIndex++; + }; + + context.Buf.readUint8 = function() { + return buf[index++]; + }; + + context.Buf.seekIncoming = function(offset) { + index += offset; + }; + + worker.debug = do_print; + + return worker; +} + +// Test RIL requests related to STK. +/** + * Verify if RIL.sendStkTerminalProfile be called. + */ +add_test(function test_if_send_stk_terminal_profile() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let profileSend = false; + context.RIL.sendStkTerminalProfile = function(data) { + profileSend = true; + }; + + let iccStatus = { + gsmUmtsSubscriptionAppIndex: 0, + apps: [{ + app_state: CARD_APPSTATE_READY, + app_type: CARD_APPTYPE_USIM + }], + }; + worker.RILQUIRKS_SEND_STK_PROFILE_DOWNLOAD = false; + + context.RIL._processICCStatus(iccStatus); + + equal(profileSend, false); + + run_next_test(); +}); + +/** + * Verify RIL.sendStkTerminalProfile + */ +add_test(function test_send_stk_terminal_profile() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let ril = context.RIL; + let buf = context.Buf; + + ril.sendStkTerminalProfile(STK_SUPPORTED_TERMINAL_PROFILE); + + buf.seekIncoming(8); + let profile = buf.readString(); + for (let i = 0; i < STK_SUPPORTED_TERMINAL_PROFILE.length; i++) { + equal(parseInt(profile.substring(2 * i, 2 * i + 2), 16), + STK_SUPPORTED_TERMINAL_PROFILE[i]); + } + + run_next_test(); +}); + +/** + * Verify STK terminal response + */ +add_test(function test_stk_terminal_response() { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_TERMINAL_RESPONSE); + + // Token : we don't care + this.readInt32(); + + // Data Size, 44 = 2 * (TLV_COMMAND_DETAILS_SIZE(5) + + // TLV_DEVICE_ID_SIZE(4) + + // TLV_RESULT_SIZE(3) + + // TEXT LENGTH(10)) + equal(this.readInt32(), 44); + + // Command Details, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_COMMAND_DETAILS | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 3); + equal(pduHelper.readHexOctet(), 0x01); + equal(pduHelper.readHexOctet(), STK_CMD_PROVIDE_LOCAL_INFO); + equal(pduHelper.readHexOctet(), STK_LOCAL_INFO_NNA); + + // Device Identifies, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + // Result + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_RESULT | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_RESULT_OK); + + // Text + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_TEXT_STRING | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 8); + equal(pduHelper.readHexOctet(), STK_TEXT_CODING_GSM_7BIT_PACKED); + equal(pduHelper.readSeptetsToString(7, 0, PDU_NL_IDENTIFIER_DEFAULT, + PDU_NL_IDENTIFIER_DEFAULT), "Mozilla"); + + run_next_test(); + }; + + let response = { + command: { + commandNumber: 0x01, + typeOfCommand: STK_CMD_PROVIDE_LOCAL_INFO, + commandQualifier: STK_LOCAL_INFO_NNA, + options: { + isPacked: true + } + }, + input: "Mozilla", + resultCode: STK_RESULT_OK + }; + context.RIL.sendStkTerminalResponse(response); +}); + +/** + * Verify STK terminal response : GET INPUT with empty string. + * + * @See |TERMINAL RESPONSE: GET INPUT 1.9.1A| of 27.22.4.3.1 GET INPUT (normal) + * in TS 102 384. + */ +add_test(function test_stk_terminal_response_get_input_empty_string() { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_TERMINAL_RESPONSE); + + // Token : we don't care + this.readInt32(); + + // Data Size, 30 = 2 * (TLV_COMMAND_DETAILS_SIZE(5) + + // TLV_DEVICE_ID_SIZE(4) + + // TLV_RESULT_SIZE(3) + + // TEXT LENGTH(3)) + equal(this.readInt32(), 30); + + // Command Details, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_COMMAND_DETAILS | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 3); + equal(pduHelper.readHexOctet(), 0x01); + equal(pduHelper.readHexOctet(), STK_CMD_GET_INPUT); + equal(pduHelper.readHexOctet(), 0x00); + + // Device Identifies, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + // Result + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_RESULT | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_RESULT_OK); + + // Text + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_TEXT_STRING | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_TEXT_CODING_GSM_8BIT); + + run_next_test(); + }; + + let response = { + command: { + commandNumber: 0x01, + typeOfCommand: STK_CMD_GET_INPUT, + commandQualifier: 0x00, + options: { + minLength: 0, + maxLength: 1, + defaultText: "<SEND>" + } + }, + input: "", + resultCode: STK_RESULT_OK + }; + context.RIL.sendStkTerminalResponse(response); +}); + +/** + * Verify STK terminal response : GET INPUT with 160 unpacked characters. + * + * @See |TERMINAL RESPONSE: GET INPUT 1.8.1| of 27.22.4.3.1 GET INPUT (normal) + * in TS 102 384. + */ +add_test(function test_stk_terminal_response_get_input_160_unpacked_characters() { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + let iccPduHelper = context.ICCPDUHelper; + let TEST_TEXT_STRING = "***1111111111###" + + "***2222222222###" + + "***3333333333###" + + "***4444444444###" + + "***5555555555###" + + "***6666666666###" + + "***7777777777###" + + "***8888888888###" + + "***9999999999###" + + "***0000000000###"; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_TERMINAL_RESPONSE); + + // Token : we don't care + this.readInt32(); + + // Data Size, 352 = 2 * (TLV_COMMAND_DETAILS_SIZE(5) + + // TLV_DEVICE_ID_SIZE(4) + + // TLV_RESULT_SIZE(3) + + // TEXT LENGTH(164)) + equal(this.readInt32(), 352); + + // Command Details, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_COMMAND_DETAILS | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 3); + equal(pduHelper.readHexOctet(), 0x01); + equal(pduHelper.readHexOctet(), STK_CMD_GET_INPUT); + equal(pduHelper.readHexOctet(), 0x00); + + // Device Identifies, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + // Result + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_RESULT | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_RESULT_OK); + + // Text + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_TEXT_STRING | + COMPREHENSIONTLV_FLAG_CR); + // C-TLV Length Encoding: 161 = 0x81 0xA1 + equal(pduHelper.readHexOctet(), 0x81); + equal(pduHelper.readHexOctet(), 0xA1); + equal(pduHelper.readHexOctet(), STK_TEXT_CODING_GSM_8BIT); + equal(iccPduHelper.read8BitUnpackedToString(160), TEST_TEXT_STRING); + + run_next_test(); + }; + + let response = { + command: { + commandNumber: 0x01, + typeOfCommand: STK_CMD_GET_INPUT, + commandQualifier: 0x00, + options: { + minLength: 160, + maxLength: 160, + text: TEST_TEXT_STRING + } + }, + input: TEST_TEXT_STRING, + resultCode: STK_RESULT_OK + }; + context.RIL.sendStkTerminalResponse(response); +}); + +/** + * Verify STK terminal response : GET_INKEY - NO_RESPONSE_FROM_USER with + * duration provided. + * + * @See |27.22.4.2.8 GET INKEY (Variable Time out)| in TS 102 384. + */ +add_test(function test_stk_terminal_response_get_inkey_no_response_from_user() { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_TERMINAL_RESPONSE); + + // Token : we don't care + this.readInt32(); + + // Data Size, 32 = 2 * (TLV_COMMAND_DETAILS_SIZE(5) + + // TLV_DEVICE_ID_SIZE(4) + + // TLV_RESULT_SIZE(3) + + // DURATION(4)) + equal(this.readInt32(), 32); + + // Command Details, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_COMMAND_DETAILS | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 3); + equal(pduHelper.readHexOctet(), 0x01); + equal(pduHelper.readHexOctet(), STK_CMD_GET_INKEY); + equal(pduHelper.readHexOctet(), 0x00); + + // Device Identifies, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + // Result + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_RESULT | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_RESULT_NO_RESPONSE_FROM_USER); + + // Duration, Type-Length-Value(Time unit, Time interval) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DURATION); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_TIME_UNIT_SECOND); + equal(pduHelper.readHexOctet(), 10); + + run_next_test(); + }; + + let response = { + command: { + commandNumber: 0x01, + typeOfCommand: STK_CMD_GET_INKEY, + commandQualifier: 0x00, + options: { + duration: { + timeUnit: STK_TIME_UNIT_SECOND, + timeInterval: 10 + }, + text: 'Enter "+"' + } + }, + resultCode: STK_RESULT_NO_RESPONSE_FROM_USER + }; + context.RIL.sendStkTerminalResponse(response); +}); + +/** + * Verify STK terminal response : GET_INKEY - YES/NO request + */ +add_test(function test_stk_terminal_response_get_inkey() { + function do_test(isYesNo) { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_TERMINAL_RESPONSE); + + // Token : we don't care + this.readInt32(); + + // Data Size, 32 = 2 * (TLV_COMMAND_DETAILS_SIZE(5) + + // TLV_DEVICE_ID_SIZE(4) + + // TLV_RESULT_SIZE(3) + + // TEXT LENGTH(4)) + equal(this.readInt32(), 32); + + // Command Details, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_COMMAND_DETAILS | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 3); + equal(pduHelper.readHexOctet(), 0x01); + equal(pduHelper.readHexOctet(), STK_CMD_GET_INKEY); + equal(pduHelper.readHexOctet(), 0x04); + + // Device Identifies, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + // Result + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_RESULT | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_RESULT_OK); + + // Yes/No response + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_TEXT_STRING | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_TEXT_CODING_GSM_8BIT); + equal(pduHelper.readHexOctet(), isYesNo ? 0x01 : 0x00); + }; + + let response = { + command: { + commandNumber: 0x01, + typeOfCommand: STK_CMD_GET_INKEY, + commandQualifier: 0x04, + options: { + isYesNoRequested: true + } + }, + isYesNo: isYesNo, + resultCode: STK_RESULT_OK + }; + + context.RIL.sendStkTerminalResponse(response); + }; + + // Test "Yes" response + do_test(true); + // Test "No" response + do_test(false); + + run_next_test(); +}); + +/** + * Verify STK terminal response with additional information. + */ +add_test(function test_stk_terminal_response_with_additional_info() { + function do_test(aInfo) { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_TERMINAL_RESPONSE); + + // Token : we don't care + this.readInt32(); + + // Data Length 26 = 2 * (TLV_COMMAND_DETAILS_SIZE(5) + + // TLV_DEVICE_ID_SIZE(4) + + // TLV_RESULT_SIZE(4)) + equal(this.readInt32(), 26); + + // Command Details, Type-Length-Value(commandNumber, typeOfCommand, commandQualifier) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_COMMAND_DETAILS | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 3); + equal(pduHelper.readHexOctet(), 0x01); + equal(pduHelper.readHexOctet(), STK_CMD_DISPLAY_TEXT); + equal(pduHelper.readHexOctet(), 0x01); + + // Device Identifies, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + // Result, Type-Length-Value(General result, Additional information on result) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_RESULT | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_RESULT_TERMINAL_CRNTLY_UNABLE_TO_PROCESS); + equal(pduHelper.readHexOctet(), aInfo); + }; + + let response = { + command: { + commandNumber: 0x01, + typeOfCommand: STK_CMD_DISPLAY_TEXT, + commandQualifier: 0x01, + options: { + isHighPriority: true + } + }, + resultCode: STK_RESULT_TERMINAL_CRNTLY_UNABLE_TO_PROCESS, + additionalInformation: aInfo + }; + + context.RIL.sendStkTerminalResponse(response); + }; + + do_test(0x01); // 'Screen is busy' + + run_next_test(); +}); + +// Test ComprehensionTlvHelper + +/** + * Verify ComprehensionTlvHelper.writeLocationInfoTlv + */ +add_test(function test_write_location_info_tlv() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let pduHelper = context.GsmPDUHelper; + let tlvHelper = context.ComprehensionTlvHelper; + + // Test with 2-digit mnc, and gsmCellId obtained from UMTS network. + let loc = { + mcc: "466", + mnc: "92", + gsmLocationAreaCode : 10291, + gsmCellId: 19072823 + }; + tlvHelper.writeLocationInfoTlv(loc); + + let tag = pduHelper.readHexOctet(); + equal(tag, COMPREHENSIONTLV_TAG_LOCATION_INFO | + COMPREHENSIONTLV_FLAG_CR); + + let length = pduHelper.readHexOctet(); + equal(length, 9); + + let mcc_mnc = pduHelper.readSwappedNibbleBcdString(3); + equal(mcc_mnc, "46692"); + + let lac = (pduHelper.readHexOctet() << 8) | pduHelper.readHexOctet(); + equal(lac, 10291); + + let cellId = (pduHelper.readHexOctet() << 24) | + (pduHelper.readHexOctet() << 16) | + (pduHelper.readHexOctet() << 8) | + (pduHelper.readHexOctet()); + equal(cellId, 19072823); + + // Test with 1-digit mnc, and gsmCellId obtained from GSM network. + loc = { + mcc: "466", + mnc: "02", + gsmLocationAreaCode : 10291, + gsmCellId: 65534 + }; + tlvHelper.writeLocationInfoTlv(loc); + + tag = pduHelper.readHexOctet(); + equal(tag, COMPREHENSIONTLV_TAG_LOCATION_INFO | + COMPREHENSIONTLV_FLAG_CR); + + length = pduHelper.readHexOctet(); + equal(length, 7); + + mcc_mnc = pduHelper.readSwappedNibbleBcdString(3); + equal(mcc_mnc, "46602"); + + lac = (pduHelper.readHexOctet() << 8) | pduHelper.readHexOctet(); + equal(lac, 10291); + + cellId = (pduHelper.readHexOctet() << 8) | (pduHelper.readHexOctet()); + equal(cellId, 65534); + + // Test with 3-digit mnc, and gsmCellId obtained from GSM network. + loc = { + mcc: "466", + mnc: "222", + gsmLocationAreaCode : 10291, + gsmCellId: 65534 + }; + tlvHelper.writeLocationInfoTlv(loc); + + tag = pduHelper.readHexOctet(); + equal(tag, COMPREHENSIONTLV_TAG_LOCATION_INFO | + COMPREHENSIONTLV_FLAG_CR); + + length = pduHelper.readHexOctet(); + equal(length, 7); + + mcc_mnc = pduHelper.readSwappedNibbleBcdString(3); + equal(mcc_mnc, "466222"); + + lac = (pduHelper.readHexOctet() << 8) | pduHelper.readHexOctet(); + equal(lac, 10291); + + cellId = (pduHelper.readHexOctet() << 8) | (pduHelper.readHexOctet()); + equal(cellId, 65534); + + run_next_test(); +}); + +/** + * Verify ComprehensionTlvHelper.writeErrorNumber + */ +add_test(function test_write_disconnecting_cause() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let pduHelper = context.GsmPDUHelper; + let tlvHelper = context.ComprehensionTlvHelper; + + tlvHelper.writeCauseTlv(RIL_CALL_FAILCAUSE_TO_GECKO_CALL_ERROR[CALL_FAIL_BUSY]); + let tag = pduHelper.readHexOctet(); + equal(tag, COMPREHENSIONTLV_TAG_CAUSE | COMPREHENSIONTLV_FLAG_CR); + let len = pduHelper.readHexOctet(); + equal(len, 2); // We have one cause. + let standard = pduHelper.readHexOctet(); + equal(standard, 0x60); + let cause = pduHelper.readHexOctet(); + equal(cause, 0x80 | CALL_FAIL_BUSY); + + run_next_test(); +}); + +/** + * Verify ComprehensionTlvHelper.getSizeOfLengthOctets + */ +add_test(function test_get_size_of_length_octets() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let tlvHelper = context.ComprehensionTlvHelper; + + let length = 0x70; + equal(tlvHelper.getSizeOfLengthOctets(length), 1); + + length = 0x80; + equal(tlvHelper.getSizeOfLengthOctets(length), 2); + + length = 0x180; + equal(tlvHelper.getSizeOfLengthOctets(length), 3); + + length = 0x18000; + equal(tlvHelper.getSizeOfLengthOctets(length), 4); + + run_next_test(); +}); + +/** + * Verify ComprehensionTlvHelper.writeLength + */ +add_test(function test_write_length() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let pduHelper = context.GsmPDUHelper; + let tlvHelper = context.ComprehensionTlvHelper; + + let length = 0x70; + tlvHelper.writeLength(length); + equal(pduHelper.readHexOctet(), length); + + length = 0x80; + tlvHelper.writeLength(length); + equal(pduHelper.readHexOctet(), 0x81); + equal(pduHelper.readHexOctet(), length); + + length = 0x180; + tlvHelper.writeLength(length); + equal(pduHelper.readHexOctet(), 0x82); + equal(pduHelper.readHexOctet(), (length >> 8) & 0xff); + equal(pduHelper.readHexOctet(), length & 0xff); + + length = 0x18000; + tlvHelper.writeLength(length); + equal(pduHelper.readHexOctet(), 0x83); + equal(pduHelper.readHexOctet(), (length >> 16) & 0xff); + equal(pduHelper.readHexOctet(), (length >> 8) & 0xff); + equal(pduHelper.readHexOctet(), length & 0xff); + + run_next_test(); +}); + +// Test Proactive commands. + +function test_stk_proactive_command(aOptions) { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let pduHelper = context.GsmPDUHelper; + let berHelper = context.BerTlvHelper; + let stkHelper = context.StkProactiveCmdHelper; + let stkFactory = context.StkCommandParamsFactory; + + let testPdu = aOptions.pdu; + let testTypeOfCommand = aOptions.typeOfCommand; + let testIcons = aOptions.icons; + let testFunc = aOptions.testFunc; + + if (testIcons) { + let ril = context.RIL; + ril.iccInfoPrivate.sst = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30]; //IMG: 39 + ril.appType = CARD_APPTYPE_SIM; + + // skip asynchornous process in IconLoader.loadIcons(). + let iconLoader = context.IconLoader; + iconLoader.loadIcons = (recordNumbers, onsuccess, onerror) => { + onsuccess(testIcons); + }; + } + + for(let i = 0 ; i < testPdu.length; i++) { + pduHelper.writeHexOctet(testPdu[i]); + } + + let berTlv = berHelper.decode(testPdu.length); + let ctlvs = berTlv.value; + let ctlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); + let cmdDetails = ctlv.value; + equal(cmdDetails.typeOfCommand, testTypeOfCommand); + + stkFactory.createParam(cmdDetails, ctlvs, (aResult) => { + cmdDetails.options = aResult; + testFunc(context, cmdDetails, ctlvs); + }); +} + +/** + * Verify Proactive command helper : searchForSelectedTags + */ +add_test(function test_stk_proactive_command_search_for_selected_tags() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let pduHelper = context.GsmPDUHelper; + let berHelper = context.BerTlvHelper; + let stkHelper = context.StkProactiveCmdHelper; + + let tag_test = [ + 0xD0, + 0x3E, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x31, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x32, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x33, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x34, + 0x85, 0x0A, 0x61, 0x6C, 0x70, 0x68, 0x61, 0x20, 0x69, 0x64, 0x20, 0x35, + 0x85, 0x00]; + + for (let i = 0; i < tag_test.length; i++) { + pduHelper.writeHexOctet(tag_test[i]); + } + + let berTlv = berHelper.decode(tag_test.length); + let selectedCtlvs = + stkHelper.searchForSelectedTags(berTlv.value, [COMPREHENSIONTLV_TAG_ALPHA_ID]); + let tlv = selectedCtlvs.retrieve(COMPREHENSIONTLV_TAG_ALPHA_ID); + equal(tlv.value.identifier, "alpha id 1"); + + tlv = selectedCtlvs.retrieve(COMPREHENSIONTLV_TAG_ALPHA_ID); + equal(tlv.value.identifier, "alpha id 2"); + + tlv = selectedCtlvs.retrieve(COMPREHENSIONTLV_TAG_ALPHA_ID); + equal(tlv.value.identifier, "alpha id 3"); + + tlv = selectedCtlvs.retrieve(COMPREHENSIONTLV_TAG_ALPHA_ID); + equal(tlv.value.identifier, "alpha id 4"); + + tlv = selectedCtlvs.retrieve(COMPREHENSIONTLV_TAG_ALPHA_ID); + equal(tlv.value.identifier, "alpha id 5"); + + // emulate that the alpha identifier is provided and is a null data object, + // which is converted to an empty string in ICCPDUHelper. + tlv = selectedCtlvs.retrieve(COMPREHENSIONTLV_TAG_ALPHA_ID); + strictEqual(tlv.value.identifier, ""); + + // emulate that the alpha identifier is not provided + tlv = selectedCtlvs.retrieve(COMPREHENSIONTLV_TAG_ALPHA_ID); + strictEqual(tlv, undefined); + + run_next_test(); +}); + +/** + * Verify Proactive Command : Refresh + */ +add_test(function test_stk_proactive_command_refresh() { + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x10, + 0x81, 0x03, 0x01, 0x01, 0x01, + 0x82, 0x02, 0x81, 0x82, + 0x92, 0x05, 0x01, 0x3F, 0x00, 0x2F, 0xE2 + ], + typeOfCommand: STK_CMD_REFRESH, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let stkHelper = context.StkProactiveCmdHelper; + let ctlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_FILE_LIST, ctlvs); + equal(ctlv.value.fileList, "3F002FE2"); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command : Play Tone + */ +add_test(function test_stk_proactive_command_play_tone() { + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x1F, + 0x81, 0x03, 0x01, 0x20, 0x00, + 0x82, 0x02, 0x81, 0x03, + 0x85, 0x09, 0x44, 0x69, 0x61, 0x6C, 0x20, 0x54, 0x6F, 0x6E, 0x65, + 0x8E, 0x01, 0x01, + 0x84, 0x02, 0x01, 0x05, + 0x9E, 0x02, 0x00, 0x01 + ], + typeOfCommand: STK_CMD_PLAY_TONE, + icons: [1], + testFunc: (context, cmdDetails, ctlvs) => { + let playTone = cmdDetails.options; + + equal(playTone.text, "Dial Tone"); + equal(playTone.tone, STK_TONE_TYPE_DIAL_TONE); + equal(playTone.duration.timeUnit, STK_TIME_UNIT_SECOND); + equal(playTone.duration.timeInterval, 5); + equal(playTone.iconSelfExplanatory, true); + equal(playTone.icons, 1); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command : Poll Interval + */ +add_test(function test_stk_proactive_command_poll_interval() { + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x0D, + 0x81, 0x03, 0x01, 0x03, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x84, 0x02, 0x01, 0x14 + ], + typeOfCommand: STK_CMD_POLL_INTERVAL, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let interval = cmdDetails.options; + + equal(interval.timeUnit, STK_TIME_UNIT_SECOND); + equal(interval.timeInterval, 0x14); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command: Display Text + */ +add_test(function test_stk_proactive_command_display_text() { + test_stk_proactive_command({ + pdu: [ + 0xd0, + 0x2c, + 0x81, 0x03, 0x01, 0x21, 0x80, + 0x82, 0x02, 0x81, 0x02, + 0x0d, 0x1d, 0x00, 0xd3, 0x30, 0x9b, 0xfc, 0x06, 0xc9, 0x5c, 0x30, 0x1a, + 0xa8, 0xe8, 0x02, 0x59, 0xc3, 0xec, 0x34, 0xb9, 0xac, 0x07, 0xc9, 0x60, + 0x2f, 0x58, 0xed, 0x15, 0x9b, 0xb9, 0x40, + 0x9e, 0x02, 0x00, 0x01 + ], + typeOfCommand: STK_CMD_DISPLAY_TEXT, + icons: [1], + testFunc: (context, cmdDetails, ctlvs) => { + let textMsg = cmdDetails.options; + + equal(textMsg.text, "Saldo 2.04 E. Validez 20/05/13. "); + equal(textMsg.iconSelfExplanatory, true); + equal(textMsg.icons, 1); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command: Set Up Event List. + */ +add_test(function test_stk_proactive_command_event_list() { + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x0F, + 0x81, 0x03, 0x01, 0x05, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x99, 0x04, 0x00, 0x01, 0x02, 0x03 + ], + typeOfCommand: STK_CMD_SET_UP_EVENT_LIST, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let event = cmdDetails.options; + + equal(Array.isArray(event.eventList), true); + + for (let i = 0; i < event.eventList.length; i++) { + equal(event.eventList[i], i); + } + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command : Get Input + */ +add_test(function test_stk_proactive_command_get_input() { + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x22, + 0x81, 0x03, 0x01, 0x23, 0x8F, + 0x82, 0x02, 0x81, 0x82, + 0x8D, 0x05, 0x04, 0x54, 0x65, 0x78, 0x74, + 0x91, 0x02, 0x01, 0x10, + 0x17, 0x08, 0x04, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, + 0x9E, 0x02, 0x00, 0x01 + ], + typeOfCommand: STK_CMD_GET_INPUT, + icons: [1], + testFunc: (context, cmdDetails, ctlvs) => { + let input = cmdDetails.options; + + equal(input.text, "Text"); + equal(input.isAlphabet, true); + equal(input.isUCS2, true); + equal(input.hideInput, true); + equal(input.isPacked, true); + equal(input.isHelpAvailable, true); + equal(input.minLength, 0x01); + equal(input.maxLength, 0x10); + equal(input.defaultText, "Default"); + equal(input.iconSelfExplanatory, true); + equal(input.icons, 1); + } + }); + + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x11, + 0x81, 0x03, 0x01, 0x23, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x8D, 0x00, + 0x91, 0x02, 0x01, 0x10, + 0x17, 0x00 + ], + typeOfCommand: STK_CMD_GET_INPUT, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let input = cmdDetails.options; + + equal(input.text, null); + equal(input.minLength, 0x01); + equal(input.maxLength, 0x10); + equal(input.defaultText, null); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command : More Time + */ +add_test(function test_stk_proactive_command_more_time() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let pduHelper = context.GsmPDUHelper; + let berHelper = context.BerTlvHelper; + let stkHelper = context.StkProactiveCmdHelper; + + let more_time_1 = [ + 0xD0, + 0x09, + 0x81, 0x03, 0x01, 0x02, 0x00, + 0x82, 0x02, 0x81, 0x82]; + + for(let i = 0 ; i < more_time_1.length; i++) { + pduHelper.writeHexOctet(more_time_1[i]); + } + + let berTlv = berHelper.decode(more_time_1.length); + let ctlvs = berTlv.value; + let tlv = stkHelper.searchForTag(COMPREHENSIONTLV_TAG_COMMAND_DETAILS, ctlvs); + equal(tlv.value.commandNumber, 0x01); + equal(tlv.value.typeOfCommand, STK_CMD_MORE_TIME); + equal(tlv.value.commandQualifier, 0x00); + + run_next_test(); +}); + +/** + * Verify Proactive Command : Select Item + */ +add_test(function test_stk_proactive_command_select_item() { + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x3D, + 0x81, 0x03, 0x01, 0x24, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x85, 0x05, 0x54, 0x69, 0x74, 0x6C, 0x65, + 0x8F, 0x07, 0x01, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x31, + 0x8F, 0x07, 0x02, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x32, + 0x8F, 0x07, 0x03, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x33, + 0x18, 0x03, 0x10, 0x15, 0x20, + 0x90, 0x01, 0x01, + 0x9E, 0x02, 0x00, 0x01, + 0x9F, 0x04, 0x00, 0x01, 0x02, 0x03 + ], + typeOfCommand: STK_CMD_SELECT_ITEM, + icons: [1, 1, 2, 3], + testFunc: (context, cmdDetails, ctlvs) => { + let menu = cmdDetails.options; + + equal(menu.title, "Title"); + equal(menu.iconSelfExplanatory, true); + equal(menu.icons, 1); + equal(menu.items[0].identifier, 1); + equal(menu.items[0].text, "item 1"); + equal(menu.items[0].iconSelfExplanatory, true); + equal(menu.items[0].icons, 1); + equal(menu.items[1].identifier, 2); + equal(menu.items[1].text, "item 2"); + equal(menu.items[1].iconSelfExplanatory, true); + equal(menu.items[1].icons, 2); + equal(menu.items[2].identifier, 3); + equal(menu.items[2].text, "item 3"); + equal(menu.items[2].iconSelfExplanatory, true); + equal(menu.items[2].icons, 3); + equal(menu.nextActionList[0], STK_CMD_SET_UP_CALL); + equal(menu.nextActionList[1], STK_CMD_LAUNCH_BROWSER); + equal(menu.nextActionList[2], STK_CMD_PLAY_TONE); + equal(menu.defaultItem, 0x00); + } + }); + + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x33, + 0x81, 0x03, 0x01, 0x24, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x85, 0x05, 0x54, 0x69, 0x74, 0x6C, 0x65, + 0x8F, 0x07, 0x01, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x31, + 0x8F, 0x07, 0x02, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x32, + 0x8F, 0x07, 0x03, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x33, + 0x18, 0x03, 0x00, 0x15, 0x81, + 0x90, 0x01, 0x03 + ], + typeOfCommand: STK_CMD_SELECT_ITEM, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let menu = cmdDetails.options; + + equal(menu.title, "Title"); + equal(menu.items[0].identifier, 1); + equal(menu.items[0].text, "item 1"); + equal(menu.items[1].identifier, 2); + equal(menu.items[1].text, "item 2"); + equal(menu.items[2].identifier, 3); + equal(menu.items[2].text, "item 3"); + equal(menu.nextActionList[0], STK_NEXT_ACTION_NULL); + equal(menu.nextActionList[1], STK_CMD_LAUNCH_BROWSER); + equal(menu.nextActionList[2], STK_NEXT_ACTION_END_PROACTIVE_SESSION); + equal(menu.defaultItem, 0x02); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command : Set Up Menu + */ +add_test(function test_stk_proactive_command_set_up_menu() { + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x3A, + 0x81, 0x03, 0x01, 0x25, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x85, 0x05, 0x54, 0x69, 0x74, 0x6C, 0x65, + 0x8F, 0x07, 0x01, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x31, + 0x8F, 0x07, 0x02, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x32, + 0x8F, 0x07, 0x03, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x33, + 0x18, 0x03, 0x10, 0x15, 0x20, + 0x9E, 0x02, 0x00, 0x01, + 0x9F, 0x04, 0x00, 0x01, 0x02, 0x03 + ], + typeOfCommand: STK_CMD_SET_UP_MENU, + icons: [1, 1, 2, 3], + testFunc: (context, cmdDetails, ctlvs) => { + let menu = cmdDetails.options; + + equal(menu.title, "Title"); + equal(menu.iconSelfExplanatory, true); + equal(menu.icons, 1); + equal(menu.items[0].identifier, 1); + equal(menu.items[0].text, "item 1"); + equal(menu.items[0].iconSelfExplanatory, true); + equal(menu.items[0].icons, 1); + equal(menu.items[1].identifier, 2); + equal(menu.items[1].text, "item 2"); + equal(menu.items[1].iconSelfExplanatory, true); + equal(menu.items[1].icons, 2); + equal(menu.items[2].identifier, 3); + equal(menu.items[2].text, "item 3"); + equal(menu.items[2].iconSelfExplanatory, true); + equal(menu.items[2].icons, 3); + equal(menu.nextActionList[0], STK_CMD_SET_UP_CALL); + equal(menu.nextActionList[1], STK_CMD_LAUNCH_BROWSER); + equal(menu.nextActionList[2], STK_CMD_PLAY_TONE); + } + }); + + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x30, + 0x81, 0x03, 0x01, 0x25, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x85, 0x05, 0x54, 0x69, 0x74, 0x6C, 0x65, + 0x8F, 0x07, 0x01, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x31, + 0x8F, 0x07, 0x02, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x32, + 0x8F, 0x07, 0x03, 0x69, 0x74, 0x65, 0x6D, 0x20, 0x33, + 0x18, 0x03, 0x81, 0x00, 0x00 + ], + typeOfCommand: STK_CMD_SET_UP_MENU, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let menu = cmdDetails.options; + + equal(menu.title, "Title"); + equal(menu.items[0].identifier, 1); + equal(menu.items[0].text, "item 1"); + equal(menu.items[1].identifier, 2); + equal(menu.items[1].text, "item 2"); + equal(menu.items[2].identifier, 3); + equal(menu.items[2].text, "item 3"); + equal(menu.nextActionList[0], STK_NEXT_ACTION_END_PROACTIVE_SESSION); + equal(menu.nextActionList[1], STK_NEXT_ACTION_NULL); + equal(menu.nextActionList[2], STK_NEXT_ACTION_NULL); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command : Set Up Call + */ +add_test(function test_stk_proactive_command_set_up_call() { + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x31, + 0x81, 0x03, 0x01, 0x10, 0x04, + 0x82, 0x02, 0x81, 0x82, + 0x05, 0x0A, 0x44, 0x69, 0x73, 0x63, 0x6F, 0x6E, 0x6E, 0x65, 0x63, 0x74, + 0x86, 0x09, 0x81, 0x10, 0x32, 0x04, 0x21, 0x43, 0x65, 0x1C, 0x2C, + 0x05, 0x07, 0x4D, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x9E, 0x02, 0x00, 0x01, + 0x9E, 0x02, 0x01, 0x02 + ], + typeOfCommand: STK_CMD_SET_UP_CALL, + icons: [1, 2], + testFunc: (context, cmdDetails, ctlvs) => { + let setupCall = cmdDetails.options; + + equal(setupCall.address, "012340123456,1,2"); + equal(setupCall.confirmMessage.text, "Disconnect"); + equal(setupCall.confirmMessage.iconSelfExplanatory, true); + equal(setupCall.confirmMessage.icons, 1); + equal(setupCall.callMessage.text, "Message"); + equal(setupCall.callMessage.iconSelfExplanatory, false); + equal(setupCall.callMessage.icons, 2); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command : Timer Management + */ +add_test(function test_stk_proactive_command_timer_management() { + // Timer Management - Start + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x11, + 0x81, 0x03, 0x01, 0x27, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0xA4, 0x01, 0x01, + 0xA5, 0x03, 0x10, 0x20, 0x30 + ], + typeOfCommand: STK_CMD_TIMER_MANAGEMENT, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + equal(cmdDetails.commandQualifier, STK_TIMER_START); + + let timer = cmdDetails.options; + + equal(timer.timerId, 0x01); + equal(timer.timerValue, (0x01 * 60 * 60) + (0x02 * 60) + 0x03); + } + }); + + // Timer Management - Deactivate + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x0C, + 0x81, 0x03, 0x01, 0x27, 0x01, + 0x82, 0x02, 0x81, 0x82, + 0xA4, 0x01, 0x01 + ], + typeOfCommand: STK_CMD_TIMER_MANAGEMENT, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + equal(cmdDetails.commandQualifier, STK_TIMER_DEACTIVATE); + + let timer = cmdDetails.options; + + equal(timer.timerId, 0x01); + ok(timer.timerValue === undefined); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive Command : Provide Local Information + */ +add_test(function test_stk_proactive_command_provide_local_information() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let pduHelper = context.GsmPDUHelper; + let berHelper = context.BerTlvHelper; + let stkHelper = context.StkProactiveCmdHelper; + let stkCmdHelper = context.StkCommandParamsFactory; + + // Verify IMEI + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x09, + 0x81, 0x03, 0x01, 0x26, 0x01, + 0x82, 0x02, 0x81, 0x82 + ], + typeOfCommand: STK_CMD_PROVIDE_LOCAL_INFO, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + equal(cmdDetails.commandQualifier, STK_LOCAL_INFO_IMEI); + + let provideLocalInfo = cmdDetails.options; + equal(provideLocalInfo.localInfoType, STK_LOCAL_INFO_IMEI); + } + }); + + // Verify Date and Time Zone + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x09, + 0x81, 0x03, 0x01, 0x26, 0x03, + 0x82, 0x02, 0x81, 0x82 + ], + typeOfCommand: STK_CMD_PROVIDE_LOCAL_INFO, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + equal(cmdDetails.commandQualifier, STK_LOCAL_INFO_DATE_TIME_ZONE); + + let provideLocalInfo = cmdDetails.options; + equal(provideLocalInfo.localInfoType, STK_LOCAL_INFO_DATE_TIME_ZONE); + } + }); + + run_next_test(); +}); + +/** + * Verify Proactive command : BIP Messages + */ +add_test(function test_stk_proactive_command_open_channel() { + let worker = newUint8Worker(); + let context = worker.ContextPool._contexts[0]; + let pduHelper = context.GsmPDUHelper; + let berHelper = context.BerTlvHelper; + let stkHelper = context.StkProactiveCmdHelper; + let stkCmdHelper = context.StkCommandParamsFactory; + + // Open Channel + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x0F, + 0x81, 0x03, 0x01, 0x40, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x85, 0x04, 0x4F, 0x70, 0x65, 0x6E //alpha id: "Open" + ], + typeOfCommand: STK_CMD_OPEN_CHANNEL, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let bipMsg = cmdDetails.options; + + equal(bipMsg.text, "Open"); + } + }); + + // Close Channel + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x10, + 0x81, 0x03, 0x01, 0x41, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x85, 0x05, 0x43, 0x6C, 0x6F, 0x73, 0x65 //alpha id: "Close" + ], + typeOfCommand: STK_CMD_CLOSE_CHANNEL, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let bipMsg = cmdDetails.options; + + equal(bipMsg.text, "Close"); + } + }); + + // Receive Data + test_stk_proactive_command({ + pdu: [ + 0XD0, + 0X12, + 0x81, 0x03, 0x01, 0x42, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x85, 0x07, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65 //alpha id: "Receive" + ], + typeOfCommand: STK_CMD_RECEIVE_DATA, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let bipMsg = cmdDetails.options; + + equal(bipMsg.text, "Receive"); + } + }); + + // Send Data + test_stk_proactive_command({ + pdu: [ + 0xD0, + 0x0F, + 0x81, 0x03, 0x01, 0x43, 0x00, + 0x82, 0x02, 0x81, 0x82, + 0x85, 0x04, 0x53, 0x65, 0x6E, 0x64 //alpha id: "Send" + ], + typeOfCommand: STK_CMD_SEND_DATA, + icons: null, + testFunc: (context, cmdDetails, ctlvs) => { + let bipMsg = cmdDetails.options; + + equal(bipMsg.text, "Send"); + } + }); + + run_next_test(); +}); + +/** + * Verify Event Download Command : Location Status + */ +add_test(function test_stk_event_download_location_status() { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); + + // Token : we don't care + this.readInt32(); + + // Data Size, 42 = 2 * (2 + TLV_DEVICE_ID_SIZE(4) + + // TLV_EVENT_LIST_SIZE(3) + + // TLV_LOCATION_STATUS_SIZE(3) + + // TLV_LOCATION_INFO_GSM_SIZE(9)) + equal(this.readInt32(), 42); + + // BER tag + equal(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); + + // BER length, 19 = TLV_DEVICE_ID_SIZE(4) + + // TLV_EVENT_LIST_SIZE(3) + + // TLV_LOCATION_STATUS_SIZE(3) + + // TLV_LOCATION_INFO_GSM_SIZE(9) + equal(pduHelper.readHexOctet(), 19); + + // Event List, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_EVENT_TYPE_LOCATION_STATUS); + + // Device Identifies, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + // Location Status, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_LOCATION_STATUS | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_SERVICE_STATE_NORMAL); + + // Location Info, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_LOCATION_INFO | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 7); + + equal(pduHelper.readHexOctet(), 0x21); // MCC + MNC + equal(pduHelper.readHexOctet(), 0x63); + equal(pduHelper.readHexOctet(), 0x54); + equal(pduHelper.readHexOctet(), 0); // LAC + equal(pduHelper.readHexOctet(), 0); + equal(pduHelper.readHexOctet(), 0); // Cell ID + equal(pduHelper.readHexOctet(), 0); + + run_next_test(); + }; + + let event = { + eventType: STK_EVENT_TYPE_LOCATION_STATUS, + locationStatus: STK_SERVICE_STATE_NORMAL, + locationInfo: { + mcc: "123", + mnc: "456", + gsmLocationAreaCode: 0, + gsmCellId: 0 + } + }; + context.RIL.sendStkEventDownload({ + event: event + }); +}); + +// Test Event Download commands. + +/** + * Verify Event Download Command : Language Selection + */ +add_test(function test_stk_event_download_language_selection() { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + let iccHelper = context.ICCPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); + + // Token : we don't care + this.readInt32(); + + // Data Size, 26 = 2 * (2 + TLV_DEVICE_ID_SIZE(4) + + // TLV_EVENT_LIST_SIZE(3) + + // TLV_LANGUAGE(4)) + equal(this.readInt32(), 26); + + // BER tag + equal(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); + + // BER length, 19 = TLV_DEVICE_ID_SIZE(4) + + // TLV_EVENT_LIST_SIZE(3) + + // TLV_LANGUAGE(4) + equal(pduHelper.readHexOctet(), 11); + + // Event List, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_EVENT_TYPE_LANGUAGE_SELECTION); + + // Device Identifies, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + // Language, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_LANGUAGE); + equal(pduHelper.readHexOctet(), 2); + equal(iccHelper.read8BitUnpackedToString(2), "zh"); + + run_next_test(); + }; + + let event = { + eventType: STK_EVENT_TYPE_LANGUAGE_SELECTION, + language: "zh" + }; + context.RIL.sendStkEventDownload({ + event: event + }); +}); + +/** + * Verify Event Download Command : User Activity + */ +add_test(function test_stk_event_download_user_activity() { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); + + // Token : we don't care + this.readInt32(); + + // Data Size, 18 = 2 * (2 + TLV_DEVICE_ID_SIZE(4) + TLV_EVENT_LIST_SIZE(3)) + equal(this.readInt32(), 18); + + // BER tag + equal(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); + + // BER length, 7 = TLV_DEVICE_ID_SIZE(4) + TLV_EVENT_LIST_SIZE(3) + equal(pduHelper.readHexOctet(), 7); + + // Event List, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_EVENT_TYPE_USER_ACTIVITY); + + // Device Identities, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + run_next_test(); + }; + + let event = { + eventType: STK_EVENT_TYPE_USER_ACTIVITY + }; + context.RIL.sendStkEventDownload({ + event: event + }); +}); + +/** + * Verify Event Download Command : Idle Screen Available + */ +add_test(function test_stk_event_download_idle_screen_available() { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); + + // Token : we don't care + this.readInt32(); + + // Data Size, 18 = 2 * (2 + TLV_DEVICE_ID_SIZE(4) + TLV_EVENT_LIST_SIZE(3)) + equal(this.readInt32(), 18); + + // BER tag + equal(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); + + // BER length, 7 = TLV_DEVICE_ID_SIZE(4) + TLV_EVENT_LIST_SIZE(3) + equal(pduHelper.readHexOctet(), 7); + + // Event List, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_EVENT_TYPE_IDLE_SCREEN_AVAILABLE); + + // Device Identities, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_DISPLAY); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + run_next_test(); + }; + + let event = { + eventType: STK_EVENT_TYPE_IDLE_SCREEN_AVAILABLE + }; + context.RIL.sendStkEventDownload({ + event: event + }); +}); + +/** + * Verify Event Downloaded Command :Browser Termination + */ +add_test(function test_stk_event_download_browser_termination() { + let worker = newUint8SupportOutgoingIndexWorker(); + let context = worker.ContextPool._contexts[0]; + let buf = context.Buf; + let pduHelper = context.GsmPDUHelper; + + buf.sendParcel = function() { + // Type + equal(this.readInt32(), REQUEST_STK_SEND_ENVELOPE_COMMAND); + + // Token : we don't care + this.readInt32(); + + // Data Size, 24 = 2 * ( 2+TLV_DEVICE_ID(4)+TLV_EVENT_LIST_SIZE(3) + // +TLV_BROWSER_TERMINATION_CAUSE(3) ) + equal(this.readInt32(), 24); + + // BER tag + equal(pduHelper.readHexOctet(), BER_EVENT_DOWNLOAD_TAG); + + // BER length, 10 = TLV_DEVICE_ID(4)+TLV_EVENT_LIST_SIZE(3) + // ++TLV_BROWSER_TERMINATION_CAUSE(3) + equal(pduHelper.readHexOctet(), 10); + + // Event List, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_EVENT_LIST | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_EVENT_TYPE_BROWSER_TERMINATION); + + // Device Identities, Type-Length-Value(Source ID-Destination ID) + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_DEVICE_ID | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 2); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_ME); + equal(pduHelper.readHexOctet(), STK_DEVICE_ID_SIM); + + // Browser Termination Case, Type-Length-Value + equal(pduHelper.readHexOctet(), COMPREHENSIONTLV_TAG_BROWSER_TERMINATION_CAUSE | + COMPREHENSIONTLV_FLAG_CR); + equal(pduHelper.readHexOctet(), 1); + equal(pduHelper.readHexOctet(), STK_BROWSER_TERMINATION_CAUSE_USER); + + run_next_test(); + }; + + let event = { + eventType: STK_EVENT_TYPE_BROWSER_TERMINATION, + terminationCause: STK_BROWSER_TERMINATION_CAUSE_USER + }; + context.RIL.sendStkEventDownload({ + event: event + }); +}); |