network_time_test_utils.cc 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. // Copyright 2016 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/network_time/network_time_test_utils.h"
  5. #include <memory>
  6. #include "base/metrics/field_trial_params.h"
  7. #include "base/strings/string_number_conversions.h"
  8. #include "net/http/http_response_headers.h"
  9. #include "net/test/embedded_test_server/http_response.h"
  10. #include "testing/gtest/include/gtest/gtest.h"
  11. namespace network_time {
  12. // Update as follows:
  13. //
  14. // curl -i http://clients2.google.com/time/1/current?cup2key=6:123123123
  15. //
  16. // where 6 is the key version and 123123123 is the nonce. Copy the response
  17. // and the x-cup-server-proof header into |kGoodTimeResponseBody| and
  18. // |kGoodTimeResponseServerProofHeader| respectively, and the
  19. // 'current_time_millis' value of the response into
  20. // |kGoodTimeResponseHandlerJsTime|. Do this five times, so that the five
  21. // requests appear in order below.
  22. const char* kGoodTimeResponseBody[] = {
  23. ")]}'\n{\"current_time_millis\":1652339069759,\"server_nonce\":7."
  24. "29375327039265E-230}",
  25. ")]}'\n{\"current_time_millis\":1652339136683,\"server_nonce\":1."
  26. "4794255040588188E-23}",
  27. ")]}'\n{\"current_time_millis\":1652339231311,\"server_nonce\":-4."
  28. "419622990529329E127}",
  29. ")]}'\n{\"current_time_millis\":1652339325263,\"server_nonce\":6."
  30. "315542071193776E16}",
  31. ")]}'\n{\"current_time_millis\":1652339380058,\"server_nonce\":-3."
  32. "8130598030275436E-131}"};
  33. const char* kGoodTimeResponseServerProofHeader[] = {
  34. "3046022100ab673cb907cd0c9139da0d50ada4c3326929d455e46f8f797f0a8c511ef"
  35. "6881b02210091b0f77f463578b7c0be36d42f053de34e486eba8c0526f9f115f80c80"
  36. "7a5ce4:"
  37. "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  38. "30440220139b1710412e68cf445d39234158943efee3e2b27859b97582b478af7dcf6"
  39. "e85022004d9d7c432aae15a5207a18e25ae345675348767f784b7d3b07920b64a2ead"
  40. "c3:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  41. "3044022017d2ae7bf4507b18badd735629f1c44f1f024c88aeb271e4d52e6a849cb22"
  42. "7a3022052c1223d65b4488ccb47f2c882f249c91541a55b99752f4f487a3e6abc5194"
  43. "10:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  44. "30450221009b8db5fe3000e6e0b696baf8d42d40d7b4ff9757c84b49cdd6d85fa39cd"
  45. "0fca2022005144ed3eeb95707e3bc9e7369d8bd475b5d2f50ac98e5c56160bc9b1f1f"
  46. "d36a:"
  47. "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
  48. "3046022100ec690467b5eb550e6b91ec65810d942ed859d3dd6f966f72c9489679825"
  49. "81cf8022100b2a54d11217ba6a75576e6db02f5293a70fd4bc27b02f0bda46e60f98a"
  50. "b05785:"
  51. "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"};
  52. const double kGoodTimeResponseHandlerJsTime[] = {
  53. 1652339069759, 1652339136683, 1652339231311, 1652339325263, 1652339380058};
  54. std::unique_ptr<net::test_server::HttpResponse> GoodTimeResponseHandler(
  55. const net::test_server::HttpRequest& request) {
  56. net::test_server::BasicHttpResponse* response =
  57. new net::test_server::BasicHttpResponse();
  58. response->set_code(net::HTTP_OK);
  59. response->set_content(kGoodTimeResponseBody[0]);
  60. response->AddCustomHeader("x-cup-server-proof",
  61. kGoodTimeResponseServerProofHeader[0]);
  62. return std::unique_ptr<net::test_server::HttpResponse>(response);
  63. }
  64. FieldTrialTest::FieldTrialTest() {}
  65. FieldTrialTest::~FieldTrialTest() {}
  66. void FieldTrialTest::SetFeatureParams(
  67. bool enable,
  68. float query_probability,
  69. NetworkTimeTracker::FetchBehavior fetch_behavior,
  70. NetworkTimeTracker::ClockDriftSamples clock_drift_samples) {
  71. scoped_feature_list_.Reset();
  72. if (!enable) {
  73. scoped_feature_list_.InitAndDisableFeature(kNetworkTimeServiceQuerying);
  74. return;
  75. }
  76. base::FieldTrialParams params;
  77. params["RandomQueryProbability"] = base::NumberToString(query_probability);
  78. // See string format defined by `base::TimeDeltaFromString`.
  79. params["CheckTimeInterval"] = "360s";
  80. params["ClockDriftSampleDistance"] = "2s";
  81. std::string fetch_behavior_param;
  82. switch (fetch_behavior) {
  83. case NetworkTimeTracker::FETCH_BEHAVIOR_UNKNOWN:
  84. NOTREACHED();
  85. fetch_behavior_param = "unknown";
  86. break;
  87. case NetworkTimeTracker::FETCHES_IN_BACKGROUND_ONLY:
  88. fetch_behavior_param = "background-only";
  89. break;
  90. case NetworkTimeTracker::FETCHES_ON_DEMAND_ONLY:
  91. fetch_behavior_param = "on-demand-only";
  92. break;
  93. case NetworkTimeTracker::FETCHES_IN_BACKGROUND_AND_ON_DEMAND:
  94. fetch_behavior_param = "background-and-on-demand";
  95. break;
  96. }
  97. params["FetchBehavior"] = fetch_behavior_param;
  98. std::string num_clock_drift_samples;
  99. switch (clock_drift_samples) {
  100. case NetworkTimeTracker::ClockDriftSamples::NO_SAMPLES:
  101. num_clock_drift_samples = "0";
  102. break;
  103. case NetworkTimeTracker::ClockDriftSamples::TWO_SAMPLES:
  104. num_clock_drift_samples = "2";
  105. break;
  106. case NetworkTimeTracker::ClockDriftSamples::FOUR_SAMPLES:
  107. num_clock_drift_samples = "4";
  108. break;
  109. case NetworkTimeTracker::ClockDriftSamples::SIX_SAMPLES:
  110. num_clock_drift_samples = "6";
  111. break;
  112. }
  113. params["ClockDriftSamples"] = num_clock_drift_samples;
  114. scoped_feature_list_.InitAndEnableFeatureWithParameters(
  115. kNetworkTimeServiceQuerying, params);
  116. }
  117. } // namespace network_time