navigation_controller_impl_unittest.cc 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. // Copyright 2019 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 "fuchsia_web/webengine/browser/navigation_controller_impl.h"
  5. #include "base/strings/string_piece.h"
  6. #include "base/test/gtest_util.h"
  7. #include "testing/gtest/include/gtest/gtest.h"
  8. #include "url/gurl.h"
  9. namespace {
  10. const char kUrl1[] = "http://www.url1.com/";
  11. const char kUrl2[] = "http://www.url2.com/";
  12. const char kTitle1[] = "title1";
  13. const char kTitle2[] = "title2";
  14. fuchsia::web::NavigationState CreateNavigationState(
  15. const GURL& url,
  16. base::StringPiece title,
  17. fuchsia::web::PageType page_type,
  18. bool can_go_back,
  19. bool can_go_forward,
  20. bool is_main_document_loaded) {
  21. fuchsia::web::NavigationState navigation_state;
  22. navigation_state.set_url(url.spec());
  23. navigation_state.set_title(std::string(title));
  24. navigation_state.set_page_type(fuchsia::web::PageType(page_type));
  25. navigation_state.set_can_go_back(can_go_back);
  26. navigation_state.set_can_go_forward(can_go_forward);
  27. navigation_state.set_is_main_document_loaded(is_main_document_loaded);
  28. return navigation_state;
  29. }
  30. } // namespace
  31. // Verifies that two NavigationStates that are the same are differenced
  32. // correctly.
  33. TEST(DiffNavigationEntriesTest, NoChange) {
  34. fuchsia::web::NavigationState state1 = CreateNavigationState(
  35. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, true, true, true);
  36. fuchsia::web::NavigationState state2 = CreateNavigationState(
  37. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, true, true, true);
  38. fuchsia::web::NavigationState difference;
  39. DiffNavigationEntriesForTest(state1, state2, &difference);
  40. EXPECT_TRUE(difference.IsEmpty());
  41. }
  42. // Differencing from an empty to non-empty state should return a diff equivalent
  43. // to the non-empty state. Differencing to an empty state is not supported and
  44. // should DCHECK.
  45. TEST(DiffNavigationEntriesTest, EmptyAndNonEmpty) {
  46. fuchsia::web::NavigationState difference;
  47. fuchsia::web::NavigationState empty_state;
  48. fuchsia::web::NavigationState state = CreateNavigationState(
  49. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, true, true, true);
  50. DiffNavigationEntriesForTest(empty_state, state, &difference);
  51. ASSERT_FALSE(difference.IsEmpty());
  52. ASSERT_TRUE(difference.has_title());
  53. EXPECT_EQ(difference.title(), kTitle1);
  54. ASSERT_TRUE(difference.has_url());
  55. EXPECT_EQ(difference.url(), kUrl1);
  56. difference = {};
  57. EXPECT_DCHECK_DEATH(
  58. DiffNavigationEntriesForTest(state, empty_state, &difference));
  59. }
  60. // Verifies that states with different URL and title are correctly checked.
  61. TEST(DiffNavigationEntriesTest, DifferentTitleAndUrl) {
  62. fuchsia::web::NavigationState difference;
  63. fuchsia::web::NavigationState state1 = CreateNavigationState(
  64. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, true, true, true);
  65. fuchsia::web::NavigationState state2 = CreateNavigationState(
  66. GURL(kUrl2), kTitle2, fuchsia::web::PageType::NORMAL, true, true, true);
  67. DiffNavigationEntriesForTest(state1, state2, &difference);
  68. ASSERT_TRUE(difference.has_title());
  69. EXPECT_EQ(difference.title(), kTitle2);
  70. ASSERT_TRUE(difference.has_url());
  71. EXPECT_EQ(difference.url(), kUrl2);
  72. difference = {};
  73. DiffNavigationEntriesForTest(state2, state1, &difference);
  74. ASSERT_TRUE(difference.has_title());
  75. EXPECT_EQ(difference.title(), kTitle1);
  76. ASSERT_TRUE(difference.has_url());
  77. EXPECT_EQ(difference.url(), kUrl1);
  78. }
  79. // Verifies that differences are accumulated into |difference|.
  80. TEST(DiffNavigationEntriesTest, DifferencesAccumulate) {
  81. fuchsia::web::NavigationState difference;
  82. fuchsia::web::NavigationState state1 = CreateNavigationState(
  83. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, true, true, true);
  84. fuchsia::web::NavigationState state2 = CreateNavigationState(
  85. GURL(kUrl2), kTitle1, fuchsia::web::PageType::NORMAL, true, true, true);
  86. fuchsia::web::NavigationState state3 = CreateNavigationState(
  87. GURL(kUrl2), kTitle2, fuchsia::web::PageType::NORMAL, true, true, true);
  88. DiffNavigationEntriesForTest(state1, state2, &difference);
  89. EXPECT_FALSE(difference.has_title());
  90. ASSERT_TRUE(difference.has_url());
  91. EXPECT_EQ(difference.url(), kUrl2);
  92. DiffNavigationEntriesForTest(state2, state3, &difference);
  93. ASSERT_TRUE(difference.has_title());
  94. EXPECT_EQ(difference.title(), kTitle2);
  95. ASSERT_TRUE(difference.has_url());
  96. EXPECT_EQ(difference.url(), kUrl2);
  97. }
  98. // Verifies that states with different can_go_back and can_go_forward are
  99. // correctly checked.
  100. TEST(DiffNavigationEntriesTest, DifferentCanGoBackAndForward) {
  101. fuchsia::web::NavigationState difference;
  102. fuchsia::web::NavigationState state1 = CreateNavigationState(
  103. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, true, false, true);
  104. fuchsia::web::NavigationState state2 = CreateNavigationState(
  105. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, false, true, true);
  106. DiffNavigationEntriesForTest(state1, state2, &difference);
  107. ASSERT_TRUE(difference.has_can_go_back());
  108. EXPECT_FALSE(difference.can_go_back());
  109. ASSERT_TRUE(difference.has_can_go_forward());
  110. EXPECT_TRUE(difference.can_go_forward());
  111. difference = {};
  112. DiffNavigationEntriesForTest(state2, state1, &difference);
  113. ASSERT_TRUE(difference.has_can_go_back());
  114. EXPECT_TRUE(difference.can_go_back());
  115. ASSERT_TRUE(difference.has_can_go_forward());
  116. EXPECT_FALSE(difference.can_go_forward());
  117. }
  118. // Verifies that is_main_document is checked correctly.
  119. TEST(DiffNavigationEntriesTest, DifferentIsMainDocumentLoaded) {
  120. fuchsia::web::NavigationState difference;
  121. fuchsia::web::NavigationState state1 = CreateNavigationState(
  122. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, true, true, true);
  123. fuchsia::web::NavigationState state2 = CreateNavigationState(
  124. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, true, true, false);
  125. DiffNavigationEntriesForTest(state1, state2, &difference);
  126. ASSERT_TRUE(difference.has_is_main_document_loaded());
  127. EXPECT_FALSE(difference.is_main_document_loaded());
  128. difference = {};
  129. DiffNavigationEntriesForTest(state2, state1, &difference);
  130. ASSERT_TRUE(difference.has_is_main_document_loaded());
  131. EXPECT_TRUE(difference.is_main_document_loaded());
  132. }
  133. // Verifies that transitions from empty to non-empty states are handled.
  134. TEST(FrameImplUnitTest, DiffNavigationEntriesFromInitial) {
  135. fuchsia::web::NavigationState difference;
  136. fuchsia::web::NavigationState state1;
  137. fuchsia::web::NavigationState state2 = CreateNavigationState(
  138. GURL(kUrl1), kTitle1, fuchsia::web::PageType::NORMAL, true, true, false);
  139. DiffNavigationEntriesForTest(state1, state2, &difference);
  140. EXPECT_FALSE(difference.IsEmpty());
  141. // Transitions from non-empty to empty (initial) state are DCHECK'd.
  142. EXPECT_DCHECK_DEATH(
  143. { DiffNavigationEntriesForTest(state2, state1, &difference); });
  144. }
  145. // Verifies that differencing between two empty/initial states are handled.
  146. TEST(FrameImplUnitTest, DiffNavigationEntriesBothInitial) {
  147. fuchsia::web::NavigationState difference;
  148. fuchsia::web::NavigationState state1;
  149. fuchsia::web::NavigationState state2;
  150. DiffNavigationEntriesForTest(state1, state2, &difference);
  151. EXPECT_TRUE(difference.IsEmpty());
  152. }