summaryrefslogtreecommitdiffstats
path: root/dom/system/gonk/tests/test_ril_system_messenger.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/system/gonk/tests/test_ril_system_messenger.js')
-rw-r--r--dom/system/gonk/tests/test_ril_system_messenger.js1187
1 files changed, 1187 insertions, 0 deletions
diff --git a/dom/system/gonk/tests/test_ril_system_messenger.js b/dom/system/gonk/tests/test_ril_system_messenger.js
new file mode 100644
index 000000000..a588d0ddb
--- /dev/null
+++ b/dom/system/gonk/tests/test_ril_system_messenger.js
@@ -0,0 +1,1187 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+var {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+
+var RIL = {};
+Cu.import("resource://gre/modules/ril_consts.js", RIL);
+
+XPCOMUtils.defineLazyServiceGetter(this, "gStkCmdFactory",
+ "@mozilla.org/icc/stkcmdfactory;1",
+ "nsIStkCmdFactory");
+
+/**
+ * Name space for RILSystemMessenger.jsm. Only initialized after first call to
+ * newRILSystemMessenger.
+ */
+var RSM;
+
+var gReceivedMsgType = null;
+var gReceivedMessage = null;
+
+/**
+ * Create a new RILSystemMessenger instance.
+ *
+ * @return a RILSystemMessenger instance.
+ */
+function newRILSystemMessenger() {
+ if (!RSM) {
+ RSM = Cu.import("resource://gre/modules/RILSystemMessenger.jsm", {});
+ equal(typeof RSM.RILSystemMessenger, "function", "RSM.RILSystemMessenger");
+ }
+
+ let rsm = new RSM.RILSystemMessenger();
+ rsm.broadcastMessage = (aType, aMessage) => {
+ gReceivedMsgType = aType;
+ gReceivedMessage = aMessage;
+ };
+
+ rsm.createCommandMessage = (aStkProactiveCmd) => {
+ return gStkCmdFactory.createCommandMessage(aStkProactiveCmd);
+ };
+
+ return rsm;
+}
+
+function equal_received_system_message(aType, aMessage) {
+ equal(aType, gReceivedMsgType);
+ deepEqual(aMessage, gReceivedMessage);
+ gReceivedMsgType = null;
+ gReceivedMessage = null;
+}
+
+/**
+ * Verify that each nsIXxxMessenger could be retrieved.
+ */
+function run_test() {
+ let telephonyMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"]
+ .getService(Ci.nsITelephonyMessenger);
+
+ let smsMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"]
+ .getService(Ci.nsISmsMessenger);
+
+ let cellbroadcastMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"]
+ .getService(Ci.nsICellbroadcastMessenger);
+
+ let mobileConnectionMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"]
+ .getService(Ci.nsIMobileConnectionMessenger);
+
+ let iccMessenger = Cc["@mozilla.org/ril/system-messenger-helper;1"]
+ .getService(Ci.nsIIccMessenger);
+
+ ok(telephonyMessenger !== null, "Get TelephonyMessenger.");
+ ok(smsMessenger != null, "Get SmsMessenger.");
+ ok(cellbroadcastMessenger != null, "Get CellbroadcastMessenger.");
+ ok(mobileConnectionMessenger != null, "Get MobileConnectionMessenger.");
+ ok(iccMessenger != null, "Get IccMessenger.");
+
+ run_next_test();
+}
+
+/**
+ * Verify RILSystemMessenger.notifyNewCall()
+ */
+add_test(function test_telephony_messenger_notify_new_call() {
+ let messenger = newRILSystemMessenger();
+
+ messenger.notifyNewCall();
+ equal_received_system_message("telephony-new-call", {});
+
+ run_next_test();
+});
+
+/**
+ * Verify RILSystemMessenger.notifyCallEnded()
+ */
+add_test(function test_telephony_messenger_notify_call_ended() {
+ let messenger = newRILSystemMessenger();
+
+ messenger.notifyCallEnded(1,
+ "+0987654321",
+ null,
+ true,
+ 500,
+ false,
+ true);
+
+ equal_received_system_message("telephony-call-ended", {
+ serviceId: 1,
+ number: "+0987654321",
+ emergency: true,
+ duration: 500,
+ direction: "incoming",
+ hangUpLocal: true
+ });
+
+ // Verify 'optional' parameter of secondNumber.
+ messenger.notifyCallEnded(1,
+ "+0987654321",
+ "+1234567890",
+ true,
+ 500,
+ true,
+ false);
+
+ equal_received_system_message("telephony-call-ended", {
+ serviceId: 1,
+ number: "+0987654321",
+ emergency: true,
+ duration: 500,
+ direction: "outgoing",
+ hangUpLocal: false,
+ secondNumber: "+1234567890"
+ });
+
+ run_next_test();
+});
+
+/**
+ * Verify RILSystemMessenger.notifySms()
+ */
+add_test(function test_sms_messenger_notify_sms() {
+ let messenger = newRILSystemMessenger();
+ let timestamp = Date.now();
+ let sentTimestamp = timestamp + 100;
+ let deliveryTimestamp = sentTimestamp + 100;
+
+ // Verify 'sms-received' system message.
+ messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_RECEIVED,
+ 1,
+ 2,
+ "99887766554433221100",
+ Ci.nsISmsService.DELIVERY_TYPE_RECEIVED,
+ Ci.nsISmsService.DELIVERY_STATUS_TYPE_SUCCESS,
+ "+0987654321",
+ null,
+ "Incoming message",
+ Ci.nsISmsService.MESSAGE_CLASS_TYPE_CLASS_2,
+ timestamp,
+ sentTimestamp,
+ 0,
+ false);
+
+ equal_received_system_message("sms-received", {
+ iccId: "99887766554433221100",
+ type: "sms",
+ id: 1,
+ threadId: 2,
+ delivery: "received",
+ deliveryStatus: "success",
+ sender: "+0987654321",
+ receiver: null,
+ body: "Incoming message",
+ messageClass: "class-2",
+ timestamp: timestamp,
+ sentTimestamp: sentTimestamp,
+ deliveryTimestamp: 0,
+ read: false
+ });
+
+ // Verify 'sms-sent' system message.
+ messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_SENT,
+ 3,
+ 4,
+ "99887766554433221100",
+ Ci.nsISmsService.DELIVERY_TYPE_SENT,
+ Ci.nsISmsService.DELIVERY_STATUS_TYPE_PENDING,
+ null,
+ "+0987654321",
+ "Outgoing message",
+ Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL,
+ timestamp,
+ 0,
+ 0,
+ true);
+
+ equal_received_system_message("sms-sent", {
+ iccId: "99887766554433221100",
+ type: "sms",
+ id: 3,
+ threadId: 4,
+ delivery: "sent",
+ deliveryStatus: "pending",
+ sender: null,
+ receiver: "+0987654321",
+ body: "Outgoing message",
+ messageClass: "normal",
+ timestamp: timestamp,
+ sentTimestamp: 0,
+ deliveryTimestamp: 0,
+ read: true
+ });
+
+ // Verify 'sms-delivery-success' system message.
+ messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_DELIVERY_SUCCESS,
+ 5,
+ 6,
+ "99887766554433221100",
+ Ci.nsISmsService.DELIVERY_TYPE_SENT,
+ Ci.nsISmsService.DELIVERY_STATUS_TYPE_SUCCESS,
+ null,
+ "+0987654321",
+ "Outgoing message",
+ Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL,
+ timestamp,
+ 0,
+ deliveryTimestamp,
+ true);
+
+ equal_received_system_message("sms-delivery-success", {
+ iccId: "99887766554433221100",
+ type: "sms",
+ id: 5,
+ threadId: 6,
+ delivery: "sent",
+ deliveryStatus: "success",
+ sender: null,
+ receiver: "+0987654321",
+ body: "Outgoing message",
+ messageClass: "normal",
+ timestamp: timestamp,
+ sentTimestamp: 0,
+ deliveryTimestamp: deliveryTimestamp,
+ read: true
+ });
+
+ // Verify 'sms-failed' system message.
+ messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_SENT_FAILED,
+ 7,
+ 8,
+ "99887766554433221100",
+ Ci.nsISmsService.DELIVERY_TYPE_ERROR,
+ Ci.nsISmsService.DELIVERY_STATUS_TYPE_ERROR,
+ null,
+ "+0987654321",
+ "Outgoing message",
+ Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL,
+ timestamp,
+ 0,
+ 0,
+ true);
+
+ equal_received_system_message("sms-failed", {
+ iccId: "99887766554433221100",
+ type: "sms",
+ id: 7,
+ threadId: 8,
+ delivery: "error",
+ deliveryStatus: "error",
+ sender: null,
+ receiver: "+0987654321",
+ body: "Outgoing message",
+ messageClass: "normal",
+ timestamp: timestamp,
+ sentTimestamp: 0,
+ deliveryTimestamp: 0,
+ read: true
+ });
+
+ // Verify 'sms-delivery-error' system message.
+ messenger.notifySms(Ci.nsISmsMessenger.NOTIFICATION_TYPE_DELIVERY_ERROR,
+ 9,
+ 10,
+ "99887766554433221100",
+ Ci.nsISmsService.DELIVERY_TYPE_SENT,
+ Ci.nsISmsService.DELIVERY_STATUS_TYPE_ERROR,
+ null,
+ "+0987654321",
+ "Outgoing message",
+ Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL,
+ timestamp,
+ 0,
+ 0,
+ true);
+
+ equal_received_system_message("sms-delivery-error", {
+ iccId: "99887766554433221100",
+ type: "sms",
+ id: 9,
+ threadId: 10,
+ delivery: "sent",
+ deliveryStatus: "error",
+ sender: null,
+ receiver: "+0987654321",
+ body: "Outgoing message",
+ messageClass: "normal",
+ timestamp: timestamp,
+ sentTimestamp: 0,
+ deliveryTimestamp: 0,
+ read: true
+ });
+
+ // Verify the protection of invalid nsISmsMessenger.NOTIFICATION_TYPEs.
+ try {
+ messenger.notifySms(5,
+ 1,
+ 2,
+ "99887766554433221100",
+ Ci.nsISmsService.DELIVERY_TYPE_RECEIVED,
+ Ci.nsISmsService.DELIVERY_STATUS_TYPE_SUCCESS,
+ "+0987654321",
+ null,
+ "Incoming message",
+ Ci.nsISmsService.MESSAGE_CLASS_TYPE_NORMAL,
+ timestamp,
+ sentTimestamp,
+ 0,
+ false);
+ ok(false, "Failed to verify the protection of invalid nsISmsMessenger.NOTIFICATION_TYPE!");
+ } catch (e) {}
+
+ run_next_test();
+});
+
+/**
+ * Verify RILSystemMessenger.notifyCbMessageReceived()
+ */
+add_test(function test_cellbroadcast_messenger_notify_cb_message_received() {
+ let messenger = newRILSystemMessenger();
+ let timestamp = Date.now();
+
+ // Verify ETWS
+ messenger.notifyCbMessageReceived(0,
+ Ci.nsICellBroadcastService.GSM_GEOGRAPHICAL_SCOPE_CELL_IMMEDIATE,
+ 256,
+ 4352,
+ null,
+ null,
+ Ci.nsICellBroadcastService.GSM_MESSAGE_CLASS_NORMAL,
+ timestamp,
+ Ci.nsICellBroadcastService.CDMA_SERVICE_CATEGORY_INVALID,
+ true,
+ Ci.nsICellBroadcastService.GSM_ETWS_WARNING_EARTHQUAKE,
+ false,
+ true);
+ equal_received_system_message("cellbroadcast-received", {
+ serviceId: 0,
+ gsmGeographicalScope: "cell-immediate",
+ messageCode: 256,
+ messageId: 4352,
+ language: null,
+ body: null,
+ messageClass: "normal",
+ timestamp: timestamp,
+ cdmaServiceCategory: null,
+ etws: {
+ warningType: "earthquake",
+ emergencyUserAlert: false,
+ popup: true
+ }
+ });
+
+ // Verify Normal CB Message
+ messenger.notifyCbMessageReceived(1,
+ Ci.nsICellBroadcastService.GSM_GEOGRAPHICAL_SCOPE_PLMN,
+ 0,
+ 50,
+ "en",
+ "The quick brown fox jumps over the lazy dog",
+ Ci.nsICellBroadcastService.GSM_MESSAGE_CLASS_NORMAL,
+ timestamp,
+ Ci.nsICellBroadcastService.CDMA_SERVICE_CATEGORY_INVALID,
+ false,
+ Ci.nsICellBroadcastService.GSM_ETWS_WARNING_INVALID,
+ false,
+ false);
+ equal_received_system_message("cellbroadcast-received", {
+ serviceId: 1,
+ gsmGeographicalScope: "plmn",
+ messageCode: 0,
+ messageId: 50,
+ language: "en",
+ body: "The quick brown fox jumps over the lazy dog",
+ messageClass: "normal",
+ timestamp: timestamp,
+ cdmaServiceCategory: null,
+ etws: null
+ });
+
+ // Verify CB Message with ETWS Info
+ messenger.notifyCbMessageReceived(0,
+ Ci.nsICellBroadcastService.GSM_GEOGRAPHICAL_SCOPE_LOCATION_AREA,
+ 0,
+ 4354,
+ "en",
+ "Earthquake & Tsunami Warning!",
+ Ci.nsICellBroadcastService.GSM_MESSAGE_CLASS_0,
+ timestamp,
+ Ci.nsICellBroadcastService.CDMA_SERVICE_CATEGORY_INVALID,
+ true,
+ Ci.nsICellBroadcastService.GSM_ETWS_WARNING_EARTHQUAKE_TSUNAMI,
+ true,
+ false);
+ equal_received_system_message("cellbroadcast-received", {
+ serviceId: 0,
+ gsmGeographicalScope: "location-area",
+ messageCode: 0,
+ messageId: 4354,
+ language: "en",
+ body: "Earthquake & Tsunami Warning!",
+ messageClass: "class-0",
+ timestamp: timestamp,
+ cdmaServiceCategory: null,
+ etws: {
+ warningType: "earthquake-tsunami",
+ emergencyUserAlert: true,
+ popup: false
+ }
+ });
+
+ // Verify CDMA CB Message
+ messenger.notifyCbMessageReceived(0,
+ Ci.nsICellBroadcastService.GSM_GEOGRAPHICAL_SCOPE_INVALID,
+ 0,
+ 0,
+ null,
+ "CDMA CB Message",
+ Ci.nsICellBroadcastService.GSM_MESSAGE_CLASS_NORMAL,
+ timestamp,
+ 512,
+ false,
+ Ci.nsICellBroadcastService.GSM_ETWS_WARNING_INVALID,
+ false,
+ false);
+ equal_received_system_message("cellbroadcast-received", {
+ serviceId: 0,
+ gsmGeographicalScope: null,
+ messageCode: 0,
+ messageId: 0,
+ language: null,
+ body: "CDMA CB Message",
+ messageClass: "normal",
+ timestamp: timestamp,
+ cdmaServiceCategory: 512,
+ etws: null
+ });
+
+ run_next_test();
+});
+
+/**
+ * Verify RILSystemMessenger.notifyUssdReceived()
+ */
+add_test(function test_mobileconnection_notify_ussd_received() {
+ let messenger = newRILSystemMessenger();
+
+ messenger.notifyUssdReceived(0, "USSD Message", false);
+
+ equal_received_system_message("ussd-received", {
+ serviceId: 0,
+ message: "USSD Message",
+ sessionEnded: false
+ });
+
+ messenger.notifyUssdReceived(1, "USSD Message", true);
+
+ equal_received_system_message("ussd-received", {
+ serviceId: 1,
+ message: "USSD Message",
+ sessionEnded: true
+ });
+
+ run_next_test();
+});
+
+/**
+ * Verify RILSystemMessenger.notifyCdmaInfoRecXXX()
+ */
+add_test(function test_mobileconnection_notify_cdma_info() {
+ let messenger = newRILSystemMessenger();
+
+ messenger.notifyCdmaInfoRecDisplay(0, "CDMA Display Info");
+
+ equal_received_system_message("cdma-info-rec-received", {
+ clientId: 0,
+ display: "CDMA Display Info"
+ });
+
+ messenger.notifyCdmaInfoRecCalledPartyNumber(1, 1, 2, "+0987654321", 3, 4);
+
+ equal_received_system_message("cdma-info-rec-received", {
+ clientId: 1,
+ calledNumber: {
+ type: 1,
+ plan: 2,
+ number: "+0987654321",
+ pi: 3,
+ si: 4
+ }
+ });
+
+ messenger.notifyCdmaInfoRecCallingPartyNumber(0, 5, 6, "+1234567890", 7, 8);
+
+ equal_received_system_message("cdma-info-rec-received", {
+ clientId: 0,
+ callingNumber: {
+ type: 5,
+ plan: 6,
+ number: "+1234567890",
+ pi: 7,
+ si: 8
+ }
+ });
+
+ messenger.notifyCdmaInfoRecConnectedPartyNumber(1, 4, 3, "+56473839201", 2, 1);
+
+ equal_received_system_message("cdma-info-rec-received", {
+ clientId: 1,
+ connectedNumber: {
+ type: 4,
+ plan: 3,
+ number: "+56473839201",
+ pi: 2,
+ si: 1
+ }
+ });
+
+ messenger.notifyCdmaInfoRecSignal(0, 1, 2, 3);
+
+ equal_received_system_message("cdma-info-rec-received", {
+ clientId: 0,
+ signal: {
+ type: 1,
+ alertPitch: 2,
+ signal: 3
+ }
+ });
+
+ messenger.notifyCdmaInfoRecRedirectingNumber(1, 8, 7, "+1029384756", 6, 5, 4);
+
+ equal_received_system_message("cdma-info-rec-received", {
+ clientId: 1,
+ redirect: {
+ type: 8,
+ plan: 7,
+ number: "+1029384756",
+ pi: 6,
+ si: 5,
+ reason: 4
+ }
+ });
+
+ messenger.notifyCdmaInfoRecLineControl(0, 1, 0, 1, 255);
+
+ equal_received_system_message("cdma-info-rec-received", {
+ clientId: 0,
+ lineControl: {
+ polarityIncluded: 1,
+ toggle: 0,
+ reverse: 1,
+ powerDenial: 255
+ }
+ });
+
+ messenger.notifyCdmaInfoRecClir(1, 256);
+
+ equal_received_system_message("cdma-info-rec-received", {
+ clientId: 1,
+ clirCause: 256
+ });
+
+ messenger.notifyCdmaInfoRecAudioControl(0, 255, -1);
+
+ equal_received_system_message("cdma-info-rec-received", {
+ clientId: 0,
+ audioControl: {
+ upLink: 255,
+ downLink: -1
+ }
+ });
+
+ run_next_test();
+});
+
+/**
+ * Verify Error Handling of StkProactiveCmdFactory.createCommand()
+ */
+add_test(function test_icc_stk_cmd_factory_create_command_error() {
+ let messenger = newRILSystemMessenger();
+
+ // Verify the protection of invalid typeOfCommand.
+ try {
+ gStkCmdFactory.createCommand({
+ commandNumber: 0,
+ typeOfCommand: RIL.STK_CMD_MORE_TIME, // Invalid TypeOfCommand
+ commandQualifier: 0x00
+ });
+
+ ok(false, "Failed to verify the protection of createCommand()!");
+ } catch (e) {
+ ok(e.message.indexOf("Unknown Command Type") !== -1,
+ "Invalid typeOfCommand!");
+ }
+
+ run_next_test();
+});
+
+/**
+ * Verify Error Handling of StkProactiveCmdFactory.createCommandMessage()
+ */
+add_test(function test_icc_stk_cmd_factory_create_system_msg_invalid_cmd_type() {
+ let messenger = newRILSystemMessenger();
+ let iccId = "99887766554433221100";
+
+ // Verify the protection of invalid typeOfCommand.
+ try {
+ gStkCmdFactory.createCommandMessage({
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd]),
+
+ // nsIStkProactiveCmd
+ commandNumber: 0,
+ typeOfCommand: RIL.STK_CMD_MORE_TIME, // Invalid TypeOfCommand
+ commandQualifier: 0
+ });
+
+ ok(false, "Failed to identify invalid typeOfCommand!");
+ } catch (e) {
+ ok(e.message.indexOf("Unknown Command Type") !== -1,
+ "Invalid typeOfCommand!");
+ }
+
+ run_next_test();
+});
+
+/**
+ * Verify Error Handling of StkProactiveCmdFactory.createCommandMessage()
+ */
+add_test(function test_icc_stk_cmd_factory_create_system_msg_incorrect_cmd_type() {
+ let messenger = newRILSystemMessenger();
+ let iccId = "99887766554433221100";
+
+ // Verify the protection of invalid typeOfCommand.
+ try {
+ gStkCmdFactory.createCommandMessage({
+ QueryInterface: XPCOMUtils.generateQI([Ci.nsIStkProactiveCmd,
+ Ci.nsIStkProvideLocalInfoCmd]),
+
+ // nsIStkProactiveCmd
+ commandNumber: 0,
+ typeOfCommand: RIL.STK_CMD_POLL_INTERVAL, // Incorrect typeOfCommand
+ commandQualifier: 0,
+ // nsIStkProvideLocalInfoCmd
+ localInfoType: 0x00,
+ });
+
+ ok(false, "Failed to identify incorrect typeOfCommand!");
+ } catch (e) {
+ ok(e.message.indexOf("Failed to convert command into concrete class: ") !== -1);
+ }
+
+ run_next_test();
+});
+
+/**
+ * Verify RILSystemMessenger.notifyStkProactiveCommand()
+ */
+add_test(function test_icc_notify_stk_proactive_command() {
+ let messenger = newRILSystemMessenger();
+ let iccId = "99887766554433221100";
+ let WHT = 0xFFFFFFFF;
+ let BLK = 0x000000FF;
+ let RED = 0xFF0000FF;
+ let GRN = 0x00FF00FF;
+ let BLU = 0x0000FFFF;
+ let TSP = 0;
+ // Basic Image, see Anex B.1 in TS 31.102.
+ let basicIcon = {
+ width: 8,
+ height: 8,
+ codingScheme: "basic",
+ pixels: [WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT,
+ BLK, BLK, BLK, BLK, BLK, BLK, WHT, WHT,
+ WHT, BLK, WHT, BLK, BLK, WHT, BLK, WHT,
+ WHT, BLK, BLK, WHT, WHT, BLK, BLK, WHT,
+ WHT, BLK, BLK, WHT, WHT, BLK, BLK, WHT,
+ WHT, BLK, WHT, BLK, BLK, WHT, BLK, WHT,
+ WHT, WHT, BLK, BLK, BLK, BLK, WHT, WHT,
+ WHT, WHT, WHT, WHT, WHT, WHT, WHT, WHT]
+ };
+ // Color Image, see Anex B.2 in TS 31.102.
+ let colorIcon = {
+ width: 8,
+ height: 8,
+ codingScheme: "color",
+ pixels: [BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU,
+ BLU, RED, RED, RED, RED, RED, RED, BLU,
+ BLU, RED, GRN, GRN, GRN, RED, RED, BLU,
+ BLU, RED, RED, GRN, GRN, RED, RED, BLU,
+ BLU, RED, RED, GRN, GRN, RED, RED, BLU,
+ BLU, RED, RED, GRN, GRN, GRN, RED, BLU,
+ BLU, RED, RED, RED, RED, RED, RED, BLU,
+ BLU, BLU, BLU, BLU, BLU, BLU, BLU, BLU]
+ };
+ // Color Image with Transparency, see Anex B.2 in TS 31.102.
+ let colorTransparencyIcon = {
+ width: 8,
+ height: 8,
+ codingScheme: "color-transparency",
+ pixels: [TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP,
+ TSP, RED, RED, RED, RED, RED, RED, TSP,
+ TSP, RED, GRN, GRN, GRN, RED, RED, TSP,
+ TSP, RED, RED, GRN, GRN, RED, RED, TSP,
+ TSP, RED, RED, GRN, GRN, RED, RED, TSP,
+ TSP, RED, RED, GRN, GRN, GRN, RED, TSP,
+ TSP, RED, RED, RED, RED, RED, RED, TSP,
+ TSP, TSP, TSP, TSP, TSP, TSP, TSP, TSP]
+ };
+
+ let cmdCount = 0;
+
+ // Test Messages:
+ let messages = [
+ // STK_CMD_REFRESH
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_REFRESH,
+ commandQualifier: 0x04 // UICC Reset
+ },
+ // STK_CMD_POLL_INTERVAL
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_POLL_INTERVAL,
+ commandQualifier: 0x00, // RFU
+ options: {
+ timeUnit: RIL.STK_TIME_UNIT_TENTH_SECOND,
+ timeInterval: 0x05
+ }
+ },
+ // STK_CMD_POLL_OFF
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_POLL_OFF,
+ commandQualifier: 0x00, // RFU
+ },
+ // STK_CMD_PROVIDE_LOCAL_INFO
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_PROVIDE_LOCAL_INFO,
+ commandQualifier: 0x01, // IMEI of the terminal
+ options: {
+ localInfoType: 0x01 // IMEI of the terminal
+ }
+ },
+ // STK_CMD_SET_UP_EVENT_LIST with eventList
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SET_UP_EVENT_LIST,
+ commandQualifier: 0x00, // RFU
+ options: {
+ eventList: [ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1A, 0x1B, 0x1C ]
+ }
+ },
+ // STK_CMD_SET_UP_EVENT_LIST without eventList
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SET_UP_EVENT_LIST,
+ commandQualifier: 0x00, // RFU
+ options: {
+ eventList: null
+ }
+ },
+ // STK_CMD_SET_UP_MENU with mandatory properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SET_UP_MENU,
+ commandQualifier: 0x80, // bit 8: 1 = help information available
+ options: {
+ title: "Toolkit Menu 1",
+ items: [
+ { identifier: 0x01, text: "Menu Item 1" },
+ { identifier: 0x02, text: "Menu Item 2" },
+ { identifier: 0x03, text: "Menu Item 3" }
+ ],
+ isHelpAvailable: true
+ }
+ },
+ // STK_CMD_SET_UP_MENU with optional properties including:
+ // iconInfo for this menu, iconInfo for each item and nextActionList.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SET_UP_MENU,
+ commandQualifier: 0x00, // bit 8: 0 = help information is not available
+ options: {
+ title: "Toolkit Menu 2",
+ items: [
+ { identifier: 0x01,
+ text: "Menu Item 1",
+ iconSelfExplanatory: true,
+ icons: [basicIcon]
+ },
+ { identifier: 0x02,
+ text: "Menu Item 2",
+ iconSelfExplanatory: false,
+ icons: [basicIcon, colorIcon]
+ },
+ { identifier: 0x03,
+ text: "Menu Item 3",
+ iconSelfExplanatory: true,
+ icons: [basicIcon, colorIcon, colorTransparencyIcon]
+ },
+ ],
+ nextActionList: [
+ RIL.STK_NEXT_ACTION_END_PROACTIVE_SESSION,
+ RIL.STK_NEXT_ACTION_NULL,
+ RIL.STK_NEXT_ACTION_NULL,
+ RIL.STK_NEXT_ACTION_NULL
+ ],
+ iconSelfExplanatory: false,
+ icons: [basicIcon, colorIcon, colorTransparencyIcon],
+ isHelpAvailable: false
+ }
+ },
+ // STK_CMD_SELECT_ITEM with mandatory properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SELECT_ITEM,
+ commandQualifier: RIL.STK_PRESENTATION_TYPE_NOT_SPECIFIED,
+ options: {
+ title: null,
+ items: [
+ { identifier: 0x01, text: "Menu Item 1" },
+ { identifier: 0x02, text: "Menu Item 2" },
+ { identifier: 0x03, text: "Menu Item 3" }
+ ],
+ presentationType: RIL.STK_PRESENTATION_TYPE_NOT_SPECIFIED,
+ isHelpAvailable: false
+ }
+ },
+ // STK_CMD_SELECT_ITEM with optional properties including:
+ // title, iconInfo for this menu, iconInfo for each item and nextActionList.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SELECT_ITEM,
+ commandQualifier: RIL.STK_PRESENTATION_TYPE_NAVIGATION_OPTIONS,
+ options: {
+ title: "Selected Toolkit Menu",
+ items: [
+ { identifier: 0x01,
+ text: "Menu Item 1",
+ iconSelfExplanatory: true,
+ icons: [basicIcon]
+ },
+ { identifier: 0x02,
+ text: "Menu Item 2",
+ iconSelfExplanatory: false,
+ icons: [basicIcon, colorIcon]
+ },
+ { identifier: 0x03,
+ text: "Menu Item 3",
+ iconSelfExplanatory: true,
+ icons: [basicIcon, colorIcon, colorTransparencyIcon]
+ },
+ ],
+ nextActionList: [
+ RIL.STK_NEXT_ACTION_END_PROACTIVE_SESSION,
+ RIL.STK_NEXT_ACTION_NULL,
+ RIL.STK_NEXT_ACTION_NULL,
+ RIL.STK_NEXT_ACTION_NULL
+ ],
+ defaultItem: 0x02,
+ iconSelfExplanatory: false,
+ icons: [basicIcon, colorIcon, colorTransparencyIcon],
+ presentationType: RIL.STK_PRESENTATION_TYPE_NAVIGATION_OPTIONS,
+ isHelpAvailable: false
+ }
+ },
+ // STK_CMD_DISPLAY_TEXT with mandatory properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_DISPLAY_TEXT,
+ commandQualifier: 0x01, // bit 1: High Priority
+ options: {
+ text: "Display Text 1",
+ isHighPriority: true,
+ userClear: false,
+ responseNeeded: false
+ }
+ },
+ // STK_CMD_DISPLAY_TEXT with optional properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_DISPLAY_TEXT,
+ commandQualifier: 0x80, // bit 8: User Clear
+ options: {
+ text: "Display Text 2",
+ isHighPriority: false,
+ userClear: true,
+ responseNeeded: true,
+ duration: {
+ timeUnit: RIL.STK_TIME_UNIT_TENTH_SECOND,
+ timeInterval: 0x05
+ },
+ iconSelfExplanatory: true,
+ icons: [basicIcon]
+ }
+ },
+ // STK_CMD_SET_UP_IDLE_MODE_TEXT
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SET_UP_IDLE_MODE_TEXT,
+ commandQualifier: 0x00, // RFU
+ options: {
+ text: "Setup Idle Mode Text"
+ }
+ },
+ // STK_CMD_SEND_SS
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SEND_SS,
+ commandQualifier: 0x00, // RFU
+ options: {
+ text: "Send SS",
+ iconSelfExplanatory: true,
+ icons: [colorIcon]
+ }
+ },
+ // STK_CMD_SEND_USSD
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SEND_USSD,
+ commandQualifier: 0x00, // RFU
+ options: {
+ text: "Send USSD"
+ }
+ },
+ // STK_CMD_SEND_SMS
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SEND_SMS,
+ commandQualifier: 0x00, // RFU
+ options: {
+ text: "Send SMS",
+ iconSelfExplanatory: false,
+ icons: [colorTransparencyIcon]
+ }
+ },
+ // STK_CMD_SEND_DTMF
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SEND_DTMF,
+ commandQualifier: 0x00, // RFU
+ options: {
+ text: "Send DTMF",
+ iconSelfExplanatory: true,
+ icons: [basicIcon]
+ }
+ },
+ // STK_CMD_GET_INKEY
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_GET_INKEY,
+ commandQualifier: 0x84, // bit 3: isYesNoRequested, bit 8: isHelpAvailable
+ options: {
+ text: "Get Input Key",
+ minLength: 1,
+ maxLength: 1,
+ duration: {
+ timeUnit: RIL.STK_TIME_UNIT_SECOND,
+ timeInterval: 0x0A
+ },
+ isAlphabet: false,
+ isUCS2: false,
+ isYesNoRequested: true,
+ isHelpAvailable: true,
+ defaultText: null,
+ iconSelfExplanatory: false,
+ icons: [colorIcon]
+ }
+ },
+ // STK_CMD_GET_INPUT
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_GET_INPUT,
+ commandQualifier: 0x0F, // bit 1-4: isAlphabet, isUCS2, hideInput, isPacked
+ options: {
+ text: "Get Input Text",
+ minLength: 1,
+ maxLength: 255,
+ defaultText: "Default Input Text",
+ isAlphabet: true,
+ isUCS2: true,
+ hideInput: true,
+ isPacked: true,
+ isHelpAvailable: false,
+ defaultText: null,
+ iconSelfExplanatory: true,
+ icons: [basicIcon]
+ }
+ },
+ // STK_CMD_SET_UP_CALL with mandatory properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SET_UP_CALL,
+ commandQualifier: 0x00, // RFU
+ options: {
+ address: "+0987654321"
+ }
+ },
+ // STK_CMD_SET_UP_CALL with optional properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SET_UP_CALL,
+ commandQualifier: 0x00, // RFU
+ options: {
+ address: "+0987654321",
+ confirmMessage: {
+ text: "Confirm Message",
+ iconSelfExplanatory: false,
+ icons: [colorIcon]
+ },
+ callMessage: {
+ text: "Call Message",
+ iconSelfExplanatory: true,
+ icons: [basicIcon]
+ },
+ duration: {
+ timeUnit: RIL.STK_TIME_UNIT_SECOND,
+ timeInterval: 0x0A
+ }
+ }
+ },
+ // STK_CMD_LAUNCH_BROWSER with mandatory properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_LAUNCH_BROWSER,
+ commandQualifier: RIL.STK_BROWSER_MODE_USING_NEW_BROWSER,
+ options: {
+ url: "http://www.mozilla.org",
+ mode: RIL.STK_BROWSER_MODE_USING_NEW_BROWSER
+ }
+ },
+ // STK_CMD_LAUNCH_BROWSER with optional properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_LAUNCH_BROWSER,
+ commandQualifier: RIL.STK_BROWSER_MODE_USING_NEW_BROWSER,
+ options: {
+ url: "http://www.mozilla.org",
+ mode: RIL.STK_BROWSER_MODE_USING_NEW_BROWSER,
+ confirmMessage: {
+ text: "Confirm Message for Launch Browser",
+ iconSelfExplanatory: false,
+ icons: [colorTransparencyIcon]
+ }
+ }
+ },
+ // STK_CMD_PLAY_TONE with mandatory properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_PLAY_TONE,
+ commandQualifier: 0x01, // isVibrate
+ options: {
+ text: null,
+ isVibrate: true
+ }
+ },
+ // STK_CMD_PLAY_TONE with optional properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_PLAY_TONE,
+ commandQualifier: 0x00, // isVibrate = false
+ options: {
+ text: "Play Tone",
+ tone: RIL.STK_TONE_TYPE_CONGESTION,
+ isVibrate: false,
+ duration: {
+ timeUnit: RIL.STK_TIME_UNIT_SECOND,
+ timeInterval: 0x0A
+ },
+ iconSelfExplanatory: true,
+ icons: [basicIcon]
+ }
+ },
+ // STK_CMD_TIMER_MANAGEMENT with mandatory properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_TIMER_MANAGEMENT,
+ commandQualifier: RIL.STK_TIMER_DEACTIVATE,
+ options: {
+ timerId: 0x08,
+ timerAction: RIL.STK_TIMER_DEACTIVATE
+ }
+ },
+ // STK_CMD_TIMER_MANAGEMENT with optional properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_TIMER_MANAGEMENT,
+ commandQualifier: RIL.STK_TIMER_START,
+ options: {
+ timerId: 0x01,
+ timerValue: (12 * 60 * 60) + (30 * 60) + (30), // 12:30:30
+ timerAction: RIL.STK_TIMER_START
+ }
+ },
+ // STK_CMD_OPEN_CHANNEL with mandatory properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_OPEN_CHANNEL,
+ commandQualifier: 0x00, //RFU
+ options: {
+ text: null,
+ }
+ },
+ // STK_CMD_OPEN_CHANNEL with optional properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_OPEN_CHANNEL,
+ commandQualifier: 0x00, //RFU
+ options: {
+ text: "Open Channel",
+ iconSelfExplanatory: false,
+ icons: [colorIcon]
+ }
+ },
+ // STK_CMD_CLOSE_CHANNEL with optional properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_CLOSE_CHANNEL,
+ commandQualifier: 0x00, //RFU
+ options: {
+ text: "Close Channel",
+ iconSelfExplanatory: true,
+ icons: [colorTransparencyIcon]
+ }
+ },
+ // STK_CMD_SEND_DATA with optional properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_SEND_DATA,
+ commandQualifier: 0x00, //RFU
+ options: {
+ text: null,
+ iconSelfExplanatory: false,
+ icons: [basicIcon]
+ }
+ },
+ // STK_CMD_RECEIVE_DATA with optional properties.
+ {
+ commandNumber: ++cmdCount,
+ typeOfCommand: RIL.STK_CMD_RECEIVE_DATA,
+ commandQualifier: 0x00, //RFU
+ options: {
+ text: "Receive Data"
+ }
+ },
+ null // Termination condition to run_next_test()
+ ];
+
+ messages.forEach(function(aMessage) {
+ if (!aMessage) {
+ run_next_test();
+ return;
+ }
+
+ messenger.notifyStkProactiveCommand(iccId,
+ gStkCmdFactory.createCommand(aMessage));
+
+ equal_received_system_message("icc-stkcommand", {
+ iccId: iccId,
+ command: aMessage
+ });
+ });
+});