diff options
Diffstat (limited to 'netwerk/test/unit/test_bug248970_cache.js')
-rw-r--r-- | netwerk/test/unit/test_bug248970_cache.js | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_bug248970_cache.js b/netwerk/test/unit/test_bug248970_cache.js new file mode 100644 index 000000000..ee6930c60 --- /dev/null +++ b/netwerk/test/unit/test_bug248970_cache.js @@ -0,0 +1,151 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// names for cache devices +const kDiskDevice = "disk"; +const kMemoryDevice = "memory"; +const kOfflineDevice = "appcache"; + +const kCacheA = "http://cache/A"; +const kCacheA2 = "http://cache/A2"; +const kCacheB = "http://cache/B"; +const kCacheC = "http://cache/C"; +const kTestContent = "test content"; + +function make_input_stream_scriptable(input) { + var wrapper = Cc["@mozilla.org/scriptableinputstream;1"]. + createInstance(Ci.nsIScriptableInputStream); + wrapper.init(input); + return wrapper; +} + +const entries = [ +// key content device should exist after leaving PB + [kCacheA, kTestContent, kMemoryDevice, true], + [kCacheA2, kTestContent, kDiskDevice, false], + [kCacheB, kTestContent, kDiskDevice, true], + [kCacheC, kTestContent, kOfflineDevice, true] +] + +var store_idx; +var store_cb = null; +var appCache = null; + +function store_entries(cb) +{ + if (cb) { + store_cb = cb; + store_idx = 0; + } + + if (store_idx == entries.length) { + do_execute_soon(store_cb); + return; + } + + asyncOpenCacheEntry(entries[store_idx][0], + entries[store_idx][2], + Ci.nsICacheStorage.OPEN_TRUNCATE, + LoadContextInfo.custom(false, + {privateBrowsingId : entries[store_idx][3] ? 0 : 1}), + store_data, + appCache); +} + +var store_data = function(status, entry) { + do_check_eq(status, Cr.NS_OK); + var os = entry.openOutputStream(0); + + var written = os.write(entries[store_idx][1], entries[store_idx][1].length); + if (written != entries[store_idx][1].length) { + do_throw("os.write has not written all data!\n" + + " Expected: " + entries[store_idx][1].length + "\n" + + " Actual: " + written + "\n"); + } + os.close(); + entry.close(); + store_idx++; + do_execute_soon(store_entries); +}; + +var check_idx; +var check_cb = null; +var check_pb_exited; +function check_entries(cb, pbExited) +{ + if (cb) { + check_cb = cb; + check_idx = 0; + check_pb_exited = pbExited; + } + + if (check_idx == entries.length) { + do_execute_soon(check_cb); + return; + } + + asyncOpenCacheEntry(entries[check_idx][0], + entries[check_idx][2], + Ci.nsICacheStorage.OPEN_READONLY, + LoadContextInfo.custom(false, + {privateBrowsingId : entries[check_idx][3] ? 0 : 1}), + check_data, + appCache); +} + +var check_data = function (status, entry) { + var cont = function() { + check_idx++; + do_execute_soon(check_entries); + } + + if (!check_pb_exited || entries[check_idx][3]) { + do_check_eq(status, Cr.NS_OK); + var is = entry.openInputStream(0); + pumpReadStream(is, function(read) { + entry.close(); + do_check_eq(read, entries[check_idx][1]); + cont(); + }); + } else { + do_check_eq(status, Cr.NS_ERROR_CACHE_KEY_NOT_FOUND); + cont(); + } +}; + +function run_test() { + // Simulate a profile dir for xpcshell + do_get_profile(); + + appCache = Cc["@mozilla.org/network/application-cache-service;1"]. + getService(Ci.nsIApplicationCacheService). + getApplicationCache("fake-client-id|fake-group-id"); + + // Start off with an empty cache + evict_cache_entries(); + + // Store cache-A, cache-A2, cache-B and cache-C + store_entries(run_test2); + + do_test_pending(); +} + +function run_test2() { + // Check if cache-A, cache-A2, cache-B and cache-C are available + check_entries(run_test3, false); +} + +function run_test3() { + // Simulate all private browsing instances being closed + var obsvc = Cc["@mozilla.org/observer-service;1"]. + getService(Ci.nsIObserverService); + obsvc.notifyObservers(null, "last-pb-context-exited", null); + + // Make sure the memory device is not empty + get_device_entry_count(kMemoryDevice, null, function(count) { + do_check_eq(count, 1); + // Check if cache-A is gone, and cache-B and cache-C are still available + check_entries(do_test_finished, true); + }); +} |