/* * 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/Test.h" namespace aapt { static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res, std::string* out_str) { std::unique_ptr manifest_class = GenerateManifestClass(context->GetDiagnostics(), res); if (!manifest_class) { return ::testing::AssertionFailure() << "manifest_class == nullptr"; } std::stringstream out; if (!manifest_class->WriteJavaFile(manifest_class.get(), "android", true, &out)) { return ::testing::AssertionFailure() << "failed to write java file"; } *out_str = out.str(); return ::testing::AssertionSuccess(); } TEST(ManifestClassGeneratorTest, NameIsProperlyGeneratedFromSymbol) { std::unique_ptr context = test::ContextBuilder().Build(); std::unique_ptr manifest = test::BuildXmlDom(R"EOF( )EOF"); std::string actual; ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); const size_t permission_class_pos = actual.find("public static final class permission {"); const size_t permission_croup_class_pos = actual.find("public static final class permission_group {"); ASSERT_NE(std::string::npos, permission_class_pos); ASSERT_NE(std::string::npos, permission_croup_class_pos); // // 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, permission_class_pos); EXPECT_LT(pos, permission_croup_class_pos); pos = actual.find( "public static final String DO_DANGEROUS_THINGS=" "\"android.DO_DANGEROUS_THINGS\";"); EXPECT_GT(pos, permission_class_pos); EXPECT_LT(pos, permission_croup_class_pos); pos = actual.find( "public static final String HUH=\"com.test.sample.permission.HUH\";"); EXPECT_GT(pos, permission_class_pos); EXPECT_LT(pos, permission_croup_class_pos); // // Make sure these permissions are in the permission_group class // pos = actual.find( "public static final String PERMISSION=" "\"foo.bar.PERMISSION\";"); EXPECT_GT(pos, permission_croup_class_pos); EXPECT_LT(pos, std::string::npos); } TEST(ManifestClassGeneratorTest, CommentsAndAnnotationsArePresent) { std::unique_ptr context = test::ContextBuilder().Build(); std::unique_ptr manifest = test::BuildXmlDom(R"EOF( )EOF"); std::string actual; ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual)); const char* expected_access_internet = 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(expected_access_internet)); const char* expected_play_outside = 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(expected_play_outside)); const char* expected_secret = R"EOF( /** * This is a private permission for system only! * @hide */ @android.annotation.SystemApi public static final String SECRET="android.permission.SECRET";)EOF"; EXPECT_NE(std::string::npos, actual.find(expected_secret)); } } // namespace aapt