blob: 8da07af64a0faf331f0455fee5ab5171c1c0086c [file] [log] [blame]
// Copyright 2014 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 "base/test/test_simple_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/gcm_driver/gcm_channel_status_request.h"
#include "components/sync/protocol/experiment_status.pb.h"
#include "components/sync/protocol/experiments_specifics.pb.h"
#include "net/url_request/test_url_fetcher_factory.h"
#include "net/url_request/url_request_test_util.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace gcm {
class GCMChannelStatusRequestTest : public testing::Test {
public:
GCMChannelStatusRequestTest();
~GCMChannelStatusRequestTest() override;
protected:
enum GCMStatus {
NOT_SPECIFIED,
GCM_ENABLED,
GCM_DISABLED,
};
void StartRequest();
void SetResponseStatusAndString(net::HttpStatusCode status_code,
const std::string& response_body);
void SetResponseProtoData(GCMStatus status, int poll_interval_seconds);
void CompleteFetch();
void OnRequestCompleted(bool update_received,
bool enabled,
int poll_interval_seconds);
std::unique_ptr<GCMChannelStatusRequest> request_;
scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
base::ThreadTaskRunnerHandle task_runner_handle_;
net::TestURLFetcherFactory url_fetcher_factory_;
scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_;
bool request_callback_invoked_;
bool update_received_;
bool enabled_;
int poll_interval_seconds_;
};
GCMChannelStatusRequestTest::GCMChannelStatusRequestTest()
: task_runner_(new base::TestSimpleTaskRunner()),
task_runner_handle_(task_runner_),
url_request_context_getter_(
new net::TestURLRequestContextGetter(task_runner_)),
request_callback_invoked_(false),
update_received_(false),
enabled_(true),
poll_interval_seconds_(0) {
}
GCMChannelStatusRequestTest::~GCMChannelStatusRequestTest() {
}
void GCMChannelStatusRequestTest::StartRequest() {
request_.reset(new GCMChannelStatusRequest(
url_request_context_getter_.get(),
"http://channel.status.request.com/",
"user agent string",
base::Bind(&GCMChannelStatusRequestTest::OnRequestCompleted,
base::Unretained(this))));
request_->Start();
}
void GCMChannelStatusRequestTest::SetResponseStatusAndString(
net::HttpStatusCode status_code,
const std::string& response_body) {
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
ASSERT_TRUE(fetcher);
fetcher->set_response_code(status_code);
fetcher->SetResponseString(response_body);
}
void GCMChannelStatusRequestTest::SetResponseProtoData(
GCMStatus status, int poll_interval_seconds) {
sync_pb::ExperimentStatusResponse response_proto;
if (status != NOT_SPECIFIED) {
sync_pb::ExperimentsSpecifics* experiment_specifics =
response_proto.add_experiment();
experiment_specifics->mutable_gcm_channel()->set_enabled(status ==
GCM_ENABLED);
}
// Zero |poll_interval_seconds| means the optional field is not set.
if (poll_interval_seconds)
response_proto.set_poll_interval_seconds(poll_interval_seconds);
std::string response_string;
response_proto.SerializeToString(&response_string);
SetResponseStatusAndString(net::HTTP_OK, response_string);
}
void GCMChannelStatusRequestTest::CompleteFetch() {
request_callback_invoked_ = false;
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
ASSERT_TRUE(fetcher);
fetcher->delegate()->OnURLFetchComplete(fetcher);
}
void GCMChannelStatusRequestTest::OnRequestCompleted(
bool update_received, bool enabled, int poll_interval_seconds) {
request_callback_invoked_ = true;
update_received_ = update_received;
enabled_ = enabled;
poll_interval_seconds_ = poll_interval_seconds;
}
TEST_F(GCMChannelStatusRequestTest, RequestData) {
StartRequest();
net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0);
ASSERT_TRUE(fetcher);
EXPECT_EQ(GURL(request_->channel_status_request_url_),
fetcher->GetOriginalURL());
net::HttpRequestHeaders headers;
fetcher->GetExtraRequestHeaders(&headers);
std::string user_agent_header;
headers.GetHeader("User-Agent", &user_agent_header);
EXPECT_FALSE(user_agent_header.empty());
EXPECT_EQ(request_->user_agent_, user_agent_header);
std::string upload_data = fetcher->upload_data();
EXPECT_FALSE(upload_data.empty());
sync_pb::ExperimentStatusRequest proto_data;
proto_data.ParseFromString(upload_data);
EXPECT_EQ(1, proto_data.experiment_name_size());
EXPECT_EQ("gcm_channel", proto_data.experiment_name(0));
}
TEST_F(GCMChannelStatusRequestTest, ResponseHttpStatusNotOK) {
StartRequest();
SetResponseStatusAndString(net::HTTP_UNAUTHORIZED, "");
CompleteFetch();
EXPECT_FALSE(request_callback_invoked_);
}
TEST_F(GCMChannelStatusRequestTest, ResponseEmpty) {
StartRequest();
SetResponseStatusAndString(net::HTTP_OK, "");
CompleteFetch();
EXPECT_TRUE(request_callback_invoked_);
EXPECT_FALSE(update_received_);
}
TEST_F(GCMChannelStatusRequestTest, ResponseNotInProtoFormat) {
StartRequest();
SetResponseStatusAndString(net::HTTP_OK, "foo");
CompleteFetch();
EXPECT_FALSE(request_callback_invoked_);
}
TEST_F(GCMChannelStatusRequestTest, ResponseEmptyProtoData) {
StartRequest();
SetResponseProtoData(NOT_SPECIFIED, 0);
CompleteFetch();
EXPECT_TRUE(request_callback_invoked_);
EXPECT_FALSE(update_received_);
}
TEST_F(GCMChannelStatusRequestTest, ResponseWithDisabledStatus) {
StartRequest();
SetResponseProtoData(GCM_DISABLED, 0);
CompleteFetch();
EXPECT_TRUE(request_callback_invoked_);
EXPECT_TRUE(update_received_);
EXPECT_FALSE(enabled_);
EXPECT_EQ(
GCMChannelStatusRequest::default_poll_interval_seconds(),
poll_interval_seconds_);
}
TEST_F(GCMChannelStatusRequestTest, ResponseWithEnabledStatus) {
StartRequest();
SetResponseProtoData(GCM_ENABLED, 0);
CompleteFetch();
EXPECT_TRUE(request_callback_invoked_);
EXPECT_TRUE(update_received_);
EXPECT_TRUE(enabled_);
EXPECT_EQ(
GCMChannelStatusRequest::default_poll_interval_seconds(),
poll_interval_seconds_);
}
TEST_F(GCMChannelStatusRequestTest, ResponseWithPollInterval) {
// Setting a poll interval 15 minutes longer than the minimum interval we
// enforce.
int poll_interval_seconds =
GCMChannelStatusRequest::min_poll_interval_seconds() + 15 * 60;
StartRequest();
SetResponseProtoData(NOT_SPECIFIED, poll_interval_seconds);
CompleteFetch();
EXPECT_TRUE(request_callback_invoked_);
EXPECT_TRUE(update_received_);
EXPECT_TRUE(enabled_);
EXPECT_EQ(poll_interval_seconds, poll_interval_seconds_);
}
TEST_F(GCMChannelStatusRequestTest, ResponseWithShortPollInterval) {
// Setting a poll interval 15 minutes shorter than the minimum interval we
// enforce.
int poll_interval_seconds =
GCMChannelStatusRequest::min_poll_interval_seconds() - 15 * 60;
StartRequest();
SetResponseProtoData(NOT_SPECIFIED, poll_interval_seconds);
CompleteFetch();
EXPECT_TRUE(request_callback_invoked_);
EXPECT_TRUE(update_received_);
EXPECT_TRUE(enabled_);
EXPECT_EQ(GCMChannelStatusRequest::min_poll_interval_seconds(),
poll_interval_seconds_);
}
TEST_F(GCMChannelStatusRequestTest, ResponseWithDisabledStatusAndPollInterval) {
int poll_interval_seconds =
GCMChannelStatusRequest::min_poll_interval_seconds() + 15 * 60;
StartRequest();
SetResponseProtoData(GCM_DISABLED, poll_interval_seconds);
CompleteFetch();
EXPECT_TRUE(request_callback_invoked_);
EXPECT_TRUE(update_received_);
EXPECT_FALSE(enabled_);
EXPECT_EQ(poll_interval_seconds, poll_interval_seconds_);
}
} // namespace gcm