15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/cookie_settings.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_special_storage_policy.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/common/content_settings.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/content_settings/core/common/content_settings_types.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest_constants.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using extensions::ExtensionSet;
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using extensions::Manifest;
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)using storage::SpecialStoragePolicy;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef SpecialStoragePolicy::StoragePolicy StoragePolicy;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace keys = extensions::manifest_keys;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionSpecialStoragePolicyTest : public testing::Test {
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class PolicyChangeObserver : public SpecialStoragePolicy::Observer {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PolicyChangeObserver()
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        : expected_type_(NOTIFICATION_TYPE_NONE),
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          expected_change_flags_(0) {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnGranted(const GURL& origin,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int change_flags) OVERRIDE {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(expected_type_, NOTIFICATION_TYPE_GRANT);
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(expected_origin_, origin);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(expected_change_flags_, change_flags);
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_type_ = NOTIFICATION_TYPE_NONE;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnRevoked(const GURL& origin,
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           int change_flags) OVERRIDE {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(expected_type_, NOTIFICATION_TYPE_REVOKE);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(expected_origin_, origin);
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(expected_change_flags_, change_flags);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_type_ = NOTIFICATION_TYPE_NONE;
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual void OnCleared() OVERRIDE {
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      EXPECT_EQ(expected_type_, NOTIFICATION_TYPE_CLEAR);
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_type_ = NOTIFICATION_TYPE_NONE;
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void ExpectGrant(const std::string& extension_id,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     int change_flags) {
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_type_ = NOTIFICATION_TYPE_GRANT;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_origin_ = Extension::GetBaseURLFromExtensionId(extension_id);
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_change_flags_ = change_flags;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void ExpectRevoke(const std::string& extension_id,
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      int change_flags) {
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_type_ = NOTIFICATION_TYPE_REVOKE;
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_origin_ = Extension::GetBaseURLFromExtensionId(extension_id);
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_change_flags_ = change_flags;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    void ExpectClear() {
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      expected_type_ = NOTIFICATION_TYPE_CLEAR;
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool IsCompleted() {
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return expected_type_ == NOTIFICATION_TYPE_NONE;
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    enum {
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTIFICATION_TYPE_NONE,
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTIFICATION_TYPE_GRANT,
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTIFICATION_TYPE_REVOKE,
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      NOTIFICATION_TYPE_CLEAR,
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    } expected_type_;
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    GURL expected_origin_;
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    int expected_change_flags_;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(PolicyChangeObserver);
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    policy_ = new ExtensionSpecialStoragePolicy(NULL);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> CreateProtectedApp() {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path(FILE_PATH_LITERAL("c:\\foo"));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path(FILE_PATH_LITERAL("/foo"));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue manifest;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.SetString(keys::kName, "Protected");
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.SetString(keys::kVersion, "1");
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.SetString(keys::kLaunchWebURL, "http://explicit/protected/start");
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::ListValue* list = new base::ListValue();
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    list->Append(new base::StringValue("http://explicit/protected"));
1113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    list->Append(new base::StringValue("*://*.wildcards/protected"));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.Set(keys::kWebURLs, list);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string error;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<Extension> protected_app = Extension::Create(
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        path, Manifest::INVALID_LOCATION, manifest,
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Extension::NO_FLAGS, &error);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(protected_app.get()) << error;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return protected_app;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> CreateUnlimitedApp() {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path(FILE_PATH_LITERAL("c:\\bar"));
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath path(FILE_PATH_LITERAL("/bar"));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue manifest;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.SetString(keys::kName, "Unlimited");
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.SetString(keys::kVersion, "1");
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.SetString(keys::kLaunchWebURL, "http://explicit/unlimited/start");
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    base::ListValue* list = new base::ListValue();
1323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    list->Append(new base::StringValue("unlimitedStorage"));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.Set(keys::kPermissions, list);
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    list = new base::ListValue();
1353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    list->Append(new base::StringValue("http://explicit/unlimited"));
1363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    list->Append(new base::StringValue("*://*.wildcards/unlimited"));
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.Set(keys::kWebURLs, list);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string error;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<Extension> unlimited_app = Extension::Create(
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        path, Manifest::INVALID_LOCATION, manifest,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Extension::NO_FLAGS, &error);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(unlimited_app.get()) << error;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unlimited_app;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> CreateRegularApp() {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath path(FILE_PATH_LITERAL("c:\\app"));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::FilePath path(FILE_PATH_LITERAL("/app"));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue manifest;
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    manifest.SetString(keys::kName, "App");
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manifest.SetString(keys::kVersion, "1");
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    manifest.SetString(keys::kPlatformAppBackgroundPage, "background.html");
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string error;
157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_refptr<Extension> app = Extension::Create(
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        path, Manifest::INVALID_LOCATION, manifest,
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        Extension::NO_FLAGS, &error);
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(app.get()) << error;
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return app;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verifies that the set of extensions protecting |url| is *exactly* equal to
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |expected_extensions|. Pass in an empty set to verify that an origin is not
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // protected.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectProtectedBy(const ExtensionSet& expected_extensions,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const GURL& url) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ExtensionSet* extensions = policy_->ExtensionsProtectingOrigin(url);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_extensions.size(), extensions->size());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (ExtensionSet::const_iterator it = expected_extensions.begin();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != expected_extensions.end(); ++it) {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(extensions->Contains((*it)->id()))
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << "Origin " << url << "not protected by extension ID "
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          << (*it)->id();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ExtensionSpecialStoragePolicy> policy_;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSpecialStoragePolicyTest, EmptyPolicy) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kHttpUrl("http://foo");
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GURL kExtensionUrl("chrome-extension://bar");
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> app(CreateRegularApp());
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(kHttpUrl));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(kHttpUrl));  // test cached result
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(kExtensionUrl));
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(app->url()));
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet empty_set;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, kHttpUrl);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This one is just based on the scheme.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageProtected(kExtensionUrl));
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageProtected(app->url()));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSpecialStoragePolicyTest, AppWithProtectedStorage) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension(CreateProtectedApp());
201868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->GrantRightsForExtension(extension.get());
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet protecting_extensions;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protecting_extensions.Insert(extension);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet empty_set;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(extension->url()));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(GURL("http://explicit/")));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://explicit/"));
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://explicit:6000/"));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://foo.wildcards/"));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("https://bar.wildcards/"));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("http://not_listed/"));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->RevokeRightsForExtension(extension.get());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("http://explicit/"));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("http://foo.wildcards/"));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("https://bar.wildcards/"));
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSpecialStoragePolicyTest, AppWithUnlimitedStorage) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> extension(CreateUnlimitedApp());
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->GrantRightsForExtension(extension.get());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet protecting_extensions;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protecting_extensions.Insert(extension);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet empty_set;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://explicit/"));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://explicit:6000/"));
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("https://foo.wildcards/"));
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("https://foo.wildcards/"));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://bar.wildcards/"));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("http://not_listed/"));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageUnlimited(extension->url()));
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageUnlimited(GURL("http://explicit/")));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageUnlimited(GURL("http://explicit:6000/")));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageUnlimited(GURL("https://foo.wildcards/")));
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageUnlimited(GURL("https://bar.wildcards/")));
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(GURL("http://not_listed/")));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->RevokeRightsForExtension(extension.get());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("http://explicit/"));
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("https://foo.wildcards/"));
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("https://foo.wildcards/"));
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("http://bar.wildcards/"));
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(GURL("http://explicit/")));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(GURL("https://foo.wildcards/")));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(GURL("https://bar.wildcards/")));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSpecialStoragePolicyTest, CanQueryDiskSize) {
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL kHttpUrl("http://foo");
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const GURL kExtensionUrl("chrome-extension://bar");
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> regular_app(CreateRegularApp());
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> protected_app(CreateProtectedApp());
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> unlimited_app(CreateUnlimitedApp());
256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->GrantRightsForExtension(regular_app.get());
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->GrantRightsForExtension(protected_app.get());
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->GrantRightsForExtension(unlimited_app.get());
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(policy_->CanQueryDiskSize(kHttpUrl));
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(policy_->CanQueryDiskSize(kExtensionUrl));
262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(policy_->CanQueryDiskSize(regular_app->url()));
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(policy_->CanQueryDiskSize(protected_app->url()));
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(policy_->CanQueryDiskSize(unlimited_app->url()));
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ExtensionSpecialStoragePolicyTest, HasIsolatedStorage) {
268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL kHttpUrl("http://foo");
269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const GURL kExtensionUrl("chrome-extension://bar");
270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_refptr<Extension> app(CreateRegularApp());
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->GrantRightsForExtension(app.get());
272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(policy_->HasIsolatedStorage(kHttpUrl));
274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(policy_->HasIsolatedStorage(kExtensionUrl));
275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_TRUE(policy_->HasIsolatedStorage(app->url()));
276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSpecialStoragePolicyTest, OverlappingApps) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> protected_app(CreateProtectedApp());
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<Extension> unlimited_app(CreateUnlimitedApp());
281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->GrantRightsForExtension(protected_app.get());
282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->GrantRightsForExtension(unlimited_app.get());
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet protecting_extensions;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSet empty_set;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protecting_extensions.Insert(protected_app);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protecting_extensions.Insert(unlimited_app);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://explicit/"));
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://explicit:6000/"));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("https://foo.wildcards/"));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("https://foo.wildcards/"));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://bar.wildcards/"));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("http://not_listed/"));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageUnlimited(GURL("http://explicit/")));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageUnlimited(GURL("http://explicit:6000/")));
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageUnlimited(GURL("https://foo.wildcards/")));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->IsStorageUnlimited(GURL("https://bar.wildcards/")));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(GURL("http://not_listed/")));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
300868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->RevokeRightsForExtension(unlimited_app.get());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protecting_extensions.Remove(unlimited_app->id());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(GURL("http://explicit/")));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(GURL("https://foo.wildcards/")));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->IsStorageUnlimited(GURL("https://bar.wildcards/")));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://explicit/"));
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("http://foo.wildcards/"));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(protecting_extensions, GURL("https://bar.wildcards/"));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
309868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  policy_->RevokeRightsForExtension(protected_app.get());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("http://explicit/"));
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("http://foo.wildcards/"));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExpectProtectedBy(empty_set, GURL("https://bar.wildcards/"));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ExtensionSpecialStoragePolicyTest, HasSessionOnlyOrigins) {
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile profile;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CookieSettings* cookie_settings =
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      CookieSettings::Factory::GetForProfile(&profile).get();
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  policy_ = new ExtensionSpecialStoragePolicy(cookie_settings);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->HasSessionOnlyOrigins());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The default setting can be session-only.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_settings->SetDefaultCookieSetting(CONTENT_SETTING_SESSION_ONLY);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->HasSessionOnlyOrigins());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_settings->SetDefaultCookieSetting(CONTENT_SETTING_ALLOW);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->HasSessionOnlyOrigins());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Or the session-onlyness can affect individual origins.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern pattern =
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromString("pattern.com");
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_settings->SetCookieSetting(pattern,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ContentSettingsPattern::Wildcard(),
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    CONTENT_SETTING_SESSION_ONLY);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(policy_->HasSessionOnlyOrigins());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clearing an origin-specific rule.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cookie_settings->ResetCookieSetting(pattern,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      ContentSettingsPattern::Wildcard());
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(policy_->HasSessionOnlyOrigins());
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(ExtensionSpecialStoragePolicyTest, NotificationTest) {
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop;
352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::TestBrowserThread ui_thread(BrowserThread::UI, &message_loop);
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::TestBrowserThread io_thread(BrowserThread::IO, &message_loop);
354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PolicyChangeObserver observer;
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  policy_->AddObserver(&observer);
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_refptr<Extension> apps[] = {
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CreateProtectedApp(),
360c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CreateUnlimitedApp(),
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int change_flags[] = {
364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SpecialStoragePolicy::STORAGE_PROTECTED,
365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SpecialStoragePolicy::STORAGE_PROTECTED |
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SpecialStoragePolicy::STORAGE_UNLIMITED,
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(arraysize(apps), arraysize(change_flags));
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < arraysize(apps); ++i) {
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE(testing::Message() << "i: " << i);
373c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observer.ExpectGrant(apps[i]->id(), change_flags[i]);
374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    policy_->GrantRightsForExtension(apps[i].get());
375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_loop.RunUntilIdle();
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(observer.IsCompleted());
377c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
378c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < arraysize(apps); ++i) {
380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE(testing::Message() << "i: " << i);
381868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    policy_->GrantRightsForExtension(apps[i].get());
382c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_loop.RunUntilIdle();
383c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(observer.IsCompleted());
384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
385c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
386c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < arraysize(apps); ++i) {
387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE(testing::Message() << "i: " << i);
388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    observer.ExpectRevoke(apps[i]->id(), change_flags[i]);
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    policy_->RevokeRightsForExtension(apps[i].get());
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_loop.RunUntilIdle();
391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(observer.IsCompleted());
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < arraysize(apps); ++i) {
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE(testing::Message() << "i: " << i);
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    policy_->RevokeRightsForExtension(apps[i].get());
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    message_loop.RunUntilIdle();
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_TRUE(observer.IsCompleted());
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  observer.ExpectClear();
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  policy_->RevokeRightsForAllExtensions();
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  message_loop.RunUntilIdle();
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(observer.IsCompleted());
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  policy_->RemoveObserver(&observer);
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
408