2 * Test for the "CacheEntryId" under several cases.
7 const { HttpServer
} = ChromeUtils
.importESModule(
8 "resource://testing-common/httpd.sys.mjs"
11 ChromeUtils
.defineLazyGetter(this, "URL", function () {
12 return "http://localhost:" + httpServer
.identity
.primaryPort
+ "/content";
15 var httpServer
= null;
17 const responseContent
= "response body";
18 const responseContent2
= "response body 2";
19 const altContent
= "!@#$%^&*()";
20 const altContentType
= "text/binary";
22 function isParentProcess() {
23 let appInfo
= Cc
["@mozilla.org/xre/app-info;1"];
26 Services
.appinfo
.processType
== Ci
.nsIXULRuntime
.PROCESS_TYPE_DEFAULT
32 r
.bodyOutputStream
.write(responseContent
, responseContent
.length
);
35 r
.setStatusLine(m
.httpVersion
, 304, "Not Modified");
38 r
.setStatusLine(m
.httpVersion
, 304, "Not Modified");
41 r
.setStatusLine(m
.httpVersion
, 304, "Not Modified");
44 r
.setStatusLine(m
.httpVersion
, 304, "Not Modified");
47 r
.bodyOutputStream
.write(responseContent2
, responseContent2
.length
);
50 r
.setStatusLine(m
.httpVersion
, 304, "Not Modified");
54 function contentHandler(metadata
, response
) {
55 response
.setHeader("Content-Type", "text/plain");
56 response
.setHeader("Cache-Control", "no-cache");
58 var handler
= handlers
.shift();
60 handler(metadata
, response
);
64 Assert
.ok(false, "Should not reach here.");
67 function fetch(preferredDataType
= null) {
68 return new Promise(resolve
=> {
69 var chan
= NetUtil
.newChannel({ uri
: URL
, loadUsingSystemPrincipal
: true });
71 if (preferredDataType
) {
72 var cc
= chan
.QueryInterface(Ci
.nsICacheInfoChannel
);
73 cc
.preferAlternativeDataType(
76 Ci
.nsICacheInfoChannel
.ASYNC
81 new ChannelListener((request
, buffer
, ctx
, isFromCache
, cacheEntryId
) => {
82 resolve({ request
, buffer
, isFromCache
, cacheEntryId
});
95 var cc
= response
.request
.QueryInterface(Ci
.nsICacheInfoChannel
);
97 Assert
.equal(response
.buffer
, content
);
98 Assert
.equal(cc
.alternativeDataType
, preferredDataType
);
99 Assert
.equal(response
.isFromCache
, isFromCache
);
100 Assert
.ok(!cacheEntryIdChecker
|| cacheEntryIdChecker(response
.cacheEntryId
));
105 function writeAltData(request
) {
106 var cc
= request
.QueryInterface(Ci
.nsICacheInfoChannel
);
107 var os
= cc
.openAlternativeOutputStream(altContentType
, altContent
.length
);
108 os
.write(altContent
, altContent
.length
);
110 gc(); // We need to do a GC pass to ensure the cache entry has been freed.
112 return new Promise(resolve
=> {
113 if (isParentProcess()) {
114 Services
.cache2
.QueryInterface(Ci
.nsICacheTesting
).flush(resolve
);
116 do_send_remote_message("flush");
117 do_await_remote_message("flushed").then(resolve
);
122 function run_test() {
124 httpServer
= new HttpServer();
125 httpServer
.registerPathHandler("/content", contentHandler
);
126 httpServer
.start(-1);
129 var targetCacheEntryId
= null;
133 // Setup testing environment: Placing alternative data into HTTP cache.
134 .then(_
=> fetch(altContentType
))
141 cacheEntryId
=> cacheEntryId
=== undefined
144 .then(r
=> writeAltData(r
.request
))
147 .then(_
=> fetch(altContentType
))
154 cacheEntryId
=> cacheEntryId
!== undefined
157 .then(r
=> (targetCacheEntryId
= r
.cacheEntryId
))
166 cacheEntryId
=> cacheEntryId
=== targetCacheEntryId
170 .then(_
=> fetch(altContentType
))
177 cacheEntryId
=> cacheEntryId
=== targetCacheEntryId
188 cacheEntryId
=> cacheEntryId
=== targetCacheEntryId
192 .then(_
=> fetch()) // The response is changed here.
199 cacheEntryId
=> cacheEntryId
=== undefined
211 cacheEntryId
!== undefined && cacheEntryId
!== targetCacheEntryId
216 .catch(e
=> Assert
.ok(false, "Unexpected exception: " + e
))
217 .then(_
=> Assert
.equal(handlers
.length
, 0))
218 .then(_
=> httpServer
.stop(do_test_finished
))