diff options
author | Alex Humesky <ahumesky@google.com> | 2015-09-28 23:32:55 +0000 |
---|---|---|
committer | Florian Weikert <fwe@google.com> | 2015-09-30 09:33:01 +0000 |
commit | c2579a5041568592913165bc0a167bd0b70f46a2 (patch) | |
tree | a208596eaebf714cc1d8c7b782c57002a1969bfe /tools | |
parent | 1ef338fb3bcacae3dfd015029d5f4630a80dba78 (diff) |
Refactors proguard_whitelister.
--
MOS_MIGRATED_REVID=104150148
Diffstat (limited to 'tools')
-rw-r--r-- | tools/android/BUILD | 2 | ||||
-rw-r--r-- | tools/android/proguard_whitelister.py | 78 | ||||
-rw-r--r-- | tools/android/proguard_whitelister_test.py | 62 | ||||
-rw-r--r-- | tools/android/proguard_whitelister_test_input.cfg (renamed from tools/android/proguard_whitelister_input.cfg) | 0 |
4 files changed, 85 insertions, 57 deletions
diff --git a/tools/android/BUILD b/tools/android/BUILD index 5021f541ff..c2aeb9a667 100644 --- a/tools/android/BUILD +++ b/tools/android/BUILD @@ -72,7 +72,7 @@ py_binary( py_test( name = "proguard_whitelister_test", srcs = ["proguard_whitelister_test.py"], - data = ["proguard_whitelister_input.cfg"], + data = ["proguard_whitelister_test_input.cfg"], deps = [ ":proguard_whitelister", ], diff --git a/tools/android/proguard_whitelister.py b/tools/android/proguard_whitelister.py index a372bfb112..e5b000fb57 100644 --- a/tools/android/proguard_whitelister.py +++ b/tools/android/proguard_whitelister.py @@ -31,42 +31,54 @@ FLAGS = gflags.FLAGS PROGUARD_COMMENTS_PATTERN = '#.*(\n|$)' -def main(): - with open(FLAGS.path) as config: - config_string = config.read() - invalid_configs = Validate(config_string) - if invalid_configs: - raise RuntimeError('Invalid proguard config parameters: ' - + str(invalid_configs)) - with open(FLAGS.output, 'w+') as outconfig: - config_string = ('# Merged from %s \n' % FLAGS.path) + config_string - outconfig.write(config_string) - - -def Validate(config): - """Checks the config for illegal arguments.""" - config = re.sub(PROGUARD_COMMENTS_PATTERN, '', config) - args = config.split('-') - invalid_configs = [] - for arg in args: - arg = arg.strip() - if not arg: - continue - elif arg.startswith('checkdiscard'): - continue - elif arg.startswith('keep'): - continue - elif arg.startswith('assumenosideeffects'): - continue - elif arg.split()[0] == 'dontnote': - if len(arg.split()) > 1: +class ProguardConfigValidator(object): + """Validates a proguard config.""" + + # Must be a tuple for str.startswith() + _VALID_ARGS = ('keep', 'assumenosideeffects') + + def __init__(self, config_path, outconfig_path): + self._config_path = config_path + self._outconfig_path = outconfig_path + + def ValidateAndWriteOutput(self): + with open(self._config_path) as config: + config_string = config.read() + invalid_configs = self._Validate(config_string) + if invalid_configs: + raise RuntimeError( + 'Invalid proguard config parameters: ' + str(invalid_configs)) + with open(self._outconfig_path, 'w+') as outconfig: + config_string = '# Merged from %s \n%s' % ( + self._config_path, config_string) + outconfig.write(config_string) + + def _Validate(self, config): + """Checks the config for illegal arguments.""" + config = re.sub(PROGUARD_COMMENTS_PATTERN, '', config) + args = config.split('-') + invalid_configs = [] + for arg in args: + arg = arg.strip() + if not arg or self._ValidateArg(arg): continue - elif arg.split()[0] == 'dontwarn': + invalid_configs.append('-' + arg.split()[0]) + + return invalid_configs + + def _ValidateArg(self, arg): + if arg.startswith(ProguardConfigValidator._VALID_ARGS): + return True + elif arg.split()[0] in ['dontnote', 'dontwarn']: if len(arg.split()) > 1: - continue - invalid_configs.append('-' + arg.split()[0]) + return True + return False + + +def main(): + validator = ProguardConfigValidator(FLAGS.path, FLAGS.output) + validator.ValidateAndWriteOutput() - return invalid_configs if __name__ == '__main__': FLAGS(sys.argv) diff --git a/tools/android/proguard_whitelister_test.py b/tools/android/proguard_whitelister_test.py index 1cb7e3d58d..2229cfbd12 100644 --- a/tools/android/proguard_whitelister_test.py +++ b/tools/android/proguard_whitelister_test.py @@ -18,39 +18,55 @@ import unittest from tools.android import proguard_whitelister -class ValidateProguardTest(unittest.TestCase): +class ProguardConfigValidatorTest(unittest.TestCase): + + def _CreateValidator(self, input_path, output_path): + return proguard_whitelister.ProguardConfigValidator(input_path, output_path) def testValidConfig(self): - path = os.path.join( - os.path.dirname(__file__), "proguard_whitelister_input.cfg") - with open(path) as config: - self.assertEqual([], proguard_whitelister.Validate(config.read())) + input_path = os.path.join( + os.path.dirname(__file__), "proguard_whitelister_test_input.cfg") + tmpdir = os.environ["TEST_TMPDIR"] + output_path = os.path.join(tmpdir, "proguard_whitelister_test_output.cfg") + # This will raise an exception if the config is invalid. + self._CreateValidator(input_path, output_path).ValidateAndWriteOutput() + with file(output_path) as output: + self.assertTrue(("# Merged from %s" % input_path) in output.read()) + + def _TestInvalidConfig(self, invalid_args, config): + tmpdir = os.environ["TEST_TMPDIR"] + input_path = os.path.join(tmpdir, "proguard_whitelister_test_input.cfg") + with open(input_path, "w") as f: + f.write(config) + output_path = os.path.join(tmpdir, "proguard_whitelister_test_output.cfg") + validator = self._CreateValidator(input_path, output_path) + try: + validator.ValidateAndWriteOutput() + self.fail() + except RuntimeError as e: + for invalid_arg in invalid_args: + self.assertTrue(invalid_arg in str(e)) def testInvalidNoteConfig(self): - self.assertEqual(["-dontnote"], proguard_whitelister.Validate( - """# We don't want libraries disabling notes globally. - -dontnote - """)) + self._TestInvalidConfig(["-dontnote"], """\ +# We don"t want libraries disabling notes globally. +-dontnote""") def testInvalidWarnConfig(self): - self.assertEqual(["-dontwarn"], proguard_whitelister.Validate( - """# We don't want libraries disabling warnings globally. - -dontwarn - """)) + self._TestInvalidConfig(["-dontwarn"], """\ +# We don"t want libraries disabling warnings globally. +-dontwarn""") def testInvalidOptimizationConfig(self): - self.assertEqual(["-optimizations"], proguard_whitelister.Validate( - """#We don't want libraries disabling global optimizations. - -optimizations !class/merging/*,!code/allocation/variable - """)) + self._TestInvalidConfig(["-optimizations"], """\ +# We don"t want libraries disabling global optimizations. +-optimizations !class/merging/*,!code/allocation/variable""") def testMultipleInvalidArgs(self): - self.assertEqual( - ["-optimizations", "-dontnote"], proguard_whitelister.Validate( - """#We don't want libraries disabling global optimizations. - -optimizations !class/merging/*,!code/allocation/variable - -dontnote - """)) + self._TestInvalidConfig(["-optimizations", "-dontnote"], """\ +# We don"t want libraries disabling global optimizations. +-optimizations !class/merging/*,!code/allocation/variable +-dontnote""") if __name__ == "__main__": diff --git a/tools/android/proguard_whitelister_input.cfg b/tools/android/proguard_whitelister_test_input.cfg index ceb3709dd8..ceb3709dd8 100644 --- a/tools/android/proguard_whitelister_input.cfg +++ b/tools/android/proguard_whitelister_test_input.cfg |