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