#include "google_apis/gcm/engine/gcm_request_test_base.h"
#include <cmath>
#include "base/strings/string_tokenizer.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/public/mojom/url_response_head.mojom.h"
#include "services/network/test/test_url_loader_factory.h"
#include "services/network/test/test_utils.h"
namespace {
const net::BackoffEntry::Policy kDefaultBackoffPolicy = {
0,
15000,
2,
0.5,
1000 * 60 * 5,
-1,
false,
};
const network::TestURLLoaderFactory::PendingRequest* PendingForURL(
network::TestURLLoaderFactory* factory,
const std::string& url) {
GURL gurl(url);
std::vector<network::TestURLLoaderFactory::PendingRequest>* pending =
factory->pending_requests();
for (const auto& pending_request : *pending) {
if (pending_request.request.url == gurl)
return &pending_request;
}
return nullptr;
}
}
namespace gcm {
GCMRequestTestBase::GCMRequestTestBase()
: shared_factory_(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_)),
retry_count_(0) {}
GCMRequestTestBase::~GCMRequestTestBase() {
}
const net::BackoffEntry::Policy& GCMRequestTestBase::GetBackoffPolicy() const {
return kDefaultBackoffPolicy;
}
void GCMRequestTestBase::OnAboutToCompleteFetch() {}
void GCMRequestTestBase::SetResponseForURLAndComplete(
const std::string& url,
net::HttpStatusCode status_code,
const std::string& response_body,
int net_error_code) {
if (retry_count_++)
FastForwardToTriggerNextRetry();
OnAboutToCompleteFetch();
EXPECT_TRUE(test_url_loader_factory_.SimulateResponseForPendingRequest(
GURL(url), network::URLLoaderCompletionStatus(net_error_code),
network::CreateURLResponseHead(status_code), response_body));
}
const net::HttpRequestHeaders* GCMRequestTestBase::GetExtraHeadersForURL(
const std::string& url) {
const network::TestURLLoaderFactory::PendingRequest* pending_request =
PendingForURL(&test_url_loader_factory_, url);
return pending_request ? &pending_request->request.headers : nullptr;
}
bool GCMRequestTestBase::GetUploadDataForURL(const std::string& url,
std::string* data_out) {
const network::TestURLLoaderFactory::PendingRequest* pending_request =
PendingForURL(&test_url_loader_factory_, url);
if (!pending_request)
return false;
*data_out = network::GetUploadData(pending_request->request);
return true;
}
void GCMRequestTestBase::VerifyFetcherUploadDataForURL(
const std::string& url,
std::map<std::string, std::string>* expected_pairs) {
std::string upload_data;
ASSERT_TRUE(GetUploadDataForURL(url, &upload_data));
base::StringTokenizer data_tokenizer(upload_data, "&=");
while (data_tokenizer.GetNext()) {
auto iter = expected_pairs->find(data_tokenizer.token());
ASSERT_TRUE(iter != expected_pairs->end()) << data_tokenizer.token();
ASSERT_TRUE(data_tokenizer.GetNext()) << data_tokenizer.token();
ASSERT_EQ(iter->second, data_tokenizer.token());
expected_pairs->erase(iter);
}
ASSERT_EQ(0UL, expected_pairs->size());
}
void GCMRequestTestBase::FastForwardToTriggerNextRetry() {
int next_retry_delay_ms = kDefaultBackoffPolicy.initial_delay_ms;
next_retry_delay_ms *=
pow(kDefaultBackoffPolicy.multiply_factor, retry_count_);
task_environment_.FastForwardBy(base::Milliseconds(next_retry_delay_ms));
}
}