Commit f1aaaced authored by Becky Zhou's avatar Becky Zhou Committed by Commit Bot

Modify presubmit check for AlertDialog

We introduced CompatibleAlertDialogBuilder to work around support
library issue at https://crrev/c/1626009

+ Modify the current presubmit check to check
  CompatibleAlertDialogBuilder
+ Add an error that CompatibleAlertDialogBuilder should be used
  instead of the AppCompat AlertDialog.Builder

Bug: 966101
Change-Id: Ic3280f3c2b2ab99d72086eaa26cbe9f6c57c69b6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1625845Reviewed-by: default avatarTheresa <twellington@chromium.org>
Commit-Queue: Becky Zhou <huayinz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#664487}
parent 967c1814
This diff is collapsed.
...@@ -13,6 +13,7 @@ sys.path.append(os.path.abspath(os.path.dirname(os.path.abspath(__file__)) ...@@ -13,6 +13,7 @@ sys.path.append(os.path.abspath(os.path.dirname(os.path.abspath(__file__))
+ '/../../../..')) + '/../../../..'))
from PRESUBMIT_test_mocks import MockFile, MockInputApi, MockOutputApi from PRESUBMIT_test_mocks import MockFile, MockInputApi, MockOutputApi
class CheckNotificationConstructors(unittest.TestCase): class CheckNotificationConstructors(unittest.TestCase):
"""Test the _CheckNotificationConstructors presubmit check.""" """Test the _CheckNotificationConstructors presubmit check."""
...@@ -20,41 +21,42 @@ class CheckNotificationConstructors(unittest.TestCase): ...@@ -20,41 +21,42 @@ class CheckNotificationConstructors(unittest.TestCase):
"""Examples of when Notification.Builder use is correctly flagged.""" """Examples of when Notification.Builder use is correctly flagged."""
mock_input = MockInputApi() mock_input = MockInputApi()
mock_input.files = [ mock_input.files = [
MockFile('path/One.java', ['new Notification.Builder()']), MockFile('path/One.java', ['new Notification.Builder()']),
MockFile('path/Two.java', ['new NotificationCompat.Builder()']), MockFile('path/Two.java', ['new NotificationCompat.Builder()']),
] ]
errors = PRESUBMIT._CheckNotificationConstructors( errors = PRESUBMIT._CheckNotificationConstructors(
mock_input, MockOutputApi()) mock_input, MockOutputApi())
self.assertEqual(1, len(errors)) self.assertEqual(1, len(errors))
self.assertEqual(2, len(errors[0].items)) self.assertEqual(2, len(errors[0].items))
self.assertTrue('One.java' in errors[0].items[0]) self.assertIn('One.java', errors[0].items[0])
self.assertTrue('Two.java' in errors[0].items[1]) self.assertIn('Two.java', errors[0].items[1])
def testFalsePositives(self): def testFalsePositives(self):
"""Examples of when Notification.Builder should not be flagged.""" """Examples of when Notification.Builder should not be flagged."""
mock_input = MockInputApi() mock_input = MockInputApi()
mock_input.files = [ mock_input.files = [
MockFile( MockFile(
'chrome/android/java/src/org/chromium/chrome/browser/notifications/' 'chrome/android/java/src/org/chromium/chrome/browser/notifications/'
'NotificationBuilder.java', 'NotificationBuilder.java',
['new Notification.Builder()']), ['new Notification.Builder()']),
MockFile( MockFile(
'chrome/android/java/src/org/chromium/chrome/browser/notifications/' 'chrome/android/java/src/org/chromium/chrome/browser/notifications/'
'NotificationCompatBuilder.java', 'NotificationCompatBuilder.java',
['new NotificationCompat.Builder()']), ['new NotificationCompat.Builder()']),
MockFile('path/One.java', ['Notification.Builder']), MockFile('path/One.java', ['Notification.Builder']),
MockFile('path/Two.java', ['// do not: new Notification.Builder()']), MockFile('path/Two.java', ['// do not: new Notification.Builder()']),
MockFile('path/Three.java', [ MockFile('path/Three.java',
'/** ChromeNotificationBuilder', ['/** ChromeNotificationBuilder',
' * replaces: new Notification.Builder()']), ' * replaces: new Notification.Builder()']),
MockFile('path/PRESUBMIT.py', ['new Notification.Builder()']), MockFile('path/PRESUBMIT.py', ['new Notification.Builder()']),
MockFile('path/Four.java', ['new NotificationCompat.Builder()'], MockFile('path/Four.java', ['new NotificationCompat.Builder()'],
action='D'), action='D'),
] ]
errors = PRESUBMIT._CheckNotificationConstructors( errors = PRESUBMIT._CheckNotificationConstructors(
mock_input, MockOutputApi()) mock_input, MockOutputApi())
self.assertEqual(0, len(errors)) self.assertEqual(0, len(errors))
class CheckAlertDialogBuilder(unittest.TestCase): class CheckAlertDialogBuilder(unittest.TestCase):
"""Test the _CheckAlertDialogBuilder presubmit check.""" """Test the _CheckAlertDialogBuilder presubmit check."""
...@@ -62,36 +64,121 @@ class CheckAlertDialogBuilder(unittest.TestCase): ...@@ -62,36 +64,121 @@ class CheckAlertDialogBuilder(unittest.TestCase):
"""Examples of when AlertDialog.Builder use is correctly flagged.""" """Examples of when AlertDialog.Builder use is correctly flagged."""
mock_input = MockInputApi() mock_input = MockInputApi()
mock_input.files = [ mock_input.files = [
MockFile('path/One.java', ['new AlertDialog.Builder()']), MockFile('path/One.java', ['new AlertDialog.Builder()']),
MockFile('path/Two.java', ['new AlertDialog.Builder(context);']), MockFile('path/Two.java', ['new AlertDialog.Builder(context);']),
] ]
errors = PRESUBMIT._CheckAlertDialogBuilder( errors = PRESUBMIT._CheckAlertDialogBuilder(mock_input, MockOutputApi())
mock_input, MockOutputApi())
self.assertEqual(1, len(errors)) self.assertEqual(1, len(errors))
self.assertEqual(2, len(errors[0].items)) self.assertEqual(2, len(errors[0].items))
self.assertTrue('One.java' in errors[0].items[0]) self.assertIn('One.java', errors[0].items[0])
self.assertTrue('Two.java' in errors[0].items[1]) self.assertIn('Two.java', errors[0].items[1])
def testFalsePositives(self): def testFalsePositives(self):
"""Examples of when AlertDialog.Builder should not be flagged.""" """Examples of when AlertDialog.Builder should not be flagged."""
mock_input = MockInputApi() mock_input = MockInputApi()
mock_input.files = [ mock_input.files = [
MockFile( MockFile('chrome/android/java/src/org/chromium/chrome/browser/signin'
'chrome/android/java/src/org/chromium/chrome/browser/payments/' '/AccountAdder.java',
'AndroidPaymentApp.java', ['new AlertDialog.Builder()']),
['new AlertDialog.Builder()']), MockFile('path/One.java', ['AlertDialog.Builder']),
MockFile('path/One.java', ['AlertDialog.Builder']), MockFile('path/Two.java', ['// do not: new AlertDialog.Builder()']),
MockFile('path/Two.java', ['// do not: new AlertDialog.Builder()']), MockFile('path/Three.java',
MockFile('path/Three.java', [ ['/** ChromeAlertDialogBuilder',
'/** ChromeAlertDialogBuilder', ' * replaces: new AlertDialog.Builder()']),
' * replaces: new AlertDialog.Builder()']), MockFile('path/PRESUBMIT.py', ['new AlertDialog.Builder()']),
MockFile('path/PRESUBMIT.py', ['new AlertDialog.Builder()']), MockFile('path/Four.java', ['new AlertDialog.Builder()'],
MockFile('path/Four.java', ['new AlertDialog.Builder()'], action='D'),
action='D'), ]
errors = PRESUBMIT._CheckAlertDialogBuilder(
mock_input, MockOutputApi())
self.assertEqual(0, len(errors))
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( errors = PRESUBMIT._CheckAlertDialogBuilder(
mock_input, MockOutputApi()) 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_WrongBuilderCheck(self):
"""Use of OS-dependent AlertDialog should not be flagged."""
mock_input = MockInputApi()
mock_input.files = [
MockFile('path/One.java',
['import android.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(1, len(errors))
self.assertEqual(2, len(errors[0].items))
class CheckCompatibleAlertDialogBuilder(unittest.TestCase):
"""Test the _CheckCompatibleAlertDialogBuilder presubmit check."""
def testFailure(self):
"""Use of CompatibleAlertDialogBuilder use is correctly flagged."""
mock_input = MockInputApi()
mock_input.files = [
MockFile('path/One.java',
['import '
'org.chromium.ui.UiUtils.CompatibleAlertDialogBuilder;',
'new CompatibleAlertDialogBuilder()',
'A new line to make sure there is no duplicate error.']),
MockFile('path/Two.java',
['new UiUtils.CompatibleAlertDialogBuilder()']),
MockFile('path/Three.java',
['new UiUtils',
'.CompatibleAlertDialogBuilder(context)']),
MockFile('path/Four.java',
['new UiUtils',
' .CompatibleAlertDialogBuilder()']),
]
errors = PRESUBMIT._CheckCompatibleAlertDialogBuilder(
mock_input, MockOutputApi())
self.assertEqual(1, len(errors))
self.assertEqual(4, len(errors[0].items))
self.assertIn('One.java', errors[0].items[0])
self.assertIn('Two.java', errors[0].items[1])
self.assertIn('Three.java', errors[0].items[2])
self.assertIn('Four.java', errors[0].items[3])
def testSucess(self):
"""Examples of when AlertDialog.Builder should not be flagged."""
mock_input = MockInputApi()
mock_input.files = [
MockFile('chrome/android/java/src/org/chromium/chrome/browser/payments/'
'AndroidPaymentApp.java',
['new UiUtils.CompatibleAlertDialogBuilder()']),
MockFile('path/One.java', ['UiUtils.CompatibleAlertDialogBuilder']),
MockFile('path/Two.java',
['// do not: new UiUtils.CompatibleAlertDialogBuilder']),
MockFile('path/Three.java',
['/** ChromeAlertDialogBuilder',
' * replaces: new UiUtils.CompatibleAlertDialogBuilder()']),
MockFile('path/PRESUBMIT.py',
['new UiUtils.CompatibleAlertDialogBuilder()']),
MockFile('path/Four.java',
['new UiUtils.CompatibleAlertDialogBuilder()'],
action='D'),
]
errors = PRESUBMIT._CheckCompatibleAlertDialogBuilder(
mock_input, MockOutputApi())
self.assertEqual(0, len(errors)) self.assertEqual(0, len(errors))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment