15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 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) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/drive/drive_app_registry.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/macros.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/run_loop.h" 100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/values.h" 11a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/drive/drive_app_registry_observer.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/fake_drive_service.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/drive_api_parser.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/gdata_wapi_parser.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace drive { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass TestDriveAppRegistryObserver : public DriveAppRegistryObserver { 22a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch public: 23a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch explicit TestDriveAppRegistryObserver(DriveAppRegistry* registry) 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : registry_(registry), 25a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch update_count_(0) { 26a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch registry_->AddObserver(this); 27a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 28a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual ~TestDriveAppRegistryObserver() { 29a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch registry_->RemoveObserver(this); 30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 31a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 32a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int update_count() const { return update_count_; } 33a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 34a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private: 35a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // DriveAppRegistryObserver overrides: 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch virtual void OnDriveAppRegistryUpdated() OVERRIDE { ++update_count_; } 37a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 38a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DriveAppRegistry* registry_; 39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch int update_count_; 40a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch DISALLOW_COPY_AND_ASSIGN(TestDriveAppRegistryObserver); 41a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}; 42a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class DriveAppRegistryTest : public testing::Test { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void SetUp() OVERRIDE { 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fake_drive_service_.reset(new FakeDriveService); 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fake_drive_service_->LoadAppListForDriveApi("drive/applist.json"); 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_.reset(new DriveAppRegistry(fake_drive_service_.get())); 5090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool VerifyApp(const std::vector<DriveAppInfo>& list, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& app_id, 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& app_name) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found = false; 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < list.size(); ++i) { 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const DriveAppInfo& app = list[i]; 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (app_id == app.app_id) { 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(app_name, app.app_name); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = true; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(found) << "Unable to find app with app_id " << app_id; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return found; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<FakeDriveService> fake_drive_service_; 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<DriveAppRegistry> apps_registry_; 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(DriveAppRegistryTest, BasicParse) { 74a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch TestDriveAppRegistryObserver observer(apps_registry_.get()); 75a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->Update(); 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 78a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1, observer.update_count()); 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<DriveAppInfo> apps; 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->GetAppList(&apps); 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_EQ(2u, apps.size()); 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("123456788192", apps[0].app_id); 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("Drive app 1", apps[0].app_name); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("https://www.example.com/createForApp1", 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps[0].create_url.spec()); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("abcdefghabcdefghabcdefghabcdefgh", apps[0].product_id); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(apps[0].is_removable); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(DriveAppRegistryTest, LoadAndFindDriveApps) { 93a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch TestDriveAppRegistryObserver observer(apps_registry_.get()); 94a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->Update(); 962385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::RunLoop().RunUntilIdle(); 97a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1, observer.update_count()); 982385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find by primary extension 'exe'. 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<DriveAppInfo> ext_results; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath ext_file(FILE_PATH_LITERAL("drive/file.exe")); 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->GetAppsForFile(ext_file.Extension(), "", &ext_results); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, ext_results.size()); 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VerifyApp(ext_results, "123456788192", "Drive app 1"); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find by primary MIME type. 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<DriveAppInfo> primary_app; 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->GetAppsForFile(base::FilePath::StringType(), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "application/vnd.google-apps.drive-sdk.123456788192", &primary_app); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, primary_app.size()); 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VerifyApp(primary_app, "123456788192", "Drive app 1"); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find by secondary MIME type. 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<DriveAppInfo> secondary_app; 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->GetAppsForFile( 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::FilePath::StringType(), "text/html", &secondary_app); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, secondary_app.size()); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) VerifyApp(secondary_app, "123456788192", "Drive app 1"); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 121424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST_F(DriveAppRegistryTest, UpdateFromAppList) { 122424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<base::Value> app_info_value = 123424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) google_apis::test_util::LoadJSONFile("drive/applist.json"); 124424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_ptr<google_apis::AppList> app_list( 125424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) google_apis::AppList::CreateFrom(*app_info_value)); 126424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 127a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch TestDriveAppRegistryObserver observer(apps_registry_.get()); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->UpdateFromAppList(*app_list); 129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1, observer.update_count()); 130424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Confirm that something was loaded from applist.json. 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<DriveAppInfo> ext_results; 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::FilePath ext_file(FILE_PATH_LITERAL("drive/file.exe")); 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->GetAppsForFile(ext_file.Extension(), "", &ext_results); 135424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ASSERT_EQ(1U, ext_results.size()); 136424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 137424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1382385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen MurdochTEST_F(DriveAppRegistryTest, MultipleUpdate) { 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch TestDriveAppRegistryObserver observer(apps_registry_.get()); 140a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 1412385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Call Update(). 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->Update(); 143a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0, observer.update_count()); 1442385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1452385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // Call Update() again. 1462385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // This call should be ignored because there is already an ongoing update. 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->Update(); 148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0, observer.update_count()); 1492385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 1502385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // The app list should be loaded only once. 1512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch base::RunLoop().RunUntilIdle(); 1522385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch EXPECT_EQ(1, fake_drive_service_->app_list_load_count()); 153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1, observer.update_count()); 1542385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch} 1552385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 156424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST(DriveAppRegistryUtilTest, FindPreferredIcon_Empty) { 1570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DriveAppInfo::IconList icons; 158424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ("", 159424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) util::FindPreferredIcon(icons, util::kPreferredIconSize).spec()); 160424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 161424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 162424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)TEST(DriveAppRegistryUtilTest, FindPreferredIcon_) { 163424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const char kSmallerIconUrl[] = "http://example.com/smaller.png"; 164424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const char kMediumIconUrl[] = "http://example.com/medium.png"; 165424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const char kBiggerIconUrl[] = "http://example.com/bigger.png"; 166424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const int kMediumSize = 16; 167424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DriveAppInfo::IconList icons; 169424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The icons are not sorted by the size. 170424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) icons.push_back(std::make_pair(kMediumSize, 171424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GURL(kMediumIconUrl))); 172424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) icons.push_back(std::make_pair(kMediumSize + 2, 173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GURL(kBiggerIconUrl))); 174424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) icons.push_back(std::make_pair(kMediumSize - 2, 175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GURL(kSmallerIconUrl))); 176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 177424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Exact match. 178424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(kMediumIconUrl, 179424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) util::FindPreferredIcon(icons, kMediumSize).spec()); 180424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The requested size is in-between of smaller.png and 181424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // medium.png. medium.png should be returned. 182424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(kMediumIconUrl, 183424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) util::FindPreferredIcon(icons, kMediumSize - 1).spec()); 184424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The requested size is smaller than the smallest icon. The smallest icon 185424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // should be returned. 186424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(kSmallerIconUrl, 187424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) util::FindPreferredIcon(icons, kMediumSize - 3).spec()); 188424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // The requested size is larger than the largest icon. The largest icon 189424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // should be returned. 190424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(kBiggerIconUrl, 191424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) util::FindPreferredIcon(icons, kMediumSize + 3).spec()); 192424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)} 193424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(DriveAppRegistryTest, UninstallDriveApp) { 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->Update(); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<DriveAppInfo> apps; 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->GetAppList(&apps); 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t original_count = apps.size(); 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Uninstall an existing app. 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->UninstallApp( 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "123456788192", 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(error, google_apis::HTTP_NO_CONTENT); 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Check that the number of apps is decreased by one. 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->GetAppList(&apps); 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(original_count - 1, apps.size()); 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Try to uninstall a non-existing app. 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) error = google_apis::GDATA_OTHER_ERROR; 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->UninstallApp( 2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "non-existing-app-id", 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(error, google_apis::HTTP_NOT_FOUND); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Check that the number is not changed this time. 2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) apps_registry_->GetAppList(&apps); 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(original_count - 1, apps.size()); 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace drive 228