summaryrefslogtreecommitdiffstats
path: root/dom/system/gonk/tests/test_ril_worker_icc_ICCRecordHelper.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/system/gonk/tests/test_ril_worker_icc_ICCRecordHelper.js')
-rw-r--r--dom/system/gonk/tests/test_ril_worker_icc_ICCRecordHelper.js1080
1 files changed, 1080 insertions, 0 deletions
diff --git a/dom/system/gonk/tests/test_ril_worker_icc_ICCRecordHelper.js b/dom/system/gonk/tests/test_ril_worker_icc_ICCRecordHelper.js
new file mode 100644
index 000000000..00c55873d
--- /dev/null
+++ b/dom/system/gonk/tests/test_ril_worker_icc_ICCRecordHelper.js
@@ -0,0 +1,1080 @@
+/* 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();
+}
+
+/**
+ * Verify ICCRecordHelper.readPBR
+ */
+add_test(function test_read_pbr() {
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ let record = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let io = context.ICCIOHelper;
+
+ io.loadLinearFixedEF = function fakeLoadLinearFixedEF(options) {
+ let pbr_1 = [
+ 0xa8, 0x05, 0xc0, 0x03, 0x4f, 0x3a, 0x01
+ ];
+
+ // Write data size
+ buf.writeInt32(pbr_1.length * 2);
+
+ // Write pbr
+ for (let i = 0; i < pbr_1.length; i++) {
+ helper.writeHexOctet(pbr_1[i]);
+ }
+
+ // Write string delimiter
+ buf.writeStringDelimiter(pbr_1.length * 2);
+
+ options.totalRecords = 2;
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ io.loadNextRecord = function fakeLoadNextRecord(options) {
+ let pbr_2 = [
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+ ];
+
+ options.p1++;
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ let successCb = function successCb(pbrs) {
+ equal(pbrs[0].adn.fileId, 0x4f3a);
+ equal(pbrs.length, 1);
+ };
+
+ let errorCb = function errorCb(errorMsg) {
+ do_print("Reading EF_PBR failed, msg = " + errorMsg);
+ ok(false);
+ };
+
+ record.readPBR(successCb, errorCb);
+
+ // Check cache pbrs when 2nd call
+ let ifLoadEF = false;
+ io.loadLinearFixedEF = function fakeLoadLinearFixedEF(options) {
+ ifLoadEF = true;
+ }
+ record.readPBR(successCb, errorCb);
+ ok(!ifLoadEF);
+
+ run_next_test();
+});
+
+/**
+ * Verify ICCRecordHelper.readEmail
+ */
+add_test(function test_read_email() {
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ let record = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let io = context.ICCIOHelper;
+ let recordSize;
+
+ io.loadLinearFixedEF = function fakeLoadLinearFixedEF(options) {
+ let email_1 = [
+ 0x65, 0x6D, 0x61, 0x69, 0x6C,
+ 0x00, 0x6D, 0x6F, 0x7A, 0x69,
+ 0x6C, 0x6C, 0x61, 0x2E, 0x63,
+ 0x6F, 0x6D, 0x02, 0x23];
+
+ // Write data size
+ buf.writeInt32(email_1.length * 2);
+
+ // Write email
+ for (let i = 0; i < email_1.length; i++) {
+ helper.writeHexOctet(email_1[i]);
+ }
+
+ // Write string delimiter
+ buf.writeStringDelimiter(email_1.length * 2);
+
+ recordSize = email_1.length;
+ options.recordSize = recordSize;
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ function doTestReadEmail(type, expectedResult) {
+ let fileId = 0x6a75;
+ let recordNumber = 1;
+
+ // fileId and recordNumber are dummy arguments.
+ record.readEmail(fileId, type, recordNumber, function(email) {
+ equal(email, expectedResult);
+ });
+ };
+
+ doTestReadEmail(ICC_USIM_TYPE1_TAG, "email@mozilla.com$#");
+ doTestReadEmail(ICC_USIM_TYPE2_TAG, "email@mozilla.com");
+ equal(record._emailRecordSize, recordSize);
+
+ run_next_test();
+});
+
+/**
+ * Verify ICCRecordHelper.updateEmail
+ */
+add_test(function test_update_email() {
+ const recordSize = 0x20;
+ const recordNumber = 1;
+ const fileId = 0x4f50;
+ const NUM_TESTS = 2;
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let pduHelper = context.GsmPDUHelper;
+ let iccHelper = context.ICCPDUHelper;
+ let ril = context.RIL;
+ ril.appType = CARD_APPTYPE_USIM;
+ let recordHelper = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let ioHelper = context.ICCIOHelper;
+ let pbr = {email: {fileId: fileId, fileType: ICC_USIM_TYPE1_TAG},
+ adn: {sfi: 1}};
+ let count = 0;
+
+ // Override.
+ ioHelper.updateLinearFixedEF = function(options) {
+ options.pathId = context.ICCFileHelper.getEFPath(options.fileId);
+ options.command = ICC_COMMAND_UPDATE_RECORD;
+ options.p1 = options.recordNumber;
+ options.p2 = READ_RECORD_ABSOLUTE_MODE;
+ options.p3 = recordSize;
+ ril.iccIO(options);
+ };
+
+ function do_test(pbr, expectedEmail, expectedAdnRecordId) {
+ buf.sendParcel = function() {
+ count++;
+
+ // Request Type.
+ equal(this.readInt32(), REQUEST_SIM_IO);
+
+ // Token : we don't care
+ this.readInt32();
+
+ // command.
+ equal(this.readInt32(), ICC_COMMAND_UPDATE_RECORD);
+
+ // fileId.
+ equal(this.readInt32(), fileId);
+
+ // pathId.
+ equal(this.readString(),
+ EF_PATH_MF_SIM + EF_PATH_DF_TELECOM + EF_PATH_DF_PHONEBOOK);
+
+ // p1.
+ equal(this.readInt32(), recordNumber);
+
+ // p2.
+ equal(this.readInt32(), READ_RECORD_ABSOLUTE_MODE);
+
+ // p3.
+ equal(this.readInt32(), recordSize);
+
+ // data.
+ let strLen = this.readInt32();
+ let email;
+ if (pbr.email.fileType === ICC_USIM_TYPE1_TAG) {
+ email = iccHelper.read8BitUnpackedToString(recordSize);
+ } else {
+ email = iccHelper.read8BitUnpackedToString(recordSize - 2);
+ equal(pduHelper.readHexOctet(), pbr.adn.sfi);
+ equal(pduHelper.readHexOctet(), expectedAdnRecordId);
+ }
+ this.readStringDelimiter(strLen);
+ equal(email, expectedEmail);
+
+ // pin2.
+ equal(this.readString(), null);
+
+ // AID. Ignore because it's from modem.
+ this.readInt32();
+
+ if (count == NUM_TESTS) {
+ run_next_test();
+ }
+ };
+ recordHelper.updateEmail(pbr, recordNumber, expectedEmail, expectedAdnRecordId);
+ }
+
+ do_test(pbr, "test@mail.com");
+ pbr.email.fileType = ICC_USIM_TYPE2_TAG;
+ do_test(pbr, "test@mail.com", 1);
+});
+
+/**
+ * Verify ICCRecordHelper.readANR
+ */
+add_test(function test_read_anr() {
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ let record = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let io = context.ICCIOHelper;
+ let recordSize;
+
+ io.loadLinearFixedEF = function fakeLoadLinearFixedEF(options) {
+ let anr_1 = [
+ 0x01, 0x05, 0x81, 0x10, 0x32,
+ 0x54, 0xF6, 0xFF, 0xFF];
+
+ // Write data size
+ buf.writeInt32(anr_1.length * 2);
+
+ // Write anr
+ for (let i = 0; i < anr_1.length; i++) {
+ helper.writeHexOctet(anr_1[i]);
+ }
+
+ // Write string delimiter
+ buf.writeStringDelimiter(anr_1.length * 2);
+
+ recordSize = anr_1.length;
+ options.recordSize = recordSize;
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ function doTestReadAnr(fileType, expectedResult) {
+ let fileId = 0x4f11;
+ let recordNumber = 1;
+
+ // fileId and recordNumber are dummy arguments.
+ record.readANR(fileId, fileType, recordNumber, function(anr) {
+ equal(anr, expectedResult);
+ });
+ };
+
+ doTestReadAnr(ICC_USIM_TYPE1_TAG, "0123456");
+ equal(record._anrRecordSize, recordSize);
+
+ run_next_test();
+});
+
+/**
+ * Verify ICCRecordHelper.updateANR
+ */
+add_test(function test_update_anr() {
+ const recordSize = 0x20;
+ const recordNumber = 1;
+ const fileId = 0x4f11;
+ const NUM_TESTS = 2;
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let pduHelper = context.GsmPDUHelper;
+ let iccHelper = context.ICCPDUHelper;
+ let ril = context.RIL;
+ ril.appType = CARD_APPTYPE_USIM;
+ let recordHelper = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let ioHelper = context.ICCIOHelper;
+ let pbr = {anr0: {fileId: fileId, fileType: ICC_USIM_TYPE1_TAG},
+ adn: {sfi: 1}};
+ let count = 0;
+
+ // Override.
+ ioHelper.updateLinearFixedEF = function(options) {
+ options.pathId = context.ICCFileHelper.getEFPath(options.fileId);
+ options.command = ICC_COMMAND_UPDATE_RECORD;
+ options.p1 = options.recordNumber;
+ options.p2 = READ_RECORD_ABSOLUTE_MODE;
+ options.p3 = recordSize;
+ ril.iccIO(options);
+ };
+
+ function do_test(pbr, expectedANR, expectedAdnRecordId) {
+ buf.sendParcel = function() {
+ count++;
+
+ // Request Type.
+ equal(this.readInt32(), REQUEST_SIM_IO);
+
+ // Token : we don't care
+ this.readInt32();
+
+ // command.
+ equal(this.readInt32(), ICC_COMMAND_UPDATE_RECORD);
+
+ // fileId.
+ equal(this.readInt32(), fileId);
+
+ // pathId.
+ equal(this.readString(),
+ EF_PATH_MF_SIM + EF_PATH_DF_TELECOM + EF_PATH_DF_PHONEBOOK);
+
+ // p1.
+ equal(this.readInt32(), recordNumber);
+
+ // p2.
+ equal(this.readInt32(), READ_RECORD_ABSOLUTE_MODE);
+
+ // p3.
+ equal(this.readInt32(), recordSize);
+
+ // data.
+ let strLen = this.readInt32();
+ // EF_AAS, ignore.
+ pduHelper.readHexOctet();
+ equal(iccHelper.readNumberWithLength(), expectedANR);
+ // EF_CCP, ignore.
+ pduHelper.readHexOctet();
+ // EF_EXT1, ignore.
+ pduHelper.readHexOctet();
+ if (pbr.anr0.fileType === ICC_USIM_TYPE2_TAG) {
+ equal(pduHelper.readHexOctet(), pbr.adn.sfi);
+ equal(pduHelper.readHexOctet(), expectedAdnRecordId);
+ }
+ this.readStringDelimiter(strLen);
+
+ // pin2.
+ equal(this.readString(), null);
+
+ // AID. Ignore because it's from modem.
+ this.readInt32();
+
+ if (count == NUM_TESTS) {
+ run_next_test();
+ }
+ };
+ recordHelper.updateANR(pbr, recordNumber, expectedANR, expectedAdnRecordId);
+ }
+
+ do_test(pbr, "+123456789");
+ pbr.anr0.fileType = ICC_USIM_TYPE2_TAG;
+ do_test(pbr, "123456789", 1);
+});
+
+/**
+ * Verify ICCRecordHelper.readIAP
+ */
+add_test(function test_read_iap() {
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ let record = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let io = context.ICCIOHelper;
+ let recordSize;
+
+ io.loadLinearFixedEF = function fakeLoadLinearFixedEF(options) {
+ let iap_1 = [0x01, 0x02];
+
+ // Write data size/
+ buf.writeInt32(iap_1.length * 2);
+
+ // Write iap.
+ for (let i = 0; i < iap_1.length; i++) {
+ helper.writeHexOctet(iap_1[i]);
+ }
+
+ // Write string delimiter.
+ buf.writeStringDelimiter(iap_1.length * 2);
+
+ recordSize = iap_1.length;
+ options.recordSize = recordSize;
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ function doTestReadIAP(expectedIAP) {
+ const fileId = 0x4f17;
+ const recordNumber = 1;
+
+ let successCb = function successCb(iap) {
+ for (let i = 0; i < iap.length; i++) {
+ equal(expectedIAP[i], iap[i]);
+ }
+ run_next_test();
+ }.bind(this);
+
+ let errorCb = function errorCb(errorMsg) {
+ do_print(errorMsg);
+ ok(false);
+ run_next_test();
+ }.bind(this);
+
+ record.readIAP(fileId, recordNumber, successCb, errorCb);
+ };
+
+ doTestReadIAP([1, 2]);
+});
+
+/**
+ * Verify ICCRecordHelper.updateIAP
+ */
+add_test(function test_update_iap() {
+ const recordSize = 2;
+ const recordNumber = 1;
+ const fileId = 0x4f17;
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let pduHelper = context.GsmPDUHelper;
+ let ril = context.RIL;
+ ril.appType = CARD_APPTYPE_USIM;
+ let recordHelper = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let ioHelper = context.ICCIOHelper;
+ let count = 0;
+
+ // Override.
+ ioHelper.updateLinearFixedEF = function(options) {
+ options.pathId = context.ICCFileHelper.getEFPath(options.fileId);
+ options.command = ICC_COMMAND_UPDATE_RECORD;
+ options.p1 = options.recordNumber;
+ options.p2 = READ_RECORD_ABSOLUTE_MODE;
+ options.p3 = recordSize;
+ ril.iccIO(options);
+ };
+
+ function do_test(expectedIAP) {
+ buf.sendParcel = function() {
+ // Request Type.
+ equal(this.readInt32(), REQUEST_SIM_IO);
+
+ // Token : we don't care
+ this.readInt32();
+
+ // command.
+ equal(this.readInt32(), ICC_COMMAND_UPDATE_RECORD);
+
+ // fileId.
+ equal(this.readInt32(), fileId);
+
+ // pathId.
+ equal(this.readString(),
+ EF_PATH_MF_SIM + EF_PATH_DF_TELECOM + EF_PATH_DF_PHONEBOOK);
+
+ // p1.
+ equal(this.readInt32(), recordNumber);
+
+ // p2.
+ equal(this.readInt32(), READ_RECORD_ABSOLUTE_MODE);
+
+ // p3.
+ equal(this.readInt32(), recordSize);
+
+ // data.
+ let strLen = this.readInt32();
+ for (let i = 0; i < recordSize; i++) {
+ equal(expectedIAP[i], pduHelper.readHexOctet());
+ }
+ this.readStringDelimiter(strLen);
+
+ // pin2.
+ equal(this.readString(), null);
+
+ // AID. Ignore because it's from modem.
+ this.readInt32();
+
+ run_next_test();
+ };
+ recordHelper.updateIAP(fileId, recordNumber, expectedIAP);
+ }
+
+ do_test([1, 2]);
+});
+
+/**
+ * Verify ICCRecordHelper.readADNLike.
+ */
+add_test(function test_read_adn_like() {
+ const RECORD_SIZE = 0x20;
+
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ let record = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let io = context.ICCIOHelper;
+ let ril = context.RIL;
+
+ function do_test(extFileId, rawEF, expectedExtRecordNumber, expectedNumber) {
+ io.loadLinearFixedEF = function fakeLoadLinearFixedEF(options) {
+ // Write data size
+ buf.writeInt32(rawEF.length * 2);
+
+ // Write adn
+ for (let i = 0; i < rawEF.length; i += 2) {
+ helper.writeHexOctet(parseInt(rawEF.substr(i, 2), 16));
+ }
+
+ // Write string delimiter
+ buf.writeStringDelimiter(rawEF.length * 2);
+
+ options.p1 = 1;
+ options.recordSize = RECORD_SIZE;
+ options.totalRecords = 1;
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ record.readExtension = function(fileId, recordNumber, onsuccess, onerror) {
+ onsuccess("1234");
+ }
+
+ let successCb = function successCb(contacts) {
+ ok(contacts[0].number == expectedNumber);
+ };
+
+ let errorCb = function errorCb(errorMsg) {
+ do_print("Reading ADNLike failed, msg = " + errorMsg);
+ ok(false);
+ };
+
+ record.readADNLike(ICC_EF_ADN, extFileId, successCb, errorCb);
+ }
+
+ ril.appType = CARD_APPTYPE_SIM;
+ // Valid extension
+ do_test(ICC_EF_EXT1,"436f6e74616374303031ffffffffffffffff0b8199887766554433221100ff01",
+ 0x01,"998877665544332211001234");
+ // Empty extension
+ do_test(ICC_EF_EXT1,"436f6e74616374303031ffffffffffffffff0b8199887766554433221100ffff",
+ 0xff, "99887766554433221100");
+ // Unsupport extension
+ do_test(null,"436f6e74616374303031ffffffffffffffff0b8199887766554433221100ffff",
+ 0xff, "99887766554433221100");
+ // Empty dialling number contact
+ do_test(null,"436f6e74616374303031ffffffffffffffffffffffffffffffffffffffffffff",
+ 0xff, "");
+
+ run_next_test();
+});
+
+/**
+ * Verify ICCRecordHelper.updateADNLike.
+ */
+add_test(function test_update_adn_like() {
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let ril = context.RIL;
+ let record = context.ICCRecordHelper;
+ let io = context.ICCIOHelper;
+ let pdu = context.ICCPDUHelper;
+ let buf = context.Buf;
+
+ ril.appType = CARD_APPTYPE_SIM;
+ const recordSize = 0x20;
+ let fileId;
+
+ // Override.
+ io.updateLinearFixedEF = function(options) {
+ options.pathId = context.ICCFileHelper.getEFPath(options.fileId);
+ options.command = ICC_COMMAND_UPDATE_RECORD;
+ options.p1 = options.recordNumber;
+ options.p2 = READ_RECORD_ABSOLUTE_MODE;
+ options.p3 = recordSize;
+ ril.iccIO(options);
+ };
+
+ buf.sendParcel = function() {
+ // Request Type.
+ equal(this.readInt32(), REQUEST_SIM_IO);
+
+ // Token : we don't care
+ this.readInt32();
+
+ // command.
+ equal(this.readInt32(), ICC_COMMAND_UPDATE_RECORD);
+
+ // fileId.
+ equal(this.readInt32(), fileId);
+
+ // pathId.
+ equal(this.readString(), EF_PATH_MF_SIM + EF_PATH_DF_TELECOM);
+
+ // p1.
+ equal(this.readInt32(), 1);
+
+ // p2.
+ equal(this.readInt32(), READ_RECORD_ABSOLUTE_MODE);
+
+ // p3.
+ equal(this.readInt32(), 0x20);
+
+ // data.
+ let contact = pdu.readAlphaIdDiallingNumber(0x20);
+ equal(contact.alphaId, "test");
+ equal(contact.number, "123456");
+ equal(contact.extRecordNumber, "0xff");
+
+ // pin2.
+ if (fileId == ICC_EF_ADN) {
+ equal(this.readString(), null);
+ } else {
+ equal(this.readString(), "1111");
+ }
+
+ // AID. Ignore because it's from modem.
+ this.readInt32();
+
+ if (fileId == ICC_EF_FDN) {
+ run_next_test();
+ }
+ };
+
+ fileId = ICC_EF_ADN;
+ record.updateADNLike(fileId, 0xff,
+ {recordId: 1, alphaId: "test", number: "123456"});
+
+ fileId = ICC_EF_FDN;
+ record.updateADNLike(fileId, 0xff,
+ {recordId: 1, alphaId: "test", number: "123456"},
+ "1111");
+});
+
+/**
+ * Verify ICCRecordHelper.findFreeRecordId.
+ */
+add_test(function test_find_free_record_id() {
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let pduHelper = context.GsmPDUHelper;
+ let recordHelper = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let io = context.ICCIOHelper;
+ let ril = context.RIL;
+
+ function writeRecord(record) {
+ // Write data size
+ buf.writeInt32(record.length * 2);
+
+ for (let i = 0; i < record.length; i++) {
+ pduHelper.writeHexOctet(record[i]);
+ }
+
+ // Write string delimiter
+ buf.writeStringDelimiter(record.length * 2);
+ }
+
+ io.loadLinearFixedEF = function fakeLoadLinearFixedEF(options) {
+ // Some random data.
+ let record = [0x12, 0x34, 0x56, 0x78, 0x90];
+ options.p1 = 1;
+ options.totalRecords = 2;
+ writeRecord(record);
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ ril.iccIO = function fakeIccIO(options) {
+ // Unused bytes.
+ let record = [0xff, 0xff, 0xff, 0xff, 0xff];
+ writeRecord(record);
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ let fileId = 0x0000; // Dummy.
+ recordHelper.findFreeRecordId(
+ fileId,
+ function(recordId) {
+ equal(recordId, 2);
+ run_next_test();
+ }.bind(this),
+ function(errorMsg) {
+ do_print(errorMsg);
+ ok(false);
+ run_next_test();
+ }.bind(this));
+});
+
+/**
+ * Verify ICCRecordHelper.fetchICCRecords.
+ */
+add_test(function test_fetch_icc_recodes() {
+ let worker = newWorker();
+ let context = worker.ContextPool._contexts[0];
+ let RIL = context.RIL;
+ let iccRecord = context.ICCRecordHelper;
+ let simRecord = context.SimRecordHelper;
+ let ruimRecord = context.RuimRecordHelper;
+ let fetchTag = 0x00;
+
+ simRecord.fetchSimRecords = function() {
+ fetchTag = 0x01;
+ };
+
+ ruimRecord.fetchRuimRecords = function() {
+ fetchTag = 0x02;
+ };
+
+ RIL.appType = CARD_APPTYPE_SIM;
+ iccRecord.fetchICCRecords();
+ equal(fetchTag, 0x01);
+
+ RIL.appType = CARD_APPTYPE_RUIM;
+ iccRecord.fetchICCRecords();
+ equal(fetchTag, 0x02);
+
+ RIL.appType = CARD_APPTYPE_USIM;
+ iccRecord.fetchICCRecords();
+ equal(fetchTag, 0x01);
+
+ run_next_test();
+});
+
+/**
+ * Verify reading EF_ICCID.
+ */
+add_test(function test_handling_iccid() {
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let record = context.ICCRecordHelper;
+ let helper = context.GsmPDUHelper;
+ let ril = context.RIL;
+ let buf = context.Buf;
+ let io = context.ICCIOHelper;
+
+ ril.reportStkServiceIsRunning = function fakeReportStkServiceIsRunning() {
+ };
+
+ function do_test(rawICCID, expectedICCID) {
+ io.loadTransparentEF = function fakeLoadTransparentEF(options) {
+ // Write data size
+ buf.writeInt32(rawICCID.length);
+
+ // Write data
+ for (let i = 0; i < rawICCID.length; i += 2) {
+ helper.writeHexOctet(parseInt(rawICCID.substr(i, 2), 16));
+ }
+
+ // Write string delimiter
+ buf.writeStringDelimiter(rawICCID.length);
+
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ record.readICCID();
+
+ equal(ril.iccInfo.iccid, expectedICCID);
+ }
+
+ // Invalid value 0xE at high nibbile + low nibbile contains 0xF.
+ do_test("9868002E90909F001519", "89860020909");
+ // Invalid value 0xD at low nibbile.
+ do_test("986800D2909090001519", "8986002090909005191");
+ // Invalid value 0xC at low nibbile.
+ do_test("986800C2909090001519", "8986002090909005191");
+ // Invalid value 0xB at low nibbile.
+ do_test("986800B2909090001519", "8986002090909005191");
+ // Invalid value 0xA at low nibbile.
+ do_test("986800A2909090001519", "8986002090909005191");
+ // Valid ICCID.
+ do_test("98101430121181157002", "89014103211118510720");
+
+ run_next_test();
+});
+
+/**
+ * Verify ICCRecordHelper.readExtension
+ */
+add_test(function test_read_extension() {
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ let record = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let io = context.ICCIOHelper;
+
+ function do_test(rawExtension, expectedExtensionNumber) {
+ io.loadLinearFixedEF = function fakeLoadLinearFixedEF(options) {
+ // Write data size
+ buf.writeInt32(rawExtension.length * 2);
+
+ // Write ext
+ for (let i = 0; i < rawExtension.length; i += 2) {
+ helper.writeHexOctet(parseInt(rawExtension.substr(i, 2), 16));
+ }
+
+ // Write string delimiter
+ buf.writeStringDelimiter(rawExtension.length);
+
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ let successCb = function successCb(number) {
+ do_print("extension number:" + number);
+ equal(number, expectedExtensionNumber);
+ };
+
+ let errorCb = function errorCb() {
+ ok(expectedExtensionNumber == null);
+ };
+
+ record.readExtension(0x6f4a, 1, successCb, errorCb);
+ }
+
+ // Test unsupported record type 0x01
+ do_test("010a10325476981032547698ff", "");
+ // Test invalid length 0xc1
+ do_test("020c10325476981032547698ff", null);
+ // Test extension chain which we don't support
+ do_test("020a1032547698103254769802", "01234567890123456789");
+ // Test valid Extension
+ do_test("020a10325476981032547698ff", "01234567890123456789");
+ // Test valid Extension
+ do_test("0209103254769810325476ffff", "012345678901234567");
+ // Test empty Extension
+ do_test("02ffffffffffffffffffffffff", "");
+
+ run_next_test();
+});
+
+/**
+ * Verify ICCRecordHelper.updateExtension
+ */
+add_test(function test_update_extension() {
+ const RECORD_SIZE = 13;
+ const RECORD_NUMBER = 1;
+
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let pduHelper = context.GsmPDUHelper;
+ let ril = context.RIL;
+ let recordHelper = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let ioHelper = context.ICCIOHelper;
+
+ // Override.
+ ioHelper.updateLinearFixedEF = function(options) {
+ options.pathId = context.ICCFileHelper.getEFPath(options.fileId);
+ options.command = ICC_COMMAND_UPDATE_RECORD;
+ options.p1 = options.recordNumber;
+ options.p2 = READ_RECORD_ABSOLUTE_MODE;
+ options.p3 = RECORD_SIZE;
+ ril.iccIO(options);
+ };
+
+ function do_test(fileId, number, expectedNumber) {
+ buf.sendParcel = function() {
+ // Request Type.
+ equal(this.readInt32(), REQUEST_SIM_IO);
+
+ // Token : we don't care
+ this.readInt32();
+
+ // command.
+ equal(this.readInt32(), ICC_COMMAND_UPDATE_RECORD);
+
+ // fileId.
+ equal(this.readInt32(), fileId);
+
+ // pathId.
+ if (ril.appType == CARD_APPTYPE_SIM || ril.appType == CARD_APPTYPE_RUIM) {
+ equal(this.readString(),
+ EF_PATH_MF_SIM + EF_PATH_DF_TELECOM);
+ } else{
+ equal(this.readString(),
+ EF_PATH_MF_SIM + EF_PATH_DF_TELECOM + EF_PATH_DF_PHONEBOOK);
+ }
+
+ // p1.
+ equal(this.readInt32(), RECORD_NUMBER);
+
+ // p2.
+ equal(this.readInt32(), READ_RECORD_ABSOLUTE_MODE);
+
+ // p3.
+ equal(this.readInt32(), RECORD_SIZE);
+
+ // data.
+ let strLen = this.readInt32();
+ // Extension record
+ let recordType = pduHelper.readHexOctet();
+
+ equal(recordType, 0x02);
+ equal(pduHelper.readHexOctet(), 10);
+ equal(
+ pduHelper.readSwappedNibbleExtendedBcdString(EXT_MAX_NUMBER_DIGITS - 1),
+ expectedNumber);
+
+ this.readStringDelimiter(strLen);
+
+ // pin2.
+ equal(this.readString(), null);
+
+ // AID. Ignore because it's from modem.
+ this.readInt32();
+ };
+
+ recordHelper.updateExtension(fileId, RECORD_NUMBER, number);
+ }
+
+ ril.appType = CARD_APPTYPE_SIM;
+ do_test(ICC_EF_EXT1, "01234567890123456789", "01234567890123456789");
+ // We don't support extension chain.
+ do_test(ICC_EF_EXT1, "012345678901234567891234", "01234567890123456789");
+
+ ril.appType = CARD_APPTYPE_USIM;
+ do_test(ICC_EF_EXT1, "01234567890123456789", "01234567890123456789");
+
+ ril.appType = CARD_APPTYPE_RUIM;
+ do_test(ICC_EF_EXT1, "01234567890123456789", "01234567890123456789");
+
+ run_next_test();
+});
+
+/**
+ * Verify ICCRecordHelper.cleanEFRecord
+ */
+add_test(function test_clean_ef_record() {
+ const RECORD_SIZE = 13;
+ const RECORD_NUMBER = 1;
+
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let pduHelper = context.GsmPDUHelper;
+ let ril = context.RIL;
+ let recordHelper = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let ioHelper = context.ICCIOHelper;
+
+ // Override.
+ ioHelper.updateLinearFixedEF = function(options) {
+ options.pathId = context.ICCFileHelper.getEFPath(options.fileId);
+ options.command = ICC_COMMAND_UPDATE_RECORD;
+ options.p1 = options.recordNumber;
+ options.p2 = READ_RECORD_ABSOLUTE_MODE;
+ options.p3 = RECORD_SIZE;
+ ril.iccIO(options);
+ };
+
+ function do_test(fileId) {
+ buf.sendParcel = function() {
+ // Request Type.
+ equal(this.readInt32(), REQUEST_SIM_IO);
+
+ // Token : we don't care
+ this.readInt32();
+
+ // command.
+ equal(this.readInt32(), ICC_COMMAND_UPDATE_RECORD);
+
+ // fileId.
+ equal(this.readInt32(), fileId);
+
+ // pathId.
+ if (ril.appType == CARD_APPTYPE_SIM || ril.appType == CARD_APPTYPE_RUIM) {
+ equal(this.readString(),
+ EF_PATH_MF_SIM + EF_PATH_DF_TELECOM);
+ } else{
+ equal(this.readString(),
+ EF_PATH_MF_SIM + EF_PATH_DF_TELECOM + EF_PATH_DF_PHONEBOOK);
+ }
+
+ // p1.
+ equal(this.readInt32(), RECORD_NUMBER);
+
+ // p2.
+ equal(this.readInt32(), READ_RECORD_ABSOLUTE_MODE);
+
+ // p3.
+ equal(this.readInt32(), RECORD_SIZE);
+
+ // data.
+ let strLen = this.readInt32();
+ // Extension record
+ for (let i = 0; i < RECORD_SIZE; i++) {
+ equal(pduHelper.readHexOctet(), 0xff);
+ }
+
+ this.readStringDelimiter(strLen);
+
+ // pin2.
+ equal(this.readString(), null);
+
+ // AID. Ignore because it's from modem.
+ this.readInt32();
+ };
+
+ recordHelper.cleanEFRecord(fileId, RECORD_NUMBER);
+ }
+
+ ril.appType = CARD_APPTYPE_SIM;
+ do_test(ICC_EF_EXT1);
+
+ run_next_test();
+});
+
+/**
+ * Verify ICCRecordHelper.getADNLikeExtensionRecordNumber
+ */
+add_test(function test_get_adn_like_extension_record_number() {
+ const RECORD_SIZE = 0x20;
+
+ let worker = newUint8Worker();
+ let context = worker.ContextPool._contexts[0];
+ let helper = context.GsmPDUHelper;
+ let record = context.ICCRecordHelper;
+ let buf = context.Buf;
+ let io = context.ICCIOHelper;
+
+ function do_test(rawEF, expectedRecordNumber) {
+ io.loadLinearFixedEF = function fakeLoadLinearFixedEF(options) {
+ // Write data size
+ buf.writeInt32(rawEF.length * 2);
+
+ // Write ext
+ for (let i = 0; i < rawEF.length; i += 2) {
+ helper.writeHexOctet(parseInt(rawEF.substr(i, 2), 16));
+ }
+
+ // Write string delimiter
+ buf.writeStringDelimiter(rawEF.length);
+ options.recordSize = RECORD_SIZE;
+ if (options.callback) {
+ options.callback(options);
+ }
+ };
+
+ let isSuccess = false;
+ let successCb = function successCb(number) {
+ equal(number, expectedRecordNumber);
+ isSuccess = true;
+ };
+
+ let errorCb = function errorCb(errorMsg) {
+ do_print("Reading ADNLike failed, msg = " + errorMsg);
+ ok(false);
+ };
+
+ record.getADNLikeExtensionRecordNumber(ICC_EF_ADN, 1, successCb, errorCb);
+ ok(isSuccess);
+ }
+
+ // Valid Extension, Alpha Id(Encoded with GSM 8 bit): "Contact001",
+ // Dialling Number: 99887766554433221100, Ext1: 0x01
+ do_test("436f6e74616374303031ffffffffffffffff0b8199887766554433221100ff01", 0x01);
+ // Empty Extension, Alpha Id(Encoded with GSM 8 bit): "Contact001", Ext1: 0xff
+ do_test("436f6e74616374303031ffffffffffffffffffffffffffffffffffffffffffff", 0xff);
+
+ run_next_test();
+});