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 "java/ManifestClassGenerator.h" 18 #include "test/Builders.h" 19 #include "test/Context.h" 20 21 #include <gtest/gtest.h> 22 23 namespace aapt { 24 25 static ::testing::AssertionResult getManifestClassText(IAaptContext* context, xml::XmlResource* res, 26 std::string* outStr) { 27 std::unique_ptr<ClassDefinition> manifestClass = generateManifestClass( 28 context->getDiagnostics(), res); 29 if (!manifestClass) { 30 return ::testing::AssertionFailure() << "manifestClass == nullptr"; 31 } 32 33 std::stringstream out; 34 if (!manifestClass->writeJavaFile(manifestClass.get(), "android", true, &out)) { 35 return ::testing::AssertionFailure() << "failed to write java file"; 36 } 37 38 *outStr = out.str(); 39 return ::testing::AssertionSuccess(); 40 } 41 42 TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) { 43 std::unique_ptr<IAaptContext> context = test::ContextBuilder().build(); 44 std::unique_ptr<xml::XmlResource> manifest = test::buildXmlDom(R"EOF( 45 <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 46 <permission android:name="android.permission.ACCESS_INTERNET" /> 47 <permission android:name="android.DO_DANGEROUS_THINGS" /> 48 <permission android:name="com.test.sample.permission.HUH" /> 49 <permission-group android:name="foo.bar.PERMISSION" /> 50 </manifest>)EOF"); 51 52 std::string actual; 53 ASSERT_TRUE(getManifestClassText(context.get(), manifest.get(), &actual)); 54 55 const size_t permissionClassPos = actual.find("public static final class permission {"); 56 const size_t permissionGroupClassPos = 57 actual.find("public static final class permission_group {"); 58 ASSERT_NE(std::string::npos, permissionClassPos); 59 ASSERT_NE(std::string::npos, permissionGroupClassPos); 60 61 // 62 // Make sure these permissions are in the permission class. 63 // 64 65 size_t pos = actual.find("public static final String ACCESS_INTERNET=" 66 "\"android.permission.ACCESS_INTERNET\";"); 67 EXPECT_GT(pos, permissionClassPos); 68 EXPECT_LT(pos, permissionGroupClassPos); 69 70 pos = actual.find("public static final String DO_DANGEROUS_THINGS=" 71 "\"android.DO_DANGEROUS_THINGS\";"); 72 EXPECT_GT(pos, permissionClassPos); 73 EXPECT_LT(pos, permissionGroupClassPos); 74 75 pos = actual.find("public static final String HUH=\"com.test.sample.permission.HUH\";"); 76 EXPECT_GT(pos, permissionClassPos); 77 EXPECT_LT(pos, permissionGroupClassPos); 78 79 // 80 // Make sure these permissions are in the permission_group class 81 // 82 83 pos = actual.find("public static final String PERMISSION=" 84 "\"foo.bar.PERMISSION\";"); 85 EXPECT_GT(pos, permissionGroupClassPos); 86 EXPECT_LT(pos, std::string::npos); 87 } 88 89 TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) { 90 std::unique_ptr<IAaptContext> context = test::ContextBuilder().build(); 91 std::unique_ptr<xml::XmlResource> manifest = test::buildXmlDom(R"EOF( 92 <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 93 <!-- Required to access the internet. 94 Added in API 1. --> 95 <permission android:name="android.permission.ACCESS_INTERNET" /> 96 <!-- @deprecated This permission is for playing outside. --> 97 <permission android:name="android.permission.PLAY_OUTSIDE" /> 98 <!-- This is a private permission for system only! 99 @hide 100 @SystemApi --> 101 <permission android:name="android.permission.SECRET" /> 102 </manifest>)EOF"); 103 104 std::string actual; 105 ASSERT_TRUE(getManifestClassText(context.get(), manifest.get(), &actual)); 106 107 const char* expectedAccessInternet = 108 R"EOF( /** 109 * Required to access the internet. 110 * Added in API 1. 111 */ 112 public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)EOF"; 113 114 EXPECT_NE(std::string::npos, actual.find(expectedAccessInternet)); 115 116 const char* expectedPlayOutside = 117 R"EOF( /** 118 * @deprecated This permission is for playing outside. 119 */ 120 @Deprecated 121 public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)EOF"; 122 123 EXPECT_NE(std::string::npos, actual.find(expectedPlayOutside)); 124 125 const char* expectedSecret = 126 R"EOF( /** 127 * This is a private permission for system only! 128 * @hide 129 */ 130 @android.annotation.SystemApi 131 public static final String SECRET="android.permission.SECRET";)EOF"; 132 133 EXPECT_NE(std::string::npos, actual.find(expectedSecret)); 134 } 135 136 } // namespace aapt 137