Index: chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab_unittest.cc |
diff --git a/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab_unittest.cc b/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f60de540f417868a79b51ceca7c8168eff03a67f |
--- /dev/null |
+++ b/chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab_unittest.cc |
@@ -0,0 +1,209 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/views/apps/app_info_dialog/app_info_permissions_tab.h" |
+ |
+#include "apps/saved_files_service.h" |
+#include "base/callback.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/strings/utf_string_conversions.h" |
+#include "chrome/browser/extensions/extension_service.h" |
+#include "chrome/browser/extensions/test_extension_system.h" |
+#include "chrome/test/base/testing_profile.h" |
+#include "content/public/test/test_browser_thread_bundle.h" |
+#include "extensions/common/extension_builder.h" |
+#include "extensions/common/manifest.h" |
+#include "extensions/common/permissions/permission_set.h" |
+#include "extensions/common/permissions/permissions_data.h" |
+#include "grit/generated_resources.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+class AppInfoPermissionsTabTest : public testing::Test { |
+ protected: |
+ AppInfoPermissionsTabTest() : window(NULL) {}; |
+ |
+ gfx::NativeWindow window; |
+ TestingProfile profile; |
+ |
+ // We need the UI thread in order to construct UI elements in the view. |
+ content::TestBrowserThreadBundle thread_bundle; |
+}; |
+ |
+// Tests that an app with no permissions is treated correctly. |
+TEST_F(AppInfoPermissionsTabTest, NoPermissionsObtainedCorrectly) { |
+ scoped_refptr<const extensions::Extension> app = |
+ extensions::ExtensionBuilder() |
+ .SetManifest( |
+ extensions::DictionaryBuilder().Set("name", "Test App Name").Set( |
+ "version", "2.0")) |
+ .SetID("cedabbhfglmiikkmdgcpjdkocfcmbkee") |
+ .Build(); |
+ AppInfoPermissionsTab tab(window, &profile, app, base::Closure()); |
+ |
+ EXPECT_TRUE(tab.GetRequiredPermissions()->IsEmpty()); |
+ EXPECT_TRUE(tab.GetRequiredPermissionMessages().empty()); |
+ |
+ EXPECT_TRUE(tab.GetOptionalPermissions()->IsEmpty()); |
+ EXPECT_TRUE(tab.GetOptionalPermissionMessages().empty()); |
+ |
+ EXPECT_TRUE(tab.GetRetainedFilePermissions().empty()); |
+ EXPECT_TRUE(tab.GetRetainedFilePermissionMessages().empty()); |
+} |
+ |
+// Tests that an app's required permissions are detected and converted to |
+// messages correctly. |
+TEST_F(AppInfoPermissionsTabTest, RequiredPermissionsObtainedCorrectly) { |
+ scoped_refptr<const extensions::Extension> app = |
+ extensions::ExtensionBuilder() |
+ .SetManifest( |
+ extensions::DictionaryBuilder() |
+ .Set("name", "Test App Name") |
+ .Set("version", "2.0") |
+ .Set("permissions", |
+ extensions::ListBuilder() |
+ .Append("location") // A valid permission with a |
+ // message |
+ .Append("bad_perm") // An invalid permission |
+ .Append("browsingData") // An valid permission with |
+ // no message |
+ .Append("tabs"))) // Another valid permission with |
+ // a message |
+ .SetID("cedabbhfglmiikkmdgcpjdkocfcmbkee") |
+ .Build(); |
+ AppInfoPermissionsTab tab(window, &profile, app, base::Closure()); |
+ |
+ const extensions::PermissionSet* required_permissions = |
+ tab.GetRequiredPermissions(); |
+ EXPECT_FALSE(required_permissions->IsEmpty()); |
+ EXPECT_EQ((size_t)3, required_permissions->GetAPIsAsStrings().size()); |
+ |
+ EXPECT_TRUE(tab.GetOptionalPermissions()->IsEmpty()); |
+ EXPECT_TRUE(tab.GetRetainedFilePermissions().empty()); |
+ |
+ const std::vector<base::string16> required_permission_messages = |
+ tab.GetRequiredPermissionMessages(); |
+ EXPECT_EQ((size_t)2, required_permission_messages.size()); |
+ ASSERT_STREQ(l10n_util::GetStringUTF8( |
+ IDS_EXTENSION_PROMPT_WARNING_GEOLOCATION).c_str(), |
+ base::UTF16ToUTF8(required_permission_messages[0]).c_str()); |
+ ASSERT_STREQ( |
+ l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_WARNING_TABS).c_str(), |
+ base::UTF16ToUTF8(required_permission_messages[1]).c_str()); |
+} |
+ |
+// Tests that an app's optional permissions are detected and converted to |
+// messages correctly. |
+TEST_F(AppInfoPermissionsTabTest, OptionalPermissionsObtainedCorrectly) { |
+ scoped_refptr<const extensions::Extension> app = |
+ extensions::ExtensionBuilder() |
+ .SetManifest( |
+ extensions::DictionaryBuilder() |
+ .Set("name", "Test App Name") |
+ .Set("version", "2.0") |
+ .Set("optional_permissions", |
+ extensions::ListBuilder() |
+ .Append("bookmarks") // A valid permission with a |
+ // message |
+ .Append("bad_perm") // An invalid permission |
+ .Append("cookies") // A valid permission with |
+ // no message |
+ .Append("tabs"))) // Another valid permission with |
+ // a message |
+ .SetID("cedabbhfglmiikkmdgcpjdkocfcmbkee") |
+ .Build(); |
+ AppInfoPermissionsTab tab(window, &profile, app, base::Closure()); |
+ |
+ const extensions::PermissionSet* optional_permissions = |
+ tab.GetOptionalPermissions(); |
+ EXPECT_FALSE(optional_permissions->IsEmpty()); |
+ EXPECT_EQ((size_t)3, optional_permissions->GetAPIsAsStrings().size()); |
+ |
+ EXPECT_TRUE(tab.GetRequiredPermissions()->IsEmpty()); |
+ EXPECT_TRUE(tab.GetRetainedFilePermissions().empty()); |
+ |
+ const std::vector<base::string16> optional_permission_messages = |
+ tab.GetOptionalPermissionMessages(); |
+ EXPECT_EQ((size_t)2, optional_permission_messages.size()); |
+ ASSERT_STREQ( |
+ l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_WARNING_BOOKMARKS).c_str(), |
+ base::UTF16ToUTF8(optional_permission_messages[0]).c_str()); |
+ ASSERT_STREQ( |
+ l10n_util::GetStringUTF8(IDS_EXTENSION_PROMPT_WARNING_TABS).c_str(), |
+ base::UTF16ToUTF8(optional_permission_messages[1]).c_str()); |
+} |
+ |
+// Tests that an app's retained files are detected and converted to paths |
+// correctly. |
+TEST_F(AppInfoPermissionsTabTest, RetainedFilePermissionsObtainedCorrectly) { |
+ scoped_refptr<const extensions::Extension> app = |
+ extensions::ExtensionBuilder() |
+ .SetManifest(extensions::DictionaryBuilder() |
+ .Set("name", "Test App Name") |
+ .Set("version", "2.0") |
+ .Set("manifest_version", 2) |
+ .Set("app", |
+ extensions::DictionaryBuilder().Set( |
+ "background", |
+ extensions::DictionaryBuilder().Set( |
+ "scripts", |
+ extensions::ListBuilder().Append( |
+ "background.js")))) |
+ .Set("permissions", |
+ extensions::ListBuilder().Append( |
+ extensions::DictionaryBuilder().Set( |
+ "fileSystem", |
+ extensions::ListBuilder().Append( |
+ "retainEntries"))))) |
+ .SetID("cedabbhfglmiikkmdgcpjdkocfcmbkee") |
+ .Build(); |
+ AppInfoPermissionsTab tab(window, &profile, app, base::Closure()); |
+ |
+ apps::SavedFilesService* files_service = |
+ apps::SavedFilesService::Get(&profile); |
+ files_service->RegisterFileEntry( |
+ app->id(), |
+ "file_id_1", |
+ base::FilePath(FILE_PATH_LITERAL("file_1.ext")), |
+ false); |
+ files_service->RegisterFileEntry( |
+ app->id(), |
+ "file_id_2", |
+ base::FilePath(FILE_PATH_LITERAL("file_2.ext")), |
+ false); |
+ files_service->RegisterFileEntry( |
+ app->id(), |
+ "file_id_3", |
+ base::FilePath(FILE_PATH_LITERAL("file_3.ext")), |
+ false); |
+ |
+ // There should be 2 required permissions: fileSystem and |
+ // fileSystem.retainEntries. |
+ const extensions::PermissionSet* required_permissions = |
+ tab.GetRequiredPermissions(); |
+ EXPECT_FALSE(required_permissions->IsEmpty()); |
+ EXPECT_EQ((size_t)2, required_permissions->GetAPIsAsStrings().size()); |
+ |
+ EXPECT_TRUE(tab.GetOptionalPermissions()->IsEmpty()); |
+ |
+ const std::vector<base::FilePath> retained_files = |
+ tab.GetRetainedFilePermissions(); |
+ EXPECT_EQ((size_t)3, retained_files.size()); |
+ ASSERT_EQ(base::FilePath::StringType(FILE_PATH_LITERAL("file_1.ext")), |
+ retained_files[0].value()); |
+ ASSERT_EQ(base::FilePath::StringType(FILE_PATH_LITERAL("file_2.ext")), |
+ retained_files[1].value()); |
+ ASSERT_EQ(base::FilePath::StringType(FILE_PATH_LITERAL("file_3.ext")), |
+ retained_files[2].value()); |
+ |
+ const std::vector<base::string16> retained_file_messages = |
+ tab.GetRetainedFilePermissionMessages(); |
+ EXPECT_EQ((size_t)3, retained_file_messages.size()); |
+ ASSERT_STREQ("file_1.ext", |
+ base::UTF16ToUTF8(retained_file_messages[0]).c_str()); |
+ ASSERT_STREQ("file_2.ext", |
+ base::UTF16ToUTF8(retained_file_messages[1]).c_str()); |
+ ASSERT_STREQ("file_3.ext", |
+ base::UTF16ToUTF8(retained_file_messages[2]).c_str()); |
+} |