blob: 6838253dad201fc116b5103accfbdcd6a5f5257b [file] [log] [blame]
Adam Lesinski8c831ca2015-05-20 15:24:01 -07001/*
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
24namespace aapt {
25
26constexpr 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
47constexpr 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
73constexpr 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
89TEST(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
105TEST(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