blob: ecfe7d67689bcf1f31f86359322084545d3d841a [file] [log] [blame]
// 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