11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/run_loop.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/extension_service.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/webstore_installer_test.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/webstore_reinstaller.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/browser.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/tabs/tab_strip_model.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/extensions/webstore_install_result.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/browser/extension_registry.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/extension_builder.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/value_builder.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace extensions {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kWebstoreDomain[] = "cws.com";
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kAppDomain[] = "app.com";
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kNonAppDomain[] = "nonapp.com";
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTestExtensionId[] = "ecglahbcnmdpdciemllbhojghbkagdje";
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kTestDataPath[] = "extensions/api_test/webstore_inline_install";
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciconst char kCrxFilename[] = "extension.crx";
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass WebstoreReinstallerBrowserTest : public WebstoreInstallerTest {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebstoreReinstallerBrowserTest()
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : WebstoreInstallerTest(
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            kWebstoreDomain,
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            kTestDataPath,
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            kCrxFilename,
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            kAppDomain,
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            kNonAppDomain) {}
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual ~WebstoreReinstallerBrowserTest() {}
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void OnInstallCompletion(const base::Closure& quit_closure,
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           bool success,
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           const std::string& error,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                           webstore_install::Result result);
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool last_install_result() const { return last_install_result_; }
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool last_install_result_;
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebstoreReinstallerBrowserTest::OnInstallCompletion(
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::Closure& quit_closure,
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool success,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& error,
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    webstore_install::Result result) {
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  last_install_result_ = success;
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  quit_closure.Run();
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(WebstoreReinstallerBrowserTest, TestWebstoreReinstall) {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Build an extension with the same id as our test extension and add it.
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string kExtensionName("ReinstallerExtension");
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<const Extension> extension =
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExtensionBuilder().SetLocation(Manifest::INTERNAL)
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      .SetID(kTestExtensionId)
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      .SetManifest(
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          DictionaryBuilder().Set("name", kExtensionName)
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             .Set("description", "Foo")
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             .Set("manifest_version", 2)
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             .Set("version", "1.0")
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                             .Build())
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      .Build();
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extension_service()->AddExtension(extension.get());
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ExtensionRegistry* registry = ExtensionRegistry::Get(profile());
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(registry->enabled_extensions().GetByID(kTestExtensionId));
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  content::WebContents* active_web_contents =
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser()->tab_strip_model()->GetActiveWebContents();
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(active_web_contents);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Start by canceling the repair prompt.
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AutoCancelInstall();
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Create and run a WebstoreReinstaller.
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop run_loop;
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<WebstoreReinstaller> reinstaller(
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new WebstoreReinstaller(
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          active_web_contents,
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kTestExtensionId,
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(&WebstoreReinstallerBrowserTest::OnInstallCompletion,
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     base::Unretained(this),
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     run_loop.QuitClosure())));
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  reinstaller->BeginReinstall();
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  run_loop.Run();
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // We should have failed, and the old extension should still be present.
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(last_install_result());
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extension = registry->enabled_extensions().GetByID(kTestExtensionId);
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(extension.get());
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kExtensionName, extension->name());
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Now accept the repair prompt.
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AutoAcceptInstall();
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::RunLoop run_loop2;
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  reinstaller =
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new WebstoreReinstaller(
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          active_web_contents,
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          kTestExtensionId,
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(&WebstoreReinstallerBrowserTest::OnInstallCompletion,
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     base::Unretained(this),
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     run_loop2.QuitClosure()));
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  reinstaller->BeginReinstall();
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  run_loop2.Run();
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The reinstall should have succeeded, and the extension should have been
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // "updated" (which in this case means that it should have been replaced with
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the inline install test extension, since that's the id we used).
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(last_install_result());
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extension = registry->enabled_extensions().GetByID(kTestExtensionId);
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(extension.get());
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The name should not match, since the extension changed.
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_NE(kExtensionName, extension->name());
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace extensions
128