OLD | NEW |
(Empty) | |
| 1 <!doctype html> |
| 2 <html> |
| 3 <head> |
| 4 <meta charset="utf-8"> |
| 5 <title>Request Keepalive Quota Tests</title> |
| 6 <meta name="help" href="https://fetch.spec.whatwg.org/#request"> |
| 7 <meta name="help" href="https://fetch.spec.whatwg.org/#body-mixin"> |
| 8 <meta name="author" title="Microsoft Edge" href="https://www.microsoft.c
om"> |
| 9 <meta name="timeout" content="long"> |
| 10 <script src="/resources/testharness.js"></script> |
| 11 <script src="/resources/testharnessreport.js"></script> |
| 12 </head> |
| 13 <body> |
| 14 <script> |
| 15 "use strict"; |
| 16 |
| 17 // We want to ensure that our keepalive requests hang slightly befor
e completing so we can validate |
| 18 // the effects of a rolling quota. To do this we will utilize trickl
e.py with a 1s delay. This should |
| 19 // prevent any of the Fetch's from finishing in this window. |
| 20 var trickleURL = "../resources/trickle.py?count=1&ms="; |
| 21 var standardDelay = 1000; |
| 22 |
| 23 // We should expect 64KiB of rolling quota for any type of keep-aliv
e request sent. |
| 24 var expectedQuota = 65536; |
| 25 |
| 26 function CreateKeepAliveRequest(delay, bodySize) { |
| 27 // Create a body of the specified size that's filled with *'s |
| 28 var requestBody = "*".repeat(bodySize); |
| 29 return new Request(trickleURL+delay, {keepalive: true, body: req
uestBody, method: "POST"}); |
| 30 } |
| 31 |
| 32 // Test 1 Byte |
| 33 promise_test(function(test) { |
| 34 return fetch(CreateKeepAliveRequest(0 /* delay */, 1 /* bodySize
*/)); |
| 35 }, "A Keep-Alive fetch() with a small body should succeed."); |
| 36 |
| 37 // Test Quota full limit |
| 38 promise_test(function(test) { |
| 39 return fetch(CreateKeepAliveRequest(0 /* delay */, expectedQuota
)); |
| 40 }, "A Keep-Alive fetch() with a body at the Quota Limit should succe
ed."); |
| 41 |
| 42 // Test Quota + 1 Byte |
| 43 promise_test(function(test) { |
| 44 return promise_rejects(test, new TypeError(), fetch(CreateKeepAl
iveRequest(0 /* delay */, expectedQuota + 1))); |
| 45 }, "A Keep-Alive fetch() with a body over the Quota Limit should rej
ect."); |
| 46 |
| 47 // Test the Quota becomes available upon promise completion. |
| 48 promise_test(function (test) { |
| 49 // Fill our Quota then try to send a second fetch. |
| 50 var firstFetch = fetch(CreateKeepAliveRequest(standardDelay, exp
ectedQuota)).then(function(response) { |
| 51 // Now validate that we can send another Keep-Alive fetch fo
r the full size of the quota. |
| 52 return fetch(CreateKeepAliveRequest(0 /* delay */, expectedQ
uota)); |
| 53 }); |
| 54 |
| 55 return firstFetch; |
| 56 }, "A Keep-Alive fetch() should return it's allocated Quota upon pro
mise resolution."); |
| 57 |
| 58 // Ensure only the correct amount of Quota becomes available when a
fetch completes. |
| 59 promise_test(function(test) { |
| 60 var lastFetchSucceeded = false; |
| 61 // Create a fetch that uses all but 1 Byte of the Quota and runs
for 2x as long as the other requests. |
| 62 var firstFetch = fetch(CreateKeepAliveRequest(standardDelay * 2,
expectedQuota - 1)).then(function(response) { |
| 63 // This should be our last completing fetch(). We need to va
lidate that the last fetch we sent out actually |
| 64 // completed. |
| 65 assert_true(lastFetchSucceeded, "Out last fetch after gainin
g Quota back should have succeeded."); |
| 66 }); |
| 67 |
| 68 // Now create a single Byte request that will complete quicker. |
| 69 fetch(CreateKeepAliveRequest(standardDelay, 1 /* bodySize */)).t
hen(function(response) { |
| 70 // We shouldn't be able to create a 2 Byte request right now
as only 1 Byte should have freed up. |
| 71 assert_throws(new TypeError(), fetch(CreateKeepAliveRequest(
0 /* delay */, 2 /* bodySize */)), "Only 1 Byte of Quota should be available rig
ht now."); |
| 72 |
| 73 // Now validate that we can send another Keep-Alive fetch fo
r just 1 Byte. |
| 74 fetch(CreateKeepAliveRequest(0 /* delay */, 1 /* bodySize */
)).then(function(response) { |
| 75 // Flag we got a response from this request. |
| 76 lastFetchSucceeded = true; |
| 77 }); |
| 78 }); |
| 79 |
| 80 return firstFetch; |
| 81 }, "A Keep-Alive fetch() should return only it's allocated Quota upo
n promise resolution."); |
| 82 |
| 83 // Test rejecting a fetch() after the quota is used up. |
| 84 promise_test(function (test) { |
| 85 // Fill our Quota then try to send a second fetch. |
| 86 fetch(CreateKeepAliveRequest(standardDelay, expectedQuota)); |
| 87 |
| 88 return promise_rejects(test, new TypeError(), fetch(CreateKeepAl
iveRequest(0 /* delay */, 1 /* bodySize */))); |
| 89 }, "A Keep-Alive fetch() should not be allowed if the Quota is used
up."); |
| 90 |
| 91 </script> |
| 92 </body> |
| 93 </html> |
OLD | NEW |