Commit 6e61ebd3 authored by Luna Lu's avatar Luna Lu Committed by Commit Bot

Added a test for sending CSS properties through PageTimingMetricsSender

As a follow up to bug fix in 393f5c2e, this adds a unit test for sending CSS
properties in range.

Bug: 826679
Change-Id: I4081bcafd7909c6ed7768ce6515e3fcaaddfc9c8
Reviewed-on: https://chromium-review.googlesource.com/985896
Commit-Queue: Luna Lu <loonybear@chromium.org>
Reviewed-by: default avatarCharlie Harrison <csharrison@chromium.org>
Cr-Commit-Position: refs/heads/master@{#546967}
parent 69d0bcdd
...@@ -50,6 +50,11 @@ void FakePageTimingSender::PageTimingValidator::UpdateExpectPageLoadFeatures( ...@@ -50,6 +50,11 @@ void FakePageTimingSender::PageTimingValidator::UpdateExpectPageLoadFeatures(
expected_features_.insert(feature); expected_features_.insert(feature);
} }
void FakePageTimingSender::PageTimingValidator::
UpdateExpectPageLoadCssProperties(int css_property_id) {
expected_css_properties_.insert(css_property_id);
}
void FakePageTimingSender::PageTimingValidator::VerifyExpectedFeatures() const { void FakePageTimingSender::PageTimingValidator::VerifyExpectedFeatures() const {
ASSERT_EQ(actual_features_.size(), expected_features_.size()); ASSERT_EQ(actual_features_.size(), expected_features_.size());
std::vector<blink::mojom::WebFeature> diff; std::vector<blink::mojom::WebFeature> diff;
...@@ -66,6 +71,25 @@ void FakePageTimingSender::PageTimingValidator::VerifyExpectedFeatures() const { ...@@ -66,6 +71,25 @@ void FakePageTimingSender::PageTimingValidator::VerifyExpectedFeatures() const {
<< "More features are actually observed than expected"; << "More features are actually observed than expected";
} }
void FakePageTimingSender::PageTimingValidator::VerifyExpectedCssProperties()
const {
ASSERT_EQ(actual_css_properties_.size(), expected_css_properties_.size());
std::vector<int> diff;
std::set_difference(actual_css_properties_.begin(),
actual_css_properties_.end(),
expected_css_properties_.begin(),
expected_css_properties_.end(), diff.begin());
EXPECT_TRUE(diff.empty())
<< "Expected more CSS properties than the actual features observed";
std::set_difference(expected_css_properties_.begin(),
expected_css_properties_.end(),
actual_css_properties_.begin(),
actual_css_properties_.end(), diff.begin());
EXPECT_TRUE(diff.empty())
<< "More CSS Properties are actually observed than expected";
}
void FakePageTimingSender::PageTimingValidator::UpdateTiming( void FakePageTimingSender::PageTimingValidator::UpdateTiming(
const mojom::PageLoadTimingPtr& timing, const mojom::PageLoadTimingPtr& timing,
const mojom::PageLoadMetadataPtr& metadata, const mojom::PageLoadMetadataPtr& metadata,
...@@ -76,8 +100,16 @@ void FakePageTimingSender::PageTimingValidator::UpdateTiming( ...@@ -76,8 +100,16 @@ void FakePageTimingSender::PageTimingValidator::UpdateTiming(
<< "Feature " << feature << "has been sent more than once"; << "Feature " << feature << "has been sent more than once";
actual_features_.insert(feature); actual_features_.insert(feature);
} }
for (const auto css_property_id : new_features->css_properties) {
EXPECT_EQ(actual_css_properties_.find(css_property_id),
actual_css_properties_.end())
<< "CSS Property ID " << css_property_id
<< "has been sent more than once";
actual_css_properties_.insert(css_property_id);
}
VerifyExpectedTimings(); VerifyExpectedTimings();
VerifyExpectedFeatures(); VerifyExpectedFeatures();
VerifyExpectedCssProperties();
} }
} // namespace page_load_metrics } // namespace page_load_metrics
...@@ -50,10 +50,16 @@ class FakePageTimingSender : public PageTimingSender { ...@@ -50,10 +50,16 @@ class FakePageTimingSender : public PageTimingSender {
// PageLoad features that are expected to be sent through SendTiming() // PageLoad features that are expected to be sent through SendTiming()
// should be passed via UpdateExpectedPageLoadFeatures. // should be passed via UpdateExpectedPageLoadFeatures.
void UpdateExpectPageLoadFeatures(const blink::mojom::WebFeature feature); void UpdateExpectPageLoadFeatures(const blink::mojom::WebFeature feature);
// PageLoad CSS properties that are expected to be sent through SendTiming()
// should be passed via UpdateExpectedPageLoadCSSProperties.
void UpdateExpectPageLoadCssProperties(int css_property_id);
// Forces verification that actual features sent through SendTiming match // Forces verification that actual features sent through SendTiming match
// expected features provided via ExpectPageLoadFeatures. // expected features provided via ExpectPageLoadFeatures.
void VerifyExpectedFeatures() const; void VerifyExpectedFeatures() const;
// Forces verification that actual CSS properties sent through SendTiming
// match expected CSS properties provided via ExpectPageLoadCSSProperties.
void VerifyExpectedCssProperties() const;
const std::vector<mojom::PageLoadTimingPtr>& expected_timings() const { const std::vector<mojom::PageLoadTimingPtr>& expected_timings() const {
return expected_timings_; return expected_timings_;
...@@ -71,6 +77,8 @@ class FakePageTimingSender : public PageTimingSender { ...@@ -71,6 +77,8 @@ class FakePageTimingSender : public PageTimingSender {
std::vector<mojom::PageLoadTimingPtr> actual_timings_; std::vector<mojom::PageLoadTimingPtr> actual_timings_;
std::set<blink::mojom::WebFeature> expected_features_; std::set<blink::mojom::WebFeature> expected_features_;
std::set<blink::mojom::WebFeature> actual_features_; std::set<blink::mojom::WebFeature> actual_features_;
std::set<int> expected_css_properties_;
std::set<int> actual_css_properties_;
DISALLOW_COPY_AND_ASSIGN(PageTimingValidator); DISALLOW_COPY_AND_ASSIGN(PageTimingValidator);
}; };
......
...@@ -231,4 +231,113 @@ TEST_F(PageTimingMetricsSenderTest, SendMultipleFeaturesTwice) { ...@@ -231,4 +231,113 @@ TEST_F(PageTimingMetricsSenderTest, SendMultipleFeaturesTwice) {
validator_.VerifyExpectedFeatures(); validator_.VerifyExpectedFeatures();
} }
TEST_F(PageTimingMetricsSenderTest, SendSingleCssProperty) {
mojom::PageLoadTiming timing;
InitPageLoadTimingForTest(&timing);
metrics_sender_->Send(timing.Clone());
validator_.ExpectPageLoadTiming(timing);
// Observe a single CSS property, update expected CSS properties sent across
// IPC.
metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
validator_.UpdateExpectPageLoadCssProperties(3);
// Fire the timer to trigger sending of features via an SendTiming call.
metrics_sender_->mock_timer()->Fire();
validator_.VerifyExpectedCssProperties();
}
TEST_F(PageTimingMetricsSenderTest, SendCssPropertiesInRange) {
mojom::PageLoadTiming timing;
InitPageLoadTimingForTest(&timing);
metrics_sender_->Send(timing.Clone());
validator_.ExpectPageLoadTiming(timing);
// Observe the smallest CSS property ID.
metrics_sender_->DidObserveNewCssPropertyUsage(2, false /*is_animated*/);
validator_.UpdateExpectPageLoadCssProperties(2);
// Observe the largest CSS property ID.
metrics_sender_->DidObserveNewCssPropertyUsage(
blink::mojom::kMaximumCSSSampleId, false /*is_animated*/);
validator_.UpdateExpectPageLoadCssProperties(
blink::mojom::kMaximumCSSSampleId);
// Fire the timer to trigger sending of features via an SendTiming call.
metrics_sender_->mock_timer()->Fire();
validator_.VerifyExpectedCssProperties();
}
TEST_F(PageTimingMetricsSenderTest, SendMultipleCssProperties) {
mojom::PageLoadTiming timing;
InitPageLoadTimingForTest(&timing);
metrics_sender_->Send(timing.Clone());
validator_.ExpectPageLoadTiming(timing);
// Observe the first CSS property, update expected CSS properties sent across
// IPC.
metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
validator_.UpdateExpectPageLoadCssProperties(3);
// Observe the second CSS property, update expected CSS properties sent across
// IPC.
metrics_sender_->DidObserveNewCssPropertyUsage(123, false /*is_animated*/);
validator_.UpdateExpectPageLoadCssProperties(123);
// Fire the timer to trigger sending of CSS properties via an SendTiming call.
metrics_sender_->mock_timer()->Fire();
validator_.VerifyExpectedCssProperties();
}
TEST_F(PageTimingMetricsSenderTest, SendDuplicatedCssProperties) {
mojom::PageLoadTiming timing;
InitPageLoadTimingForTest(&timing);
metrics_sender_->Send(timing.Clone());
validator_.ExpectPageLoadTiming(timing);
metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
validator_.UpdateExpectPageLoadCssProperties(3);
// Observe a duplicated CSS property usage, without updating expected CSS
// properties sent across IPC.
metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
// Fire the timer to trigger sending of CSS properties via an SendTiming call.
metrics_sender_->mock_timer()->Fire();
validator_.VerifyExpectedCssProperties();
}
TEST_F(PageTimingMetricsSenderTest, SendMultipleCssPropertiesTwice) {
mojom::PageLoadTiming timing;
InitPageLoadTimingForTest(&timing);
metrics_sender_->Send(timing.Clone());
validator_.ExpectPageLoadTiming(timing);
// Observe the first CSS property, update expected CSS properties sent across
// IPC.
metrics_sender_->DidObserveNewCssPropertyUsage(2, false /*is_animated*/);
validator_.UpdateExpectPageLoadCssProperties(2);
// Observe the second CSS property, update expected CSS properties sent across
// IPC.
metrics_sender_->DidObserveNewCssPropertyUsage(5, false /*is_animated*/);
validator_.UpdateExpectPageLoadCssProperties(5);
// Observe a duplicated usage, without updating expected CSS properties sent
// across IPC.
metrics_sender_->DidObserveNewCssPropertyUsage(2, false /*is_animated*/);
// Fire the timer to trigger sending of features via an SendTiming call.
metrics_sender_->mock_timer()->Fire();
validator_.VerifyExpectedFeatures();
base::TimeDelta load_event = base::TimeDelta::FromMillisecondsD(4);
// Send an updated PageLoadTiming after the timer for the first send request
// has fired, and verify that a second list of CSS properties is sent.
timing.document_timing->load_event_start = load_event;
metrics_sender_->Send(timing.Clone());
validator_.ExpectPageLoadTiming(timing);
// Observe duplicated usage, without updating expected features sent across
// IPC.
metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
metrics_sender_->DidObserveNewCssPropertyUsage(2, false /*is_animated*/);
// Observe an additional usage, update expected features sent across IPC.
metrics_sender_->DidObserveNewCssPropertyUsage(3, false /*is_animated*/);
validator_.UpdateExpectPageLoadCssProperties(3);
// Fire the timer to trigger another sending of features via the second
// SendTiming call.
metrics_sender_->mock_timer()->Fire();
validator_.VerifyExpectedFeatures();
}
} // namespace page_load_metrics } // namespace page_load_metrics
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment