update_check_helper_unittest.cc 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // Copyright 2020 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/safety_check/update_check_helper.h"
  5. #include <memory>
  6. #include "components/safety_check/url_constants.h"
  7. #include "content/public/test/browser_task_environment.h"
  8. #include "services/network/public/cpp/shared_url_loader_factory.h"
  9. #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
  10. #include "services/network/test/test_url_loader_factory.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace safety_check {
  13. class UpdateCheckHelperTest : public testing::Test {
  14. public:
  15. UpdateCheckHelperTest()
  16. : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME),
  17. shared_url_loader_factory_(
  18. base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
  19. &test_url_loader_factory_)) {
  20. update_helper_ =
  21. std::make_unique<UpdateCheckHelper>(shared_url_loader_factory_);
  22. }
  23. void SetExpectedResult(bool connected) { expected_ = connected; }
  24. void VerifyResult(bool connected) {
  25. EXPECT_EQ(expected_, connected);
  26. callback_invoked_ = true;
  27. }
  28. void VerifyCallbackInvoked(bool expected = true) {
  29. EXPECT_EQ(expected, callback_invoked_);
  30. }
  31. void ResetCallbackInvoked() { callback_invoked_ = false; }
  32. protected:
  33. content::BrowserTaskEnvironment task_environment_;
  34. std::unique_ptr<UpdateCheckHelper> update_helper_;
  35. network::TestURLLoaderFactory test_url_loader_factory_;
  36. scoped_refptr<network::SharedURLLoaderFactory> shared_url_loader_factory_;
  37. private:
  38. bool expected_ = true;
  39. bool callback_invoked_ = false;
  40. };
  41. TEST_F(UpdateCheckHelperTest, ConnectionSuccessful) {
  42. SetExpectedResult(true);
  43. update_helper_->CheckConnectivity(base::BindOnce(
  44. &UpdateCheckHelperTest::VerifyResult, base::Unretained(this)));
  45. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  46. EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
  47. kConnectivityCheckUrl, /*content=*/"", net::HTTP_NO_CONTENT));
  48. VerifyCallbackInvoked();
  49. }
  50. TEST_F(UpdateCheckHelperTest, WrongHTTPCode) {
  51. SetExpectedResult(false);
  52. update_helper_->CheckConnectivity(base::BindOnce(
  53. &UpdateCheckHelperTest::VerifyResult, base::Unretained(this)));
  54. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  55. EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
  56. kConnectivityCheckUrl, /*content=*/"", net::HTTP_BAD_REQUEST));
  57. VerifyCallbackInvoked();
  58. }
  59. TEST_F(UpdateCheckHelperTest, TimeoutExceeded) {
  60. SetExpectedResult(false);
  61. update_helper_->CheckConnectivity(base::BindOnce(
  62. &UpdateCheckHelperTest::VerifyResult, base::Unretained(this)));
  63. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  64. task_environment_.FastForwardBy(base::Seconds(6));
  65. // Request should timeout after 5 seconds.
  66. EXPECT_EQ(0, test_url_loader_factory_.NumPending());
  67. VerifyCallbackInvoked();
  68. }
  69. TEST_F(UpdateCheckHelperTest, Retry) {
  70. SetExpectedResult(true);
  71. update_helper_->CheckConnectivity(base::BindOnce(
  72. &UpdateCheckHelperTest::VerifyResult, base::Unretained(this)));
  73. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  74. EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
  75. kConnectivityCheckUrl, /*content=*/"", net::HTTP_INTERNAL_SERVER_ERROR));
  76. // Should be retried on HTTP 500.
  77. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  78. EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
  79. kConnectivityCheckUrl, /*content=*/"", net::HTTP_NO_CONTENT));
  80. EXPECT_EQ(0, test_url_loader_factory_.NumPending());
  81. VerifyCallbackInvoked();
  82. }
  83. TEST_F(UpdateCheckHelperTest, MultipleConnectivityChecks_AtOnce) {
  84. SetExpectedResult(true);
  85. update_helper_->CheckConnectivity(base::BindOnce(
  86. &UpdateCheckHelperTest::VerifyResult, base::Unretained(this)));
  87. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  88. task_environment_.FastForwardBy(base::Seconds(1));
  89. // Start another check 1 second later.
  90. update_helper_->CheckConnectivity(base::BindOnce(
  91. &UpdateCheckHelperTest::VerifyResult, base::Unretained(this)));
  92. // Still only one request as the old one is replaced.
  93. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  94. // Respond to the request.
  95. EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
  96. kConnectivityCheckUrl, /*content=*/"", net::HTTP_NO_CONTENT));
  97. EXPECT_EQ(0, test_url_loader_factory_.NumPending());
  98. VerifyCallbackInvoked();
  99. }
  100. TEST_F(UpdateCheckHelperTest, MultipleConnectivityChecks_Sequential) {
  101. SetExpectedResult(false);
  102. update_helper_->CheckConnectivity(base::BindOnce(
  103. &UpdateCheckHelperTest::VerifyResult, base::Unretained(this)));
  104. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  105. // Request should timeout after 5 seconds.
  106. EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
  107. kConnectivityCheckUrl, /*content=*/"", net::HTTP_BAD_REQUEST));
  108. EXPECT_EQ(0, test_url_loader_factory_.NumPending());
  109. VerifyCallbackInvoked();
  110. // Another check after 10 seconds - this time successful.
  111. ResetCallbackInvoked();
  112. task_environment_.FastForwardBy(base::Seconds(10));
  113. SetExpectedResult(true);
  114. update_helper_->CheckConnectivity(base::BindOnce(
  115. &UpdateCheckHelperTest::VerifyResult, base::Unretained(this)));
  116. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  117. EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
  118. kConnectivityCheckUrl, /*content=*/"", net::HTTP_NO_CONTENT));
  119. VerifyCallbackInvoked();
  120. }
  121. TEST_F(UpdateCheckHelperTest, DestroyedWhenPending) {
  122. update_helper_->CheckConnectivity(base::BindOnce(
  123. &UpdateCheckHelperTest::VerifyResult, base::Unretained(this)));
  124. EXPECT_EQ(1, test_url_loader_factory_.NumPending());
  125. update_helper_.reset();
  126. // Request canceled on destruction.
  127. EXPECT_EQ(0, test_url_loader_factory_.NumPending());
  128. VerifyCallbackInvoked(false);
  129. }
  130. } // namespace safety_check