def testCatchAnswerUrlId(self): input_api = MockInputApi() input_api.files = [ MockFile('somewhere/file.cc', [ 'char* host = ' ' "https://support.google.com/chrome/answer/123456";' ]), MockFile('somewhere_else/file.cc', [ 'char* host = ' ' "https://support.google.com/chrome/a/answer/123456";' ]), ] warnings = PRESUBMIT._CheckGoogleSupportAnswerUrl( input_api, MockOutputApi()) self.assertEqual(1, len(warnings)) self.assertEqual(2, len(warnings[0].items))
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 testValidIfDefinedMacroNames(self): lines = [ '#if defined(FOO)', '#ifdef BAR', ] errors = PRESUBMIT._CheckForInvalidIfDefinedMacrosInFile( MockInputApi(), MockFile('some/path/source.cc', lines)) self.assertEqual(0, len(errors))
def testIgnoresReadmes(self): lines = [ 'A First Level Header', '====================', '', 'A Second Level Header', '---------------------' ] errors = PRESUBMIT._CheckForVersionControlConflictsInFile( MockInputApi(), MockFile('some/polymer/README.md', lines)) self.assertEqual(0, len(errors))
def testSpecialFirstInclude3(self): mock_input_api = MockInputApi() contents = ['#include "some/path/foo.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(0, len(warnings))
def testFalsePositives(self): """Examples of when Notification.Builder should not be flagged.""" mock_input = MockInputApi() mock_input.files = [ MockFile( 'chrome/android/java/src/org/chromium/chrome/browser/notifications/' 'ChromeNotificationWrapperBuilder.java', ['new Notification.Builder()']), MockFile( 'chrome/android/java/src/org/chromium/chrome/browser/notifications/' 'ChromeNotificationWrapperCompatBuilder.java', ['new NotificationCompat.Builder()']), MockFile('path/One.java', ['Notification.Builder']), MockFile('path/Two.java', ['// do not: new Notification.Builder()']), MockFile('path/Three.java', [ '/** NotificationWrapperBuilder', ' * replaces: new Notification.Builder()' ]), MockFile('path/PRESUBMIT.py', ['new Notification.Builder()']), MockFile('path/Four.java', ['new NotificationCompat.Builder()'], action='D'), ] errors = PRESUBMIT._CheckNotificationConstructors( mock_input, MockOutputApi()) self.assertEqual(0, len(errors))
def testFailure_Widget(self): lines_top_level = [ '<TextView', 'xmlns:android="http://schemas.android.com/apk/res/android"', 'android:layout_width="match_parent"', 'android:layout_height="@dimen/snippets_article_header_height"', 'android:textColor="@color/snippets_list_header_text_color"', 'android:textSize="14sp" />' ] lines_subcomponent_widget = [ '<RelativeLayout', 'xmlns:android="http://schemas.android.com/apk/res/android"', 'android:layout_width="match_parent"', 'android:layout_height="wrap_content">', '<View', 'android:textColor="@color/error_text_color"', 'android:textSize="@dimen/text_size_medium"', 'android:textAllCaps="true"', 'android:background="@drawable/infobar_shadow_top"', 'android:visibility="gone" />', '</RelativeLayout>' ] mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('chrome/java/res_test/test1.xml', lines_top_level), MockFile('chrome/java/res_test/test2.xml', lines_subcomponent_widget) ] errors = checkxmlstyle._CheckTextAppearance(mock_input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertEqual(5, len(errors[0].items)) self.assertEqual( (' chrome/java/res_test/test1.xml:5 contains attribute ' 'android:textColor'), errors[0].items[0].splitlines()[0]) self.assertEqual( (' chrome/java/res_test/test1.xml:6 contains attribute ' 'android:textSize'), errors[0].items[1].splitlines()[0]) self.assertEqual( (' chrome/java/res_test/test2.xml:6 contains attribute ' 'android:textColor'), errors[0].items[2].splitlines()[0]) self.assertEqual( (' chrome/java/res_test/test2.xml:7 contains attribute ' 'android:textSize'), errors[0].items[3].splitlines()[0]) self.assertEqual( (' chrome/java/res_test/test2.xml:8 contains attribute ' 'android:textAllCaps'), errors[0].items[4].splitlines()[0])
def testFailure_WrongBuilderCheck(self): """Use of AppCompat AlertDialog.Builder is correctly flagged.""" mock_input = MockInputApi() mock_input.files = [ MockFile('path/One.java', [ 'import android.support.v7.app.AlertDialog;', 'new AlertDialog.Builder()' ]), MockFile('path/Two.java', [ 'import android.app.AlertDialog;', 'new AlertDialog.Builder(context);' ]), ] errors = PRESUBMIT._CheckAlertDialogBuilder(mock_input, MockOutputApi()) self.assertEqual(2, len(errors)) self.assertEqual(1, len(errors[1].items)) self.assertIn('One.java', errors[1].items[0])
def testSucess(self): lines = ['xmlns:app="http://schemas.android.com/apk/res-auto"'] mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('chrome/java/res_test/file.xml', lines) ] errors = checkxmlstyle._CheckXmlNamespacePrefixes( mock_input_api, MockOutputApi()) self.assertEqual(0, len(errors))
def testValidReference(self): lines = ['<TextView', 'android:textColor="@color/color1" />'] mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('chrome/java/res_test/test.xml', lines) ] errors = checkxmlstyle._CheckColorReferences(mock_input_api, MockOutputApi()) self.assertEqual(0, len(errors))
def testValidReferenceInColorResources(self): lines = ['<color name="color1">#61000000</color>'] mock_input_api = MockInputApi() mock_input_api.files = [ MockFile('chrome/java/res_test/colors.xml', lines) ] errors = checkxmlstyle._CheckColorReferences(mock_input_api, MockOutputApi()) self.assertEqual(0, len(errors))
def testFalsePositives(self): """Examples of when AlertDialog.Builder should not be flagged.""" mock_input = MockInputApi() mock_input.files = [ MockFile('path/One.java', ['AlertDialog.Builder']), MockFile('path/Two.java', ['// do not: new AlertDialog.Builder()']), MockFile('path/Three.java', [ '/** ChromeAlertDialogBuilder', ' * replaces: new AlertDialog.Builder()' ]), MockFile('path/PRESUBMIT.py', ['new AlertDialog.Builder()']), MockFile('path/Four.java', ['new AlertDialog.Builder()'], action='D'), ] errors = PRESUBMIT._CheckAlertDialogBuilder(mock_input, MockOutputApi()) self.assertEqual(0, len(errors))
def testSpecialFirstInclude6(self): mock_input_api = MockInputApi() contents = ['#include "some/other/path/foo_win.h"', '#include <set>', '#include "a/header.h"'] mock_file = MockFile('some/path/foo_unittest_win.h', contents) warnings = PRESUBMIT._CheckIncludeOrderInFile( mock_input_api, mock_file, range(1, len(contents) + 1)) self.assertEqual(0, len(warnings))
def testReferenceInSemanticColors(self): mock_input_api = MockInputApi() mock_input_api.files = [ MockFile( helpers.COLOR_PALETTE_PATH, ['<resources><color name="a">#f0f0f0</color></resources>']), MockFile( 'ui/android/java/res/values/semantic_colors_non_adaptive.xml', [ '<color name="b">@color/hello<color>', '<color name="c">@color/a<color>' ]), MockFile('ui/android/java/res/values/semantic_colors_adaptive.xml', ['<color name="c">@color/a<color>']) ] errors = checkxmlstyle._CheckSemanticColorsReferences( mock_input_api, MockOutputApi()) self.assertEqual(1, len(errors))
def testValidReferenceInColorResources(self): lines = ['<color name="color1">#61000000</color>'] mock_input_api = MockInputApi() mock_input_api.files = [ MockFile(helpers.COLOR_PALETTE_RELATIVE_PATH, lines) ] errors = checkxmlstyle._CheckColorReferences(mock_input_api, MockOutputApi()) self.assertEqual(0, len(errors))
def testFailure(self): input_api = MockInputApi() test_data = [ ('invalid_idl_1.idl', [ '//', 'namespace test {', ' dictionary {', ' DOMString s;', ' };', '};' ], 'Unexpected "{" after keyword "dictionary".\n'), # TODO(yoz): Disabled because it causes the IDL parser to hang. # See crbug.com/363830. # ('invalid_idl_2.idl', # (['namespace test {', # ' dictionary MissingSemicolon {', # ' DOMString a', # ' DOMString b;', # ' };', # '};'], # 'Unexpected symbol DOMString after symbol a.'), ('invalid_idl_3.idl', [ '//', 'namespace test {', ' enum MissingComma {', ' name1', ' name2', ' };', '};' ], 'Unexpected symbol name2 after symbol name1.'), ('invalid_idl_4.idl', [ '//', 'namespace test {', ' enum TrailingComma {', ' name1,', ' name2,', ' };', '};' ], 'Trailing comma in block.'), ('invalid_idl_5.idl', ['//', 'namespace test {', ' callback Callback1 = void(;', '};'], 'Unexpected ";" after "(".'), ('invalid_idl_6.idl', [ '//', 'namespace test {', ' callback Callback1 = void(long );', '};' ], 'Unexpected ")" after symbol long.'), ('invalid_idl_7.idl', [ '//', 'namespace test {', ' interace Events {', ' static void onFoo1();', ' };', '};' ], 'Unexpected symbol Events after symbol interace.'), ('invalid_idl_8.idl', [ '//', 'namespace test {', ' interface NotEvent {', ' static void onFoo1();', ' };', '};' ], 'Did not process Interface Interface(NotEvent)'), ('invalid_idl_9.idl', [ '//', 'namespace test {', ' interface {', ' static void function1();', ' };', '};' ], 'Interface missing name.'), ] input_api.files = [ MockFile(filename, contents) for (filename, contents, _) in test_data ] for (filename, _, expected_error) in test_data: actual_error = PRESUBMIT._GetIDLParseError(input_api, filename) self.assertTrue( expected_error in str(actual_error), "'%s' not found in '%s'" % (expected_error, actual_error))
def testInvalidReference(self): lines = ['<TextView', 'android:textColor="#FFFFFF" />'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile('chrome/path/test.xml', lines)] errors = PRESUBMIT._CheckColorReferences(mock_input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertEqual(1, len(errors[0].items)) self.assertEqual(' chrome/path/test.xml:2', errors[0].items[0].splitlines()[0])
def testVectorDrawbleIgnored(self): lines = [ '<vector', 'tools:targetApi="21"', 'android:fillColor="#CCCCCC">', '</vector>' ] 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 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 testActionXMLChanged(self): mock_input_api = MockInputApi() lines = ['<input id="testinput" pref="testpref"', 'metric="validaction" type="checkbox" dialog-pref>'] mock_input_api.files = [MockFile('path/valid.html', lines)] mock_input_api.change = MockChange(['path/valid.html','actions.xml']) action_xml_path = self._createActionXMLFile() self.assertEqual([], PRESUBMIT.CheckUserActionUpdate(mock_input_api, MockOutputApi(), action_xml_path))
def testFailure(self): lines = ['xmlns:chrome="http://schemas.android.com/apk/res-auto"'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile('chrome/java/res_test/file.xml', lines)] errors = checkxmlstyle._CheckXmlNamespacePrefixes( mock_input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertEqual(1, len(errors[0].items)) self.assertEqual(' chrome/java/res_test/file.xml:1', errors[0].items[0].splitlines()[0])
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 testAllowInComment(self): input_api = MockInputApi() input_api.files = [ MockFile('content/file.cc', ['char* host = "https://www.aol.com"; // google.com']) ] warnings = PRESUBMIT._CheckHardcodedGoogleHostsInLowerLayers( input_api, MockOutputApi()) self.assertEqual(0, len(warnings))
def testSuccess(self): input_api = MockInputApi() filename = 'valid_json.json' contents = [ '// This is a comment.', '{', ' "key1": ["value1", "value2"],', ' "key2": 3 // This is an inline comment.', '}' ] input_api.files = [MockFile(filename, contents)] self.assertEqual(None, PRESUBMIT._GetJSONParseError(input_api, filename))
def inputApiContainingFileWithPaths(self, filename, paths): """Returns a MockInputApi object with a single file having |filename| as its name and |paths| as its contents, with each path being wrapped in a pair of double-quotes to match the syntax for strings within BUILD.gn files.""" contents = ['"%s"' % path for path in paths] mock_file = MockFile(filename, contents) mock_input_api = MockInputApi() mock_input_api.files.append(mock_file) return mock_input_api
def testInvalidOSMacroNames(self): lines = ['#if defined(OS_WINDOWS)', ' #elif defined(OS_WINDOW)', ' # if defined(OS_MACOSX) || defined(OS_CHROME)', '# else // defined(OS_MAC)', '#endif // defined(OS_MACOS)'] errors = PRESUBMIT._CheckForInvalidOSMacrosInFile( MockInputApi(), MockFile('some/path/foo_platform.cc', lines)) self.assertEqual(len(lines), len(errors)) self.assertTrue(':1 OS_WINDOWS' in errors[0]) self.assertTrue('(did you mean OS_WIN?)' in errors[0])
def testColorFormatLowerCase(self): lines = ['<color name="color1">#61000000</color>', '<color name="color2">#EFFFFFFF</color>', '<color name="color3">#CcCcCC</color>'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile('chrome/java/res_test/test.xml', lines)] errors = checkxmlstyle._CheckColorFormat(mock_input_api, MockOutputApi()) self.assertEqual(1, len(errors)) self.assertEqual(1, len(errors[0].items)) self.assertEqual(' chrome/java/res_test/test.xml:3', errors[0].items[0].splitlines()[0])
def testVectorDrawbleIgnored(self): lines = ['<vector', 'tools:targetApi="21"', 'android:fillColor="#CCCCCC">', '</vector>'] mock_input_api = MockInputApi() mock_input_api.files = [MockFile('chrome/java/res_test/test.xml', lines)] result = checkxmlstyle._CheckColorReferences( mock_input_api, MockOutputApi()) self.assertEqual(1, len(result)) self.assertEqual(result[0].type, 'warning')
def testTypicalConflict(self): lines = [ '<<<<<<< HEAD', ' base::ScopedTempDir temp_dir_;', '=======', ' ScopedTempDir temp_dir_;', '>>>>>>> master' ] errors = PRESUBMIT._CheckForVersionControlConflictsInFile( MockInputApi(), MockFile('some/path/foo_platform.cc', lines)) self.assertEqual(3, len(errors)) self.assertTrue('1' in errors[0]) self.assertTrue('3' in errors[1]) self.assertTrue('5' in errors[2])
def testSuccess(self): """ Examples of when SplitCompatUtils.getIdentifierName() should not be flagged. """ mock_input = MockInputApi() mock_input.files = [ MockFile( 'path/One.java', ['SplitCompatUtils.getIdentifierName("foo")', 'A new line.']), MockFile('path/Two.java', ['SplitCompatUtils.getIdentifierName( "foo")']), MockFile('path/Three.java', ['SplitCompatUtils.getIdentifierName(', ' "bar")']), MockFile( 'path/Four.java', [' super(SplitCompatUtils.getIdentifierName(', '"bar"))']), ] errors = PRESUBMIT._CheckSplitCompatUtilsIdentifierName( mock_input, MockOutputApi()) self.assertEqual(0, len(errors))