| if (this.importScripts) { |
| importScripts('fs-worker-common.js'); |
| importScripts('../../../resources/js-test.js'); |
| importScripts('file-writer-utils.js'); |
| } |
| |
| description("Test that FileWriter can continue immediately after an abort."); |
| |
| var sawWriteStart; |
| var sawAbort; |
| var sawWriteEnd; |
| var writer; |
| var expectedLength; |
| var truncateLength; |
| var blobSize = 1100000; |
| var currentTest = 0; |
| var blob = getBlob(); |
| |
| // fileSystemOverhead is an estimate of extra size needed to save a full file |
| // system, it need to be large enough to avoid test failure due to file system |
| // quota limit. |
| var fileSystemOverhead = blobSize * 5 / 1000 + 1024; |
| var fileSystemSize = blobSize * 2 + fileSystemOverhead; |
| |
| var methodSet = [ |
| { // Setup method set that writes, then aborts that write before completion. |
| action : startWrite, |
| verifyLength : 0, |
| onwritestart : abortWrite, |
| onprogress : nop, |
| onwrite : onError, |
| onabort : logAbort, |
| onwriteend : checkLengthAndStartNextTest |
| }, |
| { // Method set that does a complete write. |
| action : startWrite, |
| verifyLength : blobSize, |
| onwritestart : nop, |
| onprogress : nop, |
| onwrite : nop, |
| onabort : onError, |
| onwriteend : checkLengthAndStartNextTest |
| }, |
| { // Method set that does a complete truncate, just to clean up. |
| action : startTruncate, |
| truncateLength : 0, |
| verifyLength : 0, |
| onwritestart : nop, |
| onprogress : nop, |
| onwrite : nop, |
| onabort : onError, |
| onwriteend : checkLengthAndStartNextTest |
| }, |
| { // Setup method set that writes, then aborts that write just at completion. |
| action : startWrite, |
| verifyLength : blobSize, |
| onwritestart : nop, |
| onprogress : abortOnComplete, |
| onwrite : nop, |
| onabort : logAbort, |
| onwriteend : checkLengthAndStartNextTest |
| }, |
| { // Method set that does a complete write. |
| action : startWrite, |
| verifyLength : blobSize * 2, // Add in leftovers from previous method. |
| onwritestart : nop, |
| onprogress : nop, |
| onwrite : nop, |
| onabort : onError, |
| onwriteend : checkLengthAndStartNextTest |
| }, |
| { // Method set that does a complete truncate, just to clean up. |
| action : startTruncate, |
| truncateLength : 0, |
| verifyLength : 0, |
| onwritestart : nop, |
| onprogress : nop, |
| onwrite : nop, |
| onabort : onError, |
| onwriteend : checkLengthAndStartNextTest |
| }, |
| { // Setup method set that writes, then aborts that write as it starts. |
| action : startWrite, |
| verifyLength : 0, |
| onwritestart : abortWrite, |
| onprogress : nop, |
| onwrite : onError, |
| onabort : logAbort, |
| onwriteend : checkLengthAndStartNextTest |
| }, |
| { // Method set that does a complete truncate. |
| action : startTruncate, |
| truncateLength : 7, |
| verifyLength : 7, |
| onwritestart : nop, |
| onprogress : nop, |
| onwrite : nop, |
| onabort : onError, |
| onwriteend : checkLengthAndStartNextTest |
| } |
| ]; |
| |
| function nop() { |
| } |
| |
| function tenXBlob(blob) { |
| var bb = []; |
| for (var i = 0; i < 10; ++i) { |
| bb.push(blob); |
| } |
| return new Blob(bb); |
| } |
| |
| function getBlob() { |
| // Let's make it about a megabyte. |
| var blob = tenXBlob(new Blob(["lorem ipsum"])); |
| blob = tenXBlob(blob); |
| blob = tenXBlob(blob); |
| blob = tenXBlob(blob); |
| blob = tenXBlob(blob); |
| var size = blob.size; |
| shouldBe("" + size, "blobSize"); |
| return blob; |
| } |
| |
| function abortWrite(e) { |
| testPassed("Calling abort"); |
| writer.abort(); |
| } |
| |
| function abortOnComplete(e) { |
| if (e.loaded == e.total) { |
| testPassed("Calling abort at the end of the write"); |
| writer.abort(); |
| } |
| } |
| |
| function logAbort(e) { |
| testPassed("Saw abort"); |
| } |
| |
| function checkLengthAndStartNextTest(e) { |
| shouldBe("writer.length", "" + expectedLength); |
| testPassed("Saw writeend " + currentTest + "."); |
| ++currentTest; |
| if (currentTest < methodSet.length) |
| runTest(); |
| else { |
| testPassed("All tests complete."); |
| cleanUp(); |
| } |
| } |
| |
| function startWrite() { |
| testPassed("Calling write."); |
| writer.write(blob); |
| } |
| |
| function startTruncate() { |
| testPassed("Calling truncate."); |
| writer.truncate(truncateLength); |
| } |
| |
| function setupWriter(methodSetIndex, writer) { |
| writer.onerror = onError; |
| |
| var methods = methodSet[methodSetIndex]; |
| writer.onabort = methods.onabort; |
| writer.onwritestart = methods.onwritestart; |
| writer.onprogress = methods.onprogress; |
| writer.onwrite = methods.onwrite; |
| writer.onwriteend = methods.onwriteend; |
| expectedLength = methods.verifyLength; |
| truncateLength = methods.truncateLength; |
| methods.action(); |
| } |
| |
| function runTest() { |
| setupWriter(currentTest, writer); |
| } |
| |
| var jsTestIsAsync = true; |
| setupAndRunTest(fileSystemSize, 'file-writer-abort', |
| function (fileEntry, fileWriter) { |
| fileEntryForCleanup = fileEntry; |
| writer = fileWriter; |
| runTest(); |
| }); |