Index: components/domain_reliability/context_unittest.cc |
diff --git a/components/domain_reliability/context_unittest.cc b/components/domain_reliability/context_unittest.cc |
index fd2ab1cb60203593acf33c35866970d28ceb8381..3cf776487c7066204e3439c62fc6a489419e09b3 100644 |
--- a/components/domain_reliability/context_unittest.cc |
+++ b/components/domain_reliability/context_unittest.cc |
@@ -41,6 +41,7 @@ scoped_ptr<DomainReliabilityBeacon> MakeBeacon(MockableTime* time) { |
beacon->elapsed = base::TimeDelta::FromMilliseconds(250); |
beacon->start_time = time->NowTicks() - beacon->elapsed; |
beacon->upload_depth = 0; |
+ beacon->sample_rate = 1.0; |
return beacon.Pass(); |
} |
@@ -60,9 +61,10 @@ struct HasValue { |
} |
}; |
-HasValue<std::string, &DictionaryValue::GetString> HasStringValue; |
-HasValue<int, &DictionaryValue::GetInteger> HasIntegerValue; |
HasValue<bool, &DictionaryValue::GetBoolean> HasBooleanValue; |
+HasValue<double, &DictionaryValue::GetDouble> HasDoubleValue; |
+HasValue<int, &DictionaryValue::GetInteger> HasIntegerValue; |
+HasValue<std::string, &DictionaryValue::GetString> HasStringValue; |
bool GetEntryFromReport(const Value* report, |
size_t index, |
@@ -85,13 +87,6 @@ class DomainReliabilityContextTest : public testing::Test { |
uploader_(base::Bind(&DomainReliabilityContextTest::OnUploadRequest, |
base::Unretained(this))), |
upload_reporter_string_("test-reporter"), |
- context_(&time_, |
- params_, |
- upload_reporter_string_, |
- &last_network_change_time_, |
- &dispatcher_, |
- &uploader_, |
- MakeTestConfig().Pass()), |
upload_pending_(false) { |
// Make sure that the last network change does not overlap requests |
// made in test cases, which start 250ms in the past (see |MakeBeacon|). |
@@ -99,6 +94,17 @@ class DomainReliabilityContextTest : public testing::Test { |
time_.Advance(base::TimeDelta::FromSeconds(1)); |
} |
+ void InitContext(scoped_ptr<const DomainReliabilityConfig> config) { |
+ context_.reset(new DomainReliabilityContext( |
+ &time_, |
+ params_, |
+ upload_reporter_string_, |
+ &last_network_change_time_, |
+ &dispatcher_, |
+ &uploader_, |
+ config.Pass())); |
+ } |
+ |
TimeDelta min_delay() const { return params_.minimum_upload_delay; } |
TimeDelta max_delay() const { return params_.maximum_upload_delay; } |
TimeDelta retry_interval() const { return params_.upload_retry_interval; } |
@@ -129,7 +135,7 @@ class DomainReliabilityContextTest : public testing::Test { |
bool CheckNoBeacons() { |
BeaconVector beacons; |
- context_.GetQueuedBeaconsForTesting(&beacons); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
return beacons.empty(); |
} |
@@ -139,7 +145,7 @@ class DomainReliabilityContextTest : public testing::Test { |
DomainReliabilityScheduler::Params params_; |
MockUploader uploader_; |
std::string upload_reporter_string_; |
- DomainReliabilityContext context_; |
+ scoped_ptr<DomainReliabilityContext> context_; |
private: |
void OnUploadRequest( |
@@ -163,25 +169,28 @@ class DomainReliabilityContextTest : public testing::Test { |
}; |
TEST_F(DomainReliabilityContextTest, Create) { |
+ InitContext(MakeTestConfig()); |
EXPECT_TRUE(CheckNoBeacons()); |
} |
TEST_F(DomainReliabilityContextTest, Report) { |
- context_.OnBeacon(MakeBeacon(&time_)); |
+ InitContext(MakeTestConfig()); |
+ context_->OnBeacon(MakeBeacon(&time_)); |
BeaconVector beacons; |
- context_.GetQueuedBeaconsForTesting(&beacons); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
EXPECT_EQ(1u, beacons.size()); |
} |
TEST_F(DomainReliabilityContextTest, MaxNestedBeaconSchedules) { |
+ InitContext(MakeTestConfig()); |
GURL url("http://example/always_report"); |
scoped_ptr<DomainReliabilityBeacon> beacon = MakeBeacon(&time_); |
beacon->upload_depth = DomainReliabilityContext::kMaxUploadDepthToSchedule; |
- context_.OnBeacon(beacon.Pass()); |
+ context_->OnBeacon(beacon.Pass()); |
BeaconVector beacons; |
- context_.GetQueuedBeaconsForTesting(&beacons); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
EXPECT_EQ(1u, beacons.size()); |
time_.Advance(max_delay()); |
@@ -189,14 +198,15 @@ TEST_F(DomainReliabilityContextTest, MaxNestedBeaconSchedules) { |
} |
TEST_F(DomainReliabilityContextTest, OverlyNestedBeaconDoesNotSchedule) { |
+ InitContext(MakeTestConfig()); |
GURL url("http://example/always_report"); |
scoped_ptr<DomainReliabilityBeacon> beacon = MakeBeacon(&time_); |
beacon->upload_depth = |
DomainReliabilityContext::kMaxUploadDepthToSchedule + 1; |
- context_.OnBeacon(beacon.Pass()); |
+ context_->OnBeacon(beacon.Pass()); |
BeaconVector beacons; |
- context_.GetQueuedBeaconsForTesting(&beacons); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
EXPECT_EQ(1u, beacons.size()); |
time_.Advance(max_delay()); |
@@ -205,14 +215,15 @@ TEST_F(DomainReliabilityContextTest, OverlyNestedBeaconDoesNotSchedule) { |
TEST_F(DomainReliabilityContextTest, |
MaxNestedBeaconAfterOverlyNestedBeaconSchedules) { |
+ InitContext(MakeTestConfig()); |
// Add a beacon for a report that's too nested to schedule a beacon. |
scoped_ptr<DomainReliabilityBeacon> beacon = MakeBeacon(&time_); |
beacon->upload_depth = |
DomainReliabilityContext::kMaxUploadDepthToSchedule + 1; |
- context_.OnBeacon(beacon.Pass()); |
+ context_->OnBeacon(beacon.Pass()); |
BeaconVector beacons; |
- context_.GetQueuedBeaconsForTesting(&beacons); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
EXPECT_EQ(1u, beacons.size()); |
time_.Advance(max_delay()); |
@@ -222,9 +233,9 @@ TEST_F(DomainReliabilityContextTest, |
// doesn't schedule until the deadline. |
beacon = MakeBeacon(&time_); |
beacon->upload_depth = DomainReliabilityContext::kMaxUploadDepthToSchedule; |
- context_.OnBeacon(beacon.Pass()); |
+ context_->OnBeacon(beacon.Pass()); |
- context_.GetQueuedBeaconsForTesting(&beacons); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
EXPECT_EQ(2u, beacons.size()); |
time_.Advance(max_delay()); |
@@ -239,10 +250,11 @@ TEST_F(DomainReliabilityContextTest, |
} |
TEST_F(DomainReliabilityContextTest, ReportUpload) { |
- context_.OnBeacon(MakeBeacon(&time_)); |
+ InitContext(MakeTestConfig()); |
+ context_->OnBeacon(MakeBeacon(&time_)); |
BeaconVector beacons; |
- context_.GetQueuedBeaconsForTesting(&beacons); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
EXPECT_EQ(1u, beacons.size()); |
time_.Advance(max_delay()); |
@@ -261,6 +273,7 @@ TEST_F(DomainReliabilityContextTest, ReportUpload) { |
// 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(HasDoubleValue(*entry, "sample_rate", 1.0)); |
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/")); |
@@ -274,10 +287,11 @@ TEST_F(DomainReliabilityContextTest, ReportUpload) { |
} |
TEST_F(DomainReliabilityContextTest, NetworkChanged) { |
- context_.OnBeacon(MakeBeacon(&time_)); |
+ InitContext(MakeTestConfig()); |
+ context_->OnBeacon(MakeBeacon(&time_)); |
BeaconVector beacons; |
- context_.GetQueuedBeaconsForTesting(&beacons); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
EXPECT_EQ(1u, beacons.size()); |
// Simulate a network change after the request but before the upload. |
@@ -299,6 +313,127 @@ TEST_F(DomainReliabilityContextTest, NetworkChanged) { |
EXPECT_TRUE(CheckNoBeacons()); |
} |
+TEST_F(DomainReliabilityContextTest, ZeroSampleRate) { |
+ scoped_ptr<DomainReliabilityConfig> config(MakeTestConfig()); |
+ config->failure_sample_rate = 0.0; |
+ InitContext(config.Pass()); |
+ |
+ BeaconVector beacons; |
+ for (int i = 0; i < 100; i++) { |
+ context_->OnBeacon(MakeBeacon(&time_)); |
+ EXPECT_TRUE(CheckNoBeacons()); |
+ } |
+} |
+ |
+TEST_F(DomainReliabilityContextTest, FractionalSampleRate) { |
+ scoped_ptr<DomainReliabilityConfig> config(MakeTestConfig()); |
+ config->failure_sample_rate = 0.5; |
+ InitContext(config.Pass()); |
+ |
+ BeaconVector beacons; |
+ do { |
+ context_->OnBeacon(MakeBeacon(&time_)); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
+ } while (beacons.empty()); |
+ EXPECT_EQ(1u, beacons.size()); |
+ |
+ time_.Advance(max_delay()); |
+ EXPECT_TRUE(upload_pending()); |
+ 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(HasDoubleValue(*entry, "sample_rate", 0.5)); |
+ |
+ DomainReliabilityUploader::UploadResult result; |
+ result.status = DomainReliabilityUploader::UploadResult::SUCCESS; |
+ CallUploadCallback(result); |
+ |
+ EXPECT_TRUE(CheckNoBeacons()); |
+} |
+ |
+TEST_F(DomainReliabilityContextTest, FailureSampleOnly) { |
+ scoped_ptr<DomainReliabilityConfig> config(MakeTestConfig()); |
+ config->success_sample_rate = 0.0; |
+ config->failure_sample_rate = 1.0; |
+ InitContext(config.Pass()); |
+ |
+ BeaconVector beacons; |
+ |
+ context_->OnBeacon(MakeBeacon(&time_)); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
+ EXPECT_EQ(1u, beacons.size()); |
+ |
+ scoped_ptr<DomainReliabilityBeacon> beacon(MakeBeacon(&time_)); |
+ beacon->status = "ok"; |
+ beacon->chrome_error = net::OK; |
+ context_->OnBeacon(beacon.Pass()); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
+ EXPECT_EQ(1u, beacons.size()); |
+} |
+ |
+TEST_F(DomainReliabilityContextTest, SuccessSampleOnly) { |
+ scoped_ptr<DomainReliabilityConfig> config(MakeTestConfig()); |
+ config->success_sample_rate = 1.0; |
+ config->failure_sample_rate = 0.0; |
+ InitContext(config.Pass()); |
+ |
+ BeaconVector beacons; |
+ |
+ context_->OnBeacon(MakeBeacon(&time_)); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
+ EXPECT_EQ(0u, beacons.size()); |
+ |
+ scoped_ptr<DomainReliabilityBeacon> beacon(MakeBeacon(&time_)); |
+ beacon->status = "ok"; |
+ beacon->chrome_error = net::OK; |
+ context_->OnBeacon(beacon.Pass()); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
+ EXPECT_EQ(1u, beacons.size()); |
+} |
+ |
+TEST_F(DomainReliabilityContextTest, SampleAllBeacons) { |
+ scoped_ptr<DomainReliabilityConfig> config(MakeTestConfig()); |
+ config->success_sample_rate = 1.0; |
+ config->failure_sample_rate = 1.0; |
+ InitContext(config.Pass()); |
+ |
+ BeaconVector beacons; |
+ |
+ context_->OnBeacon(MakeBeacon(&time_)); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
+ EXPECT_EQ(1u, beacons.size()); |
+ |
+ scoped_ptr<DomainReliabilityBeacon> beacon(MakeBeacon(&time_)); |
+ beacon->status = "ok"; |
+ beacon->chrome_error = net::OK; |
+ context_->OnBeacon(beacon.Pass()); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
+ EXPECT_EQ(2u, beacons.size()); |
+} |
+ |
+TEST_F(DomainReliabilityContextTest, SampleNoBeacons) { |
+ scoped_ptr<DomainReliabilityConfig> config(MakeTestConfig()); |
+ config->success_sample_rate = 0.0; |
+ config->failure_sample_rate = 0.0; |
+ InitContext(config.Pass()); |
+ |
+ BeaconVector beacons; |
+ |
+ context_->OnBeacon(MakeBeacon(&time_)); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
+ EXPECT_EQ(0u, beacons.size()); |
+ |
+ scoped_ptr<DomainReliabilityBeacon> beacon(MakeBeacon(&time_)); |
+ beacon->status = "ok"; |
+ beacon->chrome_error = net::OK; |
+ context_->OnBeacon(beacon.Pass()); |
+ context_->GetQueuedBeaconsForTesting(&beacons); |
+ EXPECT_EQ(0u, beacons.size()); |
+} |
+ |
// TODO(ttuttle): Add beacon_unittest.cc to test serialization. |
} // namespace |