summaryrefslogtreecommitdiffstats
path: root/services/sync/tests/unit/test_score_triggers.js
blob: c6afa06407d8842c3e852c30a6bee95ec970c69e (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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

const { Service } = ChromeUtils.importESModule(
  "resource://services-sync/service.sys.mjs"
);
const { Status } = ChromeUtils.importESModule(
  "resource://services-sync/status.sys.mjs"
);

// Tracking info/collections.
var collectionsHelper = track_collections_helper();
var upd = collectionsHelper.with_updated_collection;

function sync_httpd_setup() {
  let handlers = {};

  handlers["/1.1/johndoe/storage/meta/global"] = new ServerWBO(
    "global",
    {}
  ).handler();
  handlers["/1.1/johndoe/storage/steam"] = new ServerWBO("steam", {}).handler();

  handlers["/1.1/johndoe/info/collections"] = collectionsHelper.handler;
  delete collectionsHelper.collections.crypto;
  delete collectionsHelper.collections.meta;

  let cr = new ServerWBO("keys");
  handlers["/1.1/johndoe/storage/crypto/keys"] = upd("crypto", cr.handler());

  let cl = new ServerCollection();
  handlers["/1.1/johndoe/storage/clients"] = upd("clients", cl.handler());

  return httpd_setup(handlers);
}

async function setUp(server) {
  let engineInfo = await registerRotaryEngine();
  await SyncTestingInfrastructure(server, "johndoe", "ilovejane");
  return engineInfo;
}

add_task(async function test_tracker_score_updated() {
  enableValidationPrefs();
  let { engine, tracker } = await registerRotaryEngine();

  let scoreUpdated = 0;

  function onScoreUpdated() {
    scoreUpdated++;
  }

  Svc.Obs.add("weave:engine:score:updated", onScoreUpdated);

  try {
    Assert.equal(engine.score, 0);

    tracker.score += SCORE_INCREMENT_SMALL;
    Assert.equal(engine.score, SCORE_INCREMENT_SMALL);

    Assert.equal(scoreUpdated, 1);
  } finally {
    Svc.Obs.remove("weave:engine:score:updated", onScoreUpdated);
    tracker.resetScore();
    await tracker.clearChangedIDs();
    await Service.engineManager.unregister(engine);
  }
});

add_task(async function test_sync_triggered() {
  let server = sync_httpd_setup();
  let { engine, tracker } = await setUp(server);

  await Service.login();

  Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD;

  Assert.equal(Status.login, LOGIN_SUCCEEDED);
  tracker.score += SCORE_INCREMENT_XLARGE;

  await promiseOneObserver("weave:service:sync:finish");

  await Service.startOver();
  await promiseStopServer(server);

  await tracker.clearChangedIDs();
  await Service.engineManager.unregister(engine);
});

add_task(async function test_clients_engine_sync_triggered() {
  enableValidationPrefs();

  _("Ensure that client engine score changes trigger a sync.");

  // The clients engine is not registered like other engines. Therefore,
  // it needs special treatment throughout the code. Here, we verify the
  // global score tracker gives it that treatment. See bug 676042 for more.

  let server = sync_httpd_setup();
  let { engine, tracker } = await setUp(server);
  await Service.login();

  Service.scheduler.syncThreshold = MULTI_DEVICE_THRESHOLD;
  Assert.equal(Status.login, LOGIN_SUCCEEDED);
  Service.clientsEngine._tracker.score += SCORE_INCREMENT_XLARGE;

  await promiseOneObserver("weave:service:sync:finish");
  _("Sync due to clients engine change completed.");

  await Service.startOver();
  await promiseStopServer(server);

  await tracker.clearChangedIDs();
  await Service.engineManager.unregister(engine);
});

add_task(async function test_incorrect_credentials_sync_not_triggered() {
  enableValidationPrefs();

  _(
    "Ensure that score changes don't trigger a sync if Status.login != LOGIN_SUCCEEDED."
  );
  let server = sync_httpd_setup();
  let { engine, tracker } = await setUp(server);

  // Ensure we don't actually try to sync.
  function onSyncStart() {
    do_throw("Should not get here!");
  }
  Svc.Obs.add("weave:service:sync:start", onSyncStart);

  // Faking incorrect credentials to prevent score update.
  Status.login = LOGIN_FAILED_LOGIN_REJECTED;
  tracker.score += SCORE_INCREMENT_XLARGE;

  // First wait >100ms (nsITimers can take up to that much time to fire, so
  // we can account for the timer in delayedAutoconnect) and then one event
  // loop tick (to account for a possible call to weave:service:sync:start).
  await promiseNamedTimer(150, {}, "timer");
  await Async.promiseYield();

  Svc.Obs.remove("weave:service:sync:start", onSyncStart);

  Assert.equal(Status.login, LOGIN_FAILED_LOGIN_REJECTED);

  await Service.startOver();
  await promiseStopServer(server);

  await tracker.clearChangedIDs();
  await Service.engineManager.unregister(engine);
});