summaryrefslogtreecommitdiffstats
path: root/dom/cache/test/mochitest/test_cache_tons_of_fd.html
blob: c370201e507a710b3ec7c0ec509e00b203f62460 (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
<!-- Any copyright is dedicated to the Public Domain.
   - http://creativecommons.org/publicdomain/zero/1.0/ -->
<!DOCTYPE HTML>
<html>
<head>
  <title>Test cache to create tons of fds</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
  <script type="text/javascript" src="driver.js"></script>
</head>
<body>
<script class="testbody" type="text/javascript">
  function setupTestIframe() {
  return new Promise(function(resolve) {
    var iframe = document.createElement("iframe");
    iframe.src = "empty.html";
    iframe.onload = function() {
      window.caches = iframe.contentWindow.caches;
      resolve();
    };
    document.body.appendChild(iframe);
  });
}

function clearStorage() {
  return new Promise(function(resolve, reject) {
    var qms = SpecialPowers.Services.qms;
    var principal = SpecialPowers.wrap(document).nodePrincipal;
    var request = qms.clearStoragesForPrincipal(principal);
    var cb = SpecialPowers.wrapCallback(resolve);
    request.callback = cb;
  });
}

async function testCreateTonsOfFD() {
  const number_of_fd = 5120;
  const name = "cacheTonsOfFD";
  const url = "foo.com";
  const body = "This is a body";

  info("Stage A: Cached a Request/Response pairs");
  let cache = await caches.open(name);
  let request = new Request(url);
  let response = new Response(body);
  await cache.put(request, response);

  info("Stage B: Read the cached response mutliple times");
  let promise_array = [];
  for (let i = 0; i < number_of_fd; ++i) {
    let promise = cache.match(request);
    promise_array.push(promise);
  }
  let cached_response_array = [];
  try {
    cached_response_array = await Promise.all(promise_array);
  } catch (e) {
    throw new Error("Fail to open tons of files with error: " + e);
  }

  if (cached_response_array.length != number_of_fd) {
    throw new Error("Fail to cache.match the cached responses");
  }

  info("Stage C: Consume the cached body");
  for (let i = 0; i < number_of_fd; ++i) {
    if (!cached_response_array[i]) {
      // Reduce the checking message.
      throw new Error("The cached response doesn't exist");
    }

    let bodyText = "";
    try {
      bodyText = await cached_response_array[i].text();
    } catch (e) {
      throw new Error("Fail to consume the cached response's body with error: " + e);
    }

    if (bodyText != body) {
      // Reduce the checking message.
      throw new Error("The cached body doeen't be the same as original one");
    }
  }

  ok(true, "Doesn't crash or timeout");
  return Promise.resolve();
}

SimpleTest.waitForExplicitFinish();
SpecialPowers.pushPrefEnv({
  "set": [["dom.caches.enabled", true],
          ["dom.caches.testing.enabled", true],
          ["dom.quotaManager.testing", true]],
}, async function() {
  await setupTestIframe();

  info("Stage 1: Clean storage.");
  await clearStorage();

  info("Stage 2: Verify open lots of files at the same time doesn't crash " +
       "the browser");
  try {
    await testCreateTonsOfFD();
  } catch (e) {
    ok(false, e);
  }

  await SimpleTest.finish();
});
</script>
</body>
</html>