| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "java/ManifestClassGenerator.h" |
| #include "test/Builders.h" |
| #include "test/Context.h" |
| |
| #include <gtest/gtest.h> |
| |
| namespace aapt { |
| |
| static ::testing::AssertionResult getManifestClassText(IAaptContext* context, xml::XmlResource* res, |
| std::string* outStr) { |
| std::unique_ptr<ClassDefinition> manifestClass = generateManifestClass( |
| context->getDiagnostics(), res); |
| if (!manifestClass) { |
| return ::testing::AssertionFailure() << "manifestClass == nullptr"; |
| } |
| |
| std::stringstream out; |
| if (!manifestClass->writeJavaFile(manifestClass.get(), "android", true, &out)) { |
| return ::testing::AssertionFailure() << "failed to write java file"; |
| } |
| |
| *outStr = out.str(); |
| return ::testing::AssertionSuccess(); |
| } |
| |
| TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) { |
| std::unique_ptr<IAaptContext> context = test::ContextBuilder().build(); |
| std::unique_ptr<xml::XmlResource> manifest = test::buildXmlDom(R"EOF( |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android"> |
| <permission android:name="android.permission.ACCESS_INTERNET" /> |
| <permission android:name="android.DO_DANGEROUS_THINGS" /> |
| <permission android:name="com.test.sample.permission.HUH" /> |
| <permission-group android:name="foo.bar.PERMISSION" /> |
| </manifest>)EOF"); |
| |
| std::string actual; |
| ASSERT_TRUE(getManifestClassText(context.get(), manifest.get(), &actual)); |
| |
| const size_t permissionClassPos = actual.find("public static final class permission {"); |
| const size_t permissionGroupClassPos = |
| actual.find("public static final class permission_group {"); |
| ASSERT_NE(std::string::npos, permissionClassPos); |
| ASSERT_NE(std::string::npos, permissionGroupClassPos); |
| |
| // |
| // Make sure these permissions are in the permission class. |
| // |
| |
| size_t pos = actual.find("public static final String ACCESS_INTERNET=" |
| "\"android.permission.ACCESS_INTERNET\";"); |
| EXPECT_GT(pos, permissionClassPos); |
| EXPECT_LT(pos, permissionGroupClassPos); |
| |
| pos = actual.find("public static final String DO_DANGEROUS_THINGS=" |
| "\"android.DO_DANGEROUS_THINGS\";"); |
| EXPECT_GT(pos, permissionClassPos); |
| EXPECT_LT(pos, permissionGroupClassPos); |
| |
| pos = actual.find("public static final String HUH=\"com.test.sample.permission.HUH\";"); |
| EXPECT_GT(pos, permissionClassPos); |
| EXPECT_LT(pos, permissionGroupClassPos); |
| |
| // |
| // Make sure these permissions are in the permission_group class |
| // |
| |
| pos = actual.find("public static final String PERMISSION=" |
| "\"foo.bar.PERMISSION\";"); |
| EXPECT_GT(pos, permissionGroupClassPos); |
| EXPECT_LT(pos, std::string::npos); |
| } |
| |
| TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) { |
| std::unique_ptr<IAaptContext> context = test::ContextBuilder().build(); |
| std::unique_ptr<xml::XmlResource> manifest = test::buildXmlDom(R"EOF( |
| <manifest xmlns:android="http://schemas.android.com/apk/res/android"> |
| <!-- Required to access the internet. |
| Added in API 1. --> |
| <permission android:name="android.permission.ACCESS_INTERNET" /> |
| <!-- @deprecated This permission is for playing outside. --> |
| <permission android:name="android.permission.PLAY_OUTSIDE" /> |
| <!-- This is a private permission for system only! |
| @hide |
| @SystemApi --> |
| <permission android:name="android.permission.SECRET" /> |
| </manifest>)EOF"); |
| |
| std::string actual; |
| ASSERT_TRUE(getManifestClassText(context.get(), manifest.get(), &actual)); |
| |
| const char* expectedAccessInternet = |
| R"EOF( /** |
| * Required to access the internet. |
| * Added in API 1. |
| */ |
| public static final String ACCESS_INTERNET="android.permission.ACCESS_INTERNET";)EOF"; |
| |
| EXPECT_NE(std::string::npos, actual.find(expectedAccessInternet)); |
| |
| const char* expectedPlayOutside = |
| R"EOF( /** |
| * @deprecated This permission is for playing outside. |
| */ |
| @Deprecated |
| public static final String PLAY_OUTSIDE="android.permission.PLAY_OUTSIDE";)EOF"; |
| |
| EXPECT_NE(std::string::npos, actual.find(expectedPlayOutside)); |
| |
| const char* expectedSecret = |
| R"EOF( /** |
| * This is a private permission for system only! |
| * @hide |
| * @SystemApi |
| */ |
| @android.annotation.SystemApi |
| public static final String SECRET="android.permission.SECRET";)EOF"; |
| |
| EXPECT_NE(std::string::npos, actual.find(expectedSecret)); |
| } |
| |
| } // namespace aapt |