| #! /usr/bin/env vpython |
| # Copyright 2014 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import unittest |
| |
| from pylib.utils import proguard |
| |
| class TestParse(unittest.TestCase): |
| |
| def setUp(self): |
| self.maxDiff = None |
| |
| def testClass(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| ' Superclass: java/lang/Object']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': 'java.lang.Object', |
| 'annotations': {}, |
| 'methods': [] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testMethod(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Methods (count = 1):', |
| '- Method: <init>()V']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': {}, |
| 'methods': [ |
| { |
| 'method': '<init>', |
| 'annotations': {} |
| } |
| ] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testClassAnnotation(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Class file attributes (count = 3):', |
| ' - Annotation [Lorg/example/Annotation;]:', |
| ' - Annotation [Lorg/example/AnnotationWithValue;]:', |
| ' - Constant element value [attr \'13\']', |
| ' - Utf8 [val]', |
| ' - Annotation [Lorg/example/AnnotationWithTwoValues;]:', |
| ' - Constant element value [attr1 \'13\']', |
| ' - Utf8 [val1]', |
| ' - Constant element value [attr2 \'13\']', |
| ' - Utf8 [val2]']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': { |
| 'Annotation': None, |
| 'AnnotationWithValue': {'attr': 'val'}, |
| 'AnnotationWithTwoValues': {'attr1': 'val1', 'attr2': 'val2'} |
| }, |
| 'methods': [] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testClassAnnotationWithArrays(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Class file attributes (count = 3):', |
| ' - Annotation [Lorg/example/AnnotationWithEmptyArray;]:', |
| ' - Array element value [arrayAttr]:', |
| ' - Annotation [Lorg/example/AnnotationWithOneElemArray;]:', |
| ' - Array element value [arrayAttr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val]', |
| ' - Annotation [Lorg/example/AnnotationWithTwoElemArray;]:', |
| ' - Array element value [arrayAttr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val1]', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val2]']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': { |
| 'AnnotationWithEmptyArray': {'arrayAttr': []}, |
| 'AnnotationWithOneElemArray': {'arrayAttr': ['val']}, |
| 'AnnotationWithTwoElemArray': {'arrayAttr': ['val1', 'val2']} |
| }, |
| 'methods': [] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testNestedClassAnnotations(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Class file attributes (count = 1):', |
| ' - Annotation [Lorg/example/OuterAnnotation;]:', |
| ' - Constant element value [outerAttr \'13\']', |
| ' - Utf8 [outerVal]', |
| ' - Array element value [outerArr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [outerArrVal1]', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [outerArrVal2]', |
| ' - Annotation element value [emptyAnn]:', |
| ' - Annotation [Lorg/example/EmptyAnnotation;]:', |
| ' - Annotation element value [ann]:', |
| ' - Annotation [Lorg/example/InnerAnnotation;]:', |
| ' - Constant element value [innerAttr \'13\']', |
| ' - Utf8 [innerVal]', |
| ' - Array element value [innerArr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [innerArrVal1]', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [innerArrVal2]', |
| ' - Annotation element value [emptyInnerAnn]:', |
| ' - Annotation [Lorg/example/EmptyAnnotation;]:']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': { |
| 'OuterAnnotation': { |
| 'outerAttr': 'outerVal', |
| 'outerArr': ['outerArrVal1', 'outerArrVal2'], |
| 'emptyAnn': None, |
| 'ann': { |
| 'innerAttr': 'innerVal', |
| 'innerArr': ['innerArrVal1', 'innerArrVal2'], |
| 'emptyInnerAnn': None |
| } |
| } |
| }, |
| 'methods': [] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testClassArraysOfAnnotations(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Class file attributes (count = 1):', |
| ' - Annotation [Lorg/example/OuterAnnotation;]:', |
| ' - Array element value [arrayWithEmptyAnnotations]:', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/EmptyAnnotation;]:', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/EmptyAnnotation;]:', |
| ' - Array element value [outerArray]:', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/InnerAnnotation;]:', |
| ' - Constant element value [innerAttr \'115\']', |
| ' - Utf8 [innerVal]', |
| ' - Array element value [arguments]:', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/InnerAnnotation$Argument;]:', |
| ' - Constant element value [arg1Attr \'115\']', |
| ' - Utf8 [arg1Val]', |
| ' - Array element value [arg1Array]:', |
| ' - Constant element value [(default) \'73\']', |
| ' - Integer [11]', |
| ' - Constant element value [(default) \'73\']', |
| ' - Integer [12]', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/InnerAnnotation$Argument;]:', |
| ' - Constant element value [arg2Attr \'115\']', |
| ' - Utf8 [arg2Val]', |
| ' - Array element value [arg2Array]:', |
| ' - Constant element value [(default) \'73\']', |
| ' - Integer [21]', |
| ' - Constant element value [(default) \'73\']', |
| ' - Integer [22]']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': { |
| 'OuterAnnotation': { |
| 'arrayWithEmptyAnnotations': [None, None], |
| 'outerArray': [ |
| { |
| 'innerAttr': 'innerVal', |
| 'arguments': [ |
| {'arg1Attr': 'arg1Val', 'arg1Array': ['11', '12']}, |
| {'arg2Attr': 'arg2Val', 'arg2Array': ['21', '22']} |
| ] |
| } |
| ] |
| } |
| }, |
| 'methods': [] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testReadFullClassFileAttributes(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Class file attributes (count = 3):', |
| ' - Source file attribute:', |
| ' - Utf8 [Class.java]', |
| ' - Runtime visible annotations attribute:', |
| ' - Annotation [Lorg/example/IntValueAnnotation;]:', |
| ' - Constant element value [value \'73\']', |
| ' - Integer [19]', |
| ' - Inner classes attribute (count = 1)', |
| ' - InnerClassesInfo:', |
| ' Access flags: 0x9 = public static', |
| ' - Class [org/example/Class1]', |
| ' - Class [org/example/Class2]', |
| ' - Utf8 [OnPageFinishedHelper]']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': { |
| 'IntValueAnnotation': { |
| 'value': '19', |
| } |
| }, |
| 'methods': [] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testMethodAnnotation(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Methods (count = 1):', |
| '- Method: Test()V', |
| ' - Annotation [Lorg/example/Annotation;]:', |
| ' - Annotation [Lorg/example/AnnotationWithValue;]:', |
| ' - Constant element value [attr \'13\']', |
| ' - Utf8 [val]', |
| ' - Annotation [Lorg/example/AnnotationWithTwoValues;]:', |
| ' - Constant element value [attr1 \'13\']', |
| ' - Utf8 [val1]', |
| ' - Constant element value [attr2 \'13\']', |
| ' - Utf8 [val2]']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': {}, |
| 'methods': [ |
| { |
| 'method': 'Test', |
| 'annotations': { |
| 'Annotation': None, |
| 'AnnotationWithValue': {'attr': 'val'}, |
| 'AnnotationWithTwoValues': {'attr1': 'val1', 'attr2': 'val2'} |
| }, |
| } |
| ] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testMethodAnnotationWithArrays(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Methods (count = 1):', |
| '- Method: Test()V', |
| ' - Annotation [Lorg/example/AnnotationWithEmptyArray;]:', |
| ' - Array element value [arrayAttr]:', |
| ' - Annotation [Lorg/example/AnnotationWithOneElemArray;]:', |
| ' - Array element value [arrayAttr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val]', |
| ' - Annotation [Lorg/example/AnnotationWithTwoElemArray;]:', |
| ' - Array element value [arrayAttr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val1]', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val2]']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': {}, |
| 'methods': [ |
| { |
| 'method': 'Test', |
| 'annotations': { |
| 'AnnotationWithEmptyArray': {'arrayAttr': []}, |
| 'AnnotationWithOneElemArray': {'arrayAttr': ['val']}, |
| 'AnnotationWithTwoElemArray': {'arrayAttr': ['val1', 'val2']} |
| }, |
| } |
| ] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testMethodAnnotationWithPrimitivesAndArrays(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Methods (count = 1):', |
| '- Method: Test()V', |
| ' - Annotation [Lorg/example/AnnotationPrimitiveThenArray;]:', |
| ' - Constant element value [attr \'13\']', |
| ' - Utf8 [val]', |
| ' - Array element value [arrayAttr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val]', |
| ' - Annotation [Lorg/example/AnnotationArrayThenPrimitive;]:', |
| ' - Array element value [arrayAttr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val]', |
| ' - Constant element value [attr \'13\']', |
| ' - Utf8 [val]', |
| ' - Annotation [Lorg/example/AnnotationTwoArrays;]:', |
| ' - Array element value [arrayAttr1]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val1]', |
| ' - Array element value [arrayAttr2]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [val2]']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': {}, |
| 'methods': [ |
| { |
| 'method': 'Test', |
| 'annotations': { |
| 'AnnotationPrimitiveThenArray': {'attr': 'val', |
| 'arrayAttr': ['val']}, |
| 'AnnotationArrayThenPrimitive': {'arrayAttr': ['val'], |
| 'attr': 'val'}, |
| 'AnnotationTwoArrays': {'arrayAttr1': ['val1'], |
| 'arrayAttr2': ['val2']} |
| }, |
| } |
| ] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testNestedMethodAnnotations(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Methods (count = 1):', |
| '- Method: Test()V', |
| ' - Annotation [Lorg/example/OuterAnnotation;]:', |
| ' - Constant element value [outerAttr \'13\']', |
| ' - Utf8 [outerVal]', |
| ' - Array element value [outerArr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [outerArrVal1]', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [outerArrVal2]', |
| ' - Annotation element value [emptyAnn]:', |
| ' - Annotation [Lorg/example/EmptyAnnotation;]:', |
| ' - Annotation element value [ann]:', |
| ' - Annotation [Lorg/example/InnerAnnotation;]:', |
| ' - Constant element value [innerAttr \'13\']', |
| ' - Utf8 [innerVal]', |
| ' - Array element value [innerArr]:', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [innerArrVal1]', |
| ' - Constant element value [(default) \'13\']', |
| ' - Utf8 [innerArrVal2]', |
| ' - Annotation element value [emptyInnerAnn]:', |
| ' - Annotation [Lorg/example/EmptyAnnotation;]:']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': {}, |
| 'methods': [ |
| { |
| 'method': 'Test', |
| 'annotations': { |
| 'OuterAnnotation': { |
| 'outerAttr': 'outerVal', |
| 'outerArr': ['outerArrVal1', 'outerArrVal2'], |
| 'emptyAnn': None, |
| 'ann': { |
| 'innerAttr': 'innerVal', |
| 'innerArr': ['innerArrVal1', 'innerArrVal2'], |
| 'emptyInnerAnn': None |
| } |
| } |
| }, |
| } |
| ] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| def testMethodArraysOfAnnotations(self): |
| actual = proguard.Parse( |
| ['- Program class: org/example/Test', |
| 'Methods (count = 1):', |
| '- Method: Test()V', |
| ' - Annotation [Lorg/example/OuterAnnotation;]:', |
| ' - Array element value [arrayWithEmptyAnnotations]:', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/EmptyAnnotation;]:', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/EmptyAnnotation;]:', |
| ' - Array element value [outerArray]:', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/InnerAnnotation;]:', |
| ' - Constant element value [innerAttr \'115\']', |
| ' - Utf8 [innerVal]', |
| ' - Array element value [arguments]:', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/InnerAnnotation$Argument;]:', |
| ' - Constant element value [arg1Attr \'115\']', |
| ' - Utf8 [arg1Val]', |
| ' - Array element value [arg1Array]:', |
| ' - Constant element value [(default) \'73\']', |
| ' - Integer [11]', |
| ' - Constant element value [(default) \'73\']', |
| ' - Integer [12]', |
| ' - Annotation element value [(default)]:', |
| ' - Annotation [Lorg/example/InnerAnnotation$Argument;]:', |
| ' - Constant element value [arg2Attr \'115\']', |
| ' - Utf8 [arg2Val]', |
| ' - Array element value [arg2Array]:', |
| ' - Constant element value [(default) \'73\']', |
| ' - Integer [21]', |
| ' - Constant element value [(default) \'73\']', |
| ' - Integer [22]']) |
| expected = { |
| 'classes': [ |
| { |
| 'class': 'org.example.Test', |
| 'superclass': '', |
| 'annotations': {}, |
| 'methods': [ |
| { |
| 'method': 'Test', |
| 'annotations': { |
| 'OuterAnnotation': { |
| 'arrayWithEmptyAnnotations': [None, None], |
| 'outerArray': [ |
| { |
| 'innerAttr': 'innerVal', |
| 'arguments': [ |
| {'arg1Attr': 'arg1Val', 'arg1Array': ['11', '12']}, |
| {'arg2Attr': 'arg2Val', 'arg2Array': ['21', '22']} |
| ] |
| } |
| ] |
| } |
| } |
| } |
| ] |
| } |
| ] |
| } |
| self.assertEquals(expected, actual) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |