| Index: dart/tools/testing/dart/test_suite.dart
 | 
| diff --git a/dart/tools/testing/dart/test_suite.dart b/dart/tools/testing/dart/test_suite.dart
 | 
| index e5f33ea2685468acf4e28cf95c369b510fb244b9..62da33d43a59bdadf6f5bba6e1ab9a4c627dd930 100644
 | 
| --- a/dart/tools/testing/dart/test_suite.dart
 | 
| +++ b/dart/tools/testing/dart/test_suite.dart
 | 
| @@ -418,6 +418,8 @@ class StandardTestSuite extends TestSuite {
 | 
|     */
 | 
|    List serverList;
 | 
|  
 | 
| +  static final RegExp multiTestRegExp = new RegExp(r"/// [0-9][0-9]:(.*)");
 | 
| +
 | 
|    StandardTestSuite(Map configuration,
 | 
|                      String suiteName,
 | 
|                      Path suiteDirectory,
 | 
| @@ -1290,11 +1292,13 @@ class StandardTestSuite extends TestSuite {
 | 
|     * configurations, so it may not use [configuration].
 | 
|     */
 | 
|    static Map readOptionsFromFile(Path filePath) {
 | 
| +    if (filePath.segments().contains('co19')) {
 | 
| +      return readOptionsFromCo19File(filePath);
 | 
| +    }
 | 
|      RegExp testOptionsRegExp = new RegExp(r"// VMOptions=(.*)");
 | 
|      RegExp dartOptionsRegExp = new RegExp(r"// DartOptions=(.*)");
 | 
|      RegExp otherScriptsRegExp = new RegExp(r"// OtherScripts=(.*)");
 | 
|      RegExp packageRootRegExp = new RegExp(r"// PackageRoot=(.*)");
 | 
| -    RegExp multiTestRegExp = new RegExp(r"/// [0-9][0-9]:(.*)");
 | 
|      RegExp multiHtmlTestRegExp =
 | 
|          new RegExp(r"useHtmlIndividualConfiguration()");
 | 
|      RegExp staticTypeRegExp =
 | 
| @@ -1320,8 +1324,6 @@ class StandardTestSuite extends TestSuite {
 | 
|      List<List> result = new List<List>();
 | 
|      List<String> dartOptions;
 | 
|      String packageRoot;
 | 
| -    bool hasCompileError = contents.contains("@compile-error");
 | 
| -    bool hasRuntimeError = contents.contains("@runtime-error");
 | 
|      bool isStaticClean = false;
 | 
|  
 | 
|      Iterable<Match> matches = testOptionsRegExp.allMatches(contents);
 | 
| @@ -1401,8 +1403,8 @@ class StandardTestSuite extends TestSuite {
 | 
|      return { "vmOptions": result,
 | 
|               "dartOptions": dartOptions,
 | 
|               "packageRoot": packageRoot,
 | 
| -             "hasCompileError": hasCompileError,
 | 
| -             "hasRuntimeError": hasRuntimeError,
 | 
| +             "hasCompileError": false,
 | 
| +             "hasRuntimeError": false,
 | 
|               "isStaticClean" : isStaticClean,
 | 
|               "otherScripts": otherScripts,
 | 
|               "isMultitest": isMultitest,
 | 
| @@ -1430,6 +1432,64 @@ class StandardTestSuite extends TestSuite {
 | 
|      // may lead to reads from empty files.
 | 
|      return [vmOptions[0]];
 | 
|    }
 | 
| +
 | 
| +  /**
 | 
| +   * Read options from a co19 test file.
 | 
| +   *
 | 
| +   * The reason this is different from [readOptionsFromFile] is that
 | 
| +   * co19 is developed based on a contract which defines certain test
 | 
| +   * tags. These tags may appear unused, but should not be removed
 | 
| +   * without consulting with the co19 team.
 | 
| +   *
 | 
| +   * Also, [readOptionsFromFile] recognizes a number of additional
 | 
| +   * tags that are not appropriate for use in general tests of
 | 
| +   * conformance to the Dart language. Any Dart implementation must
 | 
| +   * pass the co19 test suite as is, and not require extra flags,
 | 
| +   * environment variables, configuration files, etc.
 | 
| +   */
 | 
| +  static Map readOptionsFromCo19File(Path filePath) {
 | 
| +    String contents = decodeUtf8(new File.fromPath(filePath).readAsBytesSync());
 | 
| +
 | 
| +    bool hasCompileError = contents.contains("@compile-error");
 | 
| +    bool hasRuntimeError = contents.contains("@runtime-error");
 | 
| +    bool hasDynamicTypeError = contents.contains("@dynamic-type-error");
 | 
| +    bool hasStaticWarning = contents.contains("@static-warning");
 | 
| +    bool isMultitest = multiTestRegExp.hasMatch(contents);
 | 
| +
 | 
| +    if (hasDynamicTypeError) {
 | 
| +      // TODO(ahe): Remove this warning when co19 no longer uses this tag.
 | 
| +
 | 
| +      // @dynamic-type-error has been replaced by tests that use
 | 
| +      // tests/co19/src/Utils/dynamic_check.dart to dynamically detect
 | 
| +      // if a test is running in checked mode or not and change its
 | 
| +      // expectations accordingly.
 | 
| +
 | 
| +      // Using stderr.writeString to avoid breaking dartc/junit_tests
 | 
| +      // which parses the output of the --list option.
 | 
| +      stderr.writeString(
 | 
| +          "\nWarning: deprecated @dynamic-type-error tag used in $filePath");
 | 
| +    }
 | 
| +
 | 
| +    return {
 | 
| +      "vmOptions": <List>[[]],
 | 
| +      "dartOptions": null,
 | 
| +      "packageRoot": null,
 | 
| +      "hasCompileError": hasCompileError,
 | 
| +      "hasRuntimeError": hasRuntimeError,
 | 
| +      "isStaticClean" : !hasStaticWarning,
 | 
| +      "otherScripts": <String>[],
 | 
| +      "isMultitest": isMultitest,
 | 
| +      "isMultiHtmlTest": false,
 | 
| +      "subtestNames": <String>[],
 | 
| +      "containsLeadingHash": false,
 | 
| +      "isolateStubs": '',
 | 
| +      "containsDomImport": false,
 | 
| +      "isLibraryDefinition": false,
 | 
| +      "containsSourceOrImport": false,
 | 
| +      "numStaticTypeAnnotations": 0,
 | 
| +      "numCompileTimeAnnotations": 0,
 | 
| +    };
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |