accuracy_web_contents_observer_unittest.cc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright 2021 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/accuracy_tips/accuracy_web_contents_observer.h"
  5. #include <memory>
  6. #include "base/test/bind.h"
  7. #include "base/test/metrics/histogram_tester.h"
  8. #include "base/test/mock_callback.h"
  9. #include "components/accuracy_tips/accuracy_service.h"
  10. #include "components/accuracy_tips/accuracy_tip_status.h"
  11. #include "components/accuracy_tips/features.h"
  12. #include "components/safe_browsing/core/browser/db/database_manager.h"
  13. #include "content/public/test/navigation_simulator.h"
  14. #include "content/public/test/test_renderer_host.h"
  15. #include "testing/gmock/include/gmock/gmock.h"
  16. #include "testing/gtest/include/gtest/gtest.h"
  17. using testing::_;
  18. using testing::Invoke;
  19. using testing::Mock;
  20. using testing::Return;
  21. using AccuracyCheckCallback =
  22. accuracy_tips::AccuracyService::AccuracyCheckCallback;
  23. namespace accuracy_tips {
  24. namespace {
  25. // Helpers to invoke callback on mocked function.
  26. void ReturnNone(const GURL&, AccuracyCheckCallback callback) {
  27. std::move(callback).Run(AccuracyTipStatus::kNone);
  28. }
  29. void ReturnIsNewsRelated(const GURL&, AccuracyCheckCallback callback) {
  30. std::move(callback).Run(AccuracyTipStatus::kShowAccuracyTip);
  31. }
  32. } // namespace
  33. class MockAccuracyService : public AccuracyService {
  34. public:
  35. MockAccuracyService()
  36. : AccuracyService(nullptr, nullptr, nullptr, nullptr, nullptr, nullptr) {}
  37. MOCK_METHOD2(CheckAccuracyStatus, void(const GURL&, AccuracyCheckCallback));
  38. MOCK_METHOD1(MaybeShowAccuracyTip, void(content::WebContents*));
  39. bool IsSecureConnection(content::WebContents* web_contents) override {
  40. return web_contents->GetURL().SchemeIsCryptographic();
  41. }
  42. };
  43. class AccuracyWebContentsObserverTest
  44. : public content::RenderViewHostTestHarness {
  45. protected:
  46. AccuracyWebContentsObserverTest() = default;
  47. void SetUp() override {
  48. content::RenderViewHostTestHarness::SetUp();
  49. service_ = std::make_unique<testing::StrictMock<MockAccuracyService>>();
  50. }
  51. MockAccuracyService* service() { return service_.get(); }
  52. base::HistogramTester* tester() { return &tester_; }
  53. private:
  54. std::unique_ptr<testing::StrictMock<MockAccuracyService>> service_;
  55. base::HistogramTester tester_;
  56. };
  57. TEST_F(AccuracyWebContentsObserverTest, CheckServiceOnNavigationToRandomSite) {
  58. AccuracyWebContentsObserver::CreateForWebContents(web_contents(), service());
  59. GURL url("https://example.com");
  60. EXPECT_CALL(*service(), CheckAccuracyStatus(url, _))
  61. .WillOnce(Invoke(&ReturnNone));
  62. content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(),
  63. url);
  64. tester()->ExpectUniqueSample("Privacy.AccuracyTip.PageStatus",
  65. AccuracyTipStatus::kNone, 1);
  66. }
  67. TEST_F(AccuracyWebContentsObserverTest,
  68. CheckServiceOnNavigationToRandomInsecureSite) {
  69. AccuracyWebContentsObserver::CreateForWebContents(web_contents(), service());
  70. GURL url("http://example.com");
  71. EXPECT_CALL(*service(), CheckAccuracyStatus(url, _))
  72. .WillOnce(Invoke(&ReturnNone));
  73. content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(),
  74. url);
  75. tester()->ExpectUniqueSample("Privacy.AccuracyTip.PageStatus",
  76. AccuracyTipStatus::kNone, 1);
  77. }
  78. TEST_F(AccuracyWebContentsObserverTest, CheckServiceOnNavigationToSiteInList) {
  79. AccuracyWebContentsObserver::CreateForWebContents(web_contents(), service());
  80. GURL url("https://accuracytip.com");
  81. EXPECT_CALL(*service(), CheckAccuracyStatus(url, _))
  82. .WillOnce(Invoke(&ReturnIsNewsRelated));
  83. EXPECT_CALL(*service(), MaybeShowAccuracyTip(web_contents()));
  84. content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(),
  85. url);
  86. tester()->ExpectUniqueSample("Privacy.AccuracyTip.PageStatus",
  87. AccuracyTipStatus::kShowAccuracyTip, 1);
  88. }
  89. TEST_F(AccuracyWebContentsObserverTest,
  90. CheckServiceOnNavigationToInSecureSiteInList) {
  91. AccuracyWebContentsObserver::CreateForWebContents(web_contents(), service());
  92. GURL url("http://accuracytip.com");
  93. EXPECT_CALL(*service(), CheckAccuracyStatus(url, _))
  94. .WillOnce(Invoke(&ReturnIsNewsRelated));
  95. EXPECT_CALL(*service(), MaybeShowAccuracyTip(web_contents())).Times(0);
  96. content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(),
  97. url);
  98. tester()->ExpectUniqueSample("Privacy.AccuracyTip.PageStatus",
  99. AccuracyTipStatus::kNotSecure, 1);
  100. }
  101. TEST_F(AccuracyWebContentsObserverTest, CheckServiceAndNavigationBeforeResult) {
  102. AccuracyWebContentsObserver::CreateForWebContents(web_contents(), service());
  103. GURL example_url("https://example.com");
  104. GURL accuracy_tip_url("https://accuracytip.com");
  105. // Capture callback for first navigation.
  106. AccuracyCheckCallback callback;
  107. EXPECT_CALL(*service(), CheckAccuracyStatus(accuracy_tip_url, _))
  108. .WillOnce(Invoke([&](const GURL&, AccuracyCheckCallback cb) {
  109. callback = std::move(cb);
  110. }));
  111. content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(),
  112. accuracy_tip_url);
  113. Mock::VerifyAndClearExpectations(service());
  114. // Navigate to a different site.
  115. EXPECT_CALL(*service(), CheckAccuracyStatus(example_url, _))
  116. .WillOnce(Invoke(&ReturnNone));
  117. // Twice, once per each time a callback is ran.
  118. content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(),
  119. example_url);
  120. // Verify that there is no call to MaybeShowAccuracyTip if callback is invoked
  121. // after navigation to a different site.
  122. std::move(callback).Run(AccuracyTipStatus::kShowAccuracyTip);
  123. Mock::VerifyAndClearExpectations(service());
  124. tester()->ExpectUniqueSample("Privacy.AccuracyTip.PageStatus",
  125. AccuracyTipStatus::kNone, 1);
  126. }
  127. TEST_F(AccuracyWebContentsObserverTest, CheckServiceAndDestroyBeforeResult) {
  128. AccuracyWebContentsObserver::CreateForWebContents(web_contents(), service());
  129. GURL url("https://accuracytip.com");
  130. AccuracyCheckCallback callback;
  131. EXPECT_CALL(*service(), CheckAccuracyStatus(url, _))
  132. .WillOnce(Invoke([&](const GURL&, AccuracyCheckCallback cb) {
  133. callback = std::move(cb);
  134. }));
  135. content::NavigationSimulator::NavigateAndCommitFromBrowser(web_contents(),
  136. url);
  137. // Invoke callback after webcontents is destroyed.
  138. DeleteContents();
  139. std::move(callback).Run(AccuracyTipStatus::kShowAccuracyTip);
  140. tester()->ExpectTotalCount("Privacy.AccuracyTip.PageStatus", 0);
  141. }
  142. } // namespace accuracy_tips