ManifestClassGenerator_test.cpp revision 467f171315f9c2037fcd3eb5edcfabc40671bf7b
1ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski/*
2ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * Copyright (C) 2015 The Android Open Source Project
3ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski *
4ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * you may not use this file except in compliance with the License.
6ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * You may obtain a copy of the License at
7ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski *
8ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski *
10ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * See the License for the specific language governing permissions and
14ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski * limitations under the License.
15ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski */
16ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
17ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski#include "java/ManifestClassGenerator.h"
18ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski#include "test/Builders.h"
19ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski#include "test/Context.h"
20ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
21ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski#include <gtest/gtest.h>
22ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
23ca5638fd85098c3d0a699492751043545f75553aAdam Lesinskinamespace aapt {
24ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
25ca5638fd85098c3d0a699492751043545f75553aAdam LesinskiTEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) {
26ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
27467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<xml::XmlResource> manifest = test::buildXmlDom(R"EOF(
28ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android">
29ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <permission android:name="android.permission.ACCESS_INTERNET" />
30ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <permission android:name="android.DO_DANGEROUS_THINGS" />
31ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <permission android:name="com.test.sample.permission.HUH" />
32ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <permission-group android:name="foo.bar.PERMISSION" />
33ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski        </manifest>)EOF");
34ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
35ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    std::stringstream out;
36ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    ManifestClassGenerator generator;
37ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    ASSERT_TRUE(generator.generate(context->getDiagnostics(), u"android", manifest.get(), &out));
38ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
39ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    std::string actual = out.str();
40ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
41b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski    const size_t permissionClassPos = actual.find("public static final class permission {");
42b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski    const size_t permissionGroupClassPos =
43b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski            actual.find("public static final class permission_group {");
44ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    ASSERT_NE(std::string::npos, permissionClassPos);
45ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    ASSERT_NE(std::string::npos, permissionGroupClassPos);
46ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
47ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    //
48ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    // Make sure these permissions are in the permission class.
49ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    //
50ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
51ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    size_t pos = actual.find("public static final String ACCESS_INTERNET="
52ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski                             "\"android.permission.ACCESS_INTERNET\";");
53ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_GT(pos, permissionClassPos);
54ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_LT(pos, permissionGroupClassPos);
55ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
56ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    pos = actual.find("public static final String DO_DANGEROUS_THINGS="
57ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski                      "\"android.DO_DANGEROUS_THINGS\";");
58ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_GT(pos, permissionClassPos);
59ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_LT(pos, permissionGroupClassPos);
60ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
61ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    pos = actual.find("public static final String HUH=\"com.test.sample.permission.HUH\";");
62ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_GT(pos, permissionClassPos);
63ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_LT(pos, permissionGroupClassPos);
64ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
65ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    //
66ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    // Make sure these permissions are in the permission_group class
67ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    //
68ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
69ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    pos = actual.find("public static final String PERMISSION="
70ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski                      "\"foo.bar.PERMISSION\";");
71ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_GT(pos, permissionGroupClassPos);
72ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_LT(pos, std::string::npos);
73ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski}
74ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
75ca5638fd85098c3d0a699492751043545f75553aAdam LesinskiTEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) {
76ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
77467f171315f9c2037fcd3eb5edcfabc40671bf7bAdam Lesinski    std::unique_ptr<xml::XmlResource> manifest = test::buildXmlDom(R"EOF(
78ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski        <manifest xmlns:android="http://schemas.android.com/apk/res/android">
79ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <!-- Required to access the internet.
80ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski               Added in API 1. -->
81ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <permission android:name="android.permission.ACCESS_INTERNET" />
82ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <!-- @deprecated This permission is for playing outside. -->
83ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <permission android:name="android.permission.PLAY_OUTSIDE" />
84ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <!-- This is a private permission for system only!
85ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski               @hide
86ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski               @SystemApi -->
87ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski          <permission android:name="android.permission.SECRET" />
88ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski        </manifest>)EOF");
89ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
90ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    std::stringstream out;
91ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    ManifestClassGenerator generator;
92ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    ASSERT_TRUE(generator.generate(context->getDiagnostics(), u"android", manifest.get(), &out));
93ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
94ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    std::string actual = out.str();
95ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
96ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_NE(std::string::npos, actual.find(
97ca5638fd85098c3d0a699492751043545f75553aAdam LesinskiR"EOF(    /**
98ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski     * Required to access the internet.
99ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski     * Added in API 1.
100ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski     */
101ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)EOF"));
102ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
103ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_NE(std::string::npos, actual.find(
104ca5638fd85098c3d0a699492751043545f75553aAdam LesinskiR"EOF(    /**
105ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski     * @deprecated This permission is for playing outside.
106ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski     */
107ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    @Deprecated
108ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)EOF"));
109ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
110ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    EXPECT_NE(std::string::npos, actual.find(
111ca5638fd85098c3d0a699492751043545f75553aAdam LesinskiR"EOF(    /**
112ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski     * This is a private permission for system only!
113ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski     * @hide
114ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski     * @SystemApi
115ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski     */
116b274e35abfbbd09e0fce983a215c11522c56cce2Adam Lesinski    @android.annotation.SystemApi
117ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski    public static final String SECRET="android.permission.SECRET";)EOF"));
118ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski}
119ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski
120ca5638fd85098c3d0a699492751043545f75553aAdam Lesinski} // namespace aapt
121