10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Copyright 2014 The Chromium Authors. All rights reserved.
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Use of this source code is governed by a BSD-style license that can be
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// found in the LICENSE file.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/browser/apps/drive/drive_app_converter.h"
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <utility>
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "base/bind.h"
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "base/memory/scoped_ptr.h"
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "base/path_service.h"
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "base/version.h"
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/browser/extensions/extension_browsertest.h"
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/browser/extensions/extension_service.h"
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/browser/extensions/extension_util.h"
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/common/chrome_paths.h"
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/common/extensions/extension_constants.h"
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "content/public/test/test_utils.h"
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "extensions/browser/extension_system.h"
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "extensions/common/extension.h"
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "extensions/common/manifest_handlers/icons_handler.h"
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "extensions/common/permissions/permission_set.h"
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "extensions/common/permissions/permissions_data.h"
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "net/test/embedded_test_server/embedded_test_server.h"
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing extensions::AppLaunchInfo;
290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing extensions::Extension;
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing extensions::ExtensionRegistry;
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace {
330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst char kAppName[] = "Test drive app";
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst char kAppUrl[] = "http://foobar.com/drive_app";
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass DriveAppConverterTest : public ExtensionBrowserTest {
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
41cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org  DriveAppConverterTest() {}
42cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org  virtual ~DriveAppConverterTest() {}
43cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org
44cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org  // ExtensionBrowserTest:
45cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org  virtual void SetUpOnMainThread() OVERRIDE {
4697fbd309a28be4e38d138b40662507d50cab6d26sergeyu@chromium.org    ExtensionBrowserTest::SetUpOnMainThread();
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    base::FilePath test_data_dir;
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir);
507663c27fdfb3df16d08afced5d8b08026e91c05dbuildbot@webrtc.org    embedded_test_server()->ServeFilesFromDirectory(test_data_dir);
517663c27fdfb3df16d08afced5d8b08026e91c05dbuildbot@webrtc.org    ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
527663c27fdfb3df16d08afced5d8b08026e91c05dbuildbot@webrtc.org  }
537663c27fdfb3df16d08afced5d8b08026e91c05dbuildbot@webrtc.org
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void InstallAndWaitFinish(const drive::DriveAppInfo& drive_app) {
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    runner_ = new content::MessageLoopRunner;
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
575462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org    converter_.reset(new DriveAppConverter(
585462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org        profile(),
595462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org        drive_app,
605462dd96b8c4b0be60dd3110e70f4345c110044abuildbot@webrtc.org        base::Bind(&DriveAppConverterTest::ConverterFinished,
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   base::Unretained(this))));
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    converter_->Start();
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    runner_->Run();
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  GURL GetTestUrl(const std::string& path) {
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return embedded_test_server()->base_url().Resolve(path);
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  drive::DriveAppInfo GetTestDriveApp() {
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Define four icons. icon1.png is 16x16 and good to use. icon2.png is
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // 16x16 but claims to be 32x32 and should be dropped. icon3.png is 66x66
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // and not a valid extension icon size and should be dropped too. The forth
752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    // one is icon2.png with 16x16 but should be ignored because 16x16 already
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // has icon1.png as its resource.
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    drive::DriveAppInfo::IconList app_icons;
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    app_icons.push_back(std::make_pair(16, GetTestUrl("extensions/icon1.png")));
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    app_icons.push_back(std::make_pair(32, GetTestUrl("extensions/icon2.png")));
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    app_icons.push_back(std::make_pair(66, GetTestUrl("extensions/icon3.png")));
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    app_icons.push_back(std::make_pair(16, GetTestUrl("extensions/icon2.png")));
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    drive::DriveAppInfo::IconList document_icons;
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return drive::DriveAppInfo("fake_drive_app_id",
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               "fake_product_id",
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               app_icons,
887162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org                               document_icons,
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               kAppName,
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               GURL(kAppUrl),
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                               true);
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const DriveAppConverter* converter() const { return converter_.get(); }
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void ConverterFinished(const DriveAppConverter* converter, bool success) {
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (runner_.get())
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      runner_->Quit();
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  scoped_ptr<DriveAppConverter> converter_;
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  scoped_refptr<content::MessageLoopRunner> runner_;
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DISALLOW_COPY_AND_ASSIGN(DriveAppConverterTest);
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1082a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgIN_PROC_BROWSER_TEST_F(DriveAppConverterTest, GoodApp) {
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  InstallAndWaitFinish(GetTestDriveApp());
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const Extension* app = converter()->extension();
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(app != NULL);
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(kAppName, app->name());
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(app->is_hosted_app());
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(app->from_bookmark());
1165528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  EXPECT_EQ(GURL(kAppUrl), AppLaunchInfo::GetLaunchWebURL(app));
1175528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  EXPECT_EQ(extensions::LAUNCH_CONTAINER_TAB,
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            AppLaunchInfo::GetLaunchContainer(app));
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(0u, app->permissions_data()->active_permissions()->apis().size());
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(1u, extensions::IconsInfo::GetIcons(app).map().size());
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const Extension* installed = extensions::ExtensionSystem::Get(profile())
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   ->extension_service()
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   ->GetInstalledExtension(app->id());
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(app, installed);
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(extensions::util::ShouldSyncApp(app, profile()));
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgIN_PROC_BROWSER_TEST_F(DriveAppConverterTest, BadApp) {
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  drive::DriveAppInfo no_name = GetTestDriveApp();
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  no_name.app_name.clear();
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  InstallAndWaitFinish(no_name);
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(converter()->extension() == NULL);
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  drive::DriveAppInfo no_url = GetTestDriveApp();
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  no_url.create_url = GURL();
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  InstallAndWaitFinish(no_url);
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(converter()->extension() == NULL);
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgIN_PROC_BROWSER_TEST_F(DriveAppConverterTest, InstallTwice) {
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  InstallAndWaitFinish(GetTestDriveApp());
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const Extension* first_install = converter()->extension();
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(first_install != NULL);
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(converter()->is_new_install());
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const std::string first_install_id = first_install->id();
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const base::Version first_install_version(first_install->VersionString());
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(first_install_version.IsValid());
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  InstallAndWaitFinish(GetTestDriveApp());
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const Extension* second_install = converter()->extension();
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(second_install != NULL);
1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(converter()->is_new_install());
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Two different app instances.
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_NE(first_install, second_install);
1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(first_install_id, second_install->id());
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_GE(second_install->version()->CompareTo(first_install_version), 0);
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org