// Copyright 2015 The Chromium OS 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 "leaderd/webserver_client.h"

#include <gtest/gtest.h>

namespace leaderd {

namespace {
const char kGroupId[] = "ABC";
}  // namespace

class WebServerClientTest : public testing::Test,
                            public WebServerClient::Delegate {
 public:
  WebServerClientTest() : webserver_(this, "protocol_handler_name") {}

  std::unique_ptr<base::DictionaryValue> ProcessDiscover(
      const base::DictionaryValue* input) {
    return webserver_.ProcessDiscover(input);
  }

  std::unique_ptr<base::DictionaryValue> ProcessChallenge(
      const base::DictionaryValue* input) {
    return webserver_.ProcessChallenge(input);
  }

  std::unique_ptr<base::DictionaryValue> ProcessAnnouncement(
      const base::DictionaryValue* input) {
    return webserver_.ProcessAnnouncement(input);
  }

  void SetWebServerPort(uint16_t port) override {}

  bool HandleLeaderDiscover(const std::string& in_guid,
                            std::string* out_leader) override {
    if (in_guid != kGroupId) return false;
    *out_leader = "This is my own ID.";
    return true;
  }

  bool HandleLeaderChallenge(const std::string& in_guid,
                             const std::string& in_uuid,
                             int32_t in_score,
                             std::string* out_leader,
                             std::string* out_my_uuid) override {
    if (in_guid != kGroupId) return false;
    *out_leader = in_uuid;
    *out_my_uuid = "This is my own ID.";
    return true;
  }

  bool HandleLeaderAnnouncement(const std::string& group_id,
                                const std::string& leader_id,
                                int32_t leader_score) override {
    if (group_id != kGroupId) return false;
    return true;
  }

  std::unique_ptr<base::DictionaryValue> GetValidDiscoverInput() {
    std::unique_ptr<base::DictionaryValue> input{new base::DictionaryValue()};
    input->SetString(http_api::kDiscoverGroupKey, kGroupId);
    return input;
  }

  std::unique_ptr<base::DictionaryValue> GetValidChallengeInput() {
    std::unique_ptr<base::DictionaryValue> input{new base::DictionaryValue()};
    input->SetInteger(http_api::kChallengeScoreKey, 23);
    input->SetString(http_api::kChallengeGroupKey, kGroupId);
    input->SetString(http_api::kChallengeIdKey, "this is the challenger's ID");
    return input;
  }

  std::unique_ptr<base::DictionaryValue> GetValidAnnouncementInput() {
    std::unique_ptr<base::DictionaryValue> input{new base::DictionaryValue()};
    input->SetInteger(http_api::kAnnounceScoreKey, 23);
    input->SetString(http_api::kAnnounceGroupKey, kGroupId);
    input->SetString(http_api::kAnnounceLeaderIdKey, "This is the leader's ID");
    return input;
  }

 private:
  WebServerClient webserver_;
};

TEST_F(WebServerClientTest, ChallengeBadData) {
  EXPECT_EQ(nullptr, ProcessChallenge(nullptr));
}

TEST_F(WebServerClientTest, ChallengeRejectsExtraFields) {
  auto input = GetValidChallengeInput();
  input->SetString("BogusField", kGroupId);
  EXPECT_EQ(nullptr, ProcessChallenge(input.get()));
}

TEST_F(WebServerClientTest, ChallengeRejectsMissingFields) {
  // We need group to exist.
  auto input = GetValidChallengeInput();
  input->Remove(http_api::kChallengeGroupKey, nullptr);
  EXPECT_EQ(nullptr, ProcessChallenge(input.get()));
  // Similarly, the challenger id
  input = GetValidChallengeInput();
  input->Remove(http_api::kChallengeIdKey, nullptr);
  EXPECT_EQ(nullptr, ProcessChallenge(input.get()));
  // Similarly, the score.
  input = GetValidChallengeInput();
  input->Remove(http_api::kChallengeScoreKey, nullptr);
  EXPECT_EQ(nullptr, ProcessChallenge(input.get()));
}

TEST_F(WebServerClientTest, ChallengeScoreAsTextFail) {
  auto input = GetValidChallengeInput();
  input->SetString(http_api::kChallengeScoreKey, "23");
  EXPECT_EQ(nullptr, ProcessChallenge(input.get()));
}

TEST_F(WebServerClientTest, ChallengeDelegateFails) {
  auto input = GetValidChallengeInput();
  input->SetString(http_api::kChallengeGroupKey, "not-the-expected-value");
  EXPECT_EQ(nullptr, ProcessChallenge(input.get()));
}

TEST_F(WebServerClientTest, ChallengeDelegateSuccess) {
  auto input = GetValidChallengeInput();
  std::unique_ptr<base::DictionaryValue> output = ProcessChallenge(input.get());
  EXPECT_NE(nullptr, output);
}

TEST_F(WebServerClientTest, AnnouncementBadData) {
  std::unique_ptr<base::DictionaryValue> output = ProcessAnnouncement(nullptr);
  EXPECT_EQ(nullptr, output);
}

TEST_F(WebServerClientTest, AnnouncementRejectsExtraFields) {
  auto input = GetValidAnnouncementInput();
  input->SetString("BogusField", kGroupId);
  std::unique_ptr<base::DictionaryValue> output =
      ProcessAnnouncement(input.get());
  EXPECT_EQ(nullptr, output);
}

TEST_F(WebServerClientTest, AnnouncementRejectsMissingFields) {
  // We need group to exist.
  auto input = GetValidAnnouncementInput();
  input->Remove(http_api::kAnnounceGroupKey, nullptr);
  std::unique_ptr<base::DictionaryValue> output =
      ProcessAnnouncement(input.get());
  EXPECT_EQ(nullptr, output);
  // Similarly, the leader id
  input = GetValidAnnouncementInput();
  input->Remove(http_api::kAnnounceLeaderIdKey, nullptr);
  output = ProcessAnnouncement(input.get());
  EXPECT_EQ(nullptr, output);
  // Similarly, the score.
  input = GetValidAnnouncementInput();
  input->Remove(http_api::kAnnounceScoreKey, nullptr);
  output = ProcessAnnouncement(input.get());
  EXPECT_EQ(nullptr, output);
}

TEST_F(WebServerClientTest, AnnouncementScoreAsTextFail) {
  auto input = GetValidAnnouncementInput();
  input->SetString(http_api::kAnnounceScoreKey, "23");
  std::unique_ptr<base::DictionaryValue> output =
      ProcessAnnouncement(input.get());
  EXPECT_EQ(nullptr, output);
}

TEST_F(WebServerClientTest, AnnouncementDelegateFails) {
  auto input = GetValidAnnouncementInput();
  input->SetString(http_api::kAnnounceGroupKey, "not-the-expected-value");
  std::unique_ptr<base::DictionaryValue> output =
      ProcessAnnouncement(input.get());
  EXPECT_EQ(nullptr, output);
}

TEST_F(WebServerClientTest, AnnouncementDelegateSuccess) {
  auto input = GetValidAnnouncementInput();
  std::unique_ptr<base::DictionaryValue> output =
      ProcessAnnouncement(input.get());
  EXPECT_NE(nullptr, output);
}

TEST_F(WebServerClientTest, DiscoverBadData) {
  std::unique_ptr<base::DictionaryValue> output = ProcessDiscover(nullptr);
  EXPECT_EQ(nullptr, output);
}

TEST_F(WebServerClientTest, DiscoverRejectsExtraFields) {
  auto input = GetValidDiscoverInput();
  input->SetString("BogusField", kGroupId);
  std::unique_ptr<base::DictionaryValue> output =
      ProcessDiscover(input.get());
  EXPECT_EQ(nullptr, output);
}

TEST_F(WebServerClientTest, DiscoverRejectsMissingFields) {
  // We need group to exist.
  auto input = GetValidDiscoverInput();
  input->Remove(http_api::kDiscoverGroupKey, nullptr);
  std::unique_ptr<base::DictionaryValue> output =
      ProcessDiscover(input.get());
  EXPECT_EQ(nullptr, output);
}

TEST_F(WebServerClientTest, DiscoverDelegateFails) {
  auto input = GetValidDiscoverInput();
  input->SetString(http_api::kAnnounceGroupKey, "not-the-expected-value");
  std::unique_ptr<base::DictionaryValue> output =
      ProcessDiscover(input.get());
  EXPECT_EQ(nullptr, output);
}

TEST_F(WebServerClientTest, DiscoverDelegateSuccess) {
  auto input = GetValidDiscoverInput();
  std::unique_ptr<base::DictionaryValue> output =
      ProcessDiscover(input.get());
  EXPECT_NE(nullptr, output);
}

}  // namespace leaderd
