dom/mobilemessage/tests/marionette/test_message_classes.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/mobilemessage/tests/marionette/test_message_classes.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,260 @@
     1.4 +/* Any copyright is dedicated to the Public Domain.
     1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */
     1.6 +
     1.7 +MARIONETTE_TIMEOUT = 60000;
     1.8 +
     1.9 +const PDU_SMSC = "00"; // No SMSC Address
    1.10 +const PDU_FIRST_OCTET = "00"; // RP:no, UDHI:no, SRI:no, MMS:no, MTI:SMS-DELIVER
    1.11 +const PDU_SENDER = "0191F1"; // +1
    1.12 +const PDU_PID_NORMAL = "00";
    1.13 +const PDU_PID_ANSI_136_R_DATA = "7C";
    1.14 +const PDU_PID_USIM_DATA_DOWNLOAD = "7F";
    1.15 +const PDU_TIMESTAMP = "00101000000000"; // 2000/01/01
    1.16 +const PDU_UDL = "01";
    1.17 +const PDU_UD = "41";
    1.18 +
    1.19 +const SENT_TIMESTAMP = Date.UTC(2000, 0, 1); // Must be equal to PDU_TIMESTAMP.
    1.20 +
    1.21 +SpecialPowers.addPermission("sms", true, document);
    1.22 +
    1.23 +let manager = window.navigator.mozMobileMessage;
    1.24 +ok(manager instanceof MozMobileMessageManager,
    1.25 +   "manager is instance of " + manager.constructor);
    1.26 +
    1.27 +let pendingEmulatorCmdCount = 0;
    1.28 +function sendSmsPduToEmulator(pdu) {
    1.29 +  ++pendingEmulatorCmdCount;
    1.30 +
    1.31 +  let cmd = "sms pdu " + pdu;
    1.32 +  runEmulatorCmd(cmd, function(result) {
    1.33 +    --pendingEmulatorCmdCount;
    1.34 +
    1.35 +    is(result[0], "OK", "Emulator response");
    1.36 +  });
    1.37 +}
    1.38 +
    1.39 +function checkMessage(message, id, threadId, messageClass) {
    1.40 +  ok(message instanceof MozSmsMessage,
    1.41 +     "message is instanceof " + message.constructor);
    1.42 +  if (id == null) {
    1.43 +    ok(message.id > 0, "message.id");
    1.44 +  } else {
    1.45 +    is(message.id, id, "message.id");
    1.46 +  }
    1.47 +  if (threadId == null) {
    1.48 +    ok(message.threadId > 0, "message.threadId");
    1.49 +  } else {
    1.50 +    is(message.threadId, threadId, "message.threadId");
    1.51 +  }
    1.52 +  is(message.delivery, "received", "message.delivery");
    1.53 +  is(message.deliveryStatus, "success", "message.deliveryStatus");
    1.54 +  is(message.sender, "+1", "message.sender");
    1.55 +  is(message.body, "A", "message.body");
    1.56 +  is(message.messageClass, messageClass, "message.messageClass");
    1.57 +  is(message.deliveryTimestamp, 0, "deliveryTimestamp is 0");
    1.58 +  is(message.read, false, "message.read");
    1.59 +}
    1.60 +
    1.61 +function test_message_class_0() {
    1.62 +  let allDCSs = [
    1.63 +    "10", // General Group: 00xx
    1.64 +    "50", // Automatica Deletion Group: 01xx
    1.65 +    "F0"  // (no name) Group: 1111
    1.66 +  ];
    1.67 +
    1.68 +  function do_test(dcsIndex) {
    1.69 +    manager.addEventListener("received", function onReceived(event) {
    1.70 +      manager.removeEventListener("received", onReceived);
    1.71 +
    1.72 +      let message = event.message;
    1.73 +      checkMessage(message, -1, 0, "class-0");
    1.74 +      ok(event.message.timestamp >= timeBeforeSend,
    1.75 +         "Message's timestamp should be greater then the timetamp of sending");
    1.76 +      ok(event.message.timestamp <= Date.now(),
    1.77 +         "Message's timestamp should be lesser than the timestamp of now");
    1.78 +      is(event.message.sentTimestamp, SENT_TIMESTAMP,
    1.79 +         "Message's sentTimestamp should be equal to SENT_TIMESTAMP");
    1.80 +
    1.81 +      // Make sure the message is not stored.
    1.82 +      let cursor = manager.getMessages(null, false);
    1.83 +      cursor.onsuccess = function onsuccess() {
    1.84 +        if (cursor.result) {
    1.85 +          // Here we check whether there is any message of the same sender.
    1.86 +          isnot(cursor.result.sender, message.sender, "cursor.result.sender");
    1.87 +
    1.88 +          cursor.continue();
    1.89 +          return;
    1.90 +        }
    1.91 +
    1.92 +        // All messages checked. Done.
    1.93 +        ++dcsIndex;
    1.94 +        if (dcsIndex >= allDCSs.length) {
    1.95 +          window.setTimeout(test_message_class_1, 0);
    1.96 +        } else {
    1.97 +          window.setTimeout(do_test.bind(null, dcsIndex), 0);
    1.98 +        }
    1.99 +      };
   1.100 +      cursor.onerror = function onerror() {
   1.101 +        ok(false, "Can't fetch messages from SMS database");
   1.102 +      };
   1.103 +    });
   1.104 +
   1.105 +    let dcs = allDCSs[dcsIndex];
   1.106 +    log("  Testing DCS " + dcs);
   1.107 +    let pdu = PDU_SMSC + PDU_FIRST_OCTET + PDU_SENDER + PDU_PID_NORMAL +
   1.108 +              dcs + PDU_TIMESTAMP + PDU_UDL + PDU_UD;
   1.109 +    let timeBeforeSend = Date.now();
   1.110 +    sendSmsPduToEmulator(pdu);
   1.111 +  }
   1.112 +
   1.113 +  log("Checking Message Class 0");
   1.114 +  do_test(0);
   1.115 +}
   1.116 +
   1.117 +function doTestMessageClassGeneric(allDCSs, messageClass, next) {
   1.118 +  function do_test(dcsIndex) {
   1.119 +    manager.addEventListener("received", function onReceived(event) {
   1.120 +      manager.removeEventListener("received", onReceived);
   1.121 +
   1.122 +      // Make sure we can correctly receive the message
   1.123 +      checkMessage(event.message, null, null, messageClass);
   1.124 +      ok(event.message.timestamp >= timeBeforeSend,
   1.125 +         "Message's timestamp should be greater then the timetamp of sending");
   1.126 +      ok(event.message.timestamp <= Date.now(),
   1.127 +         "Message's timestamp should be lesser than the timestamp of now");
   1.128 +      is(event.message.sentTimestamp, SENT_TIMESTAMP,
   1.129 +         "Message's sentTimestamp should be equal to SENT_TIMESTAMP");
   1.130 +
   1.131 +      ++dcsIndex;
   1.132 +      if (dcsIndex >= allDCSs.length) {
   1.133 +        window.setTimeout(next, 0);
   1.134 +      } else {
   1.135 +        window.setTimeout(do_test.bind(null, dcsIndex), 0);
   1.136 +      }
   1.137 +    });
   1.138 +
   1.139 +    let dcs = allDCSs[dcsIndex];
   1.140 +    log("  Testing DCS " + dcs);
   1.141 +    let pdu = PDU_SMSC + PDU_FIRST_OCTET + PDU_SENDER + PDU_PID_NORMAL +
   1.142 +              dcs + PDU_TIMESTAMP + PDU_UDL + PDU_UD;
   1.143 +
   1.144 +    let timeBeforeSend = Date.now();
   1.145 +    sendSmsPduToEmulator(pdu);
   1.146 +  }
   1.147 +
   1.148 +  do_test(0);
   1.149 +}
   1.150 +
   1.151 +function test_message_class_1() {
   1.152 +  let allDCSs = [
   1.153 +    "11", // General Group: 00xx
   1.154 +    "51", // Automatica Deletion Group: 01xx
   1.155 +    "F1"  // (no name) Group: 1111
   1.156 +  ];
   1.157 +
   1.158 +  log("Checking Message Class 1");
   1.159 +  doTestMessageClassGeneric(allDCSs, "class-1", test_message_class_2);
   1.160 +}
   1.161 +
   1.162 +function test_message_class_2() {
   1.163 +  let allDCSs = [
   1.164 +    "12", // General Group: 00xx
   1.165 +    "52", // Automatica Deletion Group: 01xx
   1.166 +    "F2"  // (no name) Group: 1111
   1.167 +  ];
   1.168 +
   1.169 +  let allPIDs = [
   1.170 +    PDU_PID_NORMAL,
   1.171 +    PDU_PID_ANSI_136_R_DATA,
   1.172 +    PDU_PID_USIM_DATA_DOWNLOAD
   1.173 +  ];
   1.174 +
   1.175 +  function do_test_dcs(dcsIndex) {
   1.176 +    function do_test_pid(pidIndex) {
   1.177 +      function onReceived(event) {
   1.178 +        if (pidIndex == 0) {
   1.179 +          // Make sure we can correctly receive the message
   1.180 +          checkMessage(event.message, null, null, "class-2");
   1.181 +          ok(event.message.timestamp >= timeBeforeSend,
   1.182 +             "Message's timestamp should be greater then the timetamp of sending");
   1.183 +          ok(event.message.timestamp <= Date.now(),
   1.184 +             "Message's timestamp should be lesser than the timestamp of now");
   1.185 +          is(event.message.sentTimestamp, SENT_TIMESTAMP,
   1.186 +             "Message's sentTimestamp should be equal to SENT_TIMESTAMP");
   1.187 +
   1.188 +          next();
   1.189 +          return;
   1.190 +        }
   1.191 +
   1.192 +        // TODO: Bug 792798 - B2G SMS: develop test cases for Message Class 2
   1.193 +        // Since we have "data download via SMS Point-to-Point" service enabled
   1.194 +        // but no working implementation in emulator SIM, all class 2 messages
   1.195 +        // bug normal ones should goto `dataDownloadViaSMSPP()` and we should
   1.196 +        // not receive the message in content page.
   1.197 +        ok(false, "SMS-PP messages shouldn't be sent to content");
   1.198 +      }
   1.199 +
   1.200 +      function next() {
   1.201 +        manager.removeEventListener("received", onReceived);
   1.202 +
   1.203 +        ++pidIndex;
   1.204 +        if (pidIndex >= allPIDs.length) {
   1.205 +          ++dcsIndex;
   1.206 +          if (dcsIndex >= allDCSs.length) {
   1.207 +            window.setTimeout(test_message_class_3, 0);
   1.208 +          } else {
   1.209 +            window.setTimeout(do_test_dcs.bind(null, dcsIndex), 0);
   1.210 +          }
   1.211 +        } else {
   1.212 +          window.setTimeout(do_test_pid.bind(null, pidIndex), 0);
   1.213 +        }
   1.214 +      }
   1.215 +
   1.216 +      manager.addEventListener("received", onReceived);
   1.217 +
   1.218 +      if (pidIndex != 0) {
   1.219 +        // Wait for three seconds to ensure we don't receive the message.
   1.220 +        window.setTimeout(next, 3000);
   1.221 +      }
   1.222 +
   1.223 +      let pid = allPIDs[pidIndex];
   1.224 +      log("    Testing PID " + pid);
   1.225 +
   1.226 +      let pdu = PDU_SMSC + PDU_FIRST_OCTET + PDU_SENDER + pid + dcs +
   1.227 +                PDU_TIMESTAMP + PDU_UDL + PDU_UD;
   1.228 +      let timeBeforeSend = Date.now();
   1.229 +      sendSmsPduToEmulator(pdu);
   1.230 +    }
   1.231 +
   1.232 +    let dcs = allDCSs[dcsIndex];
   1.233 +    log("  Testing DCS " + dcs);
   1.234 +
   1.235 +    do_test_pid(0);
   1.236 +  }
   1.237 +
   1.238 +  log("Checking Message Class 2");
   1.239 +  do_test_dcs(0);
   1.240 +}
   1.241 +
   1.242 +function test_message_class_3() {
   1.243 +  let allDCSs = [
   1.244 +    "13", // General Group: 00xx
   1.245 +    "53", // Automatica Deletion Group: 01xx
   1.246 +    "F3"  // (no name) Group: 1111
   1.247 +  ];
   1.248 +
   1.249 +  log("Checking Message Class 3");
   1.250 +  doTestMessageClassGeneric(allDCSs, "class-3", cleanUp);
   1.251 +}
   1.252 +
   1.253 +function cleanUp() {
   1.254 +  if (pendingEmulatorCmdCount) {
   1.255 +    window.setTimeout(cleanUp, 100);
   1.256 +    return;
   1.257 +  }
   1.258 +
   1.259 +  SpecialPowers.removePermission("sms", document);
   1.260 +  finish();
   1.261 +}
   1.262 +
   1.263 +test_message_class_0();

mercurial