Backed out changeset b71c8c052463 (bug 1943846) for causing mass failures. CLOSED...
[gecko.git] / netwerk / test / unit / test_stale-while-revalidate_negative.js
blob1715cdbc1a26761eb214deb64f01c6272741cb81
1 /*
3 Tests the Cache-control: stale-while-revalidate response directive.
5 Purpose is to check we DON'T perform the background revalidation when we make the
6 request past the reval window.
8 * Make request #1.
9 - response is from the server and version=1
10 - max-age=1, stale-while-revalidate=1
11 * Switch version of the data on the server.
12 * Make request #2 in 3 seconds (entry should be expired by that time and no longer
13 fall into the reval window.)
14 - response is from the server, version=2
15 * Done.
19 "use strict";
21 const { HttpServer } = ChromeUtils.importESModule(
22 "resource://testing-common/httpd.sys.mjs"
25 let max_age;
26 let version;
27 let generate_response = ver => `response version=${ver}`;
29 function test_handler(metadata, response) {
30 const originalBody = generate_response(version);
31 response.setHeader("Content-Type", "text/html", false);
32 response.setHeader(
33 "Cache-control",
34 `max-age=${max_age}, stale-while-revalidate=1`,
35 false
37 response.setStatusLine(metadata.httpVersion, 200, "OK");
38 response.bodyOutputStream.write(originalBody, originalBody.length);
41 function make_channel(url) {
42 return NetUtil.newChannel({
43 uri: url,
44 loadUsingSystemPrincipal: true,
45 }).QueryInterface(Ci.nsIHttpChannel);
48 async function get_response(channel, fromCache) {
49 return new Promise(resolve => {
50 channel.asyncOpen(
51 new ChannelListener((request, buffer, ctx, isFromCache) => {
52 Assert.equal(
53 fromCache,
54 isFromCache,
55 `got response from cache = ${fromCache}`
57 resolve(buffer);
60 });
63 async function sleep(time) {
64 return new Promise(resolve => {
65 do_timeout(time * 1000, resolve);
66 });
69 async function stop_server(httpserver) {
70 return new Promise(resolve => {
71 httpserver.stop(resolve);
72 });
75 add_task(async function () {
76 let httpserver = new HttpServer();
77 httpserver.registerPathHandler("/testdir", test_handler);
78 httpserver.start(-1);
79 const PORT = httpserver.identity.primaryPort;
80 const URI = `http://localhost:${PORT}/testdir`;
82 let response;
84 version = 1;
85 max_age = 1;
86 response = await get_response(make_channel(URI), false);
87 Assert.equal(response, generate_response(1), "got response ver 1");
89 await sleep(max_age + 1 /* stale window */ + 1 /* to expire the window */);
91 version = 2;
92 response = await get_response(make_channel(URI), false);
93 Assert.equal(response, generate_response(2), "got response ver 2");
95 await stop_server(httpserver);
96 });