summaryrefslogtreecommitdiffstats
path: root/dom/localstorage/test/unit/test_flushing.js
blob: b33ef7c0995b2a7c1568852f4afa0274ef24b7e1 (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
/**
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */
/* eslint-disable mozilla/no-arbitrary-setTimeout */

/**
 * This test is mainly to verify that the flush operation detaches the shadow
 * database in the event of early return due to error. See bug 1559029.
 */

add_task(async function testSteps() {
  const principal1 = getPrincipal("http://example1.com");

  const usageFile1 = getRelativeFile(
    "storage/default/http+++example1.com/ls/usage"
  );

  const principal2 = getPrincipal("http://example2.com");

  const data = {
    key: "foo",
    value: "bar",
  };

  const flushSleepTimeSec = 6;

  info("Setting prefs");

  Services.prefs.setBoolPref("dom.storage.next_gen", true);

  info("Getting storage 1");

  let storage1 = getLocalStorage(principal1);

  info("Adding item");

  storage1.setItem(data.key, data.value);

  info("Creating usage as a directory");

  // This will cause a failure during the flush for first principal.
  usageFile1.create(Ci.nsIFile.DIRECTORY_TYPE, parseInt("0755", 8));

  info("Getting storage 2");

  let storage2 = getLocalStorage(principal2);

  info("Adding item");

  storage2.setItem(data.key, data.value);

  // The flush for second principal shouldn't be affected by failed flush for
  // first principal.

  info(
    "Sleeping for " +
      flushSleepTimeSec +
      " seconds to let all flushes " +
      "finish"
  );

  await new Promise(function(resolve) {
    setTimeout(resolve, flushSleepTimeSec * 1000);
  });

  info("Resetting");

  // Wait for all database connections to close.
  let request = reset();
  await requestFinished(request);
});