| Index: components/domain_reliability/context_unittest.cc
|
| diff --git a/components/domain_reliability/context_unittest.cc b/components/domain_reliability/context_unittest.cc
|
| index 5b42d2187b50a1849d398f5c9bf890df4d07e5b9..fd2ab1cb60203593acf33c35866970d28ceb8381 100644
|
| --- a/components/domain_reliability/context_unittest.cc
|
| +++ b/components/domain_reliability/context_unittest.cc
|
| @@ -8,6 +8,7 @@
|
| #include <string>
|
|
|
| #include "base/bind.h"
|
| +#include "base/json/json_reader.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "components/domain_reliability/beacon.h"
|
| #include "components/domain_reliability/dispatcher.h"
|
| @@ -21,6 +22,10 @@
|
| namespace domain_reliability {
|
| namespace {
|
|
|
| +using base::DictionaryValue;
|
| +using base::ListValue;
|
| +using base::Value;
|
| +
|
| typedef std::vector<const DomainReliabilityBeacon*> BeaconVector;
|
|
|
| scoped_ptr<DomainReliabilityBeacon> MakeBeacon(MockableTime* time) {
|
| @@ -39,6 +44,38 @@ scoped_ptr<DomainReliabilityBeacon> MakeBeacon(MockableTime* time) {
|
| return beacon.Pass();
|
| }
|
|
|
| +template <typename ValueType,
|
| + bool (DictionaryValue::* GetValueType)(const std::string&,
|
| + ValueType*) const>
|
| +struct HasValue {
|
| + bool operator()(const DictionaryValue& dict,
|
| + const std::string& key,
|
| + ValueType expected_value) {
|
| + ValueType actual_value;
|
| + bool got_value = (dict.*GetValueType)(key, &actual_value);
|
| + EXPECT_TRUE(got_value);
|
| + if (got_value)
|
| + EXPECT_EQ(expected_value, actual_value);
|
| + return got_value && (expected_value == actual_value);
|
| + }
|
| +};
|
| +
|
| +HasValue<std::string, &DictionaryValue::GetString> HasStringValue;
|
| +HasValue<int, &DictionaryValue::GetInteger> HasIntegerValue;
|
| +HasValue<bool, &DictionaryValue::GetBoolean> HasBooleanValue;
|
| +
|
| +bool GetEntryFromReport(const Value* report,
|
| + size_t index,
|
| + const DictionaryValue** entry_out) {
|
| + const DictionaryValue* report_dict;
|
| + const ListValue* entries;
|
| +
|
| + return report &&
|
| + report->GetAsDictionary(&report_dict) &&
|
| + report_dict->GetList("entries", &entries) &&
|
| + entries->GetDictionary(index, entry_out);
|
| +}
|
| +
|
| class DomainReliabilityContextTest : public testing::Test {
|
| protected:
|
| DomainReliabilityContextTest()
|
| @@ -208,23 +245,27 @@ TEST_F(DomainReliabilityContextTest, ReportUpload) {
|
| context_.GetQueuedBeaconsForTesting(&beacons);
|
| EXPECT_EQ(1u, beacons.size());
|
|
|
| - // N.B.: Assumes max_delay is 5 minutes.
|
| - const char* kExpectedReport = "{"
|
| - "\"entries\":["
|
| - "{\"failure_data\":{\"custom_error\":\"net::ERR_CONNECTION_RESET\"},"
|
| - "\"network_changed\":false,\"protocol\":\"HTTP\","
|
| - "\"quic_broken\":true,\"request_age_ms\":300250,"
|
| - "\"request_elapsed_ms\":250,"
|
| - "\"server_ip\":\"127.0.0.1\",\"status\":\"tcp.connection_reset\","
|
| - "\"url\":\"https://localhost/\","
|
| - "\"was_proxied\":false}],\"reporter\":\"test-reporter\"}";
|
| -
|
| time_.Advance(max_delay());
|
| EXPECT_TRUE(upload_pending());
|
| - EXPECT_EQ(kExpectedReport, upload_report());
|
| EXPECT_EQ(0, upload_max_depth());
|
| EXPECT_EQ(GURL("https://exampleuploader/upload"), upload_url());
|
|
|
| + scoped_ptr<Value> value = base::JSONReader::Read(upload_report());
|
| + const DictionaryValue* entry;
|
| + ASSERT_TRUE(GetEntryFromReport(value.get(), 0, &entry));
|
| + EXPECT_TRUE(HasStringValue(*entry, "failure_data.custom_error",
|
| + "net::ERR_CONNECTION_RESET"));
|
| + EXPECT_TRUE(HasBooleanValue(*entry, "network_changed", false));
|
| + EXPECT_TRUE(HasStringValue(*entry, "protocol", "HTTP"));
|
| + EXPECT_TRUE(HasBooleanValue(*entry, "quic_broken", true));
|
| + // N.B.: Assumes max_delay is 5 minutes.
|
| + EXPECT_TRUE(HasIntegerValue(*entry, "request_age_ms", 300250));
|
| + EXPECT_TRUE(HasIntegerValue(*entry, "request_elapsed_ms", 250));
|
| + EXPECT_TRUE(HasStringValue(*entry, "server_ip", "127.0.0.1"));
|
| + EXPECT_TRUE(HasStringValue(*entry, "status", "tcp.connection_reset"));
|
| + EXPECT_TRUE(HasStringValue(*entry, "url", "https://localhost/"));
|
| + EXPECT_TRUE(HasBooleanValue(*entry, "was_proxied", false));
|
| +
|
| DomainReliabilityUploader::UploadResult result;
|
| result.status = DomainReliabilityUploader::UploadResult::SUCCESS;
|
| CallUploadCallback(result);
|
| @@ -232,32 +273,25 @@ TEST_F(DomainReliabilityContextTest, ReportUpload) {
|
| EXPECT_TRUE(CheckNoBeacons());
|
| }
|
|
|
| -TEST_F(DomainReliabilityContextTest, Upload_NetworkChanged) {
|
| +TEST_F(DomainReliabilityContextTest, NetworkChanged) {
|
| context_.OnBeacon(MakeBeacon(&time_));
|
|
|
| BeaconVector beacons;
|
| context_.GetQueuedBeaconsForTesting(&beacons);
|
| EXPECT_EQ(1u, beacons.size());
|
|
|
| - // N.B.: Assumes max_delay is 5 minutes.
|
| - const char* kExpectedReport = "{"
|
| - "\"entries\":["
|
| - "{\"failure_data\":{\"custom_error\":\"net::ERR_CONNECTION_RESET\"},"
|
| - "\"network_changed\":true,\"protocol\":\"HTTP\","
|
| - "\"quic_broken\":true,\"request_age_ms\":300250,"
|
| - "\"request_elapsed_ms\":250,"
|
| - "\"server_ip\":\"127.0.0.1\",\"status\":\"tcp.connection_reset\","
|
| - "\"url\":\"https://localhost/\","
|
| - "\"was_proxied\":false}],\"reporter\":\"test-reporter\"}";
|
| -
|
| // Simulate a network change after the request but before the upload.
|
| last_network_change_time_ = time_.NowTicks();
|
| time_.Advance(max_delay());
|
| EXPECT_TRUE(upload_pending());
|
| - EXPECT_EQ(kExpectedReport, upload_report());
|
| EXPECT_EQ(0, upload_max_depth());
|
| EXPECT_EQ(GURL("https://exampleuploader/upload"), upload_url());
|
|
|
| + scoped_ptr<Value> value = base::JSONReader::Read(upload_report());
|
| + const DictionaryValue* entry;
|
| + ASSERT_TRUE(GetEntryFromReport(value.get(), 0, &entry));
|
| + EXPECT_TRUE(HasBooleanValue(*entry, "network_changed", true));
|
| +
|
| DomainReliabilityUploader::UploadResult result;
|
| result.status = DomainReliabilityUploader::UploadResult::SUCCESS;
|
| CallUploadCallback(result);
|
|
|