| Index: chrome/browser/sync/glue/session_model_associator_unittest.cc
|
| diff --git a/chrome/browser/sync/glue/session_model_associator_unittest.cc b/chrome/browser/sync/glue/session_model_associator_unittest.cc
|
| index 64c97d7b1407412eaf1fe20443fbaf8fed54fe0f..650ffab8241d96429b5f538af6d4185a3f4379ea 100644
|
| --- a/chrome/browser/sync/glue/session_model_associator_unittest.cc
|
| +++ b/chrome/browser/sync/glue/session_model_associator_unittest.cc
|
| @@ -7,7 +7,6 @@
|
|
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/message_loop.h"
|
| -#include "base/string_number_conversions.h"
|
| #include "chrome/browser/sessions/session_types.h"
|
| #include "chrome/browser/sessions/session_types_test_helper.h"
|
| #include "chrome/browser/sync/glue/session_model_associator.h"
|
| @@ -21,6 +20,7 @@
|
| #include "content/public/browser/notification_service.h"
|
| #include "content/public/common/page_transition_types.h"
|
| #include "content/public/test/test_browser_thread.h"
|
| +#include "googleurl/src/gurl.h"
|
| #include "sync/protocol/session_specifics.pb.h"
|
| #include "sync/util/time.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| @@ -29,12 +29,13 @@
|
| using content::BrowserThread;
|
| using testing::NiceMock;
|
| using testing::Return;
|
| +using testing::StrictMock;
|
| using testing::_;
|
|
|
| namespace browser_sync {
|
|
|
| class SyncSessionModelAssociatorTest : public testing::Test {
|
| - public:
|
| + protected:
|
| SyncSessionModelAssociatorTest()
|
| : ui_thread_(BrowserThread::UI, &message_loop_),
|
| sync_service_(&profile_),
|
| @@ -57,26 +58,34 @@ class SyncSessionModelAssociatorTest : public testing::Test {
|
| model_associator_.DecrementAndCleanFaviconForURL(url);
|
| }
|
|
|
| - void AssociateTabContents(const SyncedWindowDelegate& window,
|
| - const SyncedTabDelegate& new_tab,
|
| - SessionTab* prev_tab,
|
| - sync_pb::SessionTab* sync_tab,
|
| - GURL* new_url) {
|
| - model_associator_.AssociateTabContents(window,
|
| - new_tab,
|
| - prev_tab,
|
| - sync_tab,
|
| - new_url);
|
| + static GURL GetCurrentVirtualURL(const SyncedTabDelegate& tab_delegate) {
|
| + return SessionModelAssociator::GetCurrentVirtualURL(tab_delegate);
|
| }
|
|
|
| - protected:
|
| + static void UpdateSessionTabFromDelegate(
|
| + const SyncedTabDelegate& tab_delegate,
|
| + base::Time mtime,
|
| + base::Time default_navigation_timestamp,
|
| + SessionTab* session_tab) {
|
| + SessionModelAssociator::UpdateSessionTabFromDelegate(
|
| + tab_delegate,
|
| + mtime,
|
| + default_navigation_timestamp,
|
| + session_tab);
|
| + }
|
| +
|
| + private:
|
| MessageLoopForUI message_loop_;
|
| content::TestBrowserThread ui_thread_;
|
| NiceMock<ProfileMock> profile_;
|
| NiceMock<ProfileSyncServiceMock> sync_service_;
|
| +
|
| + protected:
|
| SessionModelAssociator model_associator_;
|
| };
|
|
|
| +namespace {
|
| +
|
| TEST_F(SyncSessionModelAssociatorTest, SessionWindowHasNoTabsToSync) {
|
| SessionWindow win;
|
| ASSERT_TRUE(SessionWindowHasNoTabsToSync(win));
|
| @@ -117,6 +126,8 @@ TEST_F(SyncSessionModelAssociatorTest,
|
| ASSERT_FALSE(ShouldSyncSessionTab(tab));
|
| }
|
|
|
| +} // namespace
|
| +
|
| TEST_F(SyncSessionModelAssociatorTest, PopulateSessionHeader) {
|
| sync_pb::SessionHeader header_s;
|
| header_s.set_client_name("Client 1");
|
| @@ -150,43 +161,6 @@ TEST_F(SyncSessionModelAssociatorTest, PopulateSessionWindow) {
|
| ASSERT_EQ(1U, tracker.num_synced_tabs(std::string("tag")));
|
| }
|
|
|
| -TEST_F(SyncSessionModelAssociatorTest, PopulateSessionTab) {
|
| - sync_pb::SessionTab tab_s;
|
| - tab_s.set_tab_id(5);
|
| - tab_s.set_tab_visual_index(13);
|
| - tab_s.set_current_navigation_index(3);
|
| - tab_s.set_pinned(true);
|
| - tab_s.set_extension_app_id("app_id");
|
| - for (int i = 0; i < 5; ++i) {
|
| - sync_pb::TabNavigation* navigation = tab_s.add_navigation();
|
| - navigation->set_virtual_url("http://foo/" + base::IntToString(i));
|
| - navigation->set_referrer("referrer");
|
| - navigation->set_title("title");
|
| - navigation->set_page_transition(sync_pb::SyncEnums_PageTransition_TYPED);
|
| - }
|
| -
|
| - SessionTab tab;
|
| - tab.tab_id.set_id(5); // Expected to be set by the SyncedSessionTracker.
|
| - SessionModelAssociator::PopulateSessionTabFromSpecifics(
|
| - tab_s, base::Time(), &tab);
|
| - ASSERT_EQ(5, tab.tab_id.id());
|
| - ASSERT_EQ(13, tab.tab_visual_index);
|
| - ASSERT_EQ(3, tab.current_navigation_index);
|
| - ASSERT_TRUE(tab.pinned);
|
| - ASSERT_EQ("app_id", tab.extension_app_id);
|
| - ASSERT_EQ(5u, tab.navigations.size());
|
| - for (int i = 0; i < 5; ++i) {
|
| - ASSERT_EQ(i, tab.navigations[i].index());
|
| - ASSERT_EQ(GURL("referrer"),
|
| - SessionTypesTestHelper::GetReferrer(tab.navigations[i]).url);
|
| - ASSERT_EQ(string16(ASCIIToUTF16("title")), tab.navigations[i].title());
|
| - ASSERT_EQ(content::PAGE_TRANSITION_TYPED,
|
| - SessionTypesTestHelper::GetTransitionType(tab.navigations[i]));
|
| - ASSERT_EQ(GURL("http://foo/" + base::IntToString(i)),
|
| - tab.navigations[i].virtual_url());
|
| - }
|
| -}
|
| -
|
| TEST_F(SyncSessionModelAssociatorTest, TabNodePool) {
|
| SessionModelAssociator::TabNodePool pool(NULL);
|
| pool.set_machine_tag("tag");
|
| @@ -237,23 +211,6 @@ TEST_F(SyncSessionModelAssociatorTest, TabNodePool) {
|
|
|
| namespace {
|
|
|
| -class SyncedWindowDelegateMock : public SyncedWindowDelegate {
|
| - public:
|
| - SyncedWindowDelegateMock() {}
|
| - virtual ~SyncedWindowDelegateMock() {}
|
| - MOCK_CONST_METHOD0(HasWindow, bool());
|
| - MOCK_CONST_METHOD0(GetSessionId, SessionID::id_type());
|
| - MOCK_CONST_METHOD0(GetTabCount, int());
|
| - MOCK_CONST_METHOD0(GetActiveIndex, int());
|
| - MOCK_CONST_METHOD0(IsApp, bool());
|
| - MOCK_CONST_METHOD0(IsTypeTabbed, bool());
|
| - MOCK_CONST_METHOD0(IsTypePopup, bool());
|
| - MOCK_CONST_METHOD1(IsTabPinned, bool(const SyncedTabDelegate* tab));
|
| - MOCK_CONST_METHOD1(GetTabAt, SyncedTabDelegate*(int index));
|
| - MOCK_CONST_METHOD1(GetTabIdAt, SessionID::id_type(int index));
|
| - MOCK_CONST_METHOD0(IsSessionRestoreInProgress, bool());
|
| -};
|
| -
|
| class SyncedTabDelegateMock : public SyncedTabDelegate {
|
| public:
|
| SyncedTabDelegateMock() {}
|
| @@ -263,14 +220,14 @@ class SyncedTabDelegateMock : public SyncedTabDelegate {
|
| MOCK_CONST_METHOD0(GetSessionId, SessionID::id_type());
|
| MOCK_CONST_METHOD0(IsBeingDestroyed, bool());
|
| MOCK_CONST_METHOD0(profile, Profile*());
|
| - MOCK_CONST_METHOD0(HasExtensionAppId, bool());
|
| - MOCK_CONST_METHOD0(GetExtensionAppId, const std::string&());
|
| + MOCK_CONST_METHOD0(GetExtensionAppId, std::string());
|
| MOCK_CONST_METHOD0(GetCurrentEntryIndex, int());
|
| MOCK_CONST_METHOD0(GetEntryCount, int());
|
| MOCK_CONST_METHOD0(GetPendingEntryIndex, int());
|
| MOCK_CONST_METHOD0(GetPendingEntry, content::NavigationEntry*());
|
| MOCK_CONST_METHOD1(GetEntryAtIndex, content::NavigationEntry*(int i));
|
| MOCK_CONST_METHOD0(GetActiveEntry, content::NavigationEntry*());
|
| + MOCK_CONST_METHOD0(IsPinned, bool());
|
| };
|
|
|
| class SyncRefreshListener : public content::NotificationObserver {
|
| @@ -295,8 +252,6 @@ class SyncRefreshListener : public content::NotificationObserver {
|
| content::NotificationRegistrar registrar_;
|
| };
|
|
|
| -} // namespace.
|
| -
|
| // Test that AttemptSessionsDataRefresh() triggers the
|
| // NOTIFICATION_SYNC_REFRESH_LOCAL notification.
|
| TEST_F(SyncSessionModelAssociatorTest, TriggerSessionRefresh) {
|
| @@ -562,12 +517,46 @@ TEST_F(SyncSessionModelAssociatorTest, FaviconCleanup) {
|
| EXPECT_EQ(0U, NumFavicons());
|
| }
|
|
|
| -// Ensure new tabs have the current timestamp set for the current navigation,
|
| -// while other navigations have timestamp zero.
|
| -TEST_F(SyncSessionModelAssociatorTest, AssociateNewTab) {
|
| - NiceMock<SyncedWindowDelegateMock> window_mock;
|
| - EXPECT_CALL(window_mock, IsTabPinned(_)).WillRepeatedly(Return(false));
|
| +// TODO(akalin): We should really use a fake for SyncedTabDelegate.
|
| +
|
| +// Make sure GetCurrentVirtualURL() returns the virtual URL of the pending
|
| +// entry if the current entry is pending.
|
| +TEST_F(SyncSessionModelAssociatorTest, GetCurrentVirtualURLPending) {
|
| + StrictMock<SyncedTabDelegateMock> tab_mock;
|
| + scoped_ptr<content::NavigationEntry> entry(
|
| + content::NavigationEntry::Create());
|
| + entry->SetVirtualURL(GURL("http://www.google.com"));
|
| + EXPECT_CALL(tab_mock, GetCurrentEntryIndex()).WillOnce(Return(0));
|
| + EXPECT_CALL(tab_mock, GetPendingEntryIndex()).WillOnce(Return(0));
|
| + EXPECT_CALL(tab_mock, GetPendingEntry()).WillOnce(Return(entry.get()));
|
| + EXPECT_EQ(entry->GetVirtualURL(), GetCurrentVirtualURL(tab_mock));
|
| +}
|
| +
|
| +// Make sure GetCurrentVirtualURL() returns the virtual URL of the current
|
| +// entry if the current entry is non-pending.
|
| +TEST_F(SyncSessionModelAssociatorTest, GetCurrentVirtualURLNonPending) {
|
| + StrictMock<SyncedTabDelegateMock> tab_mock;
|
| + scoped_ptr<content::NavigationEntry> entry(
|
| + content::NavigationEntry::Create());
|
| + entry->SetVirtualURL(GURL("http://www.google.com"));
|
| + EXPECT_CALL(tab_mock, GetCurrentEntryIndex()).WillOnce(Return(0));
|
| + EXPECT_CALL(tab_mock, GetPendingEntryIndex()).WillOnce(Return(-1));
|
| + EXPECT_CALL(tab_mock, GetEntryAtIndex(0)).WillOnce(Return(entry.get()));
|
| + EXPECT_EQ(entry->GetVirtualURL(), GetCurrentVirtualURL(tab_mock));
|
| +}
|
|
|
| +const base::Time kTime1 = base::Time::FromInternalValue(100);
|
| +const base::Time kTime2 = base::Time::FromInternalValue(105);
|
| +const base::Time kTime3 = base::Time::FromInternalValue(110);
|
| +const base::Time kTime4 = base::Time::FromInternalValue(120);
|
| +const base::Time kTime5 = base::Time::FromInternalValue(150);
|
| +const base::Time kTime6 = base::Time::FromInternalValue(200);
|
| +const base::Time kTime7 = base::Time::FromInternalValue(500);
|
| +const base::Time kTime8 = base::Time::FromInternalValue(1000);
|
| +
|
| +// Ensure new tabs have the current timestamp set for the current
|
| +// navigation, while other navigations have null timestamps.
|
| +TEST_F(SyncSessionModelAssociatorTest, UpdateNewTab) {
|
| // Create a tab with three valid entries.
|
| NiceMock<SyncedTabDelegateMock> tab_mock;
|
| EXPECT_CALL(tab_mock, GetSessionId()).WillRepeatedly(Return(0));
|
| @@ -590,34 +579,33 @@ TEST_F(SyncSessionModelAssociatorTest, AssociateNewTab) {
|
| EXPECT_CALL(tab_mock, GetEntryCount()).WillRepeatedly(Return(3));
|
| EXPECT_CALL(tab_mock, GetPendingEntryIndex()).WillRepeatedly(Return(-1));
|
|
|
| - // This tab is new, so prev_tab is the default SyncedSessionTab object.
|
| - SessionTab prev_tab;
|
| - prev_tab.tab_id.set_id(0);
|
| -
|
| - sync_pb::SessionTab sync_tab;
|
| - GURL new_url;
|
| - int64 now = syncer::TimeToProtoTime(base::Time::Now());
|
| - AssociateTabContents(window_mock, tab_mock, &prev_tab, &sync_tab, &new_url);
|
| -
|
| - EXPECT_EQ(new_url, entry3->GetVirtualURL());
|
| - ASSERT_EQ(3, sync_tab.navigation_size());
|
| - EXPECT_EQ(entry1->GetVirtualURL().spec(),
|
| - sync_tab.navigation(0).virtual_url());
|
| - EXPECT_EQ(entry2->GetVirtualURL().spec(),
|
| - sync_tab.navigation(1).virtual_url());
|
| - EXPECT_EQ(entry3->GetVirtualURL().spec(),
|
| - sync_tab.navigation(2).virtual_url());
|
| - EXPECT_EQ(2, sync_tab.current_navigation_index());
|
| - EXPECT_LE(0, sync_tab.navigation(0).timestamp());
|
| - EXPECT_LE(0, sync_tab.navigation(1).timestamp());
|
| - EXPECT_LE(now, sync_tab.navigation(2).timestamp());
|
| + SessionTab session_tab;
|
| + UpdateSessionTabFromDelegate(tab_mock, kTime1, kTime2, &session_tab);
|
| +
|
| + EXPECT_EQ(0, session_tab.window_id.id());
|
| + EXPECT_EQ(0, session_tab.tab_id.id());
|
| + EXPECT_EQ(0, session_tab.tab_visual_index);
|
| + EXPECT_EQ(2, session_tab.current_navigation_index);
|
| + EXPECT_FALSE(session_tab.pinned);
|
| + EXPECT_TRUE(session_tab.extension_app_id.empty());
|
| + EXPECT_TRUE(session_tab.user_agent_override.empty());
|
| + EXPECT_EQ(kTime1, session_tab.timestamp);
|
| + ASSERT_EQ(3u, session_tab.navigations.size());
|
| + EXPECT_EQ(entry1->GetVirtualURL(),
|
| + session_tab.navigations[0].virtual_url());
|
| + EXPECT_EQ(entry2->GetVirtualURL(),
|
| + session_tab.navigations[1].virtual_url());
|
| + EXPECT_EQ(entry3->GetVirtualURL(),
|
| + session_tab.navigations[2].virtual_url());
|
| + EXPECT_EQ(2, session_tab.current_navigation_index);
|
| + EXPECT_TRUE(session_tab.navigations[0].timestamp().is_null());
|
| + EXPECT_TRUE(session_tab.navigations[1].timestamp().is_null());
|
| + EXPECT_EQ(kTime2, session_tab.navigations[2].timestamp());
|
| + EXPECT_TRUE(session_tab.session_storage_persistent_id.empty());
|
| }
|
|
|
| // Ensure we preserve old timestamps when the entries don't change.
|
| -TEST_F(SyncSessionModelAssociatorTest, AssociateExistingTab) {
|
| - NiceMock<SyncedWindowDelegateMock> window_mock;
|
| - EXPECT_CALL(window_mock, IsTabPinned(_)).WillRepeatedly(Return(false));
|
| -
|
| +TEST_F(SyncSessionModelAssociatorTest, UpdateExistingTab) {
|
| // Create a tab with three valid entries.
|
| NiceMock<SyncedTabDelegateMock> tab_mock;
|
| EXPECT_CALL(tab_mock, GetSessionId()).WillRepeatedly(Return(0));
|
| @@ -639,44 +627,37 @@ TEST_F(SyncSessionModelAssociatorTest, AssociateExistingTab) {
|
| Return(entry3.get()));
|
| EXPECT_CALL(tab_mock, GetEntryCount()).WillRepeatedly(Return(3));
|
| EXPECT_CALL(tab_mock, GetPendingEntryIndex()).WillRepeatedly(Return(-1));
|
| + EXPECT_CALL(tab_mock, IsPinned()).WillRepeatedly(Return(true));
|
|
|
| - // This tab is new, so prev_tab is the default SyncedSessionTab object.
|
| - SessionTab prev_tab;
|
| - prev_tab.tab_id.set_id(0);
|
| -
|
| - // The initial AssociateTabContents call builds the prev_tab.
|
| - sync_pb::SessionTab sync_tab;
|
| - GURL new_url;
|
| - AssociateTabContents(window_mock, tab_mock, &prev_tab, &sync_tab, &new_url);
|
| + // The initial UpdateSessionTabFromDelegate call builds the session_tab.
|
| + SessionTab session_tab;
|
| + UpdateSessionTabFromDelegate(tab_mock, kTime1, kTime2, &session_tab);
|
|
|
| - ASSERT_EQ(3u, prev_tab.navigations.size());
|
| + // Tweak the timestamps a bit.
|
| + ASSERT_EQ(3u, session_tab.navigations.size());
|
| + SessionTypesTestHelper::SetTimestamp(&session_tab.navigations[0], kTime3);
|
| + SessionTypesTestHelper::SetTimestamp(&session_tab.navigations[1], kTime4);
|
| + SessionTypesTestHelper::SetTimestamp(&session_tab.navigations[2], kTime5);
|
|
|
| // Now re-associate with the same data.
|
| - AssociateTabContents(window_mock, tab_mock, &prev_tab, &sync_tab, &new_url);
|
| -
|
| - EXPECT_EQ(new_url, entry3->GetVirtualURL());
|
| - ASSERT_EQ(3, sync_tab.navigation_size());
|
| - EXPECT_EQ(entry1->GetVirtualURL().spec(),
|
| - sync_tab.navigation(0).virtual_url());
|
| - EXPECT_EQ(entry2->GetVirtualURL().spec(),
|
| - sync_tab.navigation(1).virtual_url());
|
| - EXPECT_EQ(entry3->GetVirtualURL().spec(),
|
| - sync_tab.navigation(2).virtual_url());
|
| - EXPECT_EQ(2, sync_tab.current_navigation_index());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(prev_tab.navigations[0].timestamp()),
|
| - sync_tab.navigation(0).timestamp());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(prev_tab.navigations[1].timestamp()),
|
| - sync_tab.navigation(1).timestamp());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(prev_tab.navigations[2].timestamp()),
|
| - sync_tab.navigation(2).timestamp());
|
| - EXPECT_EQ(3U, prev_tab.navigations.size());
|
| + UpdateSessionTabFromDelegate(tab_mock, kTime3, kTime4, &session_tab);
|
| +
|
| + EXPECT_TRUE(session_tab.pinned);
|
| + EXPECT_EQ(kTime3, session_tab.timestamp);
|
| + EXPECT_EQ(entry1->GetVirtualURL(),
|
| + session_tab.navigations[0].virtual_url());
|
| + EXPECT_EQ(entry2->GetVirtualURL(),
|
| + session_tab.navigations[1].virtual_url());
|
| + EXPECT_EQ(entry3->GetVirtualURL(),
|
| + session_tab.navigations[2].virtual_url());
|
| + EXPECT_EQ(2, session_tab.current_navigation_index);
|
| + EXPECT_EQ(kTime3, session_tab.navigations[0].timestamp());
|
| + EXPECT_EQ(kTime4, session_tab.navigations[1].timestamp());
|
| + EXPECT_EQ(kTime5, session_tab.navigations[2].timestamp());
|
| }
|
|
|
| // Ensure we add a fresh timestamp for new entries appended to the end.
|
| -TEST_F(SyncSessionModelAssociatorTest, AssociateAppendedTab) {
|
| - NiceMock<SyncedWindowDelegateMock> window_mock;
|
| - EXPECT_CALL(window_mock, IsTabPinned(_)).WillRepeatedly(Return(false));
|
| -
|
| +TEST_F(SyncSessionModelAssociatorTest, UpdateAppendedTab) {
|
| // Create a tab with three valid entries.
|
| NiceMock<SyncedTabDelegateMock> tab_mock;
|
| EXPECT_CALL(tab_mock, GetSessionId()).WillRepeatedly(Return(0));
|
| @@ -699,16 +680,9 @@ TEST_F(SyncSessionModelAssociatorTest, AssociateAppendedTab) {
|
| EXPECT_CALL(tab_mock, GetEntryCount()).WillRepeatedly(Return(3));
|
| EXPECT_CALL(tab_mock, GetPendingEntryIndex()).WillRepeatedly(Return(-1));
|
|
|
| - // This tab is new, so prev_tab is the default SyncedSessionTab object.
|
| - SessionTab prev_tab;
|
| - prev_tab.tab_id.set_id(0);
|
| -
|
| - // The initial AssociateTabContents call builds the prev_tab.
|
| - sync_pb::SessionTab sync_tab;
|
| - GURL new_url;
|
| - AssociateTabContents(window_mock, tab_mock, &prev_tab, &sync_tab, &new_url);
|
| -
|
| - ASSERT_EQ(3u, prev_tab.navigations.size());
|
| + // The initial UpdateSessionTabFromDelegate call builds the session_tab.
|
| + SessionTab session_tab;
|
| + UpdateSessionTabFromDelegate(tab_mock, kTime1, kTime2, &session_tab);
|
|
|
| // Add a new entry and change the current navigation index.
|
| scoped_ptr<content::NavigationEntry> entry4(
|
| @@ -719,40 +693,29 @@ TEST_F(SyncSessionModelAssociatorTest, AssociateAppendedTab) {
|
| EXPECT_CALL(tab_mock, GetEntryCount()).WillRepeatedly(Return(4));
|
| EXPECT_CALL(tab_mock, GetCurrentEntryIndex()).WillRepeatedly(Return(3));
|
|
|
| - // The new entry should have a timestamp later than this.
|
| - int64 now = syncer::TimeToProtoTime(base::Time::Now());
|
| -
|
| // Now re-associate with the new version.
|
| - AssociateTabContents(window_mock, tab_mock, &prev_tab, &sync_tab, &new_url);
|
| -
|
| - EXPECT_EQ(new_url, entry4->GetVirtualURL());
|
| - ASSERT_EQ(4, sync_tab.navigation_size());
|
| - EXPECT_EQ(entry1->GetVirtualURL().spec(),
|
| - sync_tab.navigation(0).virtual_url());
|
| - EXPECT_EQ(entry2->GetVirtualURL().spec(),
|
| - sync_tab.navigation(1).virtual_url());
|
| - EXPECT_EQ(entry3->GetVirtualURL().spec(),
|
| - sync_tab.navigation(2).virtual_url());
|
| - EXPECT_EQ(entry4->GetVirtualURL().spec(),
|
| - sync_tab.navigation(3).virtual_url());
|
| - EXPECT_EQ(3, sync_tab.current_navigation_index());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(prev_tab.navigations[0].timestamp()),
|
| - sync_tab.navigation(0).timestamp());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(prev_tab.navigations[1].timestamp()),
|
| - sync_tab.navigation(1).timestamp());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(prev_tab.navigations[2].timestamp()),
|
| - sync_tab.navigation(2).timestamp());
|
| - EXPECT_LE(now, sync_tab.navigation(3).timestamp());
|
| - EXPECT_EQ(4U, prev_tab.navigations.size());
|
| + UpdateSessionTabFromDelegate(tab_mock, kTime3, kTime4, &session_tab);
|
| +
|
| + ASSERT_EQ(4u, session_tab.navigations.size());
|
| + EXPECT_EQ(entry1->GetVirtualURL(),
|
| + session_tab.navigations[0].virtual_url());
|
| + EXPECT_EQ(entry2->GetVirtualURL(),
|
| + session_tab.navigations[1].virtual_url());
|
| + EXPECT_EQ(entry3->GetVirtualURL(),
|
| + session_tab.navigations[2].virtual_url());
|
| + EXPECT_EQ(entry4->GetVirtualURL(),
|
| + session_tab.navigations[3].virtual_url());
|
| + EXPECT_EQ(3, session_tab.current_navigation_index);
|
| + EXPECT_TRUE(session_tab.navigations[0].timestamp().is_null());
|
| + EXPECT_TRUE(session_tab.navigations[1].timestamp().is_null());
|
| + EXPECT_EQ(kTime2, session_tab.navigations[2].timestamp());
|
| + EXPECT_EQ(kTime4, session_tab.navigations[3].timestamp());
|
| }
|
|
|
| // We shouldn't get confused when old/new entries from the previous tab have
|
| // been pruned in the new tab. Timestamps for old entries we move back to in the
|
| // navigation stack should be refreshed.
|
| -TEST_F(SyncSessionModelAssociatorTest, AssociatePrunedTab) {
|
| - NiceMock<SyncedWindowDelegateMock> window_mock;
|
| - EXPECT_CALL(window_mock, IsTabPinned(_)).WillRepeatedly(Return(false));
|
| -
|
| +TEST_F(SyncSessionModelAssociatorTest, UpdatePrunedTab) {
|
| // Create a tab with four valid entries.
|
| NiceMock<SyncedTabDelegateMock> tab_mock;
|
| EXPECT_CALL(tab_mock, GetSessionId()).WillRepeatedly(Return(0));
|
| @@ -780,16 +743,9 @@ TEST_F(SyncSessionModelAssociatorTest, AssociatePrunedTab) {
|
| EXPECT_CALL(tab_mock, GetEntryCount()).WillRepeatedly(Return(4));
|
| EXPECT_CALL(tab_mock, GetPendingEntryIndex()).WillRepeatedly(Return(-1));
|
|
|
| - // This tab is new, so prev_tab is the default SyncedSessionTab object.
|
| - SessionTab prev_tab;
|
| - prev_tab.tab_id.set_id(0);
|
| -
|
| - // The initial AssociateTabContents call builds the prev_tab.
|
| - sync_pb::SessionTab sync_tab;
|
| - GURL new_url;
|
| - AssociateTabContents(window_mock, tab_mock, &prev_tab, &sync_tab, &new_url);
|
| -
|
| - ASSERT_EQ(4u, prev_tab.navigations.size());
|
| + // The initial UpdateSessionTabFromDelegate call builds the session_tab.
|
| + SessionTab session_tab;
|
| + UpdateSessionTabFromDelegate(tab_mock, kTime1, kTime2, &session_tab);
|
|
|
| // Reset new tab to have the oldest entry pruned, the current navigation
|
| // set to entry3, and a new entry added in place of entry4.
|
| @@ -807,28 +763,31 @@ TEST_F(SyncSessionModelAssociatorTest, AssociatePrunedTab) {
|
| EXPECT_CALL(tab_mock, GetEntryCount()).WillRepeatedly(Return(3));
|
| EXPECT_CALL(tab_mock, GetPendingEntryIndex()).WillRepeatedly(Return(-1));
|
|
|
| - // The new entry should have a timestamp later than this.
|
| - int64 now = syncer::TimeToProtoTime(base::Time::Now());
|
| + // Tweak the timestamps a bit.
|
| + ASSERT_EQ(4u, session_tab.navigations.size());
|
| + SessionTypesTestHelper::SetTimestamp(&session_tab.navigations[0], kTime3);
|
| + SessionTypesTestHelper::SetTimestamp(&session_tab.navigations[1], kTime4);
|
| + SessionTypesTestHelper::SetTimestamp(&session_tab.navigations[2], kTime5);
|
| + SessionTypesTestHelper::SetTimestamp(&session_tab.navigations[3], kTime6);
|
|
|
| // Now re-associate with the new version.
|
| - AssociateTabContents(window_mock, tab_mock, &prev_tab, &sync_tab, &new_url);
|
| -
|
| - // Only entry2's timestamp should be preserved. The new entry should have a
|
| - // new timestamp.
|
| - EXPECT_EQ(new_url, entry3->GetVirtualURL());
|
| - ASSERT_EQ(3, sync_tab.navigation_size());
|
| - EXPECT_EQ(entry2->GetVirtualURL().spec(),
|
| - sync_tab.navigation(0).virtual_url());
|
| - EXPECT_EQ(entry3->GetVirtualURL().spec(),
|
| - sync_tab.navigation(1).virtual_url());
|
| - EXPECT_EQ(entry5->GetVirtualURL().spec(),
|
| - sync_tab.navigation(2).virtual_url());
|
| - EXPECT_EQ(1, sync_tab.current_navigation_index());
|
| - EXPECT_EQ(syncer::TimeToProtoTime(prev_tab.navigations[0].timestamp()),
|
| - sync_tab.navigation(0).timestamp());
|
| - EXPECT_LE(now, sync_tab.navigation(1).timestamp());
|
| - EXPECT_LE(now, sync_tab.navigation(2).timestamp());
|
| - EXPECT_EQ(3U, prev_tab.navigations.size());
|
| + UpdateSessionTabFromDelegate(tab_mock, kTime7, kTime8, &session_tab);
|
| +
|
| + // Only entry2's and entry3's timestamps should be preserved. The new
|
| + // entry should have a new timestamp.
|
| + ASSERT_EQ(3u, session_tab.navigations.size());
|
| + EXPECT_EQ(entry2->GetVirtualURL(),
|
| + session_tab.navigations[0].virtual_url());
|
| + EXPECT_EQ(entry3->GetVirtualURL(),
|
| + session_tab.navigations[1].virtual_url());
|
| + EXPECT_EQ(entry5->GetVirtualURL(),
|
| + session_tab.navigations[2].virtual_url());
|
| + EXPECT_EQ(1, session_tab.current_navigation_index);
|
| + EXPECT_EQ(kTime4, session_tab.navigations[0].timestamp());
|
| + EXPECT_EQ(kTime5, session_tab.navigations[1].timestamp());
|
| + EXPECT_EQ(kTime8, session_tab.navigations[2].timestamp());
|
| }
|
|
|
| +} // namespace
|
| +
|
| } // namespace browser_sync
|
|
|