1 // Copyright (c) 2012 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.
5 #include "chrome/browser/ui/toolbar/recent_tabs_builder_test_helper.h"
7 #include "base/rand_util.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "base/strings/stringprintf.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/browser/sync/glue/session_model_associator.h"
12 #include "sync/protocol/session_specifics.pb.h"
13 #include "testing/gtest/include/gtest/gtest.h"
17 const char kBaseSessionTag[] = "session_tag";
18 const char kBaseSessionName[] = "session_name";
19 const char kBaseTabUrl[] = "http://foo/?";
20 const char kTabTitleFormat[] = "session=%d;window=%d;tab=%d";
22 struct TitleTimestampPair {
27 bool SortTabTimesByRecency(const TitleTimestampPair& t1,
28 const TitleTimestampPair& t2) {
29 return t1.timestamp > t2.timestamp;
32 int CreateUniqueID() {
38 std::string ToSessionTag(SessionID::id_type session_id) {
39 return std::string(kBaseSessionTag + base::IntToString(session_id));
42 std::string ToSessionName(SessionID::id_type session_id) {
43 return std::string(kBaseSessionName + base::IntToString(session_id));
46 std::string ToTabTitle(SessionID::id_type session_id,
47 SessionID::id_type window_id,
48 SessionID::id_type tab_id) {
49 return base::StringPrintf(kTabTitleFormat, session_id, window_id, tab_id);
52 std::string ToTabUrl(SessionID::id_type session_id,
53 SessionID::id_type window_id,
54 SessionID::id_type tab_id) {
55 return std::string(kBaseTabUrl + ToTabTitle(session_id, window_id, tab_id));
60 struct RecentTabsBuilderTestHelper::TabInfo {
62 SessionID::id_type id;
66 struct RecentTabsBuilderTestHelper::WindowInfo {
67 WindowInfo() : id(0) {}
69 SessionID::id_type id;
70 std::vector<TabInfo> tabs;
72 struct RecentTabsBuilderTestHelper::SessionInfo {
73 SessionInfo() : id(0) {}
75 SessionID::id_type id;
76 std::vector<WindowInfo> windows;
79 RecentTabsBuilderTestHelper::RecentTabsBuilderTestHelper()
80 : max_tab_node_id_(0) {
81 start_time_ = base::Time::Now();
84 RecentTabsBuilderTestHelper::~RecentTabsBuilderTestHelper() {
87 void RecentTabsBuilderTestHelper::AddSession() {
89 info.id = CreateUniqueID();
90 sessions_.push_back(info);
93 int RecentTabsBuilderTestHelper::GetSessionCount() {
94 return sessions_.size();
97 SessionID::id_type RecentTabsBuilderTestHelper::GetSessionID(
99 return sessions_[session_index].id;
102 base::Time RecentTabsBuilderTestHelper::GetSessionTimestamp(int session_index) {
103 std::vector<base::Time> timestamps;
104 for (int w = 0; w < GetWindowCount(session_index); ++w) {
105 for (int t = 0; t < GetTabCount(session_index, w); ++t)
106 timestamps.push_back(GetTabTimestamp(session_index, w, t));
109 if (timestamps.empty())
110 return base::Time::Now();
112 sort(timestamps.begin(), timestamps.end());
113 return timestamps[0];
116 void RecentTabsBuilderTestHelper::AddWindow(int session_index) {
117 WindowInfo window_info;
118 window_info.id = CreateUniqueID();
119 sessions_[session_index].windows.push_back(window_info);
122 int RecentTabsBuilderTestHelper::GetWindowCount(int session_index) {
123 return sessions_[session_index].windows.size();
126 SessionID::id_type RecentTabsBuilderTestHelper::GetWindowID(int session_index,
128 return sessions_[session_index].windows[window_index].id;
131 void RecentTabsBuilderTestHelper::AddTab(int session_index, int window_index) {
132 base::Time timestamp =
133 start_time_ + base::TimeDelta::FromMinutes(base::RandUint64());
134 AddTabWithInfo(session_index, window_index, timestamp, string16());
137 void RecentTabsBuilderTestHelper::AddTabWithInfo(int session_index,
139 base::Time timestamp,
140 const string16& title) {
142 tab_info.id = CreateUniqueID();
143 tab_info.timestamp = timestamp;
144 tab_info.title = title;
145 sessions_[session_index].windows[window_index].tabs.push_back(tab_info);
148 int RecentTabsBuilderTestHelper::GetTabCount(int session_index,
150 return sessions_[session_index].windows[window_index].tabs.size();
153 SessionID::id_type RecentTabsBuilderTestHelper::GetTabID(int session_index,
156 return sessions_[session_index].windows[window_index].tabs[tab_index].id;
159 base::Time RecentTabsBuilderTestHelper::GetTabTimestamp(int session_index,
162 return sessions_[session_index].windows[window_index]
163 .tabs[tab_index].timestamp;
166 string16 RecentTabsBuilderTestHelper::GetTabTitle(int session_index,
170 sessions_[session_index].windows[window_index].tabs[tab_index].title;
172 title = UTF8ToUTF16(ToTabTitle(
173 GetSessionID(session_index),
174 GetWindowID(session_index, window_index),
175 GetTabID(session_index, window_index, tab_index)));
180 void RecentTabsBuilderTestHelper::RegisterRecentTabs(
181 browser_sync::SessionModelAssociator* associator) {
182 for (int s = 0; s < GetSessionCount(); ++s) {
183 sync_pb::SessionSpecifics meta;
184 BuildSessionSpecifics(s, &meta);
185 for (int w = 0; w < GetWindowCount(s); ++w) {
186 BuildWindowSpecifics(s, w, &meta);
187 for (int t = 0; t < GetTabCount(s, w); ++t) {
188 sync_pb::SessionSpecifics tab_base;
189 BuildTabSpecifics(s, w, t, &tab_base);
190 associator->AssociateForeignSpecifics(tab_base,
191 GetTabTimestamp(s, w, t));
194 associator->AssociateForeignSpecifics(meta, GetSessionTimestamp(s));
197 // Make sure data is populated correctly in SessionModelAssociator.
198 std::vector<const browser_sync::SyncedSession*> sessions;
199 ASSERT_TRUE(associator->GetAllForeignSessions(&sessions));
200 ASSERT_EQ(GetSessionCount(), static_cast<int>(sessions.size()));
201 for (int s = 0; s < GetSessionCount(); ++s) {
202 std::vector<const SessionWindow*> windows;
203 ASSERT_TRUE(associator->GetForeignSession(ToSessionTag(GetSessionID(s)),
205 ASSERT_EQ(GetWindowCount(s), static_cast<int>(windows.size()));
206 for (int w = 0; w < GetWindowCount(s); ++w)
207 ASSERT_EQ(GetTabCount(s, w), static_cast<int>(windows[w]->tabs.size()));
211 std::vector<string16>
212 RecentTabsBuilderTestHelper::GetTabTitlesSortedByRecency() {
213 std::vector<TitleTimestampPair> tabs;
214 for (int s = 0; s < GetSessionCount(); ++s) {
215 for (int w = 0; w < GetWindowCount(s); ++w) {
216 for (int t = 0; t < GetTabCount(s, w); ++t) {
217 TitleTimestampPair pair;
218 pair.title = GetTabTitle(s, w, t);
219 pair.timestamp = GetTabTimestamp(s, w, t);
220 tabs.push_back(pair);
224 sort(tabs.begin(), tabs.end(), SortTabTimesByRecency);
226 std::vector<string16> titles;
227 for (size_t i = 0; i < tabs.size(); ++i)
228 titles.push_back(tabs[i].title);
232 void RecentTabsBuilderTestHelper::BuildSessionSpecifics(
234 sync_pb::SessionSpecifics* meta) {
235 SessionID::id_type session_id = GetSessionID(session_index);
236 meta->set_session_tag(ToSessionTag(session_id));
237 sync_pb::SessionHeader* header = meta->mutable_header();
238 header->set_device_type(sync_pb::SyncEnums_DeviceType_TYPE_CROS);
239 header->set_client_name(ToSessionName(session_id));
242 void RecentTabsBuilderTestHelper::BuildWindowSpecifics(
245 sync_pb::SessionSpecifics* meta) {
246 sync_pb::SessionHeader* header = meta->mutable_header();
247 sync_pb::SessionWindow* window = header->add_window();
248 SessionID::id_type window_id = GetWindowID(session_index, window_index);
249 window->set_window_id(window_id);
250 window->set_selected_tab_index(0);
251 window->set_browser_type(sync_pb::SessionWindow_BrowserType_TYPE_TABBED);
252 for (int i = 0; i < GetTabCount(session_index, window_index); ++i)
253 window->add_tab(GetTabID(session_index, window_index, i));
256 void RecentTabsBuilderTestHelper::BuildTabSpecifics(
260 sync_pb::SessionSpecifics* tab_base) {
261 SessionID::id_type session_id = GetSessionID(session_index);
262 SessionID::id_type window_id = GetWindowID(session_index, window_index);
263 SessionID::id_type tab_id = GetTabID(session_index, window_index, tab_index);
265 tab_base->set_session_tag(ToSessionTag(session_id));
266 tab_base->set_tab_node_id(++max_tab_node_id_);
267 sync_pb::SessionTab* tab = tab_base->mutable_tab();
268 tab->set_window_id(window_id);
269 tab->set_tab_id(tab_id);
270 tab->set_tab_visual_index(1);
271 tab->set_current_navigation_index(0);
272 tab->set_pinned(true);
273 tab->set_extension_app_id("app_id");
274 sync_pb::TabNavigation* navigation = tab->add_navigation();
275 navigation->set_virtual_url(ToTabUrl(session_id, window_id, tab_id));
276 navigation->set_referrer("referrer");
277 navigation->set_title(UTF16ToUTF8(GetTabTitle(
278 session_index, window_index, tab_index)));
279 navigation->set_page_transition(sync_pb::SyncEnums_PageTransition_TYPED);