// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/network_time/network_time_test_utils.h"

#include <memory>

#include "base/metrics/field_trial_params.h"
#include "base/strings/string_number_conversions.h"
#include "net/http/http_response_headers.h"
#include "net/test/embedded_test_server/http_response.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace network_time {

// Update as follows:
//
// curl -i http://clients2.google.com/time/1/current?cup2key=6:123123123
//
// where 6 is the key version and 123123123 is the nonce.  Copy the response
// and the x-cup-server-proof header into |kGoodTimeResponseBody| and
// |kGoodTimeResponseServerProofHeader| respectively, and the
// 'current_time_millis' value of the response into
// |kGoodTimeResponseHandlerJsTime|.  Do this five times, so that the five
// requests appear in order below.
const char* kGoodTimeResponseBody[] = {
    ")]}'\n{\"current_time_millis\":1652339069759,\"server_nonce\":7."
    "29375327039265E-230}",
    ")]}'\n{\"current_time_millis\":1652339136683,\"server_nonce\":1."
    "4794255040588188E-23}",
    ")]}'\n{\"current_time_millis\":1652339231311,\"server_nonce\":-4."
    "419622990529329E127}",
    ")]}'\n{\"current_time_millis\":1652339325263,\"server_nonce\":6."
    "315542071193776E16}",
    ")]}'\n{\"current_time_millis\":1652339380058,\"server_nonce\":-3."
    "8130598030275436E-131}"};

const char* kGoodTimeResponseServerProofHeader[] = {
    "3046022100ab673cb907cd0c9139da0d50ada4c3326929d455e46f8f797f0a8c511ef"
    "6881b02210091b0f77f463578b7c0be36d42f053de34e486eba8c0526f9f115f80c80"
    "7a5ce4:"
    "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "30440220139b1710412e68cf445d39234158943efee3e2b27859b97582b478af7dcf6"
    "e85022004d9d7c432aae15a5207a18e25ae345675348767f784b7d3b07920b64a2ead"
    "c3:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "3044022017d2ae7bf4507b18badd735629f1c44f1f024c88aeb271e4d52e6a849cb22"
    "7a3022052c1223d65b4488ccb47f2c882f249c91541a55b99752f4f487a3e6abc5194"
    "10:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "30450221009b8db5fe3000e6e0b696baf8d42d40d7b4ff9757c84b49cdd6d85fa39cd"
    "0fca2022005144ed3eeb95707e3bc9e7369d8bd475b5d2f50ac98e5c56160bc9b1f1f"
    "d36a:"
    "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
    "3046022100ec690467b5eb550e6b91ec65810d942ed859d3dd6f966f72c9489679825"
    "81cf8022100b2a54d11217ba6a75576e6db02f5293a70fd4bc27b02f0bda46e60f98a"
    "b05785:"
    "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"};

const double kGoodTimeResponseHandlerJsTime[] = {
    1652339069759, 1652339136683, 1652339231311, 1652339325263, 1652339380058};

std::unique_ptr<net::test_server::HttpResponse> GoodTimeResponseHandler(
    const net::test_server::HttpRequest& request) {
  net::test_server::BasicHttpResponse* response =
      new net::test_server::BasicHttpResponse();
  response->set_code(net::HTTP_OK);
  response->set_content(kGoodTimeResponseBody[0]);
  response->AddCustomHeader("x-cup-server-proof",
                            kGoodTimeResponseServerProofHeader[0]);
  return std::unique_ptr<net::test_server::HttpResponse>(response);
}

FieldTrialTest::FieldTrialTest() {}

FieldTrialTest::~FieldTrialTest() {}

void FieldTrialTest::SetFeatureParams(
    bool enable,
    float query_probability,
    NetworkTimeTracker::FetchBehavior fetch_behavior,
    NetworkTimeTracker::ClockDriftSamples clock_drift_samples) {
  scoped_feature_list_.Reset();
  if (!enable) {
    scoped_feature_list_.InitAndDisableFeature(kNetworkTimeServiceQuerying);
    return;
  }

  base::FieldTrialParams params;
  params["RandomQueryProbability"] = base::NumberToString(query_probability);
  // See string format defined by `base::TimeDeltaFromString`.
  params["CheckTimeInterval"] = "360s";
  params["ClockDriftSampleDistance"] = "2s";
  std::string fetch_behavior_param;
  switch (fetch_behavior) {
    case NetworkTimeTracker::FETCH_BEHAVIOR_UNKNOWN:
      NOTREACHED();
      fetch_behavior_param = "unknown";
      break;
    case NetworkTimeTracker::FETCHES_IN_BACKGROUND_ONLY:
      fetch_behavior_param = "background-only";
      break;
    case NetworkTimeTracker::FETCHES_ON_DEMAND_ONLY:
      fetch_behavior_param = "on-demand-only";
      break;
    case NetworkTimeTracker::FETCHES_IN_BACKGROUND_AND_ON_DEMAND:
      fetch_behavior_param = "background-and-on-demand";
      break;
  }
  params["FetchBehavior"] = fetch_behavior_param;

  std::string num_clock_drift_samples;
  switch (clock_drift_samples) {
    case NetworkTimeTracker::ClockDriftSamples::NO_SAMPLES:
      num_clock_drift_samples = "0";
      break;
    case NetworkTimeTracker::ClockDriftSamples::TWO_SAMPLES:
      num_clock_drift_samples = "2";
      break;
    case NetworkTimeTracker::ClockDriftSamples::FOUR_SAMPLES:
      num_clock_drift_samples = "4";
      break;
    case NetworkTimeTracker::ClockDriftSamples::SIX_SAMPLES:
      num_clock_drift_samples = "6";
      break;
  }
  params["ClockDriftSamples"] = num_clock_drift_samples;

  scoped_feature_list_.InitAndEnableFeatureWithParameters(
      kNetworkTimeServiceQuerying, params);
}

}  // namespace network_time
