| Index: tests/standalone/io/file_test.dart | 
| diff --git a/tests/standalone/io/file_test.dart b/tests/standalone/io/file_test.dart | 
| index 66633f2f5f0ad1d2164ba295de20098083762956..46c46abcd2896296c947041e015072bad797906f 100644 | 
| --- a/tests/standalone/io/file_test.dart | 
| +++ b/tests/standalone/io/file_test.dart | 
| @@ -17,21 +17,22 @@ class MyListOfOneElement implements List { | 
| class FileTest { | 
| static Directory tempDirectory; | 
| static int numLiveAsyncTests = 0; | 
| +  static ReceivePort port; | 
|  | 
| static void asyncTestStarted() { ++numLiveAsyncTests; } | 
| static void asyncTestDone(String name) { | 
| --numLiveAsyncTests; | 
| if (numLiveAsyncTests == 0) { | 
| deleteTempDirectory(); | 
| +      port.close(); | 
| } | 
| } | 
|  | 
| static void createTempDirectory(Function doNext) { | 
| -    tempDirectory = new Directory(''); | 
| -    tempDirectory.onError = (e) { | 
| -      Expect.fail("Failed creating temporary directory"); | 
| -    }; | 
| -    tempDirectory.createTemp(doNext); | 
| +    new Directory('').createTemp().then((temp) { | 
| +      tempDirectory = temp; | 
| +      doNext(); | 
| +    }); | 
| } | 
|  | 
| static void deleteTempDirectory() { | 
| @@ -149,17 +150,15 @@ class FileTest { | 
| } | 
|  | 
| static void testRead() { | 
| +    ReceivePort port = new ReceivePort(); | 
| // Read a file and check part of it's contents. | 
| String filename = getFilename("bin/file_test.cc"); | 
| File file = new File(filename); | 
| -    file.onError = (e) { | 
| -      Expect.fail("No errors expected : $e"); | 
| -    }; | 
| -    file.open(FileMode.READ, (RandomAccessFile file) { | 
| +    file.open(FileMode.READ).then((RandomAccessFile file) { | 
| List<int> buffer = new List<int>(10); | 
| -      file.readList(buffer, 0, 5, (bytes_read) { | 
| +      file.readList(buffer, 0, 5).then((bytes_read) { | 
| Expect.equals(5, bytes_read); | 
| -        file.readList(buffer, 5, 5, (bytes_read) { | 
| +        file.readList(buffer, 5, 5).then((bytes_read) { | 
| Expect.equals(5, bytes_read); | 
| Expect.equals(47, buffer[0]);  // represents '/' in the file. | 
| Expect.equals(47, buffer[1]);  // represents '/' in the file. | 
| @@ -171,7 +170,7 @@ class FileTest { | 
| Expect.equals(114, buffer[7]);  // represents 'r' in the file. | 
| Expect.equals(105, buffer[8]);  // represents 'i' in the file. | 
| Expect.equals(103, buffer[9]);  // represents 'g' in the file. | 
| -          file.close(() => null); | 
| +          file.close().then((ignore) => port.close()); | 
| }); | 
| }); | 
| }); | 
| @@ -206,48 +205,29 @@ class FileTest { | 
| // Read a file. | 
| String inFilename = getFilename("tests/vm/data/fixed_length_file"); | 
| final File file = new File(inFilename); | 
| -    file.onError = (e) { | 
| -      Expect.fail("No errors expected : $e"); | 
| -    }; | 
| -    file.open(FileMode.READ, (RandomAccessFile openedFile) { | 
| -      openedFile.onError = (s) { | 
| -        Expect.fail("No errors expected : $s"); | 
| -      }; | 
| +    file.open(FileMode.READ).then((openedFile) { | 
| List<int> buffer1 = new List<int>(42); | 
| -      openedFile.readList(buffer1, 0, 42, (bytes_read) { | 
| +      openedFile.readList(buffer1, 0, 42).then((bytes_read) { | 
| Expect.equals(42, bytes_read); | 
| -        openedFile.close(() { | 
| +        openedFile.close().then((ignore) { | 
| // Write the contents of the file just read into another file. | 
| String outFilename = tempDirectory.path + "/out_read_write"; | 
| final File file2 = new File(outFilename); | 
| -          file2.onError = (e) { | 
| -            Expect.fail("No errors expected : $e"); | 
| -          }; | 
| -          file2.create(() { | 
| -            file2.fullPath((s) { | 
| +          file2.create().then((ignore) { | 
| +            file2.fullPath().then((s) { | 
| Expect.isTrue(new File(s).existsSync()); | 
| if (s[0] != '/' && s[0] != '\\' && s[1] != ':') { | 
| Expect.fail("Not a full path"); | 
| } | 
| -              file2.open(FileMode.WRITE, (RandomAccessFile openedFile2) { | 
| -                openedFile2.onError = (s) { | 
| -                  Expect.fail("No errors expected : $s"); | 
| -                }; | 
| -                openedFile2.writeList(buffer1, 0, bytes_read); | 
| -                openedFile2.onNoPendingWrites = () { | 
| -                  openedFile2.close(() { | 
| +              file2.open(FileMode.WRITE).then((openedFile2) { | 
| +                openedFile2.writeList(buffer1, 0, bytes_read).then((ignore) { | 
| +                  openedFile2.close().then((ignore) { | 
| List<int> buffer2 = new List<int>(bytes_read); | 
| final File file3 = new File(outFilename); | 
| -                    file3.onError = (e) { | 
| -                      Expect.fail("No errors expected : $e"); | 
| -                    }; | 
| -                    file3.open(FileMode.READ, (RandomAccessFile openedFile3) { | 
| -                      openedFile3.onError = (s) { | 
| -                        Expect.fail("No errors expected : $s"); | 
| -                      }; | 
| -                      openedFile3.readList(buffer2, 0, 42, (bytes_read) { | 
| -                       Expect.equals(42, bytes_read); | 
| -                        openedFile3.close(() { | 
| +                    file3.open(FileMode.READ).then((openedFile3) { | 
| +                      openedFile3.readList(buffer2, 0, 42).then((bytes_read) { | 
| +                        Expect.equals(42, bytes_read); | 
| +                        openedFile3.close().then((ignore) { | 
| // Now compare the two buffers to check if they | 
| // are identical. | 
| Expect.equals(buffer1.length, buffer2.length); | 
| @@ -256,8 +236,8 @@ class FileTest { | 
| } | 
| // Delete the output file. | 
| final file4 = file3; | 
| -                          file4.delete(() { | 
| -                            file4.exists((exists) { | 
| +                          file4.delete().then((ignore) { | 
| +                            file4.exists().then((exists) { | 
| Expect.isFalse(exists); | 
| asyncTestDone("testReadWrite"); | 
| }); | 
| @@ -266,7 +246,7 @@ class FileTest { | 
| }); | 
| }); | 
| }); | 
| -                }; | 
| +                }); | 
| }); | 
| }); | 
| }); | 
| @@ -319,11 +299,11 @@ class FileTest { | 
| appendingOutput.close(); | 
| appendingOutput.onClosed = () { | 
| File file3 = new File(filename); | 
| -            file3.open(FileMode.READ, (RandomAccessFile openedFile) { | 
| -              openedFile.length((int length) { | 
| +            file3.open(FileMode.READ).then((RandomAccessFile openedFile) { | 
| +              openedFile.length().then((int length) { | 
| Expect.equals(content.length * 2, length); | 
| -                openedFile.close(() { | 
| -                  file3.delete(() { | 
| +                openedFile.close().then((ignore) { | 
| +                  file3.delete().then((ignore) { | 
| asyncTestDone("testOutputStreamWriteAppend"); | 
| }); | 
| }); | 
| @@ -354,6 +334,9 @@ class FileTest { | 
| outStream.onClosed = () { | 
| RandomAccessFile raf = file.openSync(); | 
| Expect.equals(38, raf.lengthSync()); | 
| +        raf.close().then((ignore) { | 
| +          asyncTestDone("testOutputStreamWriteString"); | 
| +        }); | 
| }; | 
| }; | 
| asyncTestStarted(); | 
| @@ -411,23 +394,16 @@ class FileTest { | 
| static void testReadEmptyFile() { | 
| String fileName = tempDirectory.path + "/empty_file"; | 
| File file = new File(fileName); | 
| -    file.onError = (e) { | 
| -      Expect.fail("No errors expected : $e"); | 
| -    }; | 
| asyncTestStarted(); | 
| -    file.create(() { | 
| -      file.open(FileMode.READ, (RandomAccessFile openedFile) { | 
| -        openedFile.readByte((int byte) { | 
| +    file.create().then((ignore) { | 
| +      file.open(FileMode.READ).then((RandomAccessFile openedFile) { | 
| +        var readByteFuture = openedFile.readByte(); | 
| +        readByteFuture.then((int byte) { | 
| Expect.equals(-1, byte); | 
| -        }); | 
| -        openedFile.onError = (e) { | 
| -          Expect.isTrue(e is FileIOException); | 
| -          openedFile.close(() { | 
| -            file.delete(() { | 
| -              asyncTestDone("testReadEmptyFile"); | 
| -            }); | 
| +          openedFile.close().then((ignore) { | 
| +            asyncTestDone("testReadEmptyFile"); | 
| }); | 
| -        }; | 
| +        }); | 
| }); | 
| }); | 
| } | 
| @@ -437,9 +413,8 @@ class FileTest { | 
| asyncTestStarted(); | 
| final String fileName = "${tempDirectory.path}/testWriteVariousLists"; | 
| final File file = new File(fileName); | 
| -    file.onError = (e) => Expect.fail("No errors expected : $e"); | 
| -    file.create(() { | 
| -      file.open(FileMode.WRITE, (RandomAccessFile openedFile) { | 
| +    file.create().then((ignore) { | 
| +      file.open(FileMode.WRITE).then((RandomAccessFile openedFile) { | 
| // Write bytes from 0 to 7. | 
| openedFile.writeList([0], 0, 1); | 
| openedFile.writeList(const [1], 0, 1); | 
| @@ -452,11 +427,8 @@ class FileTest { | 
| openedFile.writeList(new MyListOfOneElement(262), 0, 1); | 
| x = 12345678901234567890123456789012345678901234567890; | 
| y = 12345678901234567890123456789012345678901234568153; | 
| -        openedFile.writeList([y - x], 0, 1); | 
| - | 
| -        openedFile.onError = (e) => Expect.fail("No errors expected : $e"); | 
| -        openedFile.onNoPendingWrites = () { | 
| -          openedFile.close(() { | 
| +        openedFile.writeList([y - x], 0, 1).then((ignore) { | 
| +          openedFile.close().then((ignore) { | 
| // Check the written bytes. | 
| final File file2 = new File(fileName); | 
| var openedFile2 = file2.openSync(); | 
| @@ -471,7 +443,7 @@ class FileTest { | 
| file2.deleteSync(); | 
| asyncTestDone("testWriteVariousLists"); | 
| }); | 
| -        }; | 
| +        }); | 
| }); | 
| }); | 
| } | 
| @@ -490,28 +462,34 @@ class FileTest { | 
| var tempDir = tempDirectory.path; | 
| var file = new File("${tempDir}/testDirectory"); | 
| var errors = 0; | 
| -    file.directory((d) => Expect.fail("non-existing file")); | 
| -    file.onError = (e) { | 
| -      file.onError = (e) => Expect.fail("no error expected"); | 
| -      file.create(() { | 
| -        file.directory((Directory d) { | 
| -          d.onError = (s) => Expect.fail("no error expected"); | 
| -          d.exists((exists) { | 
| +    var dirFuture = file.directory(); | 
| +    dirFuture.then((d) => Expect.fail("non-existing file")); | 
| +    dirFuture.handleException((e) { | 
| +      file.create().then((ignore) { | 
| +        file.directory().then((Directory d) { | 
| +          d.exists().then((exists) { | 
| Expect.isTrue(exists); | 
| Expect.isTrue(d.path.endsWith(tempDir)); | 
| -            file.delete(() { | 
| -              var file_dir = new File("."); | 
| -              file_dir.directory((d) => Expect.fail("non-existing file")); | 
| -              file_dir.onError = (e) { | 
| -                var file_dir = new File(tempDir); | 
| -                file_dir.directory((d) => Expect.fail("non-existing file")); | 
| -                file_dir.onError = (e) => port.toSendPort().send(1); | 
| -              }; | 
| +            file.delete().then((ignore) { | 
| +              var fileDir = new File("."); | 
| +              var dirFuture2 = fileDir.directory(); | 
| +              dirFuture2.then((d) => Expect.fail("non-existing file")); | 
| +              dirFuture2.handleException((e) { | 
| +                var fileDir = new File(tempDir); | 
| +                var dirFuture3 = fileDir.directory(); | 
| +                dirFuture3.then((d) => Expect.fail("non-existing file")); | 
| +                dirFuture3.handleException((e) { | 
| +                  port.toSendPort().send(1); | 
| +                  return true; | 
| +                }); | 
| +                return true; | 
| +              }); | 
| }); | 
| }); | 
| }); | 
| }); | 
| -    }; | 
| +      return true; | 
| +    }); | 
| } | 
|  | 
| static void testDirectorySync() { | 
| @@ -534,16 +512,15 @@ class FileTest { | 
|  | 
| // Test for file length functionality. | 
| static void testLength() { | 
| +    var port = new ReceivePort(); | 
| String filename = getFilename("tests/vm/data/fixed_length_file"); | 
| File file = new File(filename); | 
| RandomAccessFile openedFile = file.openSync(); | 
| -    openedFile.onError = (e) => Expect.fail("No errors expected"); | 
| -    file.onError = (e) => Expect.fail("No errors expected"); | 
| -    openedFile.length((length) { | 
| +    openedFile.length().then((length) { | 
| Expect.equals(42, length); | 
| -      openedFile.close(() => null); | 
| +      openedFile.close().then((ignore) => port.close()); | 
| }); | 
| -    file.length((length) { | 
| +    file.length().then((length) { | 
| Expect.equals(42, length); | 
| }); | 
| } | 
| @@ -559,22 +536,22 @@ class FileTest { | 
|  | 
| // Test for file position functionality. | 
| static void testPosition() { | 
| +    var port = new ReceivePort(); | 
| String filename = getFilename("tests/vm/data/fixed_length_file"); | 
| RandomAccessFile input = (new File(filename)).openSync(); | 
| -    input.onError = (e) => Expect.fail("No errors expected"); | 
| -    input.position((position) { | 
| +    input.position().then((position) { | 
| Expect.equals(0, position); | 
| List<int> buffer = new List<int>(100); | 
| -      input.readList(buffer, 0, 12, (bytes_read) { | 
| -        input.position((position) { | 
| +      input.readList(buffer, 0, 12).then((bytes_read) { | 
| +        input.position().then((position) { | 
| Expect.equals(12, position); | 
| -          input.readList(buffer, 12, 6, (bytes_read) { | 
| -            input.position((position) { | 
| +          input.readList(buffer, 12, 6).then((bytes_read) { | 
| +            input.position().then((position) { | 
| Expect.equals(18, position); | 
| -              input.setPosition(8, () { | 
| -                input.position((position) { | 
| +              input.setPosition(8).then((ignore) { | 
| +                input.position().then((position) { | 
| Expect.equals(8, position); | 
| -                  input.close(() => null); | 
| +                  input.close().then((ignore) => port.close()); | 
| }); | 
| }); | 
| }); | 
| @@ -601,18 +578,16 @@ class FileTest { | 
| static void testTruncate() { | 
| File file = new File(tempDirectory.path + "/out_truncate"); | 
| List buffer = const [65, 65, 65, 65, 65, 65, 65, 65, 65, 65]; | 
| -    file.onError = (e) => Expect.fail("No errors expected: $e"); | 
| -    file.open(FileMode.WRITE, (RandomAccessFile openedFile) { | 
| -      openedFile.writeList(buffer, 0, 10); | 
| -      openedFile.onNoPendingWrites = () { | 
| -        openedFile.length((length) { | 
| +    file.open(FileMode.WRITE).then((RandomAccessFile openedFile) { | 
| +      openedFile.writeList(buffer, 0, 10).then((ignore) { | 
| +        openedFile.length().then((length) { | 
| Expect.equals(10, length); | 
| -          openedFile.truncate(5, () { | 
| -            openedFile.length((length) { | 
| +          openedFile.truncate(5).then((ignore) { | 
| +            openedFile.length().then((length) { | 
| Expect.equals(5, length); | 
| -              openedFile.close(() { | 
| -                file.delete(() { | 
| -                  file.exists((exists) { | 
| +              openedFile.close().then((ignore) { | 
| +                file.delete().then((ignore) { | 
| +                  file.exists().then((exists) { | 
| Expect.isFalse(exists); | 
| asyncTestDone("testTruncate"); | 
| }); | 
| @@ -621,7 +596,7 @@ class FileTest { | 
| }); | 
| }); | 
| }); | 
| -      }; | 
| +      }); | 
| }); | 
| asyncTestStarted(); | 
| } | 
| @@ -849,8 +824,9 @@ class FileTest { | 
|  | 
| static void testOpenDirectoryAsFile() { | 
| var f = new File('.'); | 
| -    f.open(FileMode.READ, (r) => Expect.fail('Directory opened as file')); | 
| -    f.onError = (e) => null; | 
| +    var future = f.open(FileMode.READ); | 
| +    future.then((r) => Expect.fail('Directory opened as file')); | 
| +    future.handleException((e) => true); | 
| } | 
|  | 
| static void testOpenDirectoryAsFileSync() { | 
| @@ -871,11 +847,10 @@ class FileTest { | 
| }); | 
| var name = getFilename("tests/vm/data/fixed_length_file"); | 
| var f = new File(name); | 
| -    f.readAsBytes((bytes) { | 
| +    f.readAsBytes().then((bytes) { | 
| Expect.isTrue(new String.fromCharCodes(bytes).endsWith("42 bytes.")); | 
| port.toSendPort().send(bytes.length); | 
| }); | 
| -    f.onError = (e) => Expect.fail("No errors expected: $e"); | 
| } | 
|  | 
| static void testReadAsBytesSync() { | 
| @@ -893,32 +868,30 @@ class FileTest { | 
| }); | 
| var name = getFilename("tests/vm/data/fixed_length_file"); | 
| var f = new File(name); | 
| -    f.readAsText(Encoding.UTF_8, (text) { | 
| +    f.readAsText(Encoding.UTF_8).then((text) { | 
| Expect.isTrue(text.endsWith("42 bytes.")); | 
| Expect.equals(42, text.length); | 
| var name = getDataFilename("tests/standalone/io/read_as_text.dat"); | 
| var f = new File(name); | 
| -      f.onError = (e) => Expect.fail("No errors expected: $e"); | 
| -      f.readAsText(Encoding.UTF_8, (text) { | 
| +      f.readAsText(Encoding.UTF_8).then((text) { | 
| Expect.equals(6, text.length); | 
| var expected = [955, 120, 46, 32, 120, 10]; | 
| Expect.listEquals(expected, text.charCodes()); | 
| -        f.readAsText(Encoding.ISO_8859_1, (text) { | 
| +        f.readAsText(Encoding.ISO_8859_1).then((text) { | 
| Expect.equals(7, text.length); | 
| var expected = [206, 187, 120, 46, 32, 120, 10]; | 
| Expect.listEquals(expected, text.charCodes()); | 
| -          f.onError = (e) { | 
| -            port.toSendPort().send(1); | 
| -          }; | 
| -          f.readAsText(Encoding.ASCII, (text) { | 
| +          var readAsTextFuture = f.readAsText(Encoding.ASCII); | 
| +          readAsTextFuture.then((text) { | 
| Expect.fail("Non-ascii char should cause error"); | 
| }); | 
| +          readAsTextFuture.handleException((e) { | 
| +            port.toSendPort().send(1); | 
| +            return true; | 
| +          }); | 
| }); | 
| }); | 
| }); | 
| -    f.onError = (e) { | 
| -      Expect.fail("No errors expected: $e"); | 
| -    }; | 
| } | 
|  | 
| static void testReadAsTextSync() { | 
| @@ -946,13 +919,12 @@ class FileTest { | 
| }); | 
| var name = getFilename("tests/vm/data/fixed_length_file"); | 
| var f = new File(name); | 
| -    f.readAsLines(Encoding.UTF_8, (lines) { | 
| +    f.readAsLines(Encoding.UTF_8).then((lines) { | 
| Expect.equals(1, lines.length); | 
| var line = lines[0]; | 
| Expect.isTrue(line.endsWith("42 bytes.")); | 
| port.toSendPort().send(line.length); | 
| }); | 
| -    f.onError = (e) => Expect.fail("No errors expected: $e"); | 
| } | 
|  | 
| static void testReadAsLinesSync() { | 
| @@ -978,46 +950,51 @@ class FileTest { | 
| Expect.throws(f.readAsBytesSync, (e) => e is FileIOException); | 
| Expect.throws(f.readAsTextSync, (e) => e is FileIOException); | 
| Expect.throws(f.readAsLinesSync, (e) => e is FileIOException); | 
| -    f.readAsBytes((bytes) => Expect.fail("no bytes expected")); | 
| -    f.onError = (e) { | 
| -      f.readAsText(Encoding.UTF_8, (text) => Expect.fail("no text expected")); | 
| -      f.onError = (e) { | 
| -        f.readAsLines(Encoding.UTF_8, | 
| -                      (lines) => Expect.fail("no lines expected")); | 
| -        f.onError = (e) => port.toSendPort().send(1); | 
| -      }; | 
| -    }; | 
| +    var readAsBytesFuture = f.readAsBytes(); | 
| +    readAsBytesFuture.then((bytes) => Expect.fail("no bytes expected")); | 
| +    readAsBytesFuture.handleException((e) { | 
| +      var readAsTextFuture = f.readAsText(Encoding.UTF_8); | 
| +      readAsTextFuture.then((text) => Expect.fail("no text expected")); | 
| +      readAsTextFuture.handleException((e) { | 
| +        var readAsLinesFuture = f.readAsLines(Encoding.UTF_8); | 
| +        readAsLinesFuture.then((lines) => Expect.fail("no lines expected")); | 
| +        readAsLinesFuture.handleException((e) { | 
| +          port.toSendPort().send(1); | 
| +          return true; | 
| +        }); | 
| +        return true; | 
| +      }); | 
| +      return true; | 
| +    }); | 
| } | 
|  | 
| // Test that opens the same file for writing then for appending to test | 
| // that the file is not truncated when opened for appending. | 
| static void testAppend() { | 
| var file = new File('${tempDirectory.path}/out_append'); | 
| -    file.open(FileMode.WRITE, (openedFile) { | 
| -      openedFile.writeString("asdf"); | 
| -      openedFile.onNoPendingWrites = () { | 
| -        openedFile.close(() { | 
| -          file.open(FileMode.APPEND, (openedFile) { | 
| -            openedFile.length((length) { | 
| +    file.open(FileMode.WRITE).then((openedFile) { | 
| +      openedFile.writeString("asdf").then((ignore) { | 
| +        openedFile.close().then((ignore) { | 
| +          file.open(FileMode.APPEND).then((openedFile) { | 
| +            openedFile.length().then((length) { | 
| Expect.equals(4, length); | 
| -              openedFile.writeString("asdf"); | 
| -              openedFile.onNoPendingWrites = () { | 
| -                openedFile.length((length) { | 
| +              openedFile.writeString("asdf").then((ignore) { | 
| +                openedFile.length().then((length) { | 
| Expect.equals(8, length); | 
| -                  openedFile.close(() { | 
| -                    file.delete(() { | 
| -                      file.exists((exists) { | 
| +                  openedFile.close().then((ignore) { | 
| +                    file.delete().then((ignore) { | 
| +                      file.exists().then((exists) { | 
| Expect.isFalse(exists); | 
| asyncTestDone("testAppend"); | 
| }); | 
| }); | 
| }); | 
| }); | 
| -              }; | 
| +              }); | 
| }); | 
| }); | 
| }); | 
| -      }; | 
| +      }); | 
| }); | 
| asyncTestStarted(); | 
| } | 
| @@ -1047,6 +1024,7 @@ class FileTest { | 
|  | 
| // Main test entrypoint. | 
| static testMain() { | 
| +    port = new ReceivePort(); | 
| testRead(); | 
| testReadSync(); | 
| testReadStream(); | 
|  |