Memory cache live resources repeatedly purged during painting
[WebKit-https.git] / LayoutTests / http / tests / cache / disk-cache / resources / cache-test.js
1 window.jsTestIsAsync = true;
2
3 if (location.protocol != "http:" || location.host != "127.0.0.1:8000") {
4     testFailed("This test must be run from http://127.0.0.1:8000");
5     finishJSTest();
6 }
7
8 if (!window.internals) {
9     testFailed("This test requires window.internals");
10     finishJSTest();
11 }
12
13 function getServerDate()
14 {
15     var req = new XMLHttpRequest();
16     var t0 = new Date().getTime();
17     req.open('GET', "/cache/resources/current-time.cgi", false /* blocking */);
18     req.send();
19     var serverToClientTime = (new Date().getTime() - t0) / 2;
20     if (req.status != 200) {
21         console.log("unexpected status code " + req.status + ", expected 200.");
22         return new Date();
23     }
24     return new Date((parseInt(req.responseText) * 1000) + serverToClientTime);
25 }
26
27 var serverClientTimeDelta = getServerDate().getTime() - new Date().getTime();
28
29 var uniqueIdCounter = 0;
30 function makeHeaderValue(value)
31 {
32     if (value == 'now(0)')
33         return (new Date(new Date().getTime() + serverClientTimeDelta)).toUTCString();
34     if (value == 'now(100)')
35         return (new Date(new Date().getTime() + serverClientTimeDelta + 100 * 1000)).toUTCString();
36     if (value == 'unique()')
37         return "" + uniqueIdCounter++;
38     return value;
39 }
40
41 function generateTestURL(test, includeBody, expiresInFutureIn304)
42 {
43     includeBody = typeof includeBody !== 'undefined' ? includeBody : true;
44     expiresInFutureIn304 = typeof expiresInFutureIn304 !== 'undefined' ? expiresInFutureIn304 : false;
45     var uniqueTestId = Math.floor((Math.random() * 1000000000000));
46     var testURL = "resources/generate-response.cgi?include-body=" + (includeBody ? "1" : "0");
47     if (expiresInFutureIn304)
48         testURL += "&expires-in-future-in-304=1";
49     testURL += "&uniqueId=" + uniqueTestId++ + "&Content-type=text/plain";
50     for (var header in test.responseHeaders)
51         testURL += '&' + header + '=' + makeHeaderValue(test.responseHeaders[header]);
52     return testURL;
53 }
54
55 function loadResource(test, onload)
56 {
57     if (!test.url)
58         test.url = generateTestURL(test, test.includeBody, test.expiresInFutureIn304);
59
60     test.xhr = new XMLHttpRequest();
61     test.xhr.onload = onload;
62     test.xhr.open("get", test.url, true);
63
64     for (var header in test.requestHeaders)
65         test.xhr.setRequestHeader(header, makeHeaderValue(test.requestHeaders[header]));
66
67     test.xhr.send();
68 }
69
70 function loadResources(tests, completetion)
71 {
72     // Otherwise we just get responses from the memory cache.
73     internals.clearMemoryCache();
74     
75     var pendingCount = tests.length;
76     for (var i = 0; i < tests.length; ++i) {
77         loadResource(tests[i], function (ev) {
78             --pendingCount;
79             if (!pendingCount)
80                 completetion();
81          });
82     }
83 }
84
85 function printResults(tests)
86 {
87     for (var i = 0; i < tests.length; ++i) {
88         var test = tests[i];
89         debug("response headers: " + JSON.stringify(test.responseHeaders));
90         if (test.expiresInFutureIn304)
91             debug("response's 'Expires' header is overriden by future date in 304 response");
92         if (test.requestHeaders)
93             debug("request headers: " + JSON.stringify(test.requestHeaders));
94         responseSource = internals.xhrResponseSource(test.xhr);
95         debug("response source: " + responseSource);
96         debug("");
97     }
98 }
99
100 function runTests(tests, completionHandler)
101 {
102     loadResources(tests, function () {
103         // Wait a bit so things settle down in the disk cache.
104         setTimeout(function () {
105             loadResources(tests, function () {
106                 printResults(tests);
107                 if (completionHandler)
108                     completionHandler();
109                 else
110                     finishJSTest();
111             });
112         }, 100);
113     });
114 }
115
116 function mergeFields(field, componentField)
117 {
118     for (var name in componentField) {
119         if (field[name])
120             field[name] += ", " + componentField[name];
121         else
122             field[name] = componentField[name];
123     }
124 }
125
126 function generateTests(testMatrix, includeBody)
127 {
128     includeBody = typeof includeBody !== 'undefined' ? includeBody : true;
129     var tests = [];
130
131     var testCount = 1;
132     for (var i = 0; i < testMatrix.length; ++i)
133         testCount *= testMatrix[i].length;
134
135     for (var testNumber = 0; testNumber < testCount; ++testNumber) {
136         var test = {}
137
138         var index = testNumber;
139         for (var i = 0; i < testMatrix.length; ++i) {
140             var components = testMatrix[i];
141             var component = components[index % components.length];
142             index = Math.floor(index / components.length);
143
144             for (var field in component) {
145                 if (!test[field])
146                     test[field] = {}
147                 mergeFields(test[field], component[field]);
148             }
149         }
150         test.includeBody = includeBody;
151         tests.push(test);
152     }
153     return tests;
154 }