| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/memory/scoped_ptr.h" |
| 6 #include "base/values.h" |
| 7 #include "chrome/browser/extensions/extension_permissions_api_helpers.h" |
| 8 #include "chrome/common/extensions/extension_permission_set.h" |
| 9 #include "chrome/common/extensions/url_pattern_set.h" |
| 10 #include "googleurl/src/gurl.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 |
| 13 using extensions::permissions_api::PackPermissionsToValue; |
| 14 using extensions::permissions_api::UnpackPermissionsFromValue; |
| 15 |
| 16 namespace { |
| 17 |
| 18 static void AddPattern(URLPatternSet* extent, const std::string& pattern) { |
| 19 int schemes = URLPattern::SCHEME_ALL; |
| 20 extent->AddPattern(URLPattern(schemes, pattern)); |
| 21 } |
| 22 |
| 23 } // namespace |
| 24 |
| 25 // Tests that we can convert ExtensionPermissionSets to and from values. |
| 26 TEST(ExtensionPermissionsAPIHelpers, Pack) { |
| 27 ExtensionAPIPermissionSet apis; |
| 28 apis.insert(ExtensionAPIPermission::kTab); |
| 29 apis.insert(ExtensionAPIPermission::kWebRequest); |
| 30 URLPatternSet hosts; |
| 31 AddPattern(&hosts, "http://a.com/*"); |
| 32 AddPattern(&hosts, "http://b.com/*"); |
| 33 |
| 34 scoped_refptr<ExtensionPermissionSet> permissions = |
| 35 new ExtensionPermissionSet(apis, hosts, URLPatternSet()); |
| 36 |
| 37 // Pack the permission set to value and verify its contents. |
| 38 scoped_ptr<DictionaryValue> value(PackPermissionsToValue(permissions)); |
| 39 ListValue* api_list = NULL; |
| 40 ListValue* origin_list = NULL; |
| 41 ASSERT_TRUE(value->GetList("permissions", &api_list)); |
| 42 ASSERT_TRUE(value->GetList("origins", &origin_list)); |
| 43 |
| 44 ASSERT_EQ(2u, api_list->GetSize()); |
| 45 ASSERT_EQ(2u, origin_list->GetSize()); |
| 46 |
| 47 std::string expected_apis[] = { "tabs", "webRequest" }; |
| 48 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(expected_apis); ++i) { |
| 49 scoped_ptr<Value> value(Value::CreateStringValue(expected_apis[i])); |
| 50 ASSERT_NE(api_list->end(), api_list->Find(*value)); |
| 51 } |
| 52 |
| 53 std::string expected_origins[] = { "http://a.com/*", "http://b.com/*" }; |
| 54 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(expected_origins); ++i) { |
| 55 scoped_ptr<Value> value(Value::CreateStringValue(expected_origins[i])); |
| 56 ASSERT_NE(origin_list->end(), origin_list->Find(*value)); |
| 57 } |
| 58 |
| 59 // Unpack the value back to a permission set and make sure its equal to the |
| 60 // original one. |
| 61 scoped_refptr<ExtensionPermissionSet> from_value; |
| 62 bool bad_message = false; |
| 63 std::string error; |
| 64 ASSERT_TRUE(UnpackPermissionsFromValue( |
| 65 value.get(), &from_value, &bad_message, &error)); |
| 66 ASSERT_FALSE(bad_message); |
| 67 ASSERT_TRUE(error.empty()); |
| 68 |
| 69 ASSERT_EQ(*permissions, *from_value); |
| 70 } |
| 71 |
| 72 // Tests various error conditions and edge cases when unpacking values |
| 73 // into ExtensionPermissionSets. |
| 74 TEST(ExtensionPermissionsAPIHelpers, Unpack) { |
| 75 scoped_ptr<ListValue> apis(new ListValue()); |
| 76 apis->Append(Value::CreateStringValue("tabs")); |
| 77 scoped_ptr<ListValue> origins(new ListValue()); |
| 78 origins->Append(Value::CreateStringValue("http://a.com/*")); |
| 79 |
| 80 scoped_ptr<DictionaryValue> value(new DictionaryValue()); |
| 81 scoped_refptr<ExtensionPermissionSet> permissions; |
| 82 bool bad_message = false; |
| 83 std::string error; |
| 84 |
| 85 // Origins shouldn't have to be present. |
| 86 value->Set("permissions", apis->DeepCopy()); |
| 87 ASSERT_TRUE(UnpackPermissionsFromValue( |
| 88 value.get(), &permissions, &bad_message, &error)); |
| 89 ASSERT_TRUE(permissions->HasAPIPermission(ExtensionAPIPermission::kTab)); |
| 90 ASSERT_FALSE(bad_message); |
| 91 ASSERT_TRUE(error.empty()); |
| 92 |
| 93 // The api permissions don't need to be present either. |
| 94 value->Clear(); |
| 95 value->Set("origins", origins->DeepCopy()); |
| 96 ASSERT_TRUE(UnpackPermissionsFromValue( |
| 97 value.get(), &permissions, &bad_message, &error)); |
| 98 ASSERT_FALSE(bad_message); |
| 99 ASSERT_TRUE(error.empty()); |
| 100 ASSERT_TRUE(permissions->HasExplicitAccessToOrigin(GURL("http://a.com/"))); |
| 101 |
| 102 // Throw errors for non-string API permissions. |
| 103 value->Clear(); |
| 104 scoped_ptr<ListValue> invalid_apis(apis->DeepCopy()); |
| 105 invalid_apis->Append(Value::CreateIntegerValue(3)); |
| 106 value->Set("permissions", invalid_apis->DeepCopy()); |
| 107 ASSERT_FALSE(UnpackPermissionsFromValue( |
| 108 value.get(), &permissions, &bad_message, &error)); |
| 109 ASSERT_TRUE(bad_message); |
| 110 bad_message = false; |
| 111 |
| 112 // Throw errors for non-string origins. |
| 113 value->Clear(); |
| 114 scoped_ptr<ListValue> invalid_origins(origins->DeepCopy()); |
| 115 invalid_origins->Append(Value::CreateIntegerValue(3)); |
| 116 value->Set("origins", invalid_origins->DeepCopy()); |
| 117 ASSERT_FALSE(UnpackPermissionsFromValue( |
| 118 value.get(), &permissions, &bad_message, &error)); |
| 119 ASSERT_TRUE(bad_message); |
| 120 bad_message = false; |
| 121 |
| 122 // Throw errors when "origins" or "permissions" are not list values. |
| 123 value->Clear(); |
| 124 value->Set("origins", Value::CreateIntegerValue(2)); |
| 125 ASSERT_FALSE(UnpackPermissionsFromValue( |
| 126 value.get(), &permissions, &bad_message, &error)); |
| 127 ASSERT_TRUE(bad_message); |
| 128 bad_message = false; |
| 129 |
| 130 value->Clear(); |
| 131 value->Set("permissions", Value::CreateIntegerValue(2)); |
| 132 ASSERT_FALSE(UnpackPermissionsFromValue( |
| 133 value.get(), &permissions, &bad_message, &error)); |
| 134 ASSERT_TRUE(bad_message); |
| 135 bad_message = false; |
| 136 |
| 137 // Additional fields should be allowed. |
| 138 value->Clear(); |
| 139 value->Set("origins", origins->DeepCopy()); |
| 140 value->Set("random", Value::CreateIntegerValue(3)); |
| 141 ASSERT_TRUE(UnpackPermissionsFromValue( |
| 142 value.get(), &permissions, &bad_message, &error)); |
| 143 ASSERT_FALSE(bad_message); |
| 144 ASSERT_TRUE(error.empty()); |
| 145 ASSERT_TRUE(permissions->HasExplicitAccessToOrigin(GURL("http://a.com/"))); |
| 146 |
| 147 // Unknown permissions should throw an error but not set the bad_message bit. |
| 148 value->Clear(); |
| 149 invalid_apis.reset(apis->DeepCopy()); |
| 150 invalid_apis->Append(Value::CreateStringValue("unknown_permission")); |
| 151 value->Set("permissions", invalid_apis->DeepCopy()); |
| 152 ASSERT_FALSE(UnpackPermissionsFromValue( |
| 153 value.get(), &permissions, &bad_message, &error)); |
| 154 ASSERT_FALSE(bad_message); |
| 155 ASSERT_FALSE(error.empty()); |
| 156 ASSERT_EQ(error, "'unknown_permission' is not a recognized permission."); |
| 157 } |
| OLD | NEW |