| Index: PRESUBMIT.py | 
| diff --git a/PRESUBMIT.py b/PRESUBMIT.py | 
| index 870062aee77e3a2c1a993c72af29792eac00e702..64d30c320755f00223435e713ae9d0f3a8ae9a29 100644 | 
| --- a/PRESUBMIT.py | 
| +++ b/PRESUBMIT.py | 
| @@ -10,18 +10,19 @@ for more details about the presubmit API built into gcl. | 
|  | 
| import imp | 
| import os | 
| +import os.path | 
| import scm | 
| import subprocess | 
| import tempfile | 
|  | 
| def _CheckBuildStatus(input_api, output_api): | 
| -   results = [] | 
| -   status_check = input_api.canned_checks.CheckTreeIsOpen( | 
| -       input_api, | 
| -       output_api, | 
| -       json_url='http://dart-status.appspot.com/current?format=json') | 
| -   results.extend(status_check) | 
| -   return results | 
| +  results = [] | 
| +  status_check = input_api.canned_checks.CheckTreeIsOpen( | 
| +      input_api, | 
| +      output_api, | 
| +      json_url='http://dart-status.appspot.com/current?format=json') | 
| +  results.extend(status_check) | 
| +  return results | 
|  | 
| def _CheckDartFormat(input_api, output_api): | 
| local_root = input_api.change.RepositoryRoot() | 
| @@ -96,9 +97,81 @@ def _CheckDartFormat(input_api, output_api): | 
|  | 
| return [] | 
|  | 
| +def _CheckNewTests(input_api, output_api): | 
| +  testsDirectories = [ | 
| +      #    Dart 1 tests                DDC tests | 
| +      # =================       ========================== | 
| +      ("tests/language/",       "tests/language_2/"), | 
| +      ("tests/corelib/",        "tests/corelib_2/"), | 
| +      ("tests/lib/",            "tests/lib_2/"), | 
| +      ("tests/html/",           "tests/lib_2/html/"), | 
| +  ] | 
| + | 
| +  result = [] | 
| +  # Tuples of (new Dart 1 test path, expected DDC test path) | 
| +  dart1TestsAdded = [] | 
| +  # Tuples of (original Dart test path, expected DDC test path) | 
| +  ddcTestsExists = [] | 
| +  for f in input_api.AffectedFiles(): | 
| +    for oldPath, newPath in testsDirectories: | 
| +      if f.LocalPath().startswith(oldPath): | 
| +        if f.Action() == 'A': | 
| +          # Compute where the new test should live. | 
| +          ddcTestPath = f.LocalPath().replace(oldPath, newPath) | 
| +          dart1TestsAdded.append((f.LocalPath(), ddcTestPath)) | 
| +        elif f.Action() == 'M': | 
| +          # Find all modified tests in Dart 1.0 | 
| +          filename = f.LocalPath() | 
| +          for oldPath, newPath in testsDirectories: | 
| +            if filename.find(oldPath) == 0: | 
| +              ddcTestFilePathAbs = "%s" % \ | 
| +                  f.AbsoluteLocalPath().replace(oldPath, newPath) | 
| +              if os.path.isfile(ddcTestFilePathAbs): | 
| +                #originalDart1Test.append(f.LocalPath()) | 
| +                ddcTestsExists.append((f.LocalPath(), | 
| +                    f.LocalPath().replace(oldPath, newPath))) | 
| + | 
| +  # Does a Dart 2.0 DDC test exist if so it must be changed too. | 
| +  missingDDCTestsChange = [] | 
| +  for (dartTest, ddcTest) in ddcTestsExists: | 
| +    foundDDCTestModified = False | 
| +    for f in input_api.AffectedFiles(): | 
| +      if f.LocalPath() == ddcTest: | 
| +        # Found corresponding DDC test - great. | 
| +        foundDDCTestModified = True | 
| +        break | 
| +    if not foundDDCTestModified: | 
| +      # Add the tuple (dart 1 test path, DDC test path) | 
| +      missingDDCTestsChange.append((dartTest, ddcTest)) | 
| + | 
| +  if missingDDCTestsChange: | 
| +    errorList = [] | 
| +    for idx, (orginalTest, ddcTest) in enumerate(missingDDCTestsChange): | 
| +      errorList.append( | 
| +          '%s. Dart 1.0 test changed: %s\n%s. DDC  test must change: ' \ | 
| +          '%s\n' % (idx + 1, orginalTest, idx + 1, ddcTest)) | 
| +    result.append(output_api.PresubmitError( | 
| +        'Error: If you change a Dart 1.0 test, you must also update the DDC ' | 
| +        'test:\n%s' % ''.join(errorList))) | 
| + | 
| +  if dart1TestsAdded: | 
| +    errorList = [] | 
| +    for idx, (oldTestPath, newTestPath) in enumerate(dart1TestsAdded): | 
| +      errorList.append('%s. New Dart 1.0  test: %s\n' | 
| +          '%s. Should be DDC test: %s\n' % \ | 
| +          (idx + 1, oldTestPath, idx + 1, newTestPath)) | 
| +    result.append(output_api.PresubmitError( | 
| +        'Error: New Dart 1.0 test can not be added the test must be added as ' | 
| +        'a DDC test:\n' | 
| +        'Fix tests:\n%s' % ''.join(errorList))) | 
| + | 
| +  return result | 
| + | 
| def CheckChangeOnCommit(input_api, output_api): | 
| return (_CheckBuildStatus(input_api, output_api) + | 
| +          _CheckNewTests(input_api, output_api) + | 
| _CheckDartFormat(input_api, output_api)) | 
|  | 
| def CheckChangeOnUpload(input_api, output_api): | 
| -  return _CheckDartFormat(input_api, output_api) | 
| +  return (_CheckNewTests(input_api, output_api) + | 
| +          _CheckDartFormat(input_api, output_api)) | 
|  |