PRESUBMIT_test.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #!/usr/bin/env python
  2. # Copyright 2014 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. import os
  6. import re
  7. import unittest
  8. import PRESUBMIT
  9. class MockInputApi(object):
  10. def __init__(self):
  11. self.re = re
  12. self.os_path = os.path
  13. self.files = []
  14. self.is_committing = False
  15. def AffectedFiles(self):
  16. return self.files
  17. def AffectedSourceFiles(self, fn):
  18. # we'll just pretend everything is a source file for the sake of simplicity
  19. return self.files
  20. def ReadFile(self, f):
  21. return f.NewContents()
  22. class MockOutputApi(object):
  23. class PresubmitResult(object):
  24. def __init__(self, message, items=None, long_text=''):
  25. self.message = message
  26. self.items = items
  27. self.long_text = long_text
  28. class PresubmitError(PresubmitResult):
  29. def __init__(self, message, items, long_text=''):
  30. MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
  31. self.type = 'error'
  32. class PresubmitPromptWarning(PresubmitResult):
  33. def __init__(self, message, items, long_text=''):
  34. MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
  35. self.type = 'warning'
  36. class PresubmitNotifyResult(PresubmitResult):
  37. def __init__(self, message, items, long_text=''):
  38. MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
  39. self.type = 'notify'
  40. class PresubmitPromptOrNotify(PresubmitResult):
  41. def __init__(self, message, items, long_text=''):
  42. MockOutputApi.PresubmitResult.__init__(self, message, items, long_text)
  43. self.type = 'promptOrNotify'
  44. class MockFile(object):
  45. def __init__(self, local_path, new_contents):
  46. self._local_path = local_path
  47. self._new_contents = new_contents
  48. self._changed_contents = [(i + 1, l) for i, l in enumerate(new_contents)]
  49. def ChangedContents(self):
  50. return self._changed_contents
  51. def NewContents(self):
  52. return self._new_contents
  53. def LocalPath(self):
  54. return self._local_path
  55. class MockChange(object):
  56. def __init__(self, changed_files):
  57. self._changed_files = changed_files
  58. def LocalPaths(self):
  59. return self._changed_files
  60. class HistogramOffByOneTest(unittest.TestCase):
  61. # Take an input and make sure the problems found equals the expectation.
  62. def simpleCheck(self, contents, expected_errors):
  63. input_api = MockInputApi()
  64. input_api.files.append(MockFile('test.cc', contents))
  65. results = PRESUBMIT._CheckForHistogramOffByOne(input_api, MockOutputApi())
  66. if expected_errors:
  67. self.assertEqual(1, len(results))
  68. self.assertEqual(expected_errors, len(results[0].items))
  69. else:
  70. self.assertEqual(0, len(results))
  71. def testValid(self):
  72. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", kFoo, kFooMax + 1);', 0)
  73. def testValidComments(self):
  74. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", /*...*/ kFoo, /*...*/'
  75. 'kFooMax + 1);', 0)
  76. def testValidMultiLine(self):
  77. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test",\n'
  78. ' kFoo,\n'
  79. ' kFooMax + 1);', 0)
  80. def testValidMultiLineComments(self):
  81. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", // This is the name\n'
  82. ' kFoo, /* The value */\n'
  83. ' kFooMax + 1 /* The max */ );',
  84. 0)
  85. def testNoPlusOne(self):
  86. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", kFoo, kFooMax);', 1)
  87. def testInvalidWithIgnore(self):
  88. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", kFoo, kFooMax); '
  89. '// PRESUBMIT_IGNORE_UMA_MAX', 0)
  90. def testNoMax(self):
  91. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", kFoo, kFoo + 1);', 1)
  92. def testNoMaxNoPlusOne(self):
  93. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", kFoo, kFoo);', 1)
  94. def testMultipleErrors(self):
  95. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", kFoo, kFoo);\n'
  96. 'printf("hello, world!");\n'
  97. 'UMA_HISTOGRAM_ENUMERATION("test", kBar, kBarMax);', 2)
  98. def testValidAndInvalid(self):
  99. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", kFoo, kFoo);\n'
  100. 'UMA_HISTOGRAM_ENUMERATION("test", kFoo, kFooMax + 1);'
  101. 'UMA_HISTOGRAM_ENUMERATION("test", kBar, kBarMax);', 2)
  102. def testInvalidMultiLine(self):
  103. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test",\n'
  104. ' kFoo,\n'
  105. ' kFooMax + 2);', 1)
  106. def testInvalidComments(self):
  107. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", /*...*/, val, /*...*/,'
  108. 'Max);\n', 1)
  109. def testInvalidMultiLineComments(self):
  110. self.simpleCheck('UMA_HISTOGRAM_ENUMERATION("test", // This is the name\n'
  111. ' kFoo, /* The value */\n'
  112. ' kFooMax + 2 /* The max */ );',
  113. 1)
  114. class NoV4L2AggregateInitializationTest(unittest.TestCase):
  115. def testValid(self):
  116. self._testChange(['struct v4l2_format_ format;'], 0)
  117. def testInvalid(self):
  118. self._testChange(['struct v4l2_format format = {};'], 1)
  119. self._testChange([' struct v4l2_format format = {};'], 1)
  120. self._testChange([' struct std::vector<v4l2_format> format[] = {};'], 1)
  121. self._testChange([' struct std::vector<v4l2_format> format[] = {{}};'], 1)
  122. def _testChange(self, content, expected_warnings):
  123. mock_input_api = MockInputApi()
  124. mock_input_api.files.append(MockFile('test.cc', content))
  125. results = PRESUBMIT._CheckForNoV4L2AggregateInitialization(mock_input_api,
  126. MockOutputApi())
  127. if expected_warnings:
  128. self.assertEqual(1, len(results))
  129. self.assertEqual(expected_warnings, len(results[0].items))
  130. else:
  131. self.assertEqual(0, len(results))
  132. if __name__ == '__main__':
  133. unittest.main()