| Index: tests/standalone/io/file_test.dart | 
| diff --git a/tests/standalone/io/file_test.dart b/tests/standalone/io/file_test.dart | 
| index 4d7093d61b3eb5fd8d34574983846fdb1a55d7ad..1a8604ab5267f9792ecb67d8ea1680ea7db343d2 100644 | 
| --- a/tests/standalone/io/file_test.dart | 
| +++ b/tests/standalone/io/file_test.dart | 
| @@ -46,27 +46,27 @@ class FileTest { | 
| String filename = getFilename("bin/file_test.cc"); | 
| File file = new File(filename); | 
| Expect.isTrue('$file'.contains(file.name)); | 
| -    InputStream input = file.openInputStream(); | 
| -    input.onData = () { | 
| -      List<int> buffer = new List<int>.fixedLength(42); | 
| -      int bytesRead = input.readInto(buffer, 0, 12); | 
| -      Expect.equals(12, bytesRead); | 
| -      bytesRead = input.readInto(buffer, 12, 30); | 
| -      input.close(); | 
| -      Expect.equals(30, bytesRead); | 
| -      Expect.equals(47, buffer[0]);  // represents '/' in the file. | 
| -      Expect.equals(47, buffer[1]);  // represents '/' in the file. | 
| -      Expect.equals(32, buffer[2]);  // represents ' ' in the file. | 
| -      Expect.equals(67, buffer[3]);  // represents 'C' in the file. | 
| -      Expect.equals(111, buffer[4]);  // represents 'o' in the file. | 
| -      Expect.equals(112, buffer[5]);  // represents 'p' in the file. | 
| -      Expect.equals(121, buffer[6]);  // represents 'y' in the file. | 
| -      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. | 
| -      Expect.equals(104, buffer[10]);  // represents 'h' in the file. | 
| -      Expect.equals(116, buffer[11]);  // represents 't' in the file. | 
| -    }; | 
| +    var subscription; | 
| +    List<int> buffer = new List<int>(); | 
| +    subscription = file.openRead().listen( | 
| +        (d) { | 
| +          buffer.addAll(d); | 
| +          if (buffer.length >= 12) { | 
| +            subscription.cancel(); | 
| +            Expect.equals(47, buffer[0]);  // represents '/' in the file. | 
| +            Expect.equals(47, buffer[1]);  // represents '/' in the file. | 
| +            Expect.equals(32, buffer[2]);  // represents ' ' in the file. | 
| +            Expect.equals(67, buffer[3]);  // represents 'C' in the file. | 
| +            Expect.equals(111, buffer[4]);  // represents 'o' in the file. | 
| +            Expect.equals(112, buffer[5]);  // represents 'p' in the file. | 
| +            Expect.equals(121, buffer[6]);  // represents 'y' in the file. | 
| +            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. | 
| +            Expect.equals(104, buffer[10]);  // represents 'h' in the file. | 
| +            Expect.equals(116, buffer[11]);  // represents 't' in the file. | 
| +          } | 
| +        }); | 
| } | 
|  | 
| // Test for file read and write functionality. | 
| @@ -79,91 +79,42 @@ class FileTest { | 
| InputStream input; | 
| int bytesRead; | 
|  | 
| -    // Test reading all using readInto. | 
| var file1 = new File(inFilename); | 
| -    var input1 = file1.openInputStream(); | 
| -    List<int> buffer1; | 
| -    input1.onData = () { | 
| -      buffer1 = new List<int>.fixedLength(42); | 
| -      bytesRead = input1.readInto(buffer1, 0, 42); | 
| -      Expect.equals(42, bytesRead); | 
| -    }; | 
| -    input1.onError = (e) { throw e; }; | 
| -    input1.onClosed = () { | 
| -      Expect.isTrue(input1.closed); | 
| - | 
| -      // Test reading all using readInto and read. | 
| -      var file2 = new File(inFilename); | 
| -      var input2 = file2.openInputStream(); | 
| -      input2.onData = () { | 
| -        bytesRead = input2.readInto(buffer1, 0, 21); | 
| -        Expect.equals(21, bytesRead); | 
| -        buffer1 = input2.read(); | 
| -        Expect.equals(21, buffer1.length); | 
| -      }; | 
| -      input2.onError = (e) { throw e; }; | 
| -      input2.onClosed = () { | 
| -        Expect.isTrue(input2.closed); | 
| - | 
| -        // Test reading all using read and readInto. | 
| -        var file3 = new File(inFilename); | 
| -        var input3 = file3.openInputStream(); | 
| -        input3.onData = () { | 
| -          buffer1 = input3.read(21); | 
| -          Expect.equals(21, buffer1.length); | 
| -          bytesRead = input3.readInto(buffer1, 0, 21); | 
| -          Expect.equals(21, bytesRead); | 
| -        }; | 
| -        input3.onError = (e) { throw e; }; | 
| -        input3.onClosed = () { | 
| -          Expect.isTrue(input3.closed); | 
| - | 
| -          // Test reading all using read. | 
| -          var file4 = new File(inFilename); | 
| -          var input4 = file4.openInputStream(); | 
| -          input4.onData = () { | 
| -            buffer1 = input4.read(); | 
| -            Expect.equals(42, buffer1.length); | 
| -          }; | 
| -          input4.onError = (e) { throw e; }; | 
| -          input4.onClosed = () { | 
| -            Expect.isTrue(input4.closed); | 
| - | 
| -            // Write the contents of the file just read into another file. | 
| -            String outFilename = | 
| -                tempDirectory.path.concat("/out_read_write_stream"); | 
| -            file = new File(outFilename); | 
| -            OutputStream output = file.openOutputStream(); | 
| -            bool writeDone = output.writeFrom(buffer1, 0, 42); | 
| -            Expect.equals(false, writeDone); | 
| -            output.onNoPendingWrites = () { | 
| -              output.close(); | 
| -              output.onClosed = () { | 
| -                // Now read the contents of the file just written. | 
| -                List<int> buffer2 = new List<int>.fixedLength(42); | 
| -                var file6 = new File(outFilename); | 
| -                var input6 = file6.openInputStream(); | 
| -                input6.onData = () { | 
| -                  bytesRead = input6.readInto(buffer2, 0, 42); | 
| -                  Expect.equals(42, bytesRead); | 
| -                  // Now compare the two buffers to check if they are identical. | 
| -                  for (int i = 0; i < buffer1.length; i++) { | 
| -                    Expect.equals(buffer1[i],  buffer2[i]); | 
| -                  } | 
| -                }; | 
| -                input6.onError = (e) { throw e; }; | 
| -                input6.onClosed = () { | 
| -                  // Delete the output file. | 
| -                  file6.deleteSync(); | 
| -                  Expect.isFalse(file6.existsSync()); | 
| -                  asyncTestDone("testReadWriteStream"); | 
| -                }; | 
| -              }; | 
| -            }; | 
| -          }; | 
| -        }; | 
| -      }; | 
| -    }; | 
| +    List<int> buffer = new List<int>(); | 
| +    file1.openRead().listen( | 
| +      (d) { | 
| +        buffer.addAll(d); | 
| +      }, | 
| +      onDone: () { | 
| +        Expect.equals(42, buffer.length); | 
| +        // Write the contents of the file just read into another file. | 
| +        String outFilename = | 
| +            tempDirectory.path.concat("/out_read_write_stream"); | 
| +        var file2 = new File(outFilename); | 
| +        var output = file2.openWrite(); | 
| +        output.add(buffer); | 
| +        output.close(); | 
| +        output.done.then((_) { | 
| +          // Now read the contents of the file just written. | 
| +          List<int> buffer2 = new List<int>(); | 
| +          new File(outFilename).openRead().listen( | 
| +              (d) { | 
| +                buffer2.addAll(d); | 
| +              }, | 
| +              onDone: () { | 
| +                Expect.equals(42, buffer2.length); | 
| +                // Now compare the two buffers to check if they are | 
| +                // identical. | 
| +                for (int i = 0; i < buffer.length; i++) { | 
| +                  Expect.equals(buffer[i],  buffer2[i]); | 
| +                } | 
| +                // Delete the output file. | 
| +                file2.deleteSync(); | 
| +                Expect.isFalse(file2.existsSync()); | 
| +                asyncTestDone("testReadWriteStream"); | 
| +              }); | 
| +          }); | 
| +      }); | 
| } | 
|  | 
| // Test for file stream buffered handling of large files. | 
| @@ -178,22 +129,12 @@ class FileTest { | 
| String filename = | 
| tempDirectory.path.concat("/out_read_write_stream_large_file"); | 
| File file = new File(filename); | 
| -    OutputStream output = file.openOutputStream(); | 
| -    // Test a write immediately after the output stream is created. | 
| -    output.writeFrom(buffer, 0, 20000); | 
| - | 
| -    output.onNoPendingWrites = () { | 
| -      output.writeFrom(buffer, 20000, 60000); | 
| -      output.writeFrom(buffer, 80000, 20000); | 
| -      output.onNoPendingWrites = () { | 
| -        output.writeFrom(buffer, 0, 0); | 
| -        output.writeFrom(buffer, 0, 0); | 
| -        output.writeFrom(buffer, 0, 100000); | 
| -        output.close(); | 
| -      }; | 
| -    }; | 
| -    output.onClosed = () { | 
| -      InputStream input = file.openInputStream(); | 
| +    IOSink output = file.openWrite(); | 
| +    output.add(buffer); | 
| +    output.add(buffer); | 
| +    output.close(); | 
| +    output.done.then((_) { | 
| +      Stream input = file.openRead(); | 
| int position = 0; | 
| final int expectedLength = 200000; | 
| // Start an independent asynchronous check on the length. | 
| @@ -203,86 +144,55 @@ class FileTest { | 
| asyncTestDone('testReadWriteStreamLargeFile: length check'); | 
| }); | 
|  | 
| -      List<int> inputBuffer = | 
| -          new List<int>.fixedLength(expectedLength + 100000); | 
| // Immediate read should read 0 bytes. | 
| -      Expect.equals(0, input.available()); | 
| -      Expect.equals(false, input.closed); | 
| -      int bytesRead = input.readInto(inputBuffer); | 
| -      Expect.equals(0, bytesRead); | 
| -      Expect.equals(0, input.available()); | 
| -      Expect.isFalse(input.closed); | 
| -      input.onError = (e) { | 
| -        print('Error handler called on input in testReadWriteStreamLargeFile'); | 
| -        print('with error $e'); | 
| -        throw e; | 
| -      }; | 
| -      input.onData = () { | 
| -        Expect.isFalse(input.closed); | 
| -        bytesRead = input.readInto(inputBuffer, position, | 
| -                                   inputBuffer.length - position); | 
| -        position += bytesRead; | 
| -        // The buffer is large enough to hold all available data. | 
| -        // So there should be no data left to read. | 
| -        Expect.equals(0, input.available()); | 
| -        bytesRead = input.readInto(inputBuffer, position, | 
| -                                   expectedLength - position); | 
| -        Expect.equals(0, bytesRead); | 
| -        Expect.equals(0, input.available()); | 
| -        Expect.isFalse(input.closed); | 
| -      }; | 
| -      input.onClosed = () { | 
| -        Expect.equals(0, input.available()); | 
| -        Expect.isTrue(input.closed); | 
| -        input.close();  // This should be safe to call. | 
| - | 
| -        Expect.equals(expectedLength, position); | 
| -        for (int i = 0; i < position; ++i) { | 
| -          Expect.equals(buffer[i % buffer.length], inputBuffer[i]); | 
| -        } | 
| - | 
| -        Future testPipeDone = testPipe(file, buffer); | 
| - | 
| -        Future futureDeleted = testPipeDone.then((ignored) => file.delete()); | 
| -        futureDeleted.then((ignored) { | 
| -            asyncTestDone('testReadWriteStreamLargeFile: main test'); | 
| -        }).catchError((e) { | 
| -          print('Exception while deleting ReadWriteStreamLargeFile file'); | 
| -          print('Exception $e'); | 
| +      input.listen( | 
| +        (d) { | 
| +          for (int i = 0; i < d.length; ++i) { | 
| +            Expect.equals(buffer[(i + position) % buffer.length], d[i]); | 
| +          } | 
| +          position += d.length; | 
| +        }, | 
| +        onError: (e) { | 
| +          print('Error on input in testReadWriteStreamLargeFile'); | 
| +          print('with error $e'); | 
| +          throw e; | 
| +        }, | 
| +        onDone: () { | 
| +          Expect.equals(expectedLength, position); | 
| +          testPipe(file, buffer) | 
| +              .then((_) => file.delete()) | 
| +              .then((_) { | 
| +                  asyncTestDone('testReadWriteStreamLargeFile: main test'); | 
| +              }) | 
| +              .catchError((e) { | 
| +                print('Exception while deleting ReadWriteStreamLargeFile file'); | 
| +                print('Exception $e'); | 
| +              }); | 
| }); | 
| -      }; | 
| -      // Try a read again after handlers are set. | 
| -      bytesRead = input.readInto(inputBuffer); | 
| -      Expect.equals(0, bytesRead); | 
| -      Expect.equals(0, input.available()); | 
| -      Expect.isFalse(input.closed); | 
| -    }; | 
| +    }); | 
| } | 
|  | 
| static Future testPipe(File file, buffer) { | 
| String outputFilename = '${file.name}_copy'; | 
| File outputFile = new File(outputFilename); | 
| -    InputStream input = file.openInputStream(); | 
| -    OutputStream output = outputFile.openOutputStream(); | 
| -    input.pipe(output); | 
| +    var input = file.openRead(); | 
| +    var output = outputFile.openWrite(); | 
| Completer done = new Completer(); | 
| -    output.onClosed = () { | 
| -      InputStream copy = outputFile.openInputStream(); | 
| +    input.pipe(output).then((_) { | 
| +      var copy = outputFile.openRead(); | 
| int position = 0; | 
| -      copy.onData = () { | 
| -        var data; | 
| -        while ((data = copy.read()) != null) { | 
| -          for (int value in data) { | 
| -            Expect.equals(buffer[position % buffer.length], value); | 
| -            position++; | 
| -          } | 
| -        } | 
| -      }; | 
| -      copy.onClosed = () { | 
| -        Expect.equals(2 * buffer.length, position); | 
| -        outputFile.delete().then((ignore) { done.complete(null); }); | 
| -      }; | 
| -    }; | 
| +      copy.listen( | 
| +          (d) { | 
| +            for (int i = 0; i < d.length; i++) { | 
| +              Expect.equals(buffer[(position + i) % buffer.length], d[i]); | 
| +            } | 
| +            position += d.length; | 
| +          }, | 
| +          onDone: () { | 
| +            Expect.equals(2 * buffer.length, position); | 
| +            outputFile.delete().then((ignore) { done.complete(); }); | 
| +          }); | 
| +      }); | 
| return done.future; | 
| } | 
|  | 
| @@ -423,33 +333,28 @@ class FileTest { | 
| File file = new File(filename); | 
| file.createSync(); | 
| List<int> buffer = content.charCodes; | 
| -    OutputStream outStream = file.openOutputStream(); | 
| -    outStream.write(buffer); | 
| -    outStream.onNoPendingWrites = () { | 
| -      outStream.close(); | 
| -      outStream.onClosed = () { | 
| -        File file2 = new File(filename); | 
| -        OutputStream appendingOutput = | 
| -            file2.openOutputStream(FileMode.APPEND); | 
| -        appendingOutput.write(buffer); | 
| -        appendingOutput.onNoPendingWrites = () { | 
| -          appendingOutput.close(); | 
| -          appendingOutput.onClosed = () { | 
| -            File file3 = new File(filename); | 
| -            file3.open(FileMode.READ).then((RandomAccessFile openedFile) { | 
| -              openedFile.length().then((int length) { | 
| -                Expect.equals(content.length * 2, length); | 
| -                openedFile.close().then((ignore) { | 
| -                  file3.delete().then((ignore) { | 
| -                    asyncTestDone("testOutputStreamWriteAppend"); | 
| -                  }); | 
| -                }); | 
| +    var output = file.openWrite(); | 
| +    output.add(buffer); | 
| +    output.close(); | 
| +    output.done.then((_) { | 
| +      File file2 = new File(filename); | 
| +      var appendingOutput = file2.openWrite(FileMode.APPEND); | 
| +      appendingOutput.add(buffer); | 
| +      appendingOutput.close(); | 
| +      appendingOutput.done.then((_) { | 
| +        File file3 = new File(filename); | 
| +        file3.open(FileMode.READ).then((RandomAccessFile openedFile) { | 
| +          openedFile.length().then((int length) { | 
| +            Expect.equals(content.length * 2, length); | 
| +            openedFile.close().then((ignore) { | 
| +              file3.delete().then((ignore) { | 
| +                asyncTestDone("testOutputStreamWriteAppend"); | 
| }); | 
| }); | 
| -          }; | 
| -        }; | 
| -      }; | 
| -    }; | 
| +          }); | 
| +        }); | 
| +      }); | 
| +    }); | 
| asyncTestStarted(); | 
| } | 
|  | 
| @@ -460,22 +365,20 @@ class FileTest { | 
| File file = new File(filename); | 
| file.createSync(); | 
| List<int> buffer = content.charCodes; | 
| -    OutputStream outStream = file.openOutputStream(); | 
| -    outStream.writeString("abcdABCD"); | 
| -    outStream.writeString("abcdABCD", Encoding.UTF_8); | 
| -    outStream.writeString("abcdABCD", Encoding.ISO_8859_1); | 
| -    outStream.writeString("abcdABCD", Encoding.ASCII); | 
| -    outStream.writeString("æøå", Encoding.UTF_8); | 
| -    outStream.onNoPendingWrites = () { | 
| -      outStream.close(); | 
| -      outStream.onClosed = () { | 
| -        RandomAccessFile raf = file.openSync(); | 
| -        Expect.equals(38, raf.lengthSync()); | 
| -        raf.close().then((ignore) { | 
| -          asyncTestDone("testOutputStreamWriteString"); | 
| -        }); | 
| -      }; | 
| -    }; | 
| +    var output = file.openWrite(); | 
| +    output.addString("abcdABCD"); | 
| +    output.addString("abcdABCD", Encoding.UTF_8); | 
| +    output.addString("abcdABCD", Encoding.ISO_8859_1); | 
| +    output.addString("abcdABCD", Encoding.ASCII); | 
| +    output.addString("æøå", Encoding.UTF_8); | 
| +    output.close(); | 
| +    output.done.then((_) { | 
| +      RandomAccessFile raf = file.openSync(); | 
| +      Expect.equals(38, raf.lengthSync()); | 
| +      raf.close().then((ignore) { | 
| +        asyncTestDone("testOutputStreamWriteString"); | 
| +      }); | 
| +    }); | 
| asyncTestStarted(); | 
| } | 
|  | 
| @@ -846,18 +749,13 @@ class FileTest { | 
| File file = | 
| new File(tempDirectory.path.concat("/out_close_exception_stream")); | 
| file.createSync(); | 
| -    InputStream input = file.openInputStream(); | 
| -    input.onClosed = () { | 
| -      Expect.isTrue(input.closed); | 
| -      Expect.equals(0, input.readInto(buffer, 0, 12)); | 
| -      OutputStream output = file.openOutputStream(); | 
| -      output.close(); | 
| -      Expect.throws(() => output.writeFrom(buffer, 0, 12)); | 
| -      output.onClosed = () { | 
| -        file.deleteSync(); | 
| -        asyncTestDone("testCloseExceptionStream"); | 
| -      }; | 
| -    }; | 
| +    var output = file.openWrite(); | 
| +    output.close(); | 
| +    Expect.throws(() => output.add(buffer)); | 
| +    output.done.then((_) { | 
| +      file.deleteSync(); | 
| +      asyncTestDone("testCloseExceptionStream"); | 
| +    }); | 
| } | 
|  | 
| // Tests buffer out of bounds exception. | 
| @@ -1083,7 +981,10 @@ class FileTest { | 
| Expect.equals(6, text.length); | 
| var expected = [955, 120, 46, 32, 120, 10]; | 
| Expect.listEquals(expected, text.charCodes); | 
| -    Expect.throws(() { new File(name).readAsStringSync(Encoding.ASCII); }); | 
| +    text = new File(name).readAsStringSync(Encoding.ASCII); | 
| +    // Default replacement character is '?', char code 63. | 
| +    expected = [63, 63, 120, 46, 32, 120, 10]; | 
| +    Expect.listEquals(expected, text.charCodes); | 
| text = new File(name).readAsStringSync(Encoding.ISO_8859_1); | 
| expected = [206, 187, 120, 46, 32, 120, 10]; | 
| Expect.equals(7, text.length); | 
|  |