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 19 #include "test/Test.h" 20 21 namespace aapt { 22 23 static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, 24 xml::XmlResource* res, 25 std::string* out_str) { 26 std::unique_ptr<ClassDefinition> manifest_class = 27 GenerateManifestClass(context->GetDiagnostics(), res); 28 if (!manifest_class) { 29 return ::testing::AssertionFailure() << "manifest_class == nullptr"; 30 } 31 32 std::stringstream out; 33 if (!manifest_class->WriteJavaFile(manifest_class.get(), "android", true, 34 &out)) { 35 return ::testing::AssertionFailure() << "failed to write java file"; 36 } 37 38 *out_str = 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 permission_class_pos = 56 actual.find("public static final class permission {"); 57 const size_t permission_croup_class_pos = 58 actual.find("public static final class permission_group {"); 59 ASSERT_NE(std::string::npos, permission_class_pos); 60 ASSERT_NE(std::string::npos, permission_croup_class_pos); 61 62 // 63 // Make sure these permissions are in the permission class. 64 // 65 66 size_t pos = actual.find( 67 "public static final String ACCESS_INTERNET=" 68 "\"android.permission.ACCESS_INTERNET\";"); 69 EXPECT_GT(pos, permission_class_pos); 70 EXPECT_LT(pos, permission_croup_class_pos); 71 72 pos = actual.find( 73 "public static final String DO_DANGEROUS_THINGS=" 74 "\"android.DO_DANGEROUS_THINGS\";"); 75 EXPECT_GT(pos, permission_class_pos); 76 EXPECT_LT(pos, permission_croup_class_pos); 77 78 pos = actual.find( 79 "public static final String HUH=\"com.test.sample.permission.HUH\";"); 80 EXPECT_GT(pos, permission_class_pos); 81 EXPECT_LT(pos, permission_croup_class_pos); 82 83 // 84 // Make sure these permissions are in the permission_group class 85 // 86 87 pos = actual.find( 88 "public static final String PERMISSION=" 89 "\"foo.bar.PERMISSION\";"); 90 EXPECT_GT(pos, permission_croup_class_pos); 91 EXPECT_LT(pos, std::string::npos); 92 } 93 94 TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) { 95 std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build(); 96 std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"EOF( 97 <manifest xmlns:android="http://schemas.android.com/apk/res/android"> 98 <!-- Required to access the internet. 99 Added in API 1. --> 100 <permission android:name="android.permission.ACCESS_INTERNET" /> 101 <!-- @deprecated This permission is for playing outside. --> 102 <permission android:name="android.permission.PLAY_OUTSIDE" /> 103 <!-- This is a private permission for system only! 104 @hide 105 @SystemApi --> 106 <permission android:name="android.permission.SECRET" /> 107 </manifest>)EOF"); 108 109 std::string actual; 110 ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); 111 112 const char* expected_access_internet = 113 R"EOF( /** 114 * Required to access the internet. 115 * Added in API 1. 116 */ 117 public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)EOF"; 118 119 EXPECT_NE(std::string::npos, actual.find(expected_access_internet)); 120 121 const char* expected_play_outside = 122 R"EOF( /** 123 * @deprecated This permission is for playing outside. 124 */ 125 @Deprecated 126 public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)EOF"; 127 128 EXPECT_NE(std::string::npos, actual.find(expected_play_outside)); 129 130 const char* expected_secret = 131 R"EOF( /** 132 * This is a private permission for system only! 133 * @hide 134 */ 135 @android.annotation.SystemApi 136 public static final String SECRET="android.permission.SECRET";)EOF"; 137 138 EXPECT_NE(std::string::npos, actual.find(expected_secret)); 139 } 140 141 } // namespace aapt 142