blob: b11c299580e044207d60ca0fc017c8eba302984d [file] [log] [blame]
#! /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()