/*
 * Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 * for details. All rights reserved. Use of this source code is governed by a
 * BSD-style license that can be found in the LICENSE file.
 */
/**
 * @description Test that FileWriter handles abort properly.
 */
import "dart:html";
import "../../testcommon.dart";
import "../../../Utils/async_utils.dart";
import "resources/file-writer-utils.dart";

main() {
  document.body.appendHtml('<div id="console"></div>',
      treeSanitizer: NodeTreeSanitizer.trusted);

  var sawWriteStart;
  var sawAbort;
  var sawWriteEnd;
  var writer;

  tenXBlob(blob) {
    var bb = [];
    for (var i = 0; i < 10; ++i) {
      bb.add(blob);
    }
    return new Blob(bb);
  }

  onWriteStart(e) {
    shouldBeTrue(writer != null);
    shouldBeTrue(writer.readyState == FileWriter.WRITING);
    shouldBeTrue(e.type == "writestart");
    shouldBeTrue(!sawWriteStart);
    shouldBeTrue(!sawWriteEnd);
    shouldBeTrue(!e.loaded);
    sawWriteStart = true;
    testPassed("Calling abort");
    writer.abort();
  }

  // We should always abort before completion.
  onWrite(e) {
    testFailed("In onWrite.");
  }

  onAbort(e) {
    shouldBeTrue(writer.readyState == FileWriter.DONE);
    shouldBeTrue(writer.error.name == "AbortError");
    shouldBeTrue(sawWriteStart);
    shouldBeTrue(!sawWriteEnd);
    shouldBeTrue(!sawAbort);
    shouldBeTrue(e.type == "abort");
    sawAbort = true;
    testPassed("Saw abort");
  }

  onWriteEnd(e) {
    shouldBeTrue(writer.readyState == FileWriter.DONE);
    shouldBeTrue(writer.error.name == "AbortError");
    shouldBeTrue(sawWriteStart);
    shouldBeTrue(sawAbort);
    shouldBeTrue(!sawWriteEnd);
    shouldBeTrue(e.type == "writeend");
    sawWriteEnd = true;
    testPassed("Saw writeend.");
    writer.abort();  // Verify that this does nothing in readyState DONE.
    cleanUp();
  }

  startWrite(fileWriter) {
    // 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);
    writer = fileWriter;
    fileWriter.onError.listen(onError);
    fileWriter.onAbort.listen(onAbort);
    fileWriter.onWriteStart.listen(onWriteStart);
    fileWriter.onWrite.listen(onWrite);
    fileWriter.onWriteEnd.listen(onWriteEnd);
    fileWriter.abort();  // Verify that this does nothing in readyState INIT.
    fileWriter.write(blob);
  }

  runTest(unusedFileEntry, fileWriter) {
    startWrite(fileWriter);
  }

  setupAndRunTest(2*1024*1024, 'file-writer-abort', runTest);
}
