1919import zipfile
2020
2121from tools .android import aar_embedded_proguard_extractor
22+ from tools .android import proguard_extractor_lib
2223
2324
24- class AarEmbeddedProguardExtractor (unittest .TestCase ):
25- """Unit tests for aar_embedded_proguard_extractor.py."""
26-
27- # Python 2 alias
28- if not hasattr (unittest .TestCase , "assertCountEqual" ):
29-
30- def assertCountEqual (self , * args ):
31- return self .assertItemsEqual (* args )
25+ class AarEmbeddedProguardExtractorLegacyTest (unittest .TestCase ):
26+ """Unit tests for AAR proguard extraction (legacy behavior, extract_r8_rules=False)."""
3227
3328 def setUp (self ):
34- super (AarEmbeddedProguardExtractor , self ).setUp ()
29+ super (AarEmbeddedProguardExtractorLegacyTest , self ).setUp ()
3530 os .chdir (os .environ ["TEST_TMPDIR" ])
3631
3732 def testNoProguardTxt (self ):
@@ -49,6 +44,123 @@ def testWithProguardTxt(self):
4944 proguard_file .seek (0 )
5045 self .assertEqual (b"hello world" , proguard_file .read ())
5146
47+ def _makeClassesJar (self , entries ):
48+ jar_buf = io .BytesIO ()
49+ with zipfile .ZipFile (jar_buf , "w" ) as jar :
50+ for path , content in entries .items ():
51+ jar .writestr (path , content )
52+ return jar_buf .getvalue ()
53+
54+ def testR8RulesFromClassesJarIgnoredByDefault (self ):
55+ classes_jar = self ._makeClassesJar ({
56+ "META-INF/com.android.tools/r8/rules.pro" : "-keep class A" ,
57+ })
58+ aar = zipfile .ZipFile (io .BytesIO (), "w" )
59+ aar .writestr ("classes.jar" , classes_jar )
60+ proguard_file = io .BytesIO ()
61+ aar_embedded_proguard_extractor .ExtractEmbeddedProguard (aar , proguard_file )
62+ proguard_file .seek (0 )
63+ self .assertEqual (b"" , proguard_file .read ())
64+
65+
66+ class AarEmbeddedProguardExtractorWithR8RulesTest (unittest .TestCase ):
67+ """Unit tests for AAR proguard extraction with extract_r8_rules=True."""
68+
69+ def setUp (self ):
70+ super (AarEmbeddedProguardExtractorWithR8RulesTest , self ).setUp ()
71+ os .chdir (os .environ ["TEST_TMPDIR" ])
72+
73+ def _makeClassesJar (self , entries ):
74+ jar_buf = io .BytesIO ()
75+ with zipfile .ZipFile (jar_buf , "w" ) as jar :
76+ for path , content in entries .items ():
77+ jar .writestr (path , content )
78+ return jar_buf .getvalue ()
79+
80+ def testNoProguardTxt (self ):
81+ aar = zipfile .ZipFile (io .BytesIO (), "w" )
82+ proguard_file = io .BytesIO ()
83+ proguard_extractor_lib .ExtractEmbeddedProguardFromAar (aar , proguard_file )
84+ proguard_file .seek (0 )
85+ self .assertEqual (b"" , proguard_file .read ())
86+
87+ def testWithProguardTxt (self ):
88+ aar = zipfile .ZipFile (io .BytesIO (), "w" )
89+ aar .writestr ("proguard.txt" , "hello world" )
90+ proguard_file = io .BytesIO ()
91+ proguard_extractor_lib .ExtractEmbeddedProguardFromAar (aar , proguard_file )
92+ proguard_file .seek (0 )
93+ self .assertEqual (b"hello world" , proguard_file .read ())
94+
95+ def testR8RulesFromClassesJar (self ):
96+ classes_jar = self ._makeClassesJar ({
97+ "META-INF/com.android.tools/r8/rules.pro" : "-keep class A" ,
98+ })
99+ aar = zipfile .ZipFile (io .BytesIO (), "w" )
100+ aar .writestr ("classes.jar" , classes_jar )
101+ proguard_file = io .BytesIO ()
102+ proguard_extractor_lib .ExtractEmbeddedProguardFromAar (aar , proguard_file )
103+ proguard_file .seek (0 )
104+ self .assertEqual (b"\n -keep class A" , proguard_file .read ())
105+
106+ def testR8RulesFromVersionedSubdirs (self ):
107+ classes_jar = self ._makeClassesJar ({
108+ "META-INF/com.android.tools/r8-from-8.0.0/rules.pro" : "-keep class B" ,
109+ "META-INF/com.android.tools/r8-upto-8.0.0/rules.pro" : "-keep class C" ,
110+ })
111+ aar = zipfile .ZipFile (io .BytesIO (), "w" )
112+ aar .writestr ("classes.jar" , classes_jar )
113+ proguard_file = io .BytesIO ()
114+ proguard_extractor_lib .ExtractEmbeddedProguardFromAar (aar , proguard_file )
115+ proguard_file .seek (0 )
116+ self .assertEqual (
117+ b"\n -keep class B\n -keep class C" , proguard_file .read ())
118+
119+ def testR8RulesAndProguardTxtCombined (self ):
120+ classes_jar = self ._makeClassesJar ({
121+ "META-INF/com.android.tools/r8/rules.pro" : "-keep class D" ,
122+ })
123+ aar = zipfile .ZipFile (io .BytesIO (), "w" )
124+ aar .writestr ("proguard.txt" , "-keep class E" )
125+ aar .writestr ("classes.jar" , classes_jar )
126+ proguard_file = io .BytesIO ()
127+ proguard_extractor_lib .ExtractEmbeddedProguardFromAar (aar , proguard_file )
128+ proguard_file .seek (0 )
129+ self .assertEqual (
130+ b"-keep class E\n -keep class D" , proguard_file .read ())
131+
132+ def testR8RulesIgnoresDirectoryEntries (self ):
133+ classes_jar = self ._makeClassesJar ({
134+ "META-INF/com.android.tools/" : "" ,
135+ "META-INF/com.android.tools/r8/" : "" ,
136+ "META-INF/com.android.tools/r8/rules.pro" : "-keep class F" ,
137+ })
138+ aar = zipfile .ZipFile (io .BytesIO (), "w" )
139+ aar .writestr ("classes.jar" , classes_jar )
140+ proguard_file = io .BytesIO ()
141+ proguard_extractor_lib .ExtractEmbeddedProguardFromAar (aar , proguard_file )
142+ proguard_file .seek (0 )
143+ self .assertEqual (b"\n -keep class F" , proguard_file .read ())
144+
145+ def testNoClassesJarNoR8Rules (self ):
146+ aar = zipfile .ZipFile (io .BytesIO (), "w" )
147+ aar .writestr ("some_other_file.txt" , "data" )
148+ proguard_file = io .BytesIO ()
149+ proguard_extractor_lib .ExtractEmbeddedProguardFromAar (aar , proguard_file )
150+ proguard_file .seek (0 )
151+ self .assertEqual (b"" , proguard_file .read ())
152+
153+ def testClassesJarWithoutR8Rules (self ):
154+ classes_jar = self ._makeClassesJar ({
155+ "com/example/Foo.class" : "classdata" ,
156+ })
157+ aar = zipfile .ZipFile (io .BytesIO (), "w" )
158+ aar .writestr ("classes.jar" , classes_jar )
159+ proguard_file = io .BytesIO ()
160+ proguard_extractor_lib .ExtractEmbeddedProguardFromAar (aar , proguard_file )
161+ proguard_file .seek (0 )
162+ self .assertEqual (b"" , proguard_file .read ())
163+
52164
53165if __name__ == "__main__" :
54166 unittest .main ()
0 commit comments