Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(140)

Side by Side Diff: chrome/browser/sync/sessions/sessions_sync_manager_unittest.cc

Issue 2494533002: [Sync] Put session tracker in charge of maintaining local state. (Closed)
Patch Set: Rebase and update comment Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/sync_sessions/sessions_sync_manager.h" 5 #include "components/sync_sessions/sessions_sync_manager.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 if (static_cast<size_t>(i) >= entries_.size()) 542 if (static_cast<size_t>(i) >= entries_.size())
543 return; 543 return;
544 *serialized_entry = 544 *serialized_entry =
545 sessions::ContentSerializedNavigationBuilder::FromNavigationEntry( 545 sessions::ContentSerializedNavigationBuilder::FromNavigationEntry(
546 i, *entries_[i]); 546 i, *entries_[i]);
547 } 547 }
548 548
549 int GetEntryCount() const override { return entries_.size(); } 549 int GetEntryCount() const override { return entries_.size(); }
550 550
551 SessionID::id_type GetWindowId() const override { 551 SessionID::id_type GetWindowId() const override {
552 return SessionID::id_type(); 552 return window_id_;
553 }
554 void SetWindowId(SessionID::id_type window_id) {
555 window_id_ = window_id;
553 } 556 }
554 557
555 SessionID::id_type GetSessionId() const override { 558 SessionID::id_type GetSessionId() const override {
556 return SessionID::id_type(); 559 return tab_id_;
560 }
561 void SetSessionId(SessionID::id_type id) {
562 tab_id_ = id;
557 } 563 }
558 564
559 bool IsBeingDestroyed() const override { return false; } 565 bool IsBeingDestroyed() const override { return false; }
560 std::string GetExtensionAppId() const override { return std::string(); } 566 std::string GetExtensionAppId() const override { return std::string(); }
561 bool ProfileIsSupervised() const override { return is_supervised_; } 567 bool ProfileIsSupervised() const override { return is_supervised_; }
562 void set_is_supervised(bool is_supervised) { is_supervised_ = is_supervised; } 568 void set_is_supervised(bool is_supervised) { is_supervised_ = is_supervised; }
563 const std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>* 569 const std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>*
564 GetBlockedNavigations() const override { 570 GetBlockedNavigations() const override {
565 return &blocked_navigations_; 571 return &blocked_navigations_;
566 } 572 }
(...skipping 20 matching lines...) Expand all
587 void reset() { 593 void reset() {
588 current_entry_index_ = 0; 594 current_entry_index_ = 0;
589 sync_id_ = -1; 595 sync_id_ = -1;
590 entries_.clear(); 596 entries_.clear();
591 } 597 }
592 598
593 private: 599 private:
594 int current_entry_index_; 600 int current_entry_index_;
595 bool is_supervised_; 601 bool is_supervised_;
596 int sync_id_; 602 int sync_id_;
603 SessionID::id_type tab_id_ = 0;
604 SessionID::id_type window_id_ = 0;
597 std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>> 605 std::vector<std::unique_ptr<const sessions::SerializedNavigationEntry>>
598 blocked_navigations_; 606 blocked_navigations_;
599 std::vector<std::unique_ptr<content::NavigationEntry>> entries_; 607 std::vector<std::unique_ptr<content::NavigationEntry>> entries_;
600 }; 608 };
601 609
602 } // namespace 610 } // namespace
603 611
604 static const base::Time kTime0 = base::Time::FromInternalValue(100); 612 static const base::Time kTime0 = base::Time::FromInternalValue(100);
605 static const base::Time kTime1 = base::Time::FromInternalValue(110); 613 static const base::Time kTime1 = base::Time::FromInternalValue(110);
606 static const base::Time kTime2 = base::Time::FromInternalValue(120); 614 static const base::Time kTime2 = base::Time::FromInternalValue(120);
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
981 in.push_back(CreateRemoteData(t1_entity)); 989 in.push_back(CreateRemoteData(t1_entity));
982 in.push_back(CreateRemoteData(t2_entity)); 990 in.push_back(CreateRemoteData(t2_entity));
983 out.clear(); 991 out.clear();
984 manager()->StopSyncing(syncer::SESSIONS); 992 manager()->StopSyncing(syncer::SESSIONS);
985 993
986 const std::set<const SyncedWindowDelegate*>& windows = 994 const std::set<const SyncedWindowDelegate*>& windows =
987 manager()->synced_window_delegates_getter()->GetSyncedWindowDelegates(); 995 manager()->synced_window_delegates_getter()->GetSyncedWindowDelegates();
988 ASSERT_EQ(1U, windows.size()); 996 ASSERT_EQ(1U, windows.size());
989 SyncedTabDelegateFake t1_override, t2_override; 997 SyncedTabDelegateFake t1_override, t2_override;
990 t1_override.SetSyncId(1); // No WebContents by default. 998 t1_override.SetSyncId(1); // No WebContents by default.
999 t1_override.SetSessionId(kNewTabId);
991 t2_override.SetSyncId(2); // No WebContents by default. 1000 t2_override.SetSyncId(2); // No WebContents by default.
1001 t2_override.SetSessionId(t2_entity.session().tab().tab_id());
992 SyncedWindowDelegateOverride window_override(*windows.begin()); 1002 SyncedWindowDelegateOverride window_override(*windows.begin());
993 window_override.OverrideTabAt(1, &t1_override, kNewTabId); 1003 window_override.OverrideTabAt(1, &t1_override, kNewTabId);
994 window_override.OverrideTabAt(2, &t2_override, 1004 window_override.OverrideTabAt(2, &t2_override,
995 t2_entity.session().tab().tab_id()); 1005 t2_entity.session().tab().tab_id());
996 std::set<const SyncedWindowDelegate*> delegates; 1006 std::set<const SyncedWindowDelegate*> delegates;
997 delegates.insert(&window_override); 1007 delegates.insert(&window_override);
998 std::unique_ptr<TestSyncedWindowDelegatesGetter> getter( 1008 std::unique_ptr<TestSyncedWindowDelegatesGetter> getter(
999 new TestSyncedWindowDelegatesGetter(delegates)); 1009 new TestSyncedWindowDelegatesGetter(delegates));
1000 set_synced_window_getter(getter.get()); 1010 set_synced_window_getter(getter.get());
1001 1011
1002 syncer::SyncMergeResult result = manager()->MergeDataAndStartSyncing( 1012 syncer::SyncMergeResult result = manager()->MergeDataAndStartSyncing(
1003 syncer::SESSIONS, in, std::unique_ptr<syncer::SyncChangeProcessor>( 1013 syncer::SESSIONS, in, std::unique_ptr<syncer::SyncChangeProcessor>(
1004 new TestSyncProcessorStub(&out)), 1014 new TestSyncProcessorStub(&out)),
1005 std::unique_ptr<syncer::SyncErrorFactory>( 1015 std::unique_ptr<syncer::SyncErrorFactory>(
1006 new syncer::SyncErrorFactoryMock())); 1016 new syncer::SyncErrorFactoryMock()));
1007 1017
1008 // There should be two changes, one for the fully associated tab, and 1018 // There should be two changes, one for the fully associated tab, and
1009 // one for the tab_id update to t1. t2 shouldn't need to be updated. 1019 // one each for the tab_id updates to t1 and t2.
1010 ASSERT_EQ(2U, FilterOutLocalHeaderChanges(&out)->size()); 1020 ASSERT_EQ(3U, FilterOutLocalHeaderChanges(&out)->size());
1011 EXPECT_EQ(SyncChange::ACTION_UPDATE, out[0].change_type()); 1021 EXPECT_EQ(SyncChange::ACTION_UPDATE, out[0].change_type());
1012 EXPECT_EQ(SyncChange::ACTION_UPDATE, out[1].change_type()); 1022 EXPECT_EQ(SyncChange::ACTION_UPDATE, out[1].change_type());
1023 EXPECT_EQ(SyncChange::ACTION_UPDATE, out[2].change_type());
1013 EXPECT_EQ(kNewTabId, 1024 EXPECT_EQ(kNewTabId,
1014 out[1].sync_data().GetSpecifics().session().tab().tab_id()); 1025 out[1].sync_data().GetSpecifics().session().tab().tab_id());
1026 EXPECT_EQ(t2_entity.session().tab().tab_id(),
1027 out[2].sync_data().GetSpecifics().session().tab().tab_id());
1015 1028
1016 // Verify TabLinks. 1029 // Verify TabLinks.
1017 SessionsSyncManager::TabLinksMap tab_map = manager()->local_tab_map_; 1030 SessionsSyncManager::TabLinksMap tab_map = manager()->local_tab_map_;
1018 ASSERT_EQ(3U, tab_map.size()); 1031 ASSERT_EQ(3U, tab_map.size());
1019 int t2_tab_id = t2_entity.session().tab().tab_id(); 1032 int t2_tab_id = t2_entity.session().tab().tab_id();
1020 EXPECT_EQ(2, tab_map.find(t2_tab_id)->second->tab_node_id()); 1033 EXPECT_EQ(2, tab_map.find(t2_tab_id)->second->tab_node_id());
1021 EXPECT_EQ(1, tab_map.find(kNewTabId)->second->tab_node_id()); 1034 EXPECT_EQ(1, tab_map.find(kNewTabId)->second->tab_node_id());
1022 int t0_tab_id = out[0].sync_data().GetSpecifics().session().tab().tab_id(); 1035 int t0_tab_id = out[0].sync_data().GetSpecifics().session().tab().tab_id();
1023 EXPECT_EQ(0, tab_map.find(t0_tab_id)->second->tab_node_id()); 1036 EXPECT_EQ(0, tab_map.find(t0_tab_id)->second->tab_node_id());
1024 // TODO(tim): Once bug 337057 is fixed, we can issue an OnLocalTabModified
1025 // from here (using an override similar to above) to return a new tab id
1026 // and verify that we don't see any node creations in the SyncChangeProcessor
1027 // (similar to how SessionsSyncManagerTest.OnLocalTabModified works.)
1028 } 1037 }
1029 1038
1030 // Ensure model association updates the window ID for tabs whose window's ID has 1039 // Ensure model association updates the window ID for tabs whose window's ID has
1031 // changed. 1040 // changed.
1032 TEST_F(SessionsSyncManagerTest, WindowIdUpdatedOnRestore) { 1041 TEST_F(SessionsSyncManagerTest, WindowIdUpdatedOnRestore) {
1033 const int kNewWindowId = 1337; 1042 const int kNewWindowId = 1337;
1034 syncer::SyncDataList in; 1043 syncer::SyncDataList in;
1035 syncer::SyncChangeList out; 1044 syncer::SyncChangeList out;
1036 1045
1037 // Set up one tab and start sync with it. 1046 // Set up one tab and start sync with it.
1038 AddTab(browser(), GURL("http://foo1")); 1047 AddTab(browser(), GURL("http://foo1"));
1039 NavigateAndCommitActiveTab(GURL("http://foo2")); 1048 NavigateAndCommitActiveTab(GURL("http://foo2"));
1040 InitWithSyncDataTakeOutput(in, &out); 1049 InitWithSyncDataTakeOutput(in, &out);
1041 1050
1042 // Should be one header add, 1 tab add/update pair, and one header update. 1051 // Should be one header add, 1 tab add/update pair, and one header update.
1043 ASSERT_EQ(4U, out.size()); 1052 ASSERT_EQ(4U, out.size());
1044 const sync_pb::EntitySpecifics t0_entity = out[2].sync_data().GetSpecifics(); 1053 const sync_pb::EntitySpecifics t0_entity = out[2].sync_data().GetSpecifics();
1045 1054
1046 in.push_back(CreateRemoteData(t0_entity)); 1055 in.push_back(CreateRemoteData(t0_entity));
1047 out.clear(); 1056 out.clear();
1048 manager()->StopSyncing(syncer::SESSIONS); 1057 manager()->StopSyncing(syncer::SESSIONS);
1049 1058
1050 // SyncedTabDelegateFake is a placeholder (no WebContents) by default. 1059 // SyncedTabDelegateFake is a placeholder (no WebContents) by default.
1051 SyncedTabDelegateFake t0_override; 1060 SyncedTabDelegateFake t0_override;
1052 t0_override.SetSyncId(t0_entity.session().tab_node_id()); 1061 t0_override.SetSyncId(t0_entity.session().tab_node_id());
1062 t0_override.SetWindowId(kNewWindowId);
1053 1063
1054 // Set up the window override with the new window ID and placeholder tab. 1064 // Set up the window override with the new window ID and placeholder tab.
1055 const std::set<const SyncedWindowDelegate*>& windows = 1065 const std::set<const SyncedWindowDelegate*>& windows =
1056 get_synced_window_getter()->GetSyncedWindowDelegates(); 1066 get_synced_window_getter()->GetSyncedWindowDelegates();
1057 ASSERT_EQ(1U, windows.size()); 1067 ASSERT_EQ(1U, windows.size());
1058 SyncedWindowDelegateOverride window_override(*windows.begin()); 1068 SyncedWindowDelegateOverride window_override(*windows.begin());
1059 window_override.OverrideSessionId(kNewWindowId); 1069 window_override.OverrideSessionId(kNewWindowId);
1060 window_override.OverrideTabAt(0, &t0_override, 1070 window_override.OverrideTabAt(0, &t0_override,
1061 t0_entity.session().tab().tab_id()); 1071 t0_entity.session().tab().tab_id());
1062 1072
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
1300 EXPECT_TRUE(changes.empty()); 1310 EXPECT_TRUE(changes.empty());
1301 1311
1302 // Fill an instance of session specifics with a foreign session's data. 1312 // Fill an instance of session specifics with a foreign session's data.
1303 std::vector<sync_pb::SessionSpecifics> tabs; 1313 std::vector<sync_pb::SessionSpecifics> tabs;
1304 SessionID::id_type n1[] = {5, 10, 13, 17}; 1314 SessionID::id_type n1[] = {5, 10, 13, 17};
1305 std::vector<SessionID::id_type> tab_nums1(n1, n1 + arraysize(n1)); 1315 std::vector<SessionID::id_type> tab_nums1(n1, n1 + arraysize(n1));
1306 sync_pb::SessionSpecifics meta(helper()->BuildForeignSession( 1316 sync_pb::SessionSpecifics meta(helper()->BuildForeignSession(
1307 tag, tab_nums1, &tabs)); 1317 tag, tab_nums1, &tabs));
1308 1318
1309 // Update associator with the session's meta node, window, and tabs. 1319 // Update associator with the session's meta node, window, and tabs.
1310 manager()->UpdateTrackerWithForeignSession(meta, base::Time()); 1320 manager()->UpdateTrackerWithSpecifics(meta, base::Time());
1311 for (std::vector<sync_pb::SessionSpecifics>::iterator iter = tabs.begin(); 1321 for (std::vector<sync_pb::SessionSpecifics>::iterator iter = tabs.begin();
1312 iter != tabs.end(); ++iter) { 1322 iter != tabs.end(); ++iter) {
1313 manager()->UpdateTrackerWithForeignSession(*iter, base::Time()); 1323 manager()->UpdateTrackerWithSpecifics(*iter, base::Time());
1314 } 1324 }
1315 ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions)); 1325 ASSERT_TRUE(manager()->GetAllForeignSessions(&foreign_sessions));
1316 ASSERT_EQ(1U, foreign_sessions.size()); 1326 ASSERT_EQ(1U, foreign_sessions.size());
1317 1327
1318 // Now delete the foreign session. 1328 // Now delete the foreign session.
1319 manager()->DeleteForeignSessionInternal(tag, &changes); 1329 manager()->DeleteForeignSessionInternal(tag, &changes);
1320 EXPECT_FALSE(manager()->GetAllForeignSessions(&foreign_sessions)); 1330 EXPECT_FALSE(manager()->GetAllForeignSessions(&foreign_sessions));
1321 1331
1322 EXPECT_EQ(5U, changes.size()); 1332 EXPECT_EQ(5U, changes.size());
1323 std::set<std::string> expected_tags(&tag, &tag + 1); 1333 std::set<std::string> expected_tags(&tag, &tag + 1);
(...skipping 739 matching lines...) Expand 10 before | Expand all | Expand 10 after
2063 EXPECT_TRUE(specifics2.has_header()); 2073 EXPECT_TRUE(specifics2.has_header());
2064 const sync_pb::SessionHeader& header_s2 = specifics2.header(); 2074 const sync_pb::SessionHeader& header_s2 = specifics2.header();
2065 EXPECT_EQ(1, header_s2.window_size()); 2075 EXPECT_EQ(1, header_s2.window_size());
2066 2076
2067 // Verify TabLinks. 2077 // Verify TabLinks.
2068 SessionsSyncManager::TabLinksMap tab_map = manager()->local_tab_map_; 2078 SessionsSyncManager::TabLinksMap tab_map = manager()->local_tab_map_;
2069 ASSERT_EQ(2U, tab_map.size()); 2079 ASSERT_EQ(2U, tab_map.size());
2070 // Tabs are ordered by sessionid in tab_map, so should be able to traverse 2080 // Tabs are ordered by sessionid in tab_map, so should be able to traverse
2071 // the tree based on order of tabs created 2081 // the tree based on order of tabs created
2072 SessionsSyncManager::TabLinksMap::iterator iter = tab_map.begin(); 2082 SessionsSyncManager::TabLinksMap::iterator iter = tab_map.begin();
2073 ASSERT_EQ(2, iter->second->tab()->GetEntryCount()); 2083 EXPECT_EQ(GURL("http://foo2"), iter->second->url());
2074 EXPECT_EQ(GURL("http://foo1"), iter->second->tab()->GetVirtualURLAtIndex(0));
2075 EXPECT_EQ(GURL("http://foo2"), iter->second->tab()->GetVirtualURLAtIndex(1));
2076 iter++; 2084 iter++;
2077 ASSERT_EQ(2, iter->second->tab()->GetEntryCount()); 2085 EXPECT_EQ(GURL("http://bar2"), iter->second->url());
2078 EXPECT_EQ(GURL("http://bar1"), iter->second->tab()->GetVirtualURLAtIndex(0));
2079 EXPECT_EQ(GURL("http://bar2"), iter->second->tab()->GetVirtualURLAtIndex(1));
2080 } 2086 }
2081 2087
2082 TEST_F(SessionsSyncManagerTest, ForeignSessionModifiedTime) { 2088 TEST_F(SessionsSyncManagerTest, ForeignSessionModifiedTime) {
2083 syncer::SyncDataList foreign_data; 2089 syncer::SyncDataList foreign_data;
2084 base::Time newest_time = base::Time::Now() - base::TimeDelta::FromDays(1); 2090 base::Time newest_time = base::Time::Now() - base::TimeDelta::FromDays(1);
2085 base::Time middle_time = base::Time::Now() - base::TimeDelta::FromDays(2); 2091 base::Time middle_time = base::Time::Now() - base::TimeDelta::FromDays(2);
2086 base::Time oldest_time = base::Time::Now() - base::TimeDelta::FromDays(3); 2092 base::Time oldest_time = base::Time::Now() - base::TimeDelta::FromDays(3);
2087 2093
2088 { 2094 {
2089 std::string session_tag = "tag1"; 2095 std::string session_tag = "tag1";
(...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after
2603 base::Time last_time; 2609 base::Time last_time;
2604 for (size_t i = 0; i < tabs.size(); ++i) { 2610 for (size_t i = 0; i < tabs.size(); ++i) {
2605 base::Time this_time = tabs[i]->timestamp; 2611 base::Time this_time = tabs[i]->timestamp;
2606 if (i > 0) 2612 if (i > 0)
2607 ASSERT_GE(last_time, this_time); 2613 ASSERT_GE(last_time, this_time);
2608 last_time = tabs[i]->timestamp; 2614 last_time = tabs[i]->timestamp;
2609 } 2615 }
2610 } 2616 }
2611 2617
2612 } // namespace sync_sessions 2618 } // namespace sync_sessions
OLDNEW
« no previous file with comments | « no previous file | components/sync_sessions/sessions_sync_manager.h » ('j') | components/sync_sessions/sessions_sync_manager.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698