// found in the LICENSE file.
#include "base/basictypes.h"
+#include "base/strings/utf_string_conversions.h"
+#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/extensions/app_sync_data.h"
+#include "chrome/browser/extensions/bookmark_app_helper.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_sync_service.h"
#include "chrome/browser/extensions/launch_util.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sync/test/integration/apps_helper.h"
#include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
#include "chrome/browser/sync/test/integration/sync_app_helper.h"
+#include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
#include "chrome/browser/sync/test/integration/sync_test.h"
#include "chrome/common/extensions/extension_constants.h"
+#include "content/public/browser/notification_service.h"
+#include "content/public/test/test_utils.h"
#include "extensions/browser/app_sorting.h"
+#include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/browser/extension_system.h"
#include "sync/api/string_ordinal.h"
using apps_helper::AllProfilesHaveSameAppsAsVerifier;
using apps_helper::IncognitoDisableApp;
using apps_helper::IncognitoEnableApp;
using apps_helper::InstallApp;
-using apps_helper::InstallAppsPendingForSync;
using apps_helper::InstallPlatformApp;
using apps_helper::SetAppLaunchOrdinalForApp;
using apps_helper::SetPageOrdinalForApp;
using apps_helper::UninstallApp;
+using apps_helper::AwaitAllProfilesHaveSameAppsAsVerifier;
+
+namespace {
+
+extensions::ExtensionRegistry* GetExtensionRegistry(Profile* profile) {
+ return extensions::ExtensionRegistry::Get(profile);
+}
+
+ExtensionService* GetExtensionService(Profile* profile) {
+ return extensions::ExtensionSystem::Get(profile)->extension_service();
+}
+
+} // namespace
class TwoClientAppsSyncTest : public SyncTest {
public:
virtual ~TwoClientAppsSyncTest() {}
+ virtual bool TestUsesSelfNotifications() OVERRIDE { return false; }
+
private:
DISALLOW_COPY_AND_ASSIGN(TwoClientAppsSyncTest);
};
IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, StartWithNoApps) {
ASSERT_TRUE(SetupSync());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, StartWithSameApps) {
ASSERT_TRUE(SetupSync());
- ASSERT_TRUE(AwaitQuiescence());
-
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// Install some apps on both clients, some on only one client, some on only the
ASSERT_TRUE(SetupSync());
- ASSERT_TRUE(AwaitQuiescence());
-
- InstallAppsPendingForSync(GetProfile(0));
- InstallAppsPendingForSync(GetProfile(1));
-
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// Install some apps on both clients, then sync. Then install some apps on only
ASSERT_TRUE(SetupSync());
- ASSERT_TRUE(AwaitQuiescence());
-
const int kNumProfile0Apps = 10;
for (int j = 0; j < kNumProfile0Apps; ++i, ++j) {
InstallApp(GetProfile(0), i);
FixNTPOrdinalCollisions(verifier());
- ASSERT_TRUE(AwaitQuiescence());
-
- InstallAppsPendingForSync(GetProfile(0));
- InstallAppsPendingForSync(GetProfile(1));
-
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// TCM ID - 3711279.
InstallApp(GetProfile(0), 0);
InstallApp(verifier(), 0);
- ASSERT_TRUE(AwaitQuiescence());
- InstallAppsPendingForSync(GetProfile(0));
- InstallAppsPendingForSync(GetProfile(1));
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// TCM ID - 3706267.
InstallApp(GetProfile(0), 0);
InstallApp(verifier(), 0);
- ASSERT_TRUE(AwaitQuiescence());
-
- InstallAppsPendingForSync(GetProfile(0));
- InstallAppsPendingForSync(GetProfile(1));
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
UninstallApp(GetProfile(0), 0);
UninstallApp(verifier(), 0);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// Install an app on one client, then sync. Then uninstall the app on the first
// ordinals.
IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, UninstallThenInstall) {
ASSERT_TRUE(SetupSync());
+
ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
InstallApp(GetProfile(0), 0);
InstallApp(verifier(), 0);
- ASSERT_TRUE(AwaitQuiescence());
-
- InstallAppsPendingForSync(GetProfile(0));
- InstallAppsPendingForSync(GetProfile(1));
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
UninstallApp(GetProfile(0), 0);
UninstallApp(verifier(), 0);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
InstallApp(GetProfile(0), 1);
InstallApp(verifier(), 1);
- ASSERT_TRUE(AwaitQuiescence());
- InstallAppsPendingForSync(GetProfile(0));
- InstallAppsPendingForSync(GetProfile(1));
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// TCM ID - 3699295.
-// Flaky: http://crbug.com/226055
-IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, DISABLED_Merge) {
+IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, Merge) {
ASSERT_TRUE(SetupSync());
ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
InstallApp(GetProfile(0), 0);
- InstallApp(GetProfile(1), 0);
- ASSERT_TRUE(AwaitQuiescence());
+ InstallApp(verifier(), 0);
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
UninstallApp(GetProfile(0), 0);
+ UninstallApp(verifier(), 0);
+
InstallApp(GetProfile(0), 1);
InstallApp(verifier(), 1);
InstallApp(GetProfile(1), 3);
InstallApp(verifier(), 3);
- ASSERT_TRUE(AwaitQuiescence());
- InstallAppsPendingForSync(GetProfile(0));
- InstallAppsPendingForSync(GetProfile(1));
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// TCM ID - 7723126.
ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
InstallApp(GetProfile(0), 0);
- InstallApp(GetProfile(1), 0);
InstallApp(verifier(), 0);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
DisableApp(GetProfile(0), 0);
DisableApp(verifier(), 0);
ASSERT_TRUE(HasSameAppsAsVerifier(0));
ASSERT_FALSE(HasSameAppsAsVerifier(1));
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
EnableApp(GetProfile(1), 0);
EnableApp(verifier(), 0);
ASSERT_TRUE(HasSameAppsAsVerifier(1));
ASSERT_FALSE(HasSameAppsAsVerifier(0));
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// TCM ID - 7706637.
ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
InstallApp(GetProfile(0), 0);
- InstallApp(GetProfile(1), 0);
InstallApp(verifier(), 0);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
IncognitoEnableApp(GetProfile(0), 0);
IncognitoEnableApp(verifier(), 0);
ASSERT_TRUE(HasSameAppsAsVerifier(0));
ASSERT_FALSE(HasSameAppsAsVerifier(1));
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
IncognitoDisableApp(GetProfile(1), 0);
IncognitoDisableApp(verifier(), 0);
ASSERT_TRUE(HasSameAppsAsVerifier(1));
ASSERT_FALSE(HasSameAppsAsVerifier(0));
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
-}
-
-// TCM ID - 3718276.
-IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, DisableApps) {
- ASSERT_TRUE(SetupSync());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
-
- ASSERT_TRUE(GetClient(1)->DisableSyncForDatatype(syncer::APPS));
- InstallApp(GetProfile(0), 0);
- InstallApp(verifier(), 0);
- ASSERT_TRUE(GetClient(0)->AwaitCommitActivityCompletion());
- ASSERT_TRUE(HasSameAppsAsVerifier(0));
- ASSERT_FALSE(HasSameAppsAsVerifier(1));
-
- ASSERT_TRUE(GetClient(1)->EnableSyncForDatatype(syncer::APPS));
- ASSERT_TRUE(AwaitQuiescence());
-
- InstallAppsPendingForSync(GetProfile(0));
- InstallAppsPendingForSync(GetProfile(1));
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
-}
-
-// Disable sync for the second client and then install an app on the first
-// client, then enable sync on the second client. Both clients should have the
-// same app with identical app and page ordinals.
-// TCM ID - 3720303.
-IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, DisableSync) {
- ASSERT_TRUE(SetupSync());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
-
- ASSERT_TRUE(GetClient(1)->DisableSyncForAllDatatypes());
- InstallApp(GetProfile(0), 0);
- InstallApp(verifier(), 0);
- ASSERT_TRUE(GetClient(0)->AwaitCommitActivityCompletion());
- ASSERT_TRUE(HasSameAppsAsVerifier(0));
- ASSERT_FALSE(HasSameAppsAsVerifier(1));
-
- ASSERT_TRUE(GetClient(1)->EnableSyncForAllDatatypes());
- ASSERT_TRUE(AwaitQuiescence());
-
- InstallAppsPendingForSync(GetProfile(0));
- InstallAppsPendingForSync(GetProfile(1));
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// Install the same app on both clients, then sync. Change the page ordinal on
syncer::StringOrdinal initial_page =
syncer::StringOrdinal::CreateInitialOrdinal();
InstallApp(GetProfile(0), 0);
- InstallApp(GetProfile(1), 0);
InstallApp(verifier(), 0);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
syncer::StringOrdinal second_page = initial_page.CreateAfter();
SetPageOrdinalForApp(GetProfile(0), 0, second_page);
SetPageOrdinalForApp(verifier(), 0, second_page);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// Install the same app on both clients, then sync. Change the app launch
ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
InstallApp(GetProfile(0), 0);
- InstallApp(GetProfile(1), 0);
InstallApp(verifier(), 0);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
syncer::StringOrdinal initial_position =
GetAppLaunchOrdinalForApp(GetProfile(0), 0);
syncer::StringOrdinal second_position = initial_position.CreateAfter();
SetAppLaunchOrdinalForApp(GetProfile(0), 0, second_position);
SetAppLaunchOrdinalForApp(verifier(), 0, second_position);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// Adjust the CWS location within a page on the first client and sync. Adjust
// Change the app launch ordinal.
syncer::StringOrdinal cws_app_launch_ordinal =
- GetProfile(0)->GetExtensionService()->
- extension_prefs()->app_sorting()->GetAppLaunchOrdinal(
- extension_misc::kWebStoreAppId);
- GetProfile(0)->GetExtensionService()->extension_prefs()->app_sorting()->
- SetAppLaunchOrdinal(
- extension_misc::kWebStoreAppId, cws_app_launch_ordinal.CreateAfter());
- verifier()->GetExtensionService()->extension_prefs()->app_sorting()->
- SetAppLaunchOrdinal(
- extension_misc::kWebStoreAppId, cws_app_launch_ordinal.CreateAfter());
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ extensions::ExtensionPrefs::Get(GetProfile(0))
+ ->app_sorting()
+ ->GetAppLaunchOrdinal(extension_misc::kWebStoreAppId);
+ extensions::ExtensionPrefs::Get(GetProfile(0))
+ ->app_sorting()
+ ->SetAppLaunchOrdinal(extension_misc::kWebStoreAppId,
+ cws_app_launch_ordinal.CreateAfter());
+ extensions::ExtensionPrefs::Get(verifier())
+ ->app_sorting()
+ ->SetAppLaunchOrdinal(extension_misc::kWebStoreAppId,
+ cws_app_launch_ordinal.CreateAfter());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
// Change the page ordinal.
syncer::StringOrdinal cws_page_ordinal =
- GetProfile(1)->GetExtensionService()->
- extension_prefs()->app_sorting()->GetPageOrdinal(
- extension_misc::kWebStoreAppId);
- GetProfile(1)->GetExtensionService()->extension_prefs()->
- app_sorting()->SetPageOrdinal(extension_misc::kWebStoreAppId,
- cws_page_ordinal.CreateAfter());
- verifier()->GetExtensionService()->extension_prefs()->
- app_sorting()->SetPageOrdinal(extension_misc::kWebStoreAppId,
- cws_page_ordinal.CreateAfter());
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ extensions::ExtensionPrefs::Get(GetProfile(1))
+ ->app_sorting()
+ ->GetPageOrdinal(extension_misc::kWebStoreAppId);
+ extensions::ExtensionPrefs::Get(GetProfile(1))->app_sorting()->SetPageOrdinal(
+ extension_misc::kWebStoreAppId, cws_page_ordinal.CreateAfter());
+ extensions::ExtensionPrefs::Get(verifier())->app_sorting()->SetPageOrdinal(
+ extension_misc::kWebStoreAppId, cws_page_ordinal.CreateAfter());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
// Adjust the launch type on the first client and sync. Both clients should
ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
// Change the launch type to window.
- extensions::SetLaunchType(GetProfile(1)->GetExtensionService(),
+ extensions::SetLaunchType(GetExtensionService(GetProfile(1)),
extension_misc::kWebStoreAppId,
extensions::LAUNCH_TYPE_WINDOW);
- extensions::SetLaunchType(verifier()->GetExtensionService(),
+ extensions::SetLaunchType(GetExtensionService(verifier()),
extension_misc::kWebStoreAppId,
extensions::LAUNCH_TYPE_WINDOW);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
// Change the launch type to regular tab.
- extensions::SetLaunchType(GetProfile(1)->GetExtensionService(),
+ extensions::SetLaunchType(GetExtensionService(GetProfile(1)),
extension_misc::kWebStoreAppId,
extensions::LAUNCH_TYPE_REGULAR);
ASSERT_FALSE(HasSameAppsAsVerifier(1));
- extensions::SetLaunchType(verifier()->GetExtensionService(),
+ extensions::SetLaunchType(GetExtensionService(verifier()),
extension_misc::kWebStoreAppId,
extensions::LAUNCH_TYPE_REGULAR);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
}
IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, UnexpectedLaunchType) {
ASSERT_TRUE(SetupSync());
ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
- extensions::SetLaunchType(GetProfile(1)->GetExtensionService(),
+ extensions::SetLaunchType(GetExtensionService(GetProfile(1)),
extension_misc::kWebStoreAppId,
extensions::LAUNCH_TYPE_REGULAR);
- extensions::SetLaunchType(verifier()->GetExtensionService(),
+ extensions::SetLaunchType(GetExtensionService(verifier()),
extension_misc::kWebStoreAppId,
extensions::LAUNCH_TYPE_REGULAR);
- ASSERT_TRUE(AwaitQuiescence());
- ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
const extensions::Extension* extension =
- GetProfile(1)->GetExtensionService()->
- GetInstalledExtension(extension_misc::kWebStoreAppId);
+ GetExtensionRegistry(GetProfile(1))->GetExtensionById(
+ extension_misc::kWebStoreAppId,
+ extensions::ExtensionRegistry::EVERYTHING);
ASSERT_TRUE(extension);
ExtensionSyncService* extension_sync_service =
*extension,
original_data.extension_sync_data().enabled(),
original_data.extension_sync_data().incognito_enabled(),
+ original_data.extension_sync_data().remote_install(),
original_data.app_launch_ordinal(),
original_data.page_ordinal(),
extensions::NUM_LAUNCH_TYPES);
extension_sync_service->ProcessAppSyncData(invalid_launch_type_data);
// The launch type should remain the same.
- ASSERT_TRUE(AwaitQuiescence());
+ ASSERT_TRUE(AwaitAllProfilesHaveSameAppsAsVerifier());
+}
+
+IN_PROC_BROWSER_TEST_F(TwoClientAppsSyncTest, BookmarkApp) {
+ ASSERT_TRUE(SetupSync());
ASSERT_TRUE(AllProfilesHaveSameAppsAsVerifier());
+
+ size_t num_extensions =
+ GetExtensionRegistry(GetProfile(0))->enabled_extensions().size();
+
+ WebApplicationInfo web_app_info;
+ web_app_info.app_url = GURL("http://www.chromium.org");
+ web_app_info.title = base::UTF8ToUTF16("Test name");
+ web_app_info.description = base::UTF8ToUTF16("Test description");
+ ++num_extensions;
+ {
+ content::WindowedNotificationObserver windowed_observer(
+ extensions::NOTIFICATION_CRX_INSTALLER_DONE,
+ content::NotificationService::AllSources());
+ extensions::CreateOrUpdateBookmarkApp(GetExtensionService(GetProfile(0)),
+ web_app_info);
+ windowed_observer.Wait();
+ EXPECT_EQ(num_extensions,
+ GetExtensionRegistry(GetProfile(0))->enabled_extensions().size());
+ }
+ {
+ content::WindowedNotificationObserver windowed_observer(
+ extensions::NOTIFICATION_CRX_INSTALLER_DONE,
+ content::NotificationService::AllSources());
+ extensions::CreateOrUpdateBookmarkApp(GetExtensionService(verifier()),
+ web_app_info);
+ windowed_observer.Wait();
+ EXPECT_EQ(num_extensions,
+ GetExtensionRegistry(verifier())->enabled_extensions().size());
+ }
+ {
+ // Wait for the synced app to install.
+ content::WindowedNotificationObserver windowed_observer(
+ extensions::NOTIFICATION_CRX_INSTALLER_DONE,
+ base::Bind(&AllProfilesHaveSameAppsAsVerifier));
+ windowed_observer.Wait();
+ }
}
// TODO(akalin): Add tests exercising: