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

Side by Side Diff: chrome/browser/sync/glue/synced_session_tracker_unittest.cc

Issue 7966020: [Sync] Fix Session's handling of windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 9 years, 2 months 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 | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <string>
6 #include <vector>
7
8 #include "base/memory/scoped_ptr.h"
9 #include "base/rand_util.h"
10 #include "chrome/browser/sessions/session_types.h"
11 #include "chrome/browser/sync/glue/synced_session_tracker.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace browser_sync {
15
16 typedef testing::Test SyncedSessionTrackerTest;
17
18 TEST_F(SyncedSessionTrackerTest, GetSession) {
19 SyncedSessionTracker tracker;
20 SyncedSession* session1 = tracker.GetSession("tag");
21 SyncedSession* session2 = tracker.GetSession("tag2");
22 ASSERT_EQ(session1, tracker.GetSession("tag"));
23 ASSERT_NE(session1, session2);
24 // Should clean up memory on it's own.
25 }
26
27 TEST_F(SyncedSessionTrackerTest, GetTabUnmapped) {
28 SyncedSessionTracker tracker;
29 SessionTab* tab = tracker.GetTab("tag", 0);
30 ASSERT_EQ(tab, tracker.GetTab("tag", 0));
31 // Should clean up memory on it's own.
32 }
33
34 TEST_F(SyncedSessionTrackerTest, GetWindow) {
35 SyncedSessionTracker tracker;
36 SessionWindow* window = tracker.GetWindow("tag", 0);
37 ASSERT_EQ(window, tracker.GetWindow("tag", 0));
38 SyncedSession* session = tracker.GetSession("tag");
39 session->windows[0] = window;
40 // Should clean up memory on it's own.
41 }
42
43 TEST_F(SyncedSessionTrackerTest, GetTabForWindow) {
44 SyncedSessionTracker tracker;
45 SessionWindow* window = tracker.GetWindow("tag", 10);
46 SessionTab* tab = tracker.GetTabForWindow("tag", 10, 0);
47 SyncedSession* session = tracker.GetSession("tag");
48 session->windows[10] = window;
49 window->tabs.push_back(tab);
50 // Should clean up memory on it's own.
51 }
52
53 TEST_F(SyncedSessionTrackerTest, Complex) {
54 const std::string tag1 = "tag";
55 const std::string tag2 = "tag2";
56 const std::string tag3 = "tag3";
57 SyncedSessionTracker tracker;
58 std::vector<SessionTab*> tabs1, tabs2;
59 SessionTab* temp_tab;
60 ASSERT_TRUE(tracker.empty());
61 ASSERT_EQ(0U, tracker.num_synced_sessions());
62 ASSERT_EQ(0U, tracker.num_synced_tabs(tag1));
63 tabs1.push_back(tracker.GetTab(tag1, 0));
64 tabs1.push_back(tracker.GetTab(tag1, 1));
65 tabs1.push_back(tracker.GetTab(tag1, 2));
66 ASSERT_EQ(3U, tracker.num_synced_tabs(tag1));
67 ASSERT_EQ(0U, tracker.num_synced_sessions());
68 temp_tab = tracker.GetTab(tag1, 0); // Already created.
69 ASSERT_EQ(3U, tracker.num_synced_tabs(tag1));
70 ASSERT_EQ(0U, tracker.num_synced_sessions());
71 ASSERT_EQ(tabs1[0], temp_tab);
72 tabs2.push_back(tracker.GetTab(tag2, 0));
73 ASSERT_EQ(1U, tracker.num_synced_tabs(tag2));
74 ASSERT_EQ(0U, tracker.num_synced_sessions());
75
76 ASSERT_FALSE(tracker.DeleteSession(tag1));
77 ASSERT_FALSE(tracker.DeleteSession(tag3));
78
79 SyncedSession* session = tracker.GetSession(tag1);
80 SyncedSession* session2 = tracker.GetSession(tag2);
81 SyncedSession* session3 = tracker.GetSession(tag3);
82 ASSERT_EQ(3U, tracker.num_synced_sessions());
83
84 ASSERT_TRUE(session);
85 ASSERT_TRUE(session2);
86 ASSERT_TRUE(session3);
87 ASSERT_NE(session, session2);
88 ASSERT_NE(session2, session3);
89 ASSERT_TRUE(tracker.DeleteSession(tag3));
90 ASSERT_EQ(2U, tracker.num_synced_sessions());
91
92 temp_tab = tracker.GetTabForWindow(tag1, 0, 2); // No longer unmapped.
93 session->windows[0] = tracker.GetWindow(tag1, 0); // Create a window.
94 session->windows[0]->tabs.push_back(temp_tab); // Add the tab.
95 ASSERT_EQ(3U, tracker.num_synced_tabs(tag1)); // Has not changed.
96
97 const SessionTab *tab_ptr;
98 ASSERT_TRUE(tracker.LookupSessionTab(tag1, 0, &tab_ptr));
99 ASSERT_EQ(tab_ptr, tabs1[0]);
100 ASSERT_TRUE(tracker.LookupSessionTab(tag1, 2, &tab_ptr));
101 ASSERT_EQ(tab_ptr, tabs1[2]);
102 ASSERT_FALSE(tracker.LookupSessionTab(tag1, 3, &tab_ptr));
103 ASSERT_EQ(static_cast<const SessionTab*>(NULL), tab_ptr);
104
105 std::vector<SessionWindow*> windows;
106 ASSERT_TRUE(tracker.LookupSessionWindows(tag1, &windows));
107 ASSERT_EQ(1U, windows.size());
108 ASSERT_TRUE(tracker.LookupSessionWindows(tag2, &windows));
109 ASSERT_EQ(0U, windows.size());
110
111 // The sessions don't have valid tabs, lookup should not succeed.
112 std::vector<const SyncedSession*> sessions;
113 ASSERT_FALSE(tracker.LookupAllForeignSessions(&sessions));
114
115 tracker.clear();
116 ASSERT_EQ(0U, tracker.num_synced_tabs(tag1));
117 ASSERT_EQ(0U, tracker.num_synced_tabs(tag2));
118 ASSERT_EQ(0U, tracker.num_synced_sessions());
119 }
120
121 TEST_F(SyncedSessionTrackerTest, ManyGetTabs) {
122 SyncedSessionTracker tracker;
123 ASSERT_TRUE(tracker.empty());
124 const int kMaxSessions = 10;
125 const int kMaxTabs = 1000;
126 const int kMaxAttempts = 10000;
127 for (int j=0; j<kMaxSessions; ++j) {
128 std::string tag = "tag" + j;
129 for (int i=0; i<kMaxAttempts; ++i) {
130 // More attempts than tabs means we'll sometimes get the same tabs,
131 // sometimes have to allocate new tabs.
132 int rand_tab_num = base::RandInt(0, kMaxTabs);
133 SessionTab* tab = tracker.GetTab(tag, rand_tab_num);
134 ASSERT_TRUE(tab);
135 }
136 }
137 }
138
139 TEST_F(SyncedSessionTrackerTest, SessionTracking) {
140 SyncedSessionTracker tracker;
141 ASSERT_TRUE(tracker.empty());
142 std::string tag1 = "tag1";
143 std::string tag2 = "tag2";
144
145 // Create some session information that is stale.
146 SyncedSession* session1= tracker.GetSession(tag1);
147 session1->windows[0] = tracker.GetWindow(tag1, 0);
148 session1->windows[0]->tabs.push_back(
149 tracker.GetTabForWindow(tag1, 0, 0));
150 session1->windows[0]->tabs.push_back(
151 tracker.GetTabForWindow(tag1, 0, 1));
152 tracker.GetTab(tag1, 2)->window_id.set_id(0); // Will be an unmapped tab.
153 tracker.GetTab(tag1, 3)->window_id.set_id(0); // Will be an unmapped tab.
154 session1->windows[1] = tracker.GetWindow(tag1, 1);
155 session1->windows[1]->tabs.push_back(
156 tracker.GetTabForWindow(tag1, 1, 4));
157 session1->windows[1]->tabs.push_back(
158 tracker.GetTabForWindow(tag1, 1, 5));
159 ASSERT_EQ(2U, session1->windows.size());
160 ASSERT_EQ(2U, session1->windows[0]->tabs.size());
161 ASSERT_EQ(2U, session1->windows[1]->tabs.size());
162 ASSERT_EQ(6U, tracker.num_synced_tabs(tag1));
163
164 // Create a session that should not be affected.
165 SyncedSession* session2 = tracker.GetSession(tag2);
166 session2->windows[2] = tracker.GetWindow(tag2, 2);
167 session2->windows[2]->tabs.push_back(tracker.GetTabForWindow(tag2, 2, 1));
168 ASSERT_EQ(1U, session2->windows.size());
169 ASSERT_EQ(1U, session2->windows[2]->tabs.size());
170 ASSERT_EQ(1U, tracker.num_synced_tabs(tag2));
171
172 // Reset tracking and get the current windows/tabs.
173 // We simulate moving a tab from one window to another, then closing the first
174 // window (including it's one remaining tab), and opening a new tab on the
175 // remaining window.
176 tracker.ResetSessionTracking(tag1);
177 session1->windows[0] = tracker.GetWindow(tag1, 0);
178 session1->windows[0]->tabs.clear();
179 session1->windows[0]->tabs.push_back(
180 tracker.GetTabForWindow(tag1, 0, 0));
181 // Tab 1 is closed.
182 session1->windows[0]->tabs.push_back(
183 tracker.GetTabForWindow(tag1, 0, 2)); // No longer unmapped.
184 session1->windows[0]->tabs.push_back(
185 tracker.GetTabForWindow(tag1, 0, 4)); // Moved from window 1.
186 tracker.GetTab(tag1, 6); // Unmapped.
187 session1->windows[0]->tabs.push_back(
188 tracker.GetTabForWindow(tag1, 0, 6)); // Then no longer unmapped
189 // Tab 3 is not used.
190 // Window 1 was closed, along with tab 5.
191 // Session 2 should not be affected.
192 tracker.CleanupSession(tag1);
193
194 // Verify that only those parts of the session not used have been removed.
195 ASSERT_EQ(1U, session1->windows.size());
196 ASSERT_EQ(4U, session1->windows[0]->tabs.size());
197 ASSERT_EQ(1U, session2->windows.size());
198 ASSERT_EQ(1U, session2->windows[2]->tabs.size());
199 ASSERT_EQ(2U, tracker.num_synced_sessions());
200 ASSERT_EQ(4U, tracker.num_synced_tabs(tag1));
201 ASSERT_EQ(1U, tracker.num_synced_tabs(tag2));
202
203 // All memory should be properly deallocated by destructor for the
204 // SyncedSessionTracker.
205 }
206
207 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698