12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#!/usr/bin/env python
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)# found in the LICENSE file.
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)import glob
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)import json
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import os
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import re
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)import subprocess
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)import sys
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import unittest
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import PRESUBMIT
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)_TEST_DATA_DIR = 'base/test/data/presubmit'
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockInputApi(object):
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self):
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.json = json
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.re = re
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.os_path = os.path
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.python_executable = sys.executable
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.subprocess = subprocess
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.files = []
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.is_committing = False
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def AffectedFiles(self):
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self.files
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def PresubmitLocalPath(self):
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return os.path.dirname(__file__)
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def ReadFile(self, filename, mode='rU'):
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for file_ in self.files:
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      if file_.LocalPath() == filename:
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        return '\n'.join(file_.NewContents())
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    # Otherwise, file is not in our mock API.
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    raise IOError, "No such file or directory: '%s'" % filename
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockOutputApi(object):
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class PresubmitResult(object):
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def __init__(self, message, items=None, long_text=''):
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.message = message
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.items = items
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.long_text = long_text
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class PresubmitError(PresubmitResult):
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def __init__(self, message, items, long_text=''):
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.type = 'error'
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class PresubmitPromptWarning(PresubmitResult):
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def __init__(self, message, items, long_text=''):
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.type = 'warning'
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class PresubmitNotifyResult(PresubmitResult):
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    def __init__(self, message, items, long_text=''):
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      self.type = 'notify'
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class PresubmitPromptOrNotify(PresubmitResult):
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    def __init__(self, message, items, long_text=''):
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      self.type = 'promptOrNotify'
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockFile(object):
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self, local_path, new_contents):
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._local_path = local_path
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._new_contents = new_contents
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._changed_contents = [(i + 1, l) for i, l in enumerate(new_contents)]
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def ChangedContents(self):
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._changed_contents
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def NewContents(self):
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._new_contents
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def LocalPath(self):
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._local_path
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockChange(object):
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def __init__(self, changed_files):
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self._changed_files = changed_files
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def LocalPaths(self):
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return self._changed_files
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IncludeOrderTest(unittest.TestCase):
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSystemHeaderOrder(self):
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scope = [(1, '#include <csystem.h>'),
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (2, '#include <cppsystem>'),
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (3, '#include "acustom.h"')]
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    all_linenums = [linenum for (linenum, _) in scope]
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    '', all_linenums)
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(0, len(warnings))
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSystemHeaderOrderMismatch1(self):
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scope = [(10, '#include <cppsystem>'),
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (20, '#include <csystem.h>'),
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (30, '#include "acustom.h"')]
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    all_linenums = [linenum for (linenum, _) in scope]
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    '', all_linenums)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(1, len(warnings))
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('20' in warnings[0])
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSystemHeaderOrderMismatch2(self):
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scope = [(10, '#include <cppsystem>'),
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (20, '#include "acustom.h"'),
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (30, '#include <csystem.h>')]
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    all_linenums = [linenum for (linenum, _) in scope]
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    '', all_linenums)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(1, len(warnings))
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('30' in warnings[0])
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSystemHeaderOrderMismatch3(self):
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scope = [(10, '#include "acustom.h"'),
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (20, '#include <csystem.h>'),
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (30, '#include <cppsystem>')]
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    all_linenums = [linenum for (linenum, _) in scope]
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    '', all_linenums)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(2, len(warnings))
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('20' in warnings[0])
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('30' in warnings[1])
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testAlphabeticalOrderMismatch(self):
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scope = [(10, '#include <csystem.h>'),
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (15, '#include <bsystem.h>'),
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (20, '#include <cppsystem>'),
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (25, '#include <bppsystem>'),
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (30, '#include "bcustom.h"'),
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (35, '#include "acustom.h"')]
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    all_linenums = [linenum for (linenum, _) in scope]
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    '', all_linenums)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(3, len(warnings))
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('15' in warnings[0])
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('25' in warnings[1])
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('35' in warnings[2])
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSpecialFirstInclude1(self):
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include "some/path/foo.h"',
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a/header.h"']
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('some/path/foo.cc', contents)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(0, len(warnings))
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSpecialFirstInclude2(self):
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include "some/other/path/foo.h"',
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a/header.h"']
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('some/path/foo.cc', contents)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(0, len(warnings))
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSpecialFirstInclude3(self):
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include "some/path/foo.h"',
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a/header.h"']
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('some/path/foo_platform.cc', contents)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(0, len(warnings))
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSpecialFirstInclude4(self):
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include "some/path/bar.h"',
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a/header.h"']
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('some/path/foo_platform.cc', contents)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(1, len(warnings))
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('2' in warnings[0])
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testSpecialFirstInclude5(self):
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include "some/other/path/foo.h"',
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a/header.h"']
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('some/path/foo-suffix.h', contents)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(0, len(warnings))
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  def testSpecialFirstInclude6(self):
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    mock_input_api = MockInputApi()
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    contents = ['#include "some/other/path/foo_win.h"',
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                '#include <set>',
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                '#include "a/header.h"']
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    mock_file = MockFile('some/path/foo_unittest_win.h', contents)
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    self.assertEqual(0, len(warnings))
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testOrderAlreadyWrong(self):
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scope = [(1, '#include "b.h"'),
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (2, '#include "a.h"'),
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (3, '#include "c.h"')]
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    '', [3])
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(0, len(warnings))
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testConflictAdded1(self):
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scope = [(1, '#include "a.h"'),
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (2, '#include "c.h"'),
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (3, '#include "b.h"')]
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    '', [2])
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(1, len(warnings))
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('3' in warnings[0])
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testConflictAdded2(self):
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scope = [(1, '#include "c.h"'),
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (2, '#include "b.h"'),
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             (3, '#include "d.h"')]
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api,
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                    '', [2])
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(1, len(warnings))
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('2' in warnings[0])
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testIfElifElseEndif(self):
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include "e.h"',
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#define foo',
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "f.h"',
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#undef foo',
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "e.h"',
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#if foo',
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "d.h"',
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#elif bar',
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "c.h"',
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#else',
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "b.h"',
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#endif',
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a.h"']
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('', contents)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(0, len(warnings))
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  def testExcludedIncludes(self):
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    # #include <sys/...>'s can appear in any order.
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include <sys/b.h>',
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include <sys/a.h>']
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('', contents)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(0, len(warnings))
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    contents = ['#include <atlbase.h>',
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                '#include <aaa.h>']
27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    mock_file = MockFile('', contents)
27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    self.assertEqual(0, len(warnings))
27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    contents = ['#include "build/build_config.h"',
28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                '#include "aaa.h"']
28168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    mock_file = MockFile('', contents)
28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    self.assertEqual(0, len(warnings))
28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testCheckOnlyCFiles(self):
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_output_api = MockOutputApi()
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include <b.h>',
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include <a.h>']
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file_cc = MockFile('something.cc', contents)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file_h = MockFile('something.h', contents)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file_other = MockFile('something.py', contents)
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api.files = [mock_file_cc, mock_file_h, mock_file_other]
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrder(mock_input_api, mock_output_api)
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(1, len(warnings))
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(2, len(warnings[0].items))
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertEqual('promptOrNotify', warnings[0].type)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testUncheckableIncludes(self):
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include <windows.h>',
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                '#include "b.h"',
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a.h"']
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('', contents)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEqual(1, len(warnings))
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include "gpu/command_buffer/gles_autogen.h"',
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                '#include "b.h"',
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a.h"']
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('', contents)
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEqual(1, len(warnings))
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include "gl_mock_autogen.h"',
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                '#include "b.h"',
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a.h"']
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('', contents)
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEqual(1, len(warnings))
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    contents = ['#include "ipc/some_macros.h"',
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                '#include "b.h"',
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                '#include "a.h"']
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_file = MockFile('', contents)
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    warnings = PRESUBMIT._CheckIncludeOrderInFile(
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_input_api, mock_file, range(1, len(contents) + 1))
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    self.assertEqual(1, len(warnings))
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class VersionControlConflictsTest(unittest.TestCase):
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testTypicalConflict(self):
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    lines = ['<<<<<<< HEAD',
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             '  base::ScopedTempDir temp_dir_;',
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             '=======',
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             '  ScopedTempDir temp_dir_;',
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             '>>>>>>> master']
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    errors = PRESUBMIT._CheckForVersionControlConflictsInFile(
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        MockInputApi(), MockFile('some/path/foo_platform.cc', lines))
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(3, len(errors))
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('1' in errors[0])
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('3' in errors[1])
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('5' in errors[2])
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class BadExtensionsTest(unittest.TestCase):
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testBadRejFile(self):
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api.files = [
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockFile('some/path/foo.cc', ''),
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockFile('some/path/foo.cc.rej', ''),
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockFile('some/path2/bar.h.rej', ''),
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ]
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    results = PRESUBMIT._CheckPatchFiles(mock_input_api, MockOutputApi())
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(1, len(results))
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(2, len(results[0].items))
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('foo.cc.rej' in results[0].items[0])
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('bar.h.rej' in results[0].items[1])
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testBadOrigFile(self):
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api.files = [
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockFile('other/path/qux.h.orig', ''),
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockFile('other/path/qux.h', ''),
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockFile('other/path/qux.cc', ''),
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ]
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    results = PRESUBMIT._CheckPatchFiles(mock_input_api, MockOutputApi())
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(1, len(results))
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(1, len(results[0].items))
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertTrue('qux.h.orig' in results[0].items[0])
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testGoodFiles(self):
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api = MockInputApi()
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_input_api.files = [
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockFile('other/path/qux.h', ''),
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      MockFile('other/path/qux.cc', ''),
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ]
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    results = PRESUBMIT._CheckPatchFiles(mock_input_api, MockOutputApi())
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    self.assertEqual(0, len(results))
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  def testOnlyOwnersFiles(self):
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_change = MockChange([
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'some/path/OWNERS',
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      'A\Windows\Path\OWNERS',
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ])
392a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    results = PRESUBMIT.GetPreferredTryMasters(None, mock_change)
393a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    self.assertEqual({}, results)
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class InvalidOSMacroNamesTest(unittest.TestCase):
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def testInvalidOSMacroNames(self):
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    lines = ['#if defined(OS_WINDOWS)',
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             ' #elif defined(OS_WINDOW)',
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             ' # if defined(OS_MACOSX) || defined(OS_CHROME)',
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             '# else  // defined(OS_MAC)',
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             '#endif  // defined(OS_MACOS)']
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    errors = PRESUBMIT._CheckForInvalidOSMacrosInFile(
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        MockInputApi(), MockFile('some/path/foo_platform.cc', lines))
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertEqual(len(lines), len(errors))
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertTrue(':1 OS_WINDOWS' in errors[0])
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertTrue('(did you mean OS_WIN?)' in errors[0])
408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  def testValidOSMacroNames(self):
410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    lines = ['#if defined(%s)' % m for m in PRESUBMIT._VALID_OS_MACROS]
411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    errors = PRESUBMIT._CheckForInvalidOSMacrosInFile(
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        MockInputApi(), MockFile('some/path/foo_platform.cc', lines))
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    self.assertEqual(0, len(errors))
414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
416558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochclass CheckAddedDepsHaveTetsApprovalsTest(unittest.TestCase):
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  def testFilesToCheckForIncomingDeps(self):
418558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    changed_lines = [
419558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+breakpad",',
420558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+chrome/installer",',
421558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+chrome/plugin/chrome_content_plugin_client.h",',
422558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+chrome/utility/chrome_content_utility_client.h",',
423558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+chromeos/chromeos_paths.h",',
424558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+components/breakpad",',
425558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+components/nacl/common",',
426558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+content/public/browser/render_process_host.h",',
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      '"+jni/fooblat.h",',
428558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+grit",  # For generated headers',
429558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+grit/generated_resources.h",',
430558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+grit/",',
431558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+policy",  # For generated headers and source',
432558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+sandbox",',
433558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+tools/memory_watcher",',
434558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      '"+third_party/lss/linux_syscall_support.h",',
435558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    ]
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    files_to_check = PRESUBMIT._FilesToCheckForIncomingDeps(re, changed_lines)
437558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    expected = set([
438558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      'breakpad/DEPS',
439558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      'chrome/installer/DEPS',
4405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'chrome/plugin/chrome_content_plugin_client.h',
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'chrome/utility/chrome_content_utility_client.h',
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'chromeos/chromeos_paths.h',
443558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      'components/breakpad/DEPS',
444558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      'components/nacl/common/DEPS',
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'content/public/browser/render_process_host.h',
446558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      'policy/DEPS',
447558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      'sandbox/DEPS',
448558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch      'tools/memory_watcher/DEPS',
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      'third_party/lss/linux_syscall_support.h',
450558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    ])
451558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    self.assertEqual(expected, files_to_check);
452558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
453558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class JSONParsingTest(unittest.TestCase):
45546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def testSuccess(self):
45646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api = MockInputApi()
45746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    filename = 'valid_json.json'
45846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    contents = ['// This is a comment.',
45946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '{',
46046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  "key1": ["value1", "value2"],',
46146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  "key2": 3  // This is an inline comment.',
46246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '}'
46346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                ]
46446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api.files = [MockFile(filename, contents)]
46546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertEqual(None,
46646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     PRESUBMIT._GetJSONParseError(input_api, filename))
46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
46846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def testFailure(self):
46946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api = MockInputApi()
47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    test_data = [
47146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_json_1.json',
47246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['{ x }'],
473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       'Expecting property name:'),
47446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_json_2.json',
47546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['// Hello world!',
47646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '{ "hello": "world }'],
477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       'Unterminated string starting at:'),
47846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_json_3.json',
47946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['{ "a": "b", "c": "d", }'],
480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       'Expecting property name:'),
48146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_json_4.json',
48246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['{ "a": "b" "c": "d" }'],
483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)       'Expecting , delimiter:'),
48446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ]
48546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
48646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api.files = [MockFile(filename, contents)
48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       for (filename, contents, _) in test_data]
48846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
48946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (filename, _, expected_error) in test_data:
49046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      actual_error = PRESUBMIT._GetJSONParseError(input_api, filename)
491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      self.assertTrue(expected_error in str(actual_error),
492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      "'%s' not found in '%s'" % (expected_error, actual_error))
49346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
49446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def testNoEatComments(self):
49546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api = MockInputApi()
49646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    file_with_comments = 'file_with_comments.json'
49746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    contents_with_comments = ['// This is a comment.',
49846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                              '{',
49946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                              '  "key1": ["value1", "value2"],',
50046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                              '  "key2": 3  // This is an inline comment.',
50146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                              '}'
50246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                              ]
50346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    file_without_comments = 'file_without_comments.json'
50446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    contents_without_comments = ['{',
50546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 '  "key1": ["value1", "value2"],',
50646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 '  "key2": 3',
50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 '}'
50846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                 ]
50946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api.files = [MockFile(file_with_comments, contents_with_comments),
51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       MockFile(file_without_comments,
51146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                contents_without_comments)]
51246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
51346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertEqual('No JSON object could be decoded',
51446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     str(PRESUBMIT._GetJSONParseError(input_api,
51546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                      file_with_comments,
51646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                      eat_comments=False)))
51746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertEqual(None,
51846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     PRESUBMIT._GetJSONParseError(input_api,
51946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                  file_without_comments,
52046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                                  eat_comments=False))
52146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
52246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
52346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class IDLParsingTest(unittest.TestCase):
52446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def testSuccess(self):
52546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api = MockInputApi()
52646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    filename = 'valid_idl_basics.idl'
52746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    contents = ['// Tests a valid IDL file.',
52846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                'namespace idl_basics {',
52946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  enum EnumType {',
53046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    name1,',
53146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    name2',
53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  };',
53346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '',
53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  dictionary MyType1 {',
53546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    DOMString a;',
53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  };',
53746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '',
53846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  callback Callback1 = void();',
53946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  callback Callback2 = void(long x);',
54046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  callback Callback3 = void(MyType1 arg);',
54146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  callback Callback4 = void(EnumType type);',
54246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '',
54346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  interface Functions {',
54446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void function1();',
54546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void function2(long x);',
54646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void function3(MyType1 arg);',
54746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void function4(Callback1 cb);',
54846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void function5(Callback2 cb);',
54946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void function6(Callback3 cb);',
55046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void function7(Callback4 cb);',
55146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  };',
55246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '',
55346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  interface Events {',
55446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void onFoo1();',
55546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void onFoo2(long x);',
55646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void onFoo2(MyType1 arg);',
55746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '    static void onFoo3(EnumType type);',
55846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '  };',
55946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                '};'
56046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                ]
56146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api.files = [MockFile(filename, contents)]
56246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    self.assertEqual(None,
56346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                     PRESUBMIT._GetIDLParseError(input_api, filename))
56446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
56546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  def testFailure(self):
56646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api = MockInputApi()
56746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    test_data = [
56846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_idl_1.idl',
56946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['//',
57046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'namespace test {',
57146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  dictionary {',
57246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '    DOMString s;',
57346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  };',
57446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '};'],
57546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       'Unexpected "{" after keyword "dictionary".\n'),
57646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      # TODO(yoz): Disabled because it causes the IDL parser to hang.
57746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      # See crbug.com/363830.
57846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      # ('invalid_idl_2.idl',
57946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      #  (['namespace test {',
58046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      #    '  dictionary MissingSemicolon {',
58146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      #    '    DOMString a',
58246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      #    '    DOMString b;',
58346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      #    '  };',
58446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      #    '};'],
58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      #   'Unexpected symbol DOMString after symbol a.'),
58646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_idl_3.idl',
58746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['//',
58846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'namespace test {',
58946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  enum MissingComma {',
59046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '    name1',
59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '    name2',
59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  };',
59346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '};'],
59446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       'Unexpected symbol name2 after symbol name1.'),
59546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_idl_4.idl',
59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['//',
59746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'namespace test {',
59846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  enum TrailingComma {',
59946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '    name1,',
60046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '    name2,',
60146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  };',
60246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '};'],
60346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       'Trailing comma in block.'),
60446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_idl_5.idl',
60546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['//',
60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'namespace test {',
60746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  callback Callback1 = void(;',
60846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '};'],
60946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       'Unexpected ";" after "(".'),
61046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_idl_6.idl',
61146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['//',
61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'namespace test {',
61346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  callback Callback1 = void(long );',
61446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '};'],
61546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       'Unexpected ")" after symbol long.'),
61646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_idl_7.idl',
61746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['//',
61846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'namespace test {',
61946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  interace Events {',
62046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '    static void onFoo1();',
62146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  };',
62246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '};'],
62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       'Unexpected symbol Events after symbol interace.'),
62446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_idl_8.idl',
62546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['//',
62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'namespace test {',
62746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  interface NotEvent {',
62846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '    static void onFoo1();',
62946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  };',
63046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '};'],
63146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       'Did not process Interface Interface(NotEvent)'),
63246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ('invalid_idl_9.idl',
63346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       ['//',
63446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        'namespace test {',
63546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  interface {',
63646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '    static void function1();',
63746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '  };',
63846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        '};'],
63946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       'Interface missing name.'),
64046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ]
64146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
64246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    input_api.files = [MockFile(filename, contents)
64346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       for (filename, contents, _) in test_data]
64446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
64546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    for (filename, _, expected_error) in test_data:
64646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      actual_error = PRESUBMIT._GetIDLParseError(input_api, filename)
64746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      self.assertTrue(expected_error in str(actual_error),
64846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                      "'%s' not found in '%s'" % (expected_error, actual_error))
64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)if __name__ == '__main__':
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  unittest.main()
653