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