1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "ManifestMerger.h"
18 #include "SourceXmlPullParser.h"
19 
20 #include <gtest/gtest.h>
21 #include <sstream>
22 #include <string>
23 
24 namespace aapt {
25 
26 constexpr const char* kAppManifest = R"EOF(<?xml version="1.0" encoding="utf-8"?>
27 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
28     <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="21" />
29     <uses-permission android:name="android.permission.INTERNET"/>
30     <uses-feature android:name="android.hardware.GPS" android:required="false" />
31     <application android:name="com.android.library.Application">
32         <activity android:name="com.android.example.MainActivity">
33             <intent-filter>
34                 <action android:name="android.intent.action.MAIN" />
35                 <category android:name="android.intent.category.DEFAULT" />
36             </intent-filter>
37         </activity>
38         <service android:name="com.android.library.Service">
39             <intent-filter>
40                 <action android:name="com.android.library.intent.action.SYNC" />
41             </intent-filter>
42         </service>
43     </application>
44 </manifest>
45 )EOF";
46 
47 constexpr const char* kLibManifest = R"EOF(<?xml version="1.0" encoding="utf-8"?>
48 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
49     <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="21" />
50     <uses-permission android:name="android.permission.INTERNET" />
51     <uses-feature android:name="android.hardware.GPS" />
52     <uses-permission android:name="android.permission.GPS" />
53     <application android:name="com.android.library.Application">
54         <service android:name="com.android.library.Service">
55             <intent-filter>
56                 <action android:name="com.android.library.intent.action.SYNC" />
57             </intent-filter>
58         </service>
59         <provider android:name="com.android.library.DocumentProvider"
60                   android:authorities="com.android.library.documents"
61                   android:grantUriPermission="true"
62                   android:exported="true"
63                   android:permission="android.permission.MANAGE_DOCUMENTS"
64                   android:enabled="@bool/atLeastKitKat">
65             <intent-filter>
66                 <action android:name="android.content.action.DOCUMENTS_PROVIDER" />
67             </intent-filter>
68         </provider>
69     </application>
70 </manifest>
71 )EOF";
72 
73 constexpr const char* kBadLibManifest = R"EOF(<?xml version="1.0" encoding="utf-8"?>
74 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
75     <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="22" />
76     <uses-permission android:name="android.permission.INTERNET" />
77     <uses-feature android:name="android.hardware.GPS" />
78     <uses-permission android:name="android.permission.GPS" />
79     <application android:name="com.android.library.Application2">
80         <service android:name="com.android.library.Service">
81             <intent-filter>
82                 <action android:name="com.android.library.intent.action.SYNC_ACTION" />
83             </intent-filter>
84         </service>
85     </application>
86 </manifest>
87 )EOF";
88 
TEST(ManifestMergerTest,MergeManifestsSuccess)89 TEST(ManifestMergerTest, MergeManifestsSuccess) {
90     std::stringstream inA(kAppManifest);
91     std::stringstream inB(kLibManifest);
92 
93     const Source sourceA = { "AndroidManifest.xml" };
94     const Source sourceB = { "lib.apk/AndroidManifest.xml" };
95     SourceLogger loggerA(sourceA);
96     SourceLogger loggerB(sourceB);
97 
98     ManifestMerger merger({});
99     EXPECT_TRUE(merger.setAppManifest(sourceA, u"com.android.example",
100                 xml::inflate(&inA, &loggerA)));
101     EXPECT_TRUE(merger.mergeLibraryManifest(sourceB, u"com.android.library",
102                 xml::inflate(&inB, &loggerB)));
103 }
104 
105 TEST(ManifestMergerTest, MergeManifestFail) {
106     std::stringstream inA(kAppManifest);
107     std::stringstream inB(kBadLibManifest);
108 
109     const Source sourceA = { "AndroidManifest.xml" };
110     const Source sourceB = { "lib.apk/AndroidManifest.xml" };
111     SourceLogger loggerA(sourceA);
112     SourceLogger loggerB(sourceB);
113 
114     ManifestMerger merger({});
115     EXPECT_TRUE(merger.setAppManifest(sourceA, u"com.android.example",
116                 xml::inflate(&inA, &loggerA)));
117     EXPECT_FALSE(merger.mergeLibraryManifest(sourceB, u"com.android.library",
118                 xml::inflate(&inB, &loggerB)));
119 }
120 
121 } // namespace aapt
122