Chromium Code Reviews| Index: chrome/browser/extensions/content_verifier_browsertest.cc |
| diff --git a/chrome/browser/extensions/content_verifier_browsertest.cc b/chrome/browser/extensions/content_verifier_browsertest.cc |
| index 645875d85ea483c839fbfd1eef33e050467d10cb..57fb247d7e83b220f009a79d2388e84fe26e1c16 100644 |
| --- a/chrome/browser/extensions/content_verifier_browsertest.cc |
| +++ b/chrome/browser/extensions/content_verifier_browsertest.cc |
| @@ -14,6 +14,7 @@ |
| #include "base/strings/string_split.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "chrome/browser/extensions/browsertest_util.h" |
| +#include "chrome/browser/extensions/chrome_content_verifier_delegate.h" |
| #include "chrome/browser/extensions/extension_browsertest.h" |
| #include "chrome/browser/extensions/extension_management_test_util.h" |
| #include "chrome/browser/extensions/extension_service.h" |
| @@ -750,4 +751,66 @@ IN_PROC_BROWSER_TEST_F(ContentVerifierPolicyTest, |
| EXPECT_FALSE(reasons & Extension::DISABLE_CORRUPTED); |
| } |
| +namespace { |
| + |
| +// A helper for intercepting the normal action that |
| +// ChromeContentVerifierDelegate would take on discovering corruption, letting |
| +// us track the delay for each consecutive reinstall. |
| +class DelayTracker : public base::SupportsWeakPtr<DelayTracker> { |
|
Devlin
2016/11/29 22:31:24
probably safe to just use unretained here.
asargent_no_longer_on_chrome
2016/11/30 00:11:49
Done.
|
| + public: |
| + DelayTracker() {} |
| + |
| + const std::vector<base::TimeDelta>& calls() { return calls_; } |
| + |
| + void ReinstallAction(base::TimeDelta delay) { calls_.push_back(delay); } |
| + |
| + private: |
| + std::vector<base::TimeDelta> calls_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(DelayTracker); |
| +}; |
| + |
| +} // namespace |
| + |
| +IN_PROC_BROWSER_TEST_F(ContentVerifierPolicyTest, Backoff) { |
| + ExtensionRegistry* registry = ExtensionRegistry::Get(profile()); |
| + ExtensionSystem* system = ExtensionSystem::Get(profile()); |
| + ExtensionService* service = system->extension_service(); |
| + // ExtensionPrefs* prefs = ExtensionPrefs::Get(profile()); |
|
Devlin
2016/11/29 22:31:24
delete?
asargent_no_longer_on_chrome
2016/11/30 00:11:48
Good catch, done.
|
| + ContentVerifier* verifier = system->content_verifier(); |
| + |
| + // Wait for the extension to be installed by the policy we set up in |
| + // SetUpInProcessBrowserTestFixture. |
| + if (!registry->GetInstalledExtension(id_)) { |
| + RegistryObserver registry_observer(registry); |
| + EXPECT_TRUE(registry_observer.WaitForInstall(id_)); |
| + } |
| + |
| + // Setup to intercept reinstall action, so we can see what the delay would |
| + // have been for the real action. |
| + DelayTracker delay_tracker; |
| + ChromeContentVerifierDelegate::set_policy_reinstall_action_for_test( |
| + base::Bind(&DelayTracker::ReinstallAction, delay_tracker.AsWeakPtr())); |
| + |
| + // Do 4 iterations of disabling followed by reinstall. |
| + const size_t iterations = 4; |
| + for (size_t i = 0; i < iterations; i++) { |
| + RegistryObserver registry_observer(registry); |
| + verifier->VerifyFailed(id_, ContentVerifyJob::HASH_MISMATCH); |
| + EXPECT_TRUE(registry_observer.WaitForUnload(id_)); |
| + // Trigger reinstall manually (since we overrode default reinstall action). |
| + service->CheckForExternalUpdates(); |
| + EXPECT_TRUE(registry_observer.WaitForInstall(id_)); |
| + } |
| + const std::vector<base::TimeDelta>& calls = delay_tracker.calls(); |
| + |
| + // Assert that the first reinstall action happened with a delay of 0, and |
| + // then kept growing each additional time. |
| + EXPECT_EQ(iterations, calls.size()); |
| + EXPECT_EQ(base::TimeDelta(), delay_tracker.calls()[0]); |
|
Devlin
2016/11/29 22:31:25
we should either ASSERT_EQ the size above or shoul
asargent_no_longer_on_chrome
2016/11/30 00:11:48
Done.
|
| + for (size_t i = 1; i < delay_tracker.calls().size(); i++) { |
| + EXPECT_LT(calls[i - 1], calls[i]); |
| + } |
| +} |
| + |
| } // namespace extensions |