michael@0: var _PSvc; michael@0: function get_pref_service() { michael@0: if (_PSvc) michael@0: return _PSvc; michael@0: michael@0: return _PSvc = Cc["@mozilla.org/preferences-service;1"]. michael@0: getService(Ci.nsIPrefBranch); michael@0: } michael@0: michael@0: function gen_1MiB() michael@0: { michael@0: var i; michael@0: var data="x"; michael@0: for (i=0 ; i < 20 ; i++) michael@0: data+=data; michael@0: return data; michael@0: } michael@0: michael@0: function write_and_check(str, data, len) michael@0: { michael@0: var written = str.write(data, len); michael@0: if (written != len) { michael@0: do_throw("str.write has not written all data!\n" + michael@0: " Expected: " + len + "\n" + michael@0: " Actual: " + written + "\n"); michael@0: } michael@0: } michael@0: michael@0: function write_datafile(status, entry) michael@0: { michael@0: do_check_eq(status, Cr.NS_OK); michael@0: var os = entry.openOutputStream(0); michael@0: var data = gen_1MiB(); michael@0: michael@0: // write 2MiB michael@0: var i; michael@0: for (i=0 ; i<2 ; i++) michael@0: write_and_check(os, data, data.length); michael@0: michael@0: os.close(); michael@0: entry.close(); michael@0: michael@0: // now change max_entry_size so that the existing entry is too big michael@0: get_pref_service().setIntPref("browser.cache.disk.max_entry_size", 1024); michael@0: michael@0: // append to entry michael@0: asyncOpenCacheEntry("http://data/", michael@0: "disk", Ci.nsICacheStorage.OPEN_NORMALLY, null, michael@0: append_datafile); michael@0: } michael@0: michael@0: function append_datafile(status, entry) michael@0: { michael@0: do_check_eq(status, Cr.NS_OK); michael@0: var os = entry.openOutputStream(entry.dataSize); michael@0: var data = gen_1MiB(); michael@0: michael@0: // append 1MiB michael@0: try { michael@0: write_and_check(os, data, data.length); michael@0: do_throw(); michael@0: } michael@0: catch (ex) { } michael@0: michael@0: // closing the ostream should fail in this case michael@0: try { michael@0: os.close(); michael@0: do_throw(); michael@0: } michael@0: catch (ex) { } michael@0: michael@0: entry.close(); michael@0: michael@0: do_test_finished(); michael@0: } michael@0: michael@0: function run_test() { michael@0: if (newCacheBackEndUsed()) { michael@0: // Needs limit preferences michael@0: do_check_true(true, "This test doesn't run with the new cache backend, the test or the cache needs to be fixed"); michael@0: return; michael@0: } michael@0: michael@0: do_get_profile(); michael@0: michael@0: // clear the cache michael@0: evict_cache_entries(); michael@0: michael@0: asyncOpenCacheEntry("http://data/", michael@0: "disk", Ci.nsICacheStorage.OPEN_NORMALLY, null, michael@0: write_datafile); michael@0: michael@0: do_test_pending(); michael@0: }