// 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 <memory>
#include <string>
#include <vector>

#include "base/memory/ref_counted.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/version.h"
#include "components/update_client/component.h"
#include "components/update_client/protocol_builder.h"
#include "components/update_client/test_configurator.h"
#include "components/update_client/update_engine.h"
#include "components/update_client/url_request_post_interceptor.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"

using std::string;

namespace update_client {

class PingManagerTest : public testing::Test {
 public:
  PingManagerTest();
  ~PingManagerTest() override {}

  void RunThreadsUntilIdle();

  std::unique_ptr<UpdateContext> MakeFakeUpdateContext() const;

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

 protected:
  scoped_refptr<TestConfigurator> config_;
  std::unique_ptr<PingManager> ping_manager_;

 private:
  base::MessageLoopForIO loop_;
};

PingManagerTest::PingManagerTest() {}

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

void PingManagerTest::TearDown() {
  ping_manager_.reset();
  config_ = nullptr;
}

void PingManagerTest::RunThreadsUntilIdle() {
  base::RunLoop().RunUntilIdle();
}

std::unique_ptr<UpdateContext> PingManagerTest::MakeFakeUpdateContext() const {
  return std::make_unique<UpdateContext>(
      config_, false, std::vector<std::string>(),
      UpdateClient::CrxDataCallback(), UpdateEngine::NotifyObserversCallback(),
      UpdateEngine::Callback(), nullptr);
}

TEST_F(PingManagerTest, SendPing) {
  std::unique_ptr<InterceptorFactory> interceptor_factory(
      new InterceptorFactory(base::ThreadTaskRunnerHandle::Get()));
  URLRequestPostInterceptor* interceptor =
      interceptor_factory->CreateInterceptor();
  EXPECT_TRUE(interceptor);

  // Test eventresult="1" is sent for successful updates.
  const auto update_context = MakeFakeUpdateContext();

  {
    Component component(*update_context, "abc");

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

    ping_manager_->SendPing(component);
    base::RunLoop().RunUntilIdle();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    EXPECT_NE(string::npos,
              interceptor->GetRequests()[0].find(
                  "<app appid=\"abc\">"
                  "<event eventtype=\"3\" eventresult=\"1\" "
                  "previousversion=\"1.0\" nextversion=\"2.0\"/></app>"))
        << interceptor->GetRequestsAsString();
    interceptor->Reset();
  }

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

    ping_manager_->SendPing(component);
    base::RunLoop().RunUntilIdle();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    EXPECT_NE(string::npos,
              interceptor->GetRequests()[0].find(
                  "<app appid=\"abc\">"
                  "<event eventtype=\"3\" eventresult=\"0\" "
                  "previousversion=\"1.0\" nextversion=\"2.0\"/></app>"))
        << interceptor->GetRequestsAsString();
    interceptor->Reset();
  }

  {
    // Test the error values and the fingerprints.
    Component component(*update_context, "abc");
    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_ = 1;
    component.error_code_ = 2;
    component.extra_code1_ = -1;
    component.diff_error_category_ = 10;
    component.diff_error_code_ = 20;
    component.diff_extra_code1_ = -10;
    component.crx_diffurls_.push_back(GURL("http://host/path"));
    component.AppendEvent(BuildUpdateCompleteEventElement(component));

    ping_manager_->SendPing(component);
    base::RunLoop().RunUntilIdle();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    EXPECT_NE(string::npos,
              interceptor->GetRequests()[0].find(
                  "<app appid=\"abc\">"
                  "<event eventtype=\"3\" eventresult=\"0\" errorcat=\"1\" "
                  "errorcode=\"2\" extracode1=\"-1\" diffresult=\"0\" "
                  "differrorcat=\"10\" "
                  "differrorcode=\"20\" diffextracode1=\"-10\" "
                  "previousfp=\"prev fp\" nextfp=\"next fp\" "
                  "previousversion=\"1.0\" nextversion=\"2.0\"/></app>"))
        << interceptor->GetRequestsAsString();
    interceptor->Reset();
  }

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

    component.AppendEvent(BuildUpdateCompleteEventElement(component));

    ping_manager_->SendPing(component);
    base::RunLoop().RunUntilIdle();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    EXPECT_NE(string::npos,
              interceptor->GetRequests()[0].find(
                  "<app appid=\"abc\"><event eventtype=\"3\" eventresult=\"0\" "
                  "previousversion=\"1.0\"/></app>"))
        << interceptor->GetRequestsAsString();
    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.Uninstall(base::Version("1.2.3.4"), 0);
    component.AppendEvent(BuildUninstalledEventElement(component));

    ping_manager_->SendPing(component);
    base::RunLoop().RunUntilIdle();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    EXPECT_NE(string::npos,
              interceptor->GetRequests()[0].find(
                  "<app appid=\"abc\">"
                  "<event eventtype=\"4\" eventresult=\"1\" "
                  "previousversion=\"1.2.3.4\" nextversion=\"0\"/></app>"))
        << interceptor->GetRequestsAsString();
    interceptor->Reset();
  }

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

    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(
        BuildDownloadCompleteEventElement(component, 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(
        BuildDownloadCompleteEventElement(component, download_metrics));

    ping_manager_->SendPing(component);
    base::RunLoop().RunUntilIdle();

    EXPECT_EQ(1, interceptor->GetCount()) << interceptor->GetRequestsAsString();
    EXPECT_NE(
        string::npos,
        interceptor->GetRequests()[0].find(
            "<app appid=\"abc\">"
            "<event eventtype=\"3\" eventresult=\"1\" previousversion=\"1.0\" "
            "nextversion=\"2.0\"/>"
            "<event eventtype=\"14\" eventresult=\"0\" downloader=\"direct\" "
            "errorcode=\"-1\" url=\"http://host1/path1\" downloaded=\"123\" "
            "total=\"456\" download_time_ms=\"987\" previousversion=\"1.0\" "
            "nextversion=\"2.0\"/>"
            "<event eventtype=\"14\" eventresult=\"1\" downloader=\"bits\" "
            "url=\"http://host2/path2\" downloaded=\"1230\" total=\"4560\" "
            "download_time_ms=\"9870\" previousversion=\"1.0\" "
            "nextversion=\"2.0\"/></app>"))
        << interceptor->GetRequestsAsString();
    interceptor->Reset();
  }

  interceptor_factory.reset();
  base::RunLoop().RunUntilIdle();
}

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

  const auto update_context = MakeFakeUpdateContext();

  {
    Component component(*update_context, "abc");
    component.crx_component_.requires_network_encryption = true;

    EXPECT_FALSE(ping_manager_->SendPing(component));
  }

  {
    // Tests that the default for |requires_network_encryption| is true.
    Component component(*update_context, "abc");
    EXPECT_FALSE(ping_manager_->SendPing(component));
  }
}

}  // namespace update_client
