// Copyright 2013 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/update_client/ping_manager.h"

#include <stdint.h>

#include <limits>
#include <memory>
#include <string>
#include <utility>
#include <vector>

#include "base/bind.h"
#include "base/json/json_reader.h"
#include "base/memory/ref_counted.h"
#include "base/run_loop.h"
#include "base/test/scoped_task_environment.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/version.h"
#include "components/update_client/component.h"
#include "components/update_client/protocol_definition.h"
#include "components/update_client/protocol_serializer.h"
#include "components/update_client/test_configurator.h"
#include "components/update_client/update_engine.h"
#include "testing/gtest/include/gtest/gtest.h"
#if !defined(STARBOARD)
#include "components/update_client/net/url_loader_post_interceptor.h"
#include "third_party/re2/src/re2/re2.h"
#else
#include "components/update_client/net/url_request_post_interceptor.h"
#endif

using std::string;

namespace update_client {

class PingManagerTest : public testing::Test,
                        public testing::WithParamInterface<bool> {
 public:
  PingManagerTest();
  ~PingManagerTest() override {}

  PingManager::Callback MakePingCallback();
  scoped_refptr<UpdateContext> MakeMockUpdateContext() const;

  // Overrides from testing::Test.
  void SetUp() override;
  void TearDown() override;

  void PingSentCallback(int error, const std::string& response);

 protected:
  void Quit();
  void RunThreads();

  scoped_refptr<TestConfigurator> config_;
  scoped_refptr<PingManager> ping_manager_;

  int error_ = -1;
  std::string response_;

 private:
  base::test::ScopedTaskEnvironment scoped_task_environment_;
  base::OnceClosure quit_closure_;
};

PingManagerTest::PingManagerTest()
    : scoped_task_environment_(
          base::test::ScopedTaskEnvironment::MainThreadType::IO) {
  config_ = base::MakeRefCounted<TestConfigurator>();
}

void PingManagerTest::SetUp() {
  ping_manager_ = base::MakeRefCounted<PingManager>(config_);
}

void PingManagerTest::TearDown() {
  // Run the threads until they are idle to allow the clean up
  // of the network interceptors on the IO thread.
  scoped_task_environment_.RunUntilIdle();
  ping_manager_ = nullptr;
}

void PingManagerTest::RunThreads() {
  base::RunLoop runloop;
  quit_closure_ = runloop.QuitClosure();
  runloop.Run();
}

void PingManagerTest::Quit() {
  if (!quit_closure_.is_null())
    std::move(quit_closure_).Run();
}

PingManager::Callback PingManagerTest::MakePingCallback() {
  return base::BindOnce(&PingManagerTest::PingSentCallback,
                        base::Unretained(this));
}

void PingManagerTest::PingSentCallback(int error, const std::string& response) {
  error_ = error;
  response_ = response;
  Quit();
}

scoped_refptr<UpdateContext> PingManagerTest::MakeMockUpdateContext() const {
  return base::MakeRefCounted<UpdateContext>(
      config_, false, std::vector<std::string>(),
      UpdateClient::CrxDataCallback(), UpdateEngine::NotifyObserversCallback(),
      UpdateEngine::Callback(), nullptr);
}

// This test is parameterized for using JSON or XML serialization. |true| means
// JSON serialization is used.
INSTANTIATE_TEST_SUITE_P(Parameterized, PingManagerTest, testing::Bool());

TEST_P(PingManagerTest, SendPing) {
#if defined(STARBOARD)
  auto interceptor_factory =
      std::make_unique<InterceptorFactory>(base::ThreadTaskRunnerHandle::Get());
  auto interceptor = interceptor_factory->CreateInterceptor();
#else
  auto interceptor = std::make_unique<URLLoaderPostInterceptor>(
      config_->test_url_loader_factory());
#endif
  EXPECT_TRUE(interceptor);

  const auto update_context = MakeMockUpdateContext();
  {
    // Test eventresult="1" is sent for successful updates.
    Component component(*update_context, "abc");
    component.crx_component_ = CrxComponent();
    component.crx_component_->version = base::Version("1.0");
    component.state_ = std::make_unique<Component::StateUpdated>(&component);
    component.previous_version_ = base::Version("1.0");
    component.next_version_ = base::Version("2.0");
    component.AppendEvent(component.MakeEventUpdateComplete());

    EXPECT_TRUE(interceptor->ExpectRequest(std::make_unique<AnyMatch>()));
    ping_manager_->SendPing(component, MakePingCallback());
    RunThreads();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    const auto msg = interceptor->GetRequestBody(0);
      const auto root = base::JSONReader::Read(msg);
      ASSERT_TRUE(root);
      const auto* request = root->FindKey("request");
      ASSERT_TRUE(request);
      EXPECT_TRUE(request->FindKey("@os"));
      EXPECT_EQ("fake_prodid", request->FindKey("@updater")->GetString());
      EXPECT_EQ("crx2,crx3", request->FindKey("acceptformat")->GetString());
      EXPECT_TRUE(request->FindKey("arch"));
      EXPECT_EQ("cr", request->FindKey("dedup")->GetString());
      EXPECT_LT(0, request->FindPath({"hw", "physmemory"})->GetInt());
      EXPECT_EQ("fake_lang", request->FindKey("lang")->GetString());
      EXPECT_TRUE(request->FindKey("nacl_arch"));
      EXPECT_EQ("fake_channel_string",
                request->FindKey("prodchannel")->GetString());
      EXPECT_EQ("30.0", request->FindKey("prodversion")->GetString());
      EXPECT_EQ("3.1", request->FindKey("protocol")->GetString());
      EXPECT_TRUE(request->FindKey("requestid"));
      EXPECT_TRUE(request->FindKey("sessionid"));
      EXPECT_EQ("fake_channel_string",
                request->FindKey("updaterchannel")->GetString());
      EXPECT_EQ("30.0", request->FindKey("updaterversion")->GetString());

      EXPECT_TRUE(request->FindPath({"os", "arch"})->is_string());
      EXPECT_EQ("Fake Operating System",
                request->FindPath({"os", "platform"})->GetString());
      EXPECT_TRUE(request->FindPath({"os", "version"})->is_string());

      const auto& app = request->FindKey("app")->GetList()[0];
      EXPECT_EQ("abc", app.FindKey("appid")->GetString());
      EXPECT_EQ("1.0", app.FindKey("version")->GetString());
      const auto& event = app.FindKey("event")->GetList()[0];
      EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
      EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
      EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
      EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());

    // Check the ping request does not carry the specific extra request headers.
    const auto headers = std::get<1>(interceptor->GetRequests()[0]);
    EXPECT_FALSE(headers.HasHeader("X-Goog-Update-Interactivity"));
    EXPECT_FALSE(headers.HasHeader("X-Goog-Update-Updater"));
    EXPECT_FALSE(headers.HasHeader("X-Goog-Update-AppId"));
    interceptor->Reset();
  }

  {
    // Test eventresult="0" is sent for failed updates.
    Component component(*update_context, "abc");
    component.crx_component_ = CrxComponent();
    component.crx_component_->version = base::Version("1.0");
    component.state_ =
        std::make_unique<Component::StateUpdateError>(&component);
    component.previous_version_ = base::Version("1.0");
    component.next_version_ = base::Version("2.0");
    component.AppendEvent(component.MakeEventUpdateComplete());

    EXPECT_TRUE(interceptor->ExpectRequest(std::make_unique<AnyMatch>()));
    ping_manager_->SendPing(component, MakePingCallback());
    RunThreads();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    const auto msg = interceptor->GetRequestBody(0);
      const auto root = base::JSONReader::Read(msg);
      ASSERT_TRUE(root);
      const auto* request = root->FindKey("request");
      const auto& app = request->FindKey("app")->GetList()[0];
      EXPECT_EQ("abc", app.FindKey("appid")->GetString());
      EXPECT_EQ("1.0", app.FindKey("version")->GetString());
      const auto& event = app.FindKey("event")->GetList()[0];
      EXPECT_EQ(0, event.FindKey("eventresult")->GetInt());
      EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
      EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
      EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());
    interceptor->Reset();
  }

  {
    // Test the error values and the fingerprints.
    Component component(*update_context, "abc");
    component.crx_component_ = CrxComponent();
    component.crx_component_->version = base::Version("1.0");
    component.state_ =
        std::make_unique<Component::StateUpdateError>(&component);
    component.previous_version_ = base::Version("1.0");
    component.next_version_ = base::Version("2.0");
    component.previous_fp_ = "prev fp";
    component.next_fp_ = "next fp";
    component.error_category_ = ErrorCategory::kDownload;
    component.error_code_ = 2;
    component.extra_code1_ = -1;
    component.diff_error_category_ = ErrorCategory::kService;
    component.diff_error_code_ = 20;
    component.diff_extra_code1_ = -10;
    component.crx_diffurls_.push_back(GURL("http://host/path"));
    component.AppendEvent(component.MakeEventUpdateComplete());

    EXPECT_TRUE(interceptor->ExpectRequest(std::make_unique<AnyMatch>()));
    ping_manager_->SendPing(component, MakePingCallback());
    RunThreads();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    const auto msg = interceptor->GetRequestBody(0);
      const auto root = base::JSONReader::Read(msg);
      ASSERT_TRUE(root);
      const auto* request = root->FindKey("request");
      const auto& app = request->FindKey("app")->GetList()[0];
      EXPECT_EQ("abc", app.FindKey("appid")->GetString());
      EXPECT_EQ("1.0", app.FindKey("version")->GetString());
      const auto& event = app.FindKey("event")->GetList()[0];
      EXPECT_EQ(0, event.FindKey("eventresult")->GetInt());
      EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
      EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
      EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());
      EXPECT_EQ(4, event.FindKey("differrorcat")->GetInt());
      EXPECT_EQ(20, event.FindKey("differrorcode")->GetInt());
      EXPECT_EQ(-10, event.FindKey("diffextracode1")->GetInt());
      EXPECT_EQ(0, event.FindKey("diffresult")->GetInt());
      EXPECT_EQ(1, event.FindKey("errorcat")->GetInt());
      EXPECT_EQ(2, event.FindKey("errorcode")->GetInt());
      EXPECT_EQ(-1, event.FindKey("extracode1")->GetInt());
      EXPECT_EQ("next fp", event.FindKey("nextfp")->GetString());
      EXPECT_EQ("prev fp", event.FindKey("previousfp")->GetString());
    interceptor->Reset();
  }

  {
    // Test an invalid |next_version| is not serialized.
    Component component(*update_context, "abc");
    component.crx_component_ = CrxComponent();
    component.crx_component_->version = base::Version("1.0");
    component.state_ =
        std::make_unique<Component::StateUpdateError>(&component);
    component.previous_version_ = base::Version("1.0");

    component.AppendEvent(component.MakeEventUpdateComplete());

    EXPECT_TRUE(interceptor->ExpectRequest(std::make_unique<AnyMatch>()));
    ping_manager_->SendPing(component, MakePingCallback());
    RunThreads();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    const auto msg = interceptor->GetRequestBody(0);
      const auto root = base::JSONReader::Read(msg);
      ASSERT_TRUE(root);
      const auto* request = root->FindKey("request");
      const auto& app = request->FindKey("app")->GetList()[0];
      EXPECT_EQ("abc", app.FindKey("appid")->GetString());
      EXPECT_EQ("1.0", app.FindKey("version")->GetString());
      const auto& event = app.FindKey("event")->GetList()[0];
      EXPECT_EQ(0, event.FindKey("eventresult")->GetInt());
      EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
      EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());
    interceptor->Reset();
  }

  {
    // Test a valid |previouversion| and |next_version| = base::Version("0")
    // are serialized correctly under <event...> for uninstall.
    Component component(*update_context, "abc");
    component.crx_component_ = CrxComponent();
    component.Uninstall(base::Version("1.2.3.4"), 0);
    component.AppendEvent(component.MakeEventUninstalled());

    EXPECT_TRUE(interceptor->ExpectRequest(std::make_unique<AnyMatch>()));
    ping_manager_->SendPing(component, MakePingCallback());
    RunThreads();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    const auto msg = interceptor->GetRequestBody(0);
      const auto root = base::JSONReader::Read(msg);
      ASSERT_TRUE(root);
      const auto* request = root->FindKey("request");
      const auto& app = request->FindKey("app")->GetList()[0];
      EXPECT_EQ("abc", app.FindKey("appid")->GetString());
      EXPECT_EQ("1.2.3.4", app.FindKey("version")->GetString());
      const auto& event = app.FindKey("event")->GetList()[0];
      EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
      EXPECT_EQ(4, event.FindKey("eventtype")->GetInt());
      EXPECT_EQ("1.2.3.4", event.FindKey("previousversion")->GetString());
      EXPECT_EQ("0", event.FindKey("nextversion")->GetString());
    interceptor->Reset();
  }

  {
    // Test the download metrics.
    Component component(*update_context, "abc");
    component.crx_component_ = CrxComponent();
    component.crx_component_->version = base::Version("1.0");
    component.state_ = std::make_unique<Component::StateUpdated>(&component);
    component.previous_version_ = base::Version("1.0");
    component.next_version_ = base::Version("2.0");
    component.AppendEvent(component.MakeEventUpdateComplete());

    CrxDownloader::DownloadMetrics download_metrics;
    download_metrics.url = GURL("http://host1/path1");
    download_metrics.downloader = CrxDownloader::DownloadMetrics::kUrlFetcher;
    download_metrics.error = -1;
    download_metrics.downloaded_bytes = 123;
    download_metrics.total_bytes = 456;
    download_metrics.download_time_ms = 987;
    component.AppendEvent(component.MakeEventDownloadMetrics(download_metrics));

    download_metrics = CrxDownloader::DownloadMetrics();
    download_metrics.url = GURL("http://host2/path2");
    download_metrics.downloader = CrxDownloader::DownloadMetrics::kBits;
    download_metrics.error = 0;
    download_metrics.downloaded_bytes = 1230;
    download_metrics.total_bytes = 4560;
    download_metrics.download_time_ms = 9870;
    component.AppendEvent(component.MakeEventDownloadMetrics(download_metrics));

    download_metrics = CrxDownloader::DownloadMetrics();
    download_metrics.url = GURL("http://host3/path3");
    download_metrics.downloader = CrxDownloader::DownloadMetrics::kBits;
    download_metrics.error = 0;
    download_metrics.downloaded_bytes = kProtocolMaxInt;
    download_metrics.total_bytes = kProtocolMaxInt - 1;
    download_metrics.download_time_ms = kProtocolMaxInt - 2;
    component.AppendEvent(component.MakeEventDownloadMetrics(download_metrics));

    EXPECT_TRUE(interceptor->ExpectRequest(std::make_unique<AnyMatch>()));
    ping_manager_->SendPing(component, MakePingCallback());
    RunThreads();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    const auto msg = interceptor->GetRequestBody(0);
      const auto root = base::JSONReader::Read(msg);
      ASSERT_TRUE(root);
      const auto* request = root->FindKey("request");
      const auto& app = request->FindKey("app")->GetList()[0];
      EXPECT_EQ("abc", app.FindKey("appid")->GetString());
      EXPECT_EQ("1.0", app.FindKey("version")->GetString());
      EXPECT_EQ(4u, app.FindKey("event")->GetList().size());
      {
        const auto& event = app.FindKey("event")->GetList()[0];
        EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
        EXPECT_EQ(3, event.FindKey("eventtype")->GetInt());
        EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
        EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());
      }
      {
        const auto& event = app.FindKey("event")->GetList()[1];
        EXPECT_EQ(0, event.FindKey("eventresult")->GetInt());
        EXPECT_EQ(14, event.FindKey("eventtype")->GetInt());
        EXPECT_EQ(987, event.FindKey("download_time_ms")->GetDouble());
        EXPECT_EQ(123, event.FindKey("downloaded")->GetDouble());
        EXPECT_EQ("direct", event.FindKey("downloader")->GetString());
        EXPECT_EQ(-1, event.FindKey("errorcode")->GetInt());
        EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
        EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());
        EXPECT_EQ(456, event.FindKey("total")->GetDouble());
        EXPECT_EQ("http://host1/path1", event.FindKey("url")->GetString());
      }
      {
        const auto& event = app.FindKey("event")->GetList()[2];
        EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
        EXPECT_EQ(14, event.FindKey("eventtype")->GetInt());
        EXPECT_EQ(9870, event.FindKey("download_time_ms")->GetDouble());
        EXPECT_EQ(1230, event.FindKey("downloaded")->GetDouble());
        EXPECT_EQ("bits", event.FindKey("downloader")->GetString());
        EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
        EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());
        EXPECT_EQ(4560, event.FindKey("total")->GetDouble());
        EXPECT_EQ("http://host2/path2", event.FindKey("url")->GetString());
      }
      {
        const auto& event = app.FindKey("event")->GetList()[3];
        EXPECT_EQ(1, event.FindKey("eventresult")->GetInt());
        EXPECT_EQ(14, event.FindKey("eventtype")->GetInt());
        EXPECT_EQ(9007199254740990,
                  event.FindKey("download_time_ms")->GetDouble());
        EXPECT_EQ(9007199254740992, event.FindKey("downloaded")->GetDouble());
        EXPECT_EQ("bits", event.FindKey("downloader")->GetString());
        EXPECT_EQ("2.0", event.FindKey("nextversion")->GetString());
        EXPECT_EQ("1.0", event.FindKey("previousversion")->GetString());
        EXPECT_EQ(9007199254740991, event.FindKey("total")->GetDouble());
        EXPECT_EQ("http://host3/path3", event.FindKey("url")->GetString());
      }
    interceptor->Reset();
  }
}

// Tests that sending the ping fails when the component requires encryption but
// the ping URL is unsecure.
TEST_P(PingManagerTest, RequiresEncryption) {
  config_->SetPingUrl(GURL("http:\\foo\bar"));

  const auto update_context = MakeMockUpdateContext();

  Component component(*update_context, "abc");
  component.crx_component_ = CrxComponent();
  component.crx_component_->version = base::Version("1.0");

  // The default value for |requires_network_encryption| is true.
  EXPECT_TRUE(component.crx_component_->requires_network_encryption);

  component.state_ = std::make_unique<Component::StateUpdated>(&component);
  component.previous_version_ = base::Version("1.0");
  component.next_version_ = base::Version("2.0");
  component.AppendEvent(component.MakeEventUpdateComplete());

  ping_manager_->SendPing(component, MakePingCallback());
  RunThreads();

  EXPECT_EQ(-2, error_);
}

}  // namespace update_client
