def testNoEatComments(self): input_api = MockInputApi() file_with_comments = 'file_with_comments.json' contents_with_comments = ['// This is a comment.', '{', ' "key1": ["value1", "value2"],', ' "key2": 3 // This is an inline comment.', '}' ] file_without_comments = 'file_without_comments.json' contents_without_comments = ['{', ' "key1": ["value1", "value2"],', ' "key2": 3', '}' ] input_api.files = [MockFile(file_with_comments, contents_with_comments), MockFile(file_without_comments, contents_without_comments)] self.assertEqual('No JSON object could be decoded', str(PRESUBMIT._GetJSONParseError(input_api, file_with_comments, eat_comments=False))) self.assertEqual(None, PRESUBMIT._GetJSONParseError(input_api, file_without_comments, eat_comments=False))
def testUncheckableIncludes(self): mock_input_api = MockInputApi() contents = ['#include <windows.h>', '#include "b.h"', '#include "a.h"'] mock_file = MockFile('', contents) warnings = PRESUBMIT._CheckIncludeOrderInFile( mock_input_api, mock_file, range(1, len(contents) + 1)) self.assertEqual(1, len(warnings)) contents = ['#include "gpu/command_buffer/gles_autogen.h"', '#include "b.h"', '#include "a.h"'] mock_file = MockFile('', contents) warnings = PRESUBMIT._CheckIncludeOrderInFile( mock_input_api, mock_file, range(1, len(contents) + 1)) self.assertEqual(1, len(warnings)) contents = ['#include "gl_mock_autogen.h"', '#include "b.h"', '#include "a.h"'] mock_file = MockFile('', contents) warnings = PRESUBMIT._CheckIncludeOrderInFile( mock_input_api, mock_file, range(1, len(contents) + 1)) self.assertEqual(1, len(warnings)) contents = ['#include "ipc/some_macros.h"', '#include "b.h"', '#include "a.h"'] mock_file = MockFile('', contents) warnings = PRESUBMIT._CheckIncludeOrderInFile( mock_input_api, mock_file, range(1, len(contents) + 1)) self.assertEqual(1, len(warnings))
def testChangesMatch_LineIsSubstring(self): af = FakeAffectedFile(changed_contents=[(1, 'foo'), (2, 'bar')]) af_plus = FakeAffectedFile(changed_contents=[(6, 'foo'), (9, '<b>bar</b>')]) # The generated file (first arg) can have extra formatting. self.assertTrue(PRESUBMIT._ChangesMatch(af_plus, af)) # But not the static file (second arg). self.assertFalse(PRESUBMIT._ChangesMatch(af, af_plus))
def testChangesMatch_DifferentLength(self): af = FakeAffectedFile(changed_contents=[(14, 'bar'), (15, 'qxxy')]) af_extra = FakeAffectedFile(changed_contents=[(1, 'foo'), (14, 'bar'), (23, 'baz'), (25, 'qxxy')]) # The generated file (first arg) may have extra lines. self.assertTrue(PRESUBMIT._ChangesMatch(af_extra, af)) # But not the static file (second arg). self.assertFalse(PRESUBMIT._ChangesMatch(af, af_extra))
def testNoDeprecatedCompiledResourcsGYP(self): mock_input_api = MockInputApi() mock_input_api.files = [MockFile("some/js/compiled_resources.gyp", [])] errors = PRESUBMIT._CheckNoDeprecatedCompiledResourcesGYP(mock_input_api, MockOutputApi()) self.assertEquals(1, len(errors)) mock_input_api.files = [MockFile("some/js/compiled_resources2.gyp", [])] errors = PRESUBMIT._CheckNoDeprecatedCompiledResourcesGYP(mock_input_api, MockOutputApi()) self.assertEquals(0, len(errors))
def testChangesMatch_DuplicateLines(self): af = FakeAffectedFile(changed_contents=[(1, 'foo'), (2, 'bar')]) af_dups = FakeAffectedFile(changed_contents=[(7, 'foo'), (8, 'foo'), (9, 'bar')]) # Duplciate lines in the generated file (first arg) will be ignored # like extra lines. self.assertTrue(PRESUBMIT._ChangesMatch(af_dups, af)) # Duplicate lines in static file (second arg) must each have a matching # line in the generated file. self.assertFalse(PRESUBMIT._ChangesMatch(af, af_dups))
def testAlternateFilePath(self): path = os.path.normpath('foo/bar/baz.html') alt_dir = os.path.normpath('woop/dee/doo') self.assertPathsEqual('woop/dee/doo/baz.html', PRESUBMIT._AlternateFilePath(path, alt_dir, self.input_api)) alt_dir = 'foo' self.assertPathsEqual('foo/baz.html', PRESUBMIT._AlternateFilePath(path, alt_dir, self.input_api)) alt_dir = '' self.assertPathsEqual('baz.html', PRESUBMIT._AlternateFilePath(path, alt_dir, self.input_api))
def testSingletonInCC(self): diff_cc = ['Foo* foo = Singleton<Foo>::get();'] mock_input_api = MockInputApi() mock_input_api.files = [MockAffectedFile('some/path/foo.cc', diff_cc)] warnings = PRESUBMIT._CheckSingletonInHeaders(mock_input_api, MockOutputApi()) self.assertEqual(0, len(warnings))
def testTypicalNotMatchedChange(self): diff_cc = ['UMA_HISTOGRAM_BOOL("Bla.Foo.Dummy", true)'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile("some/path/foo.cc", diff_cc)] warnings = PRESUBMIT._CheckUmaHistogramChanges(mock_input_api, MockOutputApi()) self.assertEqual(1, len(warnings)) self.assertEqual("warning", warnings[0].type)
def testCheckAndroidTestAnnotationUsage(self): mock_input_api = MockInputApi() mock_output_api = MockOutputApi() mock_input_api.files = [ MockAffectedFile('LalaLand.java', [ 'random stuff' ]), MockAffectedFile('CorrectUsage.java', [ 'import org.junit.ABC', 'import org.junit.XYZ;', ]), MockAffectedFile('UsedDeprecatedJUnit.java', [ 'import junit.framework.*;', ]), MockAffectedFile('UsedDeprecatedJUnitAssert.java', [ 'import junit.framework.Assert;', ]), ] msgs = PRESUBMIT._CheckAndroidTestJUnitFrameworkImport( mock_input_api, mock_output_api) self.assertEqual(1, len(msgs), 'Expected %d items, found %d: %s' % (1, len(msgs), msgs)) self.assertEqual(2, len(msgs[0].items), 'Expected %d items, found %d: %s' % (2, len(msgs[0].items), msgs[0].items)) self.assertTrue('UsedDeprecatedJUnit.java:1' in msgs[0].items, 'UsedDeprecatedJUnit.java not found in errors') self.assertTrue('UsedDeprecatedJUnitAssert.java:1' in msgs[0].items, 'UsedDeprecatedJUnitAssert not found in errors')
def testExcludedIncludes(self): # #include <sys/...>'s can appear in any order. mock_input_api = MockInputApi() contents = ['#include <sys/b.h>', '#include <sys/a.h>'] mock_file = MockFile('', contents) warnings = PRESUBMIT._CheckIncludeOrderInFile( mock_input_api, mock_file, range(1, len(contents) + 1)) self.assertEqual(0, len(warnings)) contents = ['#include "build/build_config.h"', '#include "aaa.h"'] mock_file = MockFile('', contents) warnings = PRESUBMIT._CheckIncludeOrderInFile( mock_input_api, mock_file, range(1, len(contents) + 1)) self.assertEqual(0, len(warnings))
def testSucess(self): lines = ['xmlns:app="http://schemas.android.com/apk/res-auto"'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile('chrome/path/file.xml', lines)] errors = PRESUBMIT._CheckXmlNamespacePrefixes( mock_input_api, MockOutputApi()) self.assertEqual(0, len(errors))
def testSucess(self): lines = ['<color name="color1">#61000000</color>', '<color name="color1">#FFFFFF</color>'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile('chrome/path/colors.xml', lines)] errors = PRESUBMIT._CheckDuplicateColors(mock_input_api, MockOutputApi()) self.assertEqual(0, len(errors))
def testExternalReferenceInEDKBuildFile(self): """Tests that an external path in an EDK buildfile is not flagged.""" mock_input_api = self.inputApiContainingFileWithPaths( _EDK_BUILD_FILE, [ self.non_whitelisted_external_path, self.whitelisted_external_path ]) warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi()) self.assertEqual(0, len(warnings))
def testFailure_Style(self): lines = [ '<resource>', '<style name="TestTextAppearance">', '<item name="android:textColor">@color/default_text_color_link</item>', '<item name="android:textSize">14sp</item>', '<item name="android:textStyle">bold</item>', '<item name="android:fontFamily">some-font</item>', '<item name="android:textAllCaps">true</item>', '</style>', '</resource>'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile('chrome/path/test.xml', lines)] errors = PRESUBMIT._CheckTextAppearance(mock_input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertEqual(5, len(errors[0].items)) self.assertEqual( ' chrome/path/test.xml:2 contains attribute android:textColor', errors[0].items[0].splitlines()[0]) self.assertEqual( ' chrome/path/test.xml:2 contains attribute android:textSize', errors[0].items[1].splitlines()[0]) self.assertEqual( ' chrome/path/test.xml:2 contains attribute android:textStyle', errors[0].items[2].splitlines()[0]) self.assertEqual( ' chrome/path/test.xml:2 contains attribute android:fontFamily', errors[0].items[3].splitlines()[0]) self.assertEqual( ' chrome/path/test.xml:2 contains attribute android:textAllCaps', errors[0].items[4].splitlines()[0])
def testFailure(self): input_api = MockInputApi() test_data = [ ('invalid_json_1.json', ['{ x }'], 'Expecting property name:'), ('invalid_json_2.json', ['// Hello world!', '{ "hello": "world }'], 'Unterminated string starting at:'), ('invalid_json_3.json', ['{ "a": "b", "c": "d", }'], 'Expecting property name:'), ('invalid_json_4.json', ['{ "a": "b" "c": "d" }'], 'Expecting , delimiter:'), ] input_api.files = [MockFile(filename, contents) for (filename, contents, _) in test_data] for (filename, _, expected_error) in test_data: actual_error = PRESUBMIT._GetJSONParseError(input_api, filename) self.assertTrue(expected_error in str(actual_error), "'%s' not found in '%s'" % (expected_error, actual_error))
def testFilesToCheckForIncomingDeps(self): changed_lines = [ '"+breakpad",', '"+chrome/installer",', '"+chrome/plugin/chrome_content_plugin_client.h",', '"+chrome/utility/chrome_content_utility_client.h",', '"+chromeos/chromeos_paths.h",', '"+components/crash",', '"+components/nacl/common",', '"+content/public/browser/render_process_host.h",', '"+jni/fooblat.h",', '"+grit", # For generated headers', '"+grit/generated_resources.h",', '"+grit/",', '"+policy", # For generated headers and source', '"+sandbox",', '"+tools/memory_watcher",', '"+third_party/lss/linux_syscall_support.h",', ] files_to_check = PRESUBMIT._FilesToCheckForIncomingDeps(re, changed_lines) expected = set([ 'breakpad/DEPS', 'chrome/installer/DEPS', 'chrome/plugin/chrome_content_plugin_client.h', 'chrome/utility/chrome_content_utility_client.h', 'chromeos/chromeos_paths.h', 'components/crash/DEPS', 'components/nacl/common/DEPS', 'content/public/browser/render_process_host.h', 'policy/DEPS', 'sandbox/DEPS', 'tools/memory_watcher/DEPS', 'third_party/lss/linux_syscall_support.h', ]) self.assertEqual(expected, files_to_check);
def testValidReference(self): lines = ['<TextView', 'android:textColor="@color/color1" />'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile('chrome/path/test.xml', lines)] errors = PRESUBMIT._CheckColorReferences(mock_input_api, MockOutputApi()) self.assertEqual(0, len(errors))
def calculate(self, old_include_rules, old_specific_include_rules, new_include_rules, new_specific_include_rules): return PRESUBMIT._CalculateAddedDeps( os.path, 'include_rules = %r\nspecific_include_rules = %r' % ( old_include_rules, old_specific_include_rules), 'include_rules = %r\nspecific_include_rules = %r' % ( new_include_rules, new_specific_include_rules))
def testSystemHeaderOrderMismatch2(self): scope = [(10, "#include <cppsystem>"), (20, '#include "acustom.h"'), (30, "#include <csystem.h>")] all_linenums = [linenum for (linenum, _) in scope] mock_input_api = MockInputApi() warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api, "", all_linenums) self.assertEqual(1, len(warnings)) self.assertTrue("30" in warnings[0])
def testSpecialFirstInclude4(self): mock_input_api = MockInputApi() contents = ['#include "some/path/bar.h"', '#include "a/header.h"'] mock_file = MockFile("some/path/foo_platform.cc", contents) warnings = PRESUBMIT._CheckIncludeOrderInFile(mock_input_api, mock_file, range(1, len(contents) + 1)) self.assertEqual(1, len(warnings)) self.assertTrue("2" in warnings[0])
def testIrrelevantBuildFile(self): """Tests that a source_set in a non-SDK/EDK buildfile isn't flagged.""" mock_input_api = self.inputApiContainingFileWithSourceSets( _IRRELEVANT_BUILD_FILE, [ 'source_set(' ]) warnings = PRESUBMIT._BuildFileChecks(mock_input_api, MockOutputApi()) self.assertEqual(0, len(warnings))
def testChangesMatch_SkipEmptyLinesInStaticFile(self): generated_file = FakeAffectedFile(changed_contents=[(1, 'foo'), (14, 'bar')]) static_file = FakeAffectedFile(changed_contents=[(1, 'foo'), (2, ''), (14, 'bar')]) self.assertTrue(PRESUBMIT._ChangesMatch(generated_file, static_file))
def testGoodFiles(self): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('other/path/qux.h', ''), MockFile('other/path/qux.cc', ''), ] results = PRESUBMIT._CheckPatchFiles(mock_input_api, MockOutputApi()) self.assertEqual(0, len(results))
def testColorFormatIgnoredFile(self): lines = ['<color name="color1">#61000000</color>', '<color name="color2">#FFFFFF</color>', '<color name="color3">#CCC</color>'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile('chrome/path/test.java', lines)] errors = PRESUBMIT._CheckColorFormat(mock_input_api, MockOutputApi()) self.assertEqual(0, len(errors))
def testOrderAlreadyWrong(self): scope = [(1, '#include "b.h"'), (2, '#include "a.h"'), (3, '#include "c.h"')] mock_input_api = MockInputApi() warnings = PRESUBMIT._CheckIncludeOrderForScope(scope, mock_input_api, '', [3]) self.assertEqual(0, len(warnings))
def testArrowsAllowedInChromeCode(self): mock_input_api = MockInputApi() mock_input_api.files = [ MockAffectedFile('chrome/browser/resources/blah.js', 'arrow => OK here'), ] warnings = PRESUBMIT._CheckForRiskyJsFeatures( mock_input_api, MockOutputApi()) self.assertEqual(0, len(warnings))
def testChromeDoesNotUseOSIOS(self): lines = ['#if defined(OS_IOS)', '#error OS_IOS not allowed', '#endif'] errors = PRESUBMIT._CheckNoOSIOSMacrosInChromeFile( MockInputApi(), MockFile('chrome/path/foo_platform.cc', lines)) self.assertEqual(1, len(errors)) self.assertEqual(' chrome/path/foo_platform.cc:1', errors[0])
def testUserMetricsActionInActions(self): input_api = MockInputApi() file_with_user_action = "file_with_user_action.cc" contents_with_user_action = ['base::UserMetricsAction("AboutChrome")'] input_api.files = [MockFile(file_with_user_action, contents_with_user_action)] self.assertEqual([], PRESUBMIT._CheckUserActionUpdate(input_api, MockOutputApi()))
def testSpecialFirstInclude2(self): mock_input_api = MockInputApi() contents = ['#include "some/other/path/foo.h"', '#include "a/header.h"'] mock_file = MockFile('some/path/foo.cc', contents) warnings = PRESUBMIT._CheckIncludeOrderInFile( mock_input_api, mock_file, range(1, len(contents) + 1)) self.assertEqual(0, len(warnings))
def testTryServerMasters(self): bots = { 'master.tryserver.chromium.android': [ 'android_archive_rel_ng', 'android_arm64_dbg_recipe', 'android_blink_rel', 'android_chromium_variable', 'android_chromium_variable_archive', 'android_chromium_variable_arm64', 'android_chromium_variable_cast_shell', 'android_chromium_variable_clang', 'android_chromium_variable_gn', 'android_chromium_variable_nexus4', 'android_clang_dbg_recipe', 'android_compile_dbg', 'android_compile_mips_dbg', 'android_compile_x64_dbg', 'android_compile_x86_dbg', 'android_coverage', 'android_cronet_tester' 'android_swarming_rel', 'cast_shell_android', 'linux_android_dbg_ng', 'linux_android_rel_ng', ], 'master.tryserver.chromium.mac': [ 'ios_dbg_simulator', 'ios_rel_device', 'ios_rel_device_ninja', 'mac_asan', 'mac_asan_64', 'mac_chromium_compile_dbg', 'mac_chromium_compile_rel', 'mac_chromium_dbg', 'mac_chromium_rel', 'mac_nacl_sdk', 'mac_nacl_sdk_build', 'mac_rel_naclmore', 'mac_x64_rel', 'mac_xcodebuild', ], 'master.tryserver.chromium.linux': [ 'chromium_presubmit', 'linux_arm_cross_compile', 'linux_arm_tester', 'linux_chromeos_asan', 'linux_chromeos_browser_asan', 'linux_chromeos_valgrind', 'linux_chromium_chromeos_dbg', 'linux_chromium_chromeos_rel', 'linux_chromium_compile_dbg', 'linux_chromium_compile_rel', 'linux_chromium_dbg', 'linux_chromium_gn_dbg', 'linux_chromium_gn_rel', 'linux_chromium_rel', 'linux_chromium_trusty32_dbg', 'linux_chromium_trusty32_rel', 'linux_chromium_trusty_dbg', 'linux_chromium_trusty_rel', 'linux_clang_tsan', 'linux_ecs_ozone', 'linux_layout', 'linux_layout_asan', 'linux_layout_rel', 'linux_layout_rel_32', 'linux_nacl_sdk', 'linux_nacl_sdk_bionic', 'linux_nacl_sdk_bionic_build', 'linux_nacl_sdk_build', 'linux_redux', 'linux_rel_naclmore', 'linux_rel_precise32', 'linux_valgrind', 'tools_build_presubmit', ], 'master.tryserver.chromium.win': [ 'win8_aura', 'win8_chromium_dbg', 'win8_chromium_rel', 'win_chromium_compile_dbg', 'win_chromium_compile_rel', 'win_chromium_dbg', 'win_chromium_rel', 'win_chromium_rel', 'win_chromium_x64_dbg', 'win_chromium_x64_rel', 'win_nacl_sdk', 'win_nacl_sdk_build', 'win_rel_naclmore', ], } for master, bots in bots.iteritems(): for bot in bots: self.assertEqual( master, PRESUBMIT.GetTryServerMasterForBot(bot), 'bot=%s: expected %s, computed %s' % (bot, master, PRESUBMIT.GetTryServerMasterForBot(bot)))
def testValidOSMacroNames(self): lines = ['#if defined(%s)' % m for m in PRESUBMIT._VALID_OS_MACROS] errors = PRESUBMIT._CheckForInvalidOSMacrosInFile( MockInputApi(), MockFile('some/path/foo_platform.cc', lines)) self.assertEqual(0, len(errors))
def testCheckAndroidCrLogUsage(self): mock_input_api = MockInputApi() mock_output_api = MockOutputApi() mock_input_api.files = [ MockAffectedFile('RandomStuff.java', ['random stuff']), MockAffectedFile('HasAndroidLog.java', [ 'import android.util.Log;', 'some random stuff', 'Log.d("TAG", "foo");', ]), MockAffectedFile('HasExplicitUtilLog.java', [ 'some random stuff', 'android.util.Log.d("TAG", "foo");', ]), MockAffectedFile('IsInBasePackage.java', [ 'package org.chromium.base;', 'private static final String TAG = "cr_Foo";', 'Log.d(TAG, "foo");', ]), MockAffectedFile('IsInBasePackageButImportsLog.java', [ 'package org.chromium.base;', 'import android.util.Log;', 'private static final String TAG = "cr_Foo";', 'Log.d(TAG, "foo");', ]), MockAffectedFile('HasBothLog.java', [ 'import org.chromium.base.Log;', 'some random stuff', 'private static final String TAG = "cr_Foo";', 'Log.d(TAG, "foo");', 'android.util.Log.d("TAG", "foo");', ]), MockAffectedFile('HasCorrectTag.java', [ 'import org.chromium.base.Log;', 'some random stuff', 'private static final String TAG = "cr_Foo";', 'Log.d(TAG, "foo");', ]), MockAffectedFile('HasOldTag.java', [ 'import org.chromium.base.Log;', 'some random stuff', 'private static final String TAG = "cr.Foo";', 'Log.d(TAG, "foo");', ]), MockAffectedFile('HasDottedTag.java', [ 'import org.chromium.base.Log;', 'some random stuff', 'private static final String TAG = "cr_foo.bar";', 'Log.d(TAG, "foo");', ]), MockAffectedFile('HasNoTagDecl.java', [ 'import org.chromium.base.Log;', 'some random stuff', 'Log.d(TAG, "foo");', ]), MockAffectedFile('HasIncorrectTagDecl.java', [ 'import org.chromium.base.Log;', 'private static final String TAHG = "cr_Foo";', 'some random stuff', 'Log.d(TAG, "foo");', ]), MockAffectedFile('HasInlineTag.java', [ 'import org.chromium.base.Log;', 'some random stuff', 'private static final String TAG = "cr_Foo";', 'Log.d("TAG", "foo");', ]), MockAffectedFile('HasUnprefixedTag.java', [ 'import org.chromium.base.Log;', 'some random stuff', 'private static final String TAG = "rubbish";', 'Log.d(TAG, "foo");', ]), MockAffectedFile('HasTooLongTag.java', [ 'import org.chromium.base.Log;', 'some random stuff', 'private static final String TAG = "21_charachers_long___";', 'Log.d(TAG, "foo");', ]), ] msgs = PRESUBMIT._CheckAndroidCrLogUsage(mock_input_api, mock_output_api) self.assertEqual( 5, len(msgs), 'Expected %d items, found %d: %s' % (5, len(msgs), msgs)) # Declaration format nb = len(msgs[0].items) self.assertEqual( 2, nb, 'Expected %d items, found %d: %s' % (2, nb, msgs[0].items)) self.assertTrue('HasNoTagDecl.java' in msgs[0].items) self.assertTrue('HasIncorrectTagDecl.java' in msgs[0].items) # Tag length nb = len(msgs[1].items) self.assertEqual( 1, nb, 'Expected %d items, found %d: %s' % (1, nb, msgs[1].items)) self.assertTrue('HasTooLongTag.java' in msgs[1].items) # Tag must be a variable named TAG nb = len(msgs[2].items) self.assertEqual( 1, nb, 'Expected %d items, found %d: %s' % (1, nb, msgs[2].items)) self.assertTrue('HasInlineTag.java:4' in msgs[2].items) # Util Log usage nb = len(msgs[3].items) self.assertEqual( 2, nb, 'Expected %d items, found %d: %s' % (2, nb, msgs[3].items)) self.assertTrue('HasAndroidLog.java:3' in msgs[3].items) self.assertTrue('IsInBasePackageButImportsLog.java:4' in msgs[3].items) # Tag must not contain nb = len(msgs[4].items) self.assertEqual( 2, nb, 'Expected %d items, found %d: %s' % (2, nb, msgs[4].items)) self.assertTrue('HasDottedTag.java' in msgs[4].items) self.assertTrue('HasOldTag.java' in msgs[4].items)
def _RunCheck(self): return PRESUBMIT._CheckPydepsNeedsUpdating( self.mock_input_api, self.mock_output_api, checker_for_tests=self.checker)