/* 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(); });