"use strict";

function run_test() {
  do_get_profile();

  asyncOpenCacheEntry(
    "http://x/",
    "disk",
    Ci.nsICacheStorage.OPEN_NORMALLY,
    null,
    new OpenCallback(NEW, "x1m", "x1d", function (entry) {
      // nothing to do here, we expect concurent callbacks to get
      // all notified, then the test finishes
    })
  );

  var mc = new MultipleCallbacks(3, finish_cache2_test);

  var order = 0;

  asyncOpenCacheEntry(
    "http://x/",
    "disk",
    Ci.nsICacheStorage.OPEN_NORMALLY,
    null,
    new OpenCallback(
      NORMAL | COMPLETE | NOTIFYBEFOREREAD,
      "x1m",
      "x1d",
      function (entry, beforeReading) {
        if (beforeReading) {
          ++order;
          Assert.equal(order, 3);
        } else {
          mc.fired();
        }
      }
    )
  );
  asyncOpenCacheEntry(
    "http://x/",
    "disk",
    Ci.nsICacheStorage.OPEN_NORMALLY,
    null,
    new OpenCallback(NORMAL | NOTIFYBEFOREREAD, "x1m", "x1d", function (
      entry,
      beforeReading
    ) {
      if (beforeReading) {
        ++order;
        Assert.equal(order, 1);
      } else {
        mc.fired();
      }
    })
  );
  asyncOpenCacheEntry(
    "http://x/",
    "disk",
    Ci.nsICacheStorage.OPEN_NORMALLY,
    null,
    new OpenCallback(NORMAL | NOTIFYBEFOREREAD, "x1m", "x1d", function (
      entry,
      beforeReading
    ) {
      if (beforeReading) {
        ++order;
        Assert.equal(order, 2);
      } else {
        mc.fired();
      }
    })
  );

  do_test_pending();
}
