Index: chrome/browser/ui/app_list/app_list_syncable_service_unittest.cc |
diff --git a/chrome/browser/ui/app_list/app_list_syncable_service_unittest.cc b/chrome/browser/ui/app_list/app_list_syncable_service_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e454e1b4cc618c35ae7170fc64a228a25fa86bd3 |
--- /dev/null |
+++ b/chrome/browser/ui/app_list/app_list_syncable_service_unittest.cc |
@@ -0,0 +1,133 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/app_list/app_list_syncable_service.h" |
+#include "base/files/scoped_temp_dir.h" |
+#include "chrome/browser/extensions/extension_service.h" |
+#include "chrome/browser/profiles/profile_manager.h" |
+#include "chrome/browser/ui/app_list/app_list_test_util.h" |
+#include "chrome/test/base/testing_browser_process.h" |
+#include "chrome/test/base/testing_profile.h" |
+#include "components/crx_file/id_util.h" |
+#include "extensions/browser/extension_system.h" |
+#include "extensions/common/constants.h" |
+#include "ui/app_list/app_list_item.h" |
+#include "ui/app_list/app_list_model.h" |
+ |
+namespace { |
+ |
+scoped_refptr<extensions::Extension> MakeApp( |
+ const std::string& name, |
+ const std::string& id, |
+ extensions::Extension::InitFromValueFlags flags) { |
+ std::string err; |
+ base::DictionaryValue value; |
+ value.SetString("name", name); |
+ value.SetString("version", "0.0"); |
+ value.SetString("app.launch.web_url", "http://google.com"); |
+ scoped_refptr<extensions::Extension> app = extensions::Extension::Create( |
+ base::FilePath(), extensions::Manifest::INTERNAL, value, flags, id, &err); |
+ EXPECT_EQ(err, ""); |
+ return app; |
+} |
+ |
+// Creates next by natural sort ordering application id. Application id has to |
+// have 32 chars each in range 'a' to 'p' inclusively. |
+std::string CreateNextAppId(const std::string& app_id) { |
+ DCHECK(crx_file::id_util::IdIsValid(app_id)); |
+ std::string next_app_id = app_id; |
+ size_t index = next_app_id.length() - 1; |
+ while (index > 0 && next_app_id[index] == 'p') |
+ next_app_id[index--] = 'a'; |
+ DCHECK(next_app_id[index] != 'p'); |
+ next_app_id[index]++; |
+ DCHECK(crx_file::id_util::IdIsValid(next_app_id)); |
+ return next_app_id; |
+} |
stevenjb
2017/03/06 22:52:06
Fancy :)
khmel
2017/03/06 22:54:15
:)
|
+ |
+} // namespace |
+ |
+class AppListSyncableServiceTest : public AppListTestBase { |
+ public: |
+ AppListSyncableServiceTest() = default; |
+ ~AppListSyncableServiceTest() override = default; |
+ |
+ void SetUp() override { |
+ AppListTestBase::SetUp(); |
+ |
+ // Make sure we have a Profile Manager. |
+ DCHECK(temp_dir_.CreateUniqueTempDir()); |
+ TestingBrowserProcess::GetGlobal()->SetProfileManager( |
+ new ProfileManagerWithoutInit(temp_dir_.GetPath())); |
+ |
+ extensions::ExtensionSystem* extension_system = |
+ extensions::ExtensionSystem::Get(profile_.get()); |
+ DCHECK(extension_system); |
+ app_list_syncable_service_.reset( |
+ new app_list::AppListSyncableService(profile_.get(), extension_system)); |
+ } |
+ |
+ void TearDown() override { app_list_syncable_service_.reset(); } |
+ |
+ app_list::AppListModel* model() { |
+ return app_list_syncable_service_->GetModel(); |
+ } |
+ |
+ private: |
+ base::ScopedTempDir temp_dir_; |
+ std::unique_ptr<app_list::AppListSyncableService> app_list_syncable_service_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(AppListSyncableServiceTest); |
+}; |
+ |
+TEST_F(AppListSyncableServiceTest, OEMFolderForConflictingPos) { |
+ // Create a "web store" app. |
+ const std::string web_store_app_id(extensions::kWebStoreAppId); |
+ scoped_refptr<extensions::Extension> store = |
+ MakeApp("webstore", web_store_app_id, |
+ extensions::Extension::WAS_INSTALLED_BY_DEFAULT); |
+ service_->AddExtension(store.get()); |
+ |
+ // Create some app. Note its id should be greater than web store app id in |
+ // order to move app in case of conflicting pos after web store app. |
+ const std::string some_app_id = CreateNextAppId(extensions::kWebStoreAppId); |
+ scoped_refptr<extensions::Extension> some_app = |
+ MakeApp("some_app", some_app_id, |
+ extensions ::Extension::WAS_INSTALLED_BY_DEFAULT); |
+ service_->AddExtension(some_app.get()); |
+ |
+ app_list::AppListItem* web_store_item = model()->FindItem(web_store_app_id); |
+ ASSERT_TRUE(web_store_item); |
+ app_list::AppListItem* some_app_item = model()->FindItem(some_app_id); |
+ ASSERT_TRUE(some_app_item); |
+ |
+ // Simulate position conflict. |
+ model()->SetItemPosition(web_store_item, some_app_item->position()); |
+ |
+ // Install an OEM app. It must be placed by default after web store app but in |
+ // case of app of the same position should be shifted next. |
+ const std::string oem_app_id = CreateNextAppId(some_app_id); |
+ scoped_refptr<extensions::Extension> oem_app = MakeApp( |
+ "oem_app", oem_app_id, extensions::Extension::WAS_INSTALLED_BY_OEM); |
+ service_->AddExtension(oem_app.get()); |
+ |
+ size_t web_store_app_index; |
+ size_t some_app_index; |
+ size_t oem_app_index; |
+ size_t oem_folder_index; |
+ EXPECT_TRUE(model()->top_level_item_list()->FindItemIndex( |
+ web_store_app_id, &web_store_app_index)); |
+ EXPECT_TRUE(model()->top_level_item_list()->FindItemIndex(some_app_id, |
+ &some_app_index)); |
+ // OEM item is not top level element. |
+ EXPECT_FALSE(model()->top_level_item_list()->FindItemIndex(oem_app_id, |
+ &oem_app_index)); |
+ // But OEM folder is. |
+ EXPECT_TRUE(model()->top_level_item_list()->FindItemIndex( |
+ app_list::AppListSyncableService::kOemFolderId, &oem_folder_index)); |
+ |
+ // Ensure right item sequence. |
+ EXPECT_EQ(some_app_index, web_store_app_index + 1); |
+ EXPECT_EQ(oem_folder_index, web_store_app_index + 2); |
+} |