summaryrefslogtreecommitdiffstats
path: root/services/sync/tests/unit/test_engine_abort.js
blob: a7c62afb4a8d0f91d3520cd9034ae81390af608e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

const { WBORecord } = ChromeUtils.importESModule(
  "resource://services-sync/record.sys.mjs"
);
const { Service } = ChromeUtils.importESModule(
  "resource://services-sync/service.sys.mjs"
);
const { RotaryEngine } = ChromeUtils.importESModule(
  "resource://testing-common/services/sync/rotaryengine.sys.mjs"
);

add_task(async function test_processIncoming_abort() {
  _(
    "An abort exception, raised in applyIncoming, will abort _processIncoming."
  );
  let engine = new RotaryEngine(Service);

  let collection = new ServerCollection();
  let id = Utils.makeGUID();
  let payload = encryptPayload({ id, denomination: "Record No. " + id });
  collection.insert(id, payload);

  let server = sync_httpd_setup({
    "/1.1/foo/storage/rotary": collection.handler(),
  });

  await SyncTestingInfrastructure(server);
  await generateNewKeys(Service.collectionKeys);

  _("Create some server data.");
  let syncID = await engine.resetLocalSyncID();
  let meta_global = Service.recordManager.set(
    engine.metaURL,
    new WBORecord(engine.metaURL)
  );
  meta_global.payload.engines = { rotary: { version: engine.version, syncID } };
  _("Fake applyIncoming to abort.");
  engine._store.applyIncoming = async function () {
    let ex = {
      code: SyncEngine.prototype.eEngineAbortApplyIncoming,
      cause: "Nooo",
    };
    _("Throwing: " + JSON.stringify(ex));
    throw ex;
  };

  _("Trying _processIncoming. It will throw after aborting.");
  let err;
  try {
    await engine._syncStartup();
    await engine._processIncoming();
  } catch (ex) {
    err = ex;
  }

  Assert.equal(err, "Nooo");
  err = undefined;

  _("Trying engine.sync(). It will abort without error.");
  try {
    // This will quietly fail.
    await engine.sync();
  } catch (ex) {
    err = ex;
  }

  Assert.equal(err, undefined);

  await promiseStopServer(server);
  for (const pref of Svc.PrefBranch.getChildList("")) {
    Svc.PrefBranch.clearUserPref(pref);
  }
  Service.recordManager.clearCache();

  await engine._tracker.clearChangedIDs();
  await engine.finalize();
});