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_and_check(os, data, data.length); michael@0: michael@0: os.close(); michael@0: entry.close(); michael@0: michael@0: // try to open the entry for appending michael@0: asyncOpenCacheEntry("http://data/", michael@0: "disk", Ci.nsICacheStorage.OPEN_NORMALLY, null, michael@0: open_for_readwrite); michael@0: } michael@0: michael@0: function open_for_readwrite(status, entry) michael@0: { michael@0: do_check_eq(status, Cr.NS_OK); michael@0: var os = entry.openOutputStream(entry.dataSize); michael@0: michael@0: // Opening the entry for appending data calls nsDiskCacheStreamIO::Seek() michael@0: // which initializes mFD. If no data is written then mBufDirty is false and michael@0: // mFD won't be closed in nsDiskCacheStreamIO::Flush(). michael@0: michael@0: os.close(); michael@0: entry.close(); michael@0: michael@0: do_test_finished(); michael@0: } michael@0: michael@0: function run_test() { 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: }