michael@0: // michael@0: // Test that data can be appended to a cache entry even when the data is michael@0: // compressed by the cache compression feature - bug 648429. 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 TestAppend(compress, callback) michael@0: { michael@0: this._compress = compress; michael@0: this._callback = callback; michael@0: this.run(); michael@0: } michael@0: michael@0: TestAppend.prototype = { michael@0: _compress: false, michael@0: _callback: null, michael@0: michael@0: run: function() { michael@0: evict_cache_entries(); michael@0: asyncOpenCacheEntry("http://data/", michael@0: "disk", Ci.nsICacheStorage.OPEN_NORMALLY, null, michael@0: this.writeData.bind(this)); michael@0: }, michael@0: michael@0: writeData: function(status, entry) { michael@0: do_check_eq(status, Cr.NS_OK); michael@0: if (this._compress) michael@0: entry.setMetaDataElement("uncompressed-len", "0"); michael@0: var os = entry.openOutputStream(0); michael@0: write_and_check(os, "12345", 5); michael@0: os.close(); michael@0: entry.close(); michael@0: asyncOpenCacheEntry("http://data/", michael@0: "disk", Ci.nsICacheStorage.OPEN_NORMALLY, null, michael@0: this.appendData.bind(this)); michael@0: }, michael@0: michael@0: appendData: function(status, entry) { michael@0: do_check_eq(status, Cr.NS_OK); michael@0: var os = entry.openOutputStream(entry.storageDataSize); michael@0: write_and_check(os, "abcde", 5); michael@0: os.close(); michael@0: entry.close(); michael@0: michael@0: asyncOpenCacheEntry("http://data/", michael@0: "disk", Ci.nsICacheStorage.OPEN_READONLY, null, michael@0: this.checkData.bind(this)); michael@0: }, michael@0: michael@0: checkData: function(status, entry) { michael@0: do_check_eq(status, Cr.NS_OK); michael@0: var self = this; michael@0: pumpReadStream(entry.openInputStream(0), function(str) { michael@0: do_check_eq(str.length, 10); michael@0: do_check_eq(str, "12345abcde"); michael@0: entry.close(); michael@0: michael@0: do_execute_soon(self._callback); michael@0: }); michael@0: } michael@0: }; michael@0: michael@0: function run_test() { michael@0: do_get_profile(); michael@0: new TestAppend(false, run_test2); michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function run_test2() { michael@0: new TestAppend(true, do_test_finished); michael@0: }