open_tabs_ui_delegate_impl_unittest.cc 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // Copyright 2018 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. #include "components/sync_sessions/open_tabs_ui_delegate_impl.h"
  5. #include <vector>
  6. #include "base/bind.h"
  7. #include "base/strings/utf_string_conversions.h"
  8. #include "base/time/time.h"
  9. #include "components/sessions/core/serialized_navigation_entry_test_helper.h"
  10. #include "components/sync_sessions/mock_sync_sessions_client.h"
  11. #include "components/sync_sessions/synced_session_tracker.h"
  12. #include "testing/gmock/include/gmock/gmock.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. namespace sync_sessions {
  15. namespace {
  16. using sessions::SessionTab;
  17. using testing::ElementsAre;
  18. using testing::Field;
  19. using testing::Pointee;
  20. using testing::Property;
  21. const char kSessionTag1[] = "foreign1";
  22. const char kSessionTag2[] = "foreign2";
  23. const char kSessionTag3[] = "foreign3";
  24. const SessionID kWindowId1 = SessionID::FromSerializedValue(1);
  25. const SessionID kWindowId2 = SessionID::FromSerializedValue(2);
  26. const SessionID kWindowId3 = SessionID::FromSerializedValue(3);
  27. const SessionID kTabId1 = SessionID::FromSerializedValue(111);
  28. const SessionID kTabId2 = SessionID::FromSerializedValue(222);
  29. const SessionID kTabId3 = SessionID::FromSerializedValue(333);
  30. void IngnoreForeignSessionDeletion(const std::string& session_tag) {}
  31. class OpenTabsUIDelegateImplTest : public testing::Test {
  32. protected:
  33. OpenTabsUIDelegateImplTest()
  34. : session_tracker_(&mock_sync_sessions_client_),
  35. delegate_(&mock_sync_sessions_client_,
  36. &session_tracker_,
  37. base::BindRepeating(&IngnoreForeignSessionDeletion)) {}
  38. testing::NiceMock<MockSyncSessionsClient> mock_sync_sessions_client_;
  39. SyncedSessionTracker session_tracker_;
  40. OpenTabsUIDelegateImpl delegate_;
  41. };
  42. TEST_F(OpenTabsUIDelegateImplTest, ShouldSortSessions) {
  43. const base::Time kTime0 = base::Time::Now();
  44. // Create three sessions, with one window and tab each.
  45. session_tracker_.PutWindowInSession(kSessionTag1, kWindowId1);
  46. session_tracker_.PutTabInWindow(kSessionTag1, kWindowId1, kTabId1);
  47. sessions::SerializedNavigationEntry entry1 =
  48. sessions::SerializedNavigationEntryTestHelper::CreateNavigationForTest();
  49. entry1.set_virtual_url(GURL("http://url1"));
  50. entry1.set_title(u"title1");
  51. session_tracker_.GetTab(kSessionTag1, kTabId1)->navigations.push_back(entry1);
  52. session_tracker_.GetSession(kSessionTag1)->modified_time =
  53. kTime0 + base::Seconds(3);
  54. session_tracker_.PutWindowInSession(kSessionTag2, kWindowId2);
  55. session_tracker_.PutTabInWindow(kSessionTag2, kWindowId2, kTabId2);
  56. sessions::SerializedNavigationEntry entry2 =
  57. sessions::SerializedNavigationEntryTestHelper::CreateNavigationForTest();
  58. entry2.set_virtual_url(GURL("http://url2"));
  59. entry2.set_title(u"title2");
  60. session_tracker_.GetTab(kSessionTag2, kTabId2)->navigations.push_back(entry2);
  61. session_tracker_.GetSession(kSessionTag2)->modified_time =
  62. kTime0 + base::Seconds(1);
  63. session_tracker_.PutWindowInSession(kSessionTag3, kWindowId3);
  64. session_tracker_.PutTabInWindow(kSessionTag3, kWindowId3, kTabId3);
  65. sessions::SerializedNavigationEntry entry3 =
  66. sessions::SerializedNavigationEntryTestHelper::CreateNavigationForTest();
  67. entry3.set_virtual_url(GURL("http://url3"));
  68. entry3.set_title(u"title3");
  69. session_tracker_.GetTab(kSessionTag3, kTabId3)->navigations.push_back(entry3);
  70. session_tracker_.GetSession(kSessionTag3)->modified_time =
  71. kTime0 + base::Seconds(2);
  72. std::vector<const SyncedSession*> sessions;
  73. EXPECT_TRUE(delegate_.GetAllForeignSessions(&sessions));
  74. EXPECT_THAT(sessions,
  75. ElementsAre(Field(&SyncedSession::session_tag, kSessionTag1),
  76. Field(&SyncedSession::session_tag, kSessionTag3),
  77. Field(&SyncedSession::session_tag, kSessionTag2)));
  78. }
  79. TEST_F(OpenTabsUIDelegateImplTest, ShouldSortTabs) {
  80. const base::Time kTime0 = base::Time::Now();
  81. session_tracker_.PutWindowInSession(kSessionTag1, kWindowId1);
  82. session_tracker_.PutWindowInSession(kSessionTag1, kWindowId2);
  83. session_tracker_.PutTabInWindow(kSessionTag1, kWindowId1, kTabId1);
  84. session_tracker_.PutTabInWindow(kSessionTag1, kWindowId2, kTabId2);
  85. session_tracker_.PutTabInWindow(kSessionTag1, kWindowId2, kTabId3);
  86. sessions::SessionTab* tab1 = session_tracker_.GetTab(kSessionTag1, kTabId1);
  87. tab1->navigations.push_back(
  88. sessions::SerializedNavigationEntryTestHelper::CreateNavigationForTest());
  89. tab1->timestamp = kTime0 + base::Seconds(3);
  90. sessions::SessionTab* tab2 = session_tracker_.GetTab(kSessionTag1, kTabId2);
  91. tab2->navigations.push_back(
  92. sessions::SerializedNavigationEntryTestHelper::CreateNavigationForTest());
  93. tab2->timestamp = kTime0 + base::Seconds(1);
  94. sessions::SessionTab* tab3 = session_tracker_.GetTab(kSessionTag1, kTabId3);
  95. tab3->navigations.push_back(
  96. sessions::SerializedNavigationEntryTestHelper::CreateNavigationForTest());
  97. tab3->timestamp = kTime0 + base::Seconds(2);
  98. std::vector<const SessionTab*> tabs;
  99. EXPECT_TRUE(delegate_.GetForeignSessionTabs(kSessionTag1, &tabs));
  100. EXPECT_THAT(
  101. tabs,
  102. ElementsAre(Pointee(Field(&SessionTab::tab_id,
  103. Property(&SessionID::id, kTabId1.id()))),
  104. Pointee(Field(&SessionTab::tab_id,
  105. Property(&SessionID::id, kTabId3.id()))),
  106. Pointee(Field(&SessionTab::tab_id,
  107. Property(&SessionID::id, kTabId2.id())))));
  108. }
  109. TEST_F(OpenTabsUIDelegateImplTest, ShouldSkipNonPresentable) {
  110. // Create two sessions, with one window and tab each, but only the second
  111. // contains a navigation.
  112. session_tracker_.PutWindowInSession(kSessionTag1, kWindowId1);
  113. session_tracker_.PutTabInWindow(kSessionTag1, kWindowId1, kTabId1);
  114. session_tracker_.GetTab(kSessionTag1, kTabId1);
  115. session_tracker_.PutWindowInSession(kSessionTag2, kWindowId2);
  116. session_tracker_.PutTabInWindow(kSessionTag2, kWindowId2, kTabId2);
  117. session_tracker_.GetTab(kSessionTag2, kTabId2)
  118. ->navigations.push_back(sessions::SerializedNavigationEntryTestHelper::
  119. CreateNavigationForTest());
  120. std::vector<const SyncedSession*> sessions;
  121. EXPECT_TRUE(delegate_.GetAllForeignSessions(&sessions));
  122. EXPECT_THAT(sessions,
  123. ElementsAre(Field(&SyncedSession::session_tag, kSessionTag2)));
  124. }
  125. TEST_F(OpenTabsUIDelegateImplTest, ShouldSkipNonSyncableTabs) {
  126. ON_CALL(mock_sync_sessions_client_, ShouldSyncURL(GURL("http://url1")))
  127. .WillByDefault(testing::Return(false));
  128. // Create two sessions, with one window and tab each. The first of the two
  129. // contains a URL that should not be synced.
  130. sessions::SerializedNavigationEntry nonsyncable_entry =
  131. sessions::SerializedNavigationEntryTestHelper::CreateNavigationForTest();
  132. nonsyncable_entry.set_virtual_url(GURL("http://url1"));
  133. nonsyncable_entry.set_title(u"title1");
  134. session_tracker_.PutWindowInSession(kSessionTag1, kWindowId1);
  135. session_tracker_.PutTabInWindow(kSessionTag1, kWindowId1, kTabId1);
  136. session_tracker_.GetTab(kSessionTag1, kTabId1)
  137. ->navigations.push_back(nonsyncable_entry);
  138. sessions::SerializedNavigationEntry syncable_entry =
  139. sessions::SerializedNavigationEntryTestHelper::CreateNavigationForTest();
  140. syncable_entry.set_virtual_url(GURL("http://otherurl"));
  141. syncable_entry.set_title(u"title1");
  142. session_tracker_.PutWindowInSession(kSessionTag2, kWindowId2);
  143. session_tracker_.PutTabInWindow(kSessionTag2, kWindowId2, kTabId2);
  144. session_tracker_.GetTab(kSessionTag2, kTabId2)
  145. ->navigations.push_back(syncable_entry);
  146. std::vector<const SyncedSession*> sessions;
  147. EXPECT_TRUE(delegate_.GetAllForeignSessions(&sessions));
  148. EXPECT_THAT(sessions,
  149. ElementsAre(Field(&SyncedSession::session_tag, kSessionTag2)));
  150. }
  151. } // namespace
  152. } // namespace sync_sessions