Index: components/data_usage/core/data_use_aggregator_unittest.cc |
diff --git a/components/data_usage/core/data_use_aggregator_unittest.cc b/components/data_usage/core/data_use_aggregator_unittest.cc |
index daa80c8224756cf0cb7e7c7a0eaad407de1fb95d..ea606959e26a3c21ccfc928912142fa3aeecae87 100644 |
--- a/components/data_usage/core/data_use_aggregator_unittest.cc |
+++ b/components/data_usage/core/data_use_aggregator_unittest.cc |
@@ -11,6 +11,7 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/message_loop/message_loop.h" |
#include "components/data_usage/core/data_use.h" |
+#include "components/data_usage/core/data_use_amortizer.h" |
#include "net/base/network_change_notifier.h" |
#include "net/base/network_delegate_impl.h" |
#include "net/socket/socket_test_util.h" |
@@ -106,19 +107,47 @@ class TestObserver : public DataUseAggregator::Observer { |
DISALLOW_COPY_AND_ASSIGN(TestObserver); |
}; |
-class DataUseAggregatorTest : public testing::Test { |
+// An amortizer that doubles all byte counts it sees. |
+class DoublingAmortizer : public DataUseAmortizer { |
public: |
- DataUseAggregatorTest() |
- : reporting_network_delegate_(&data_use_aggregator_), |
- context_(true), |
- test_observer_(&data_use_aggregator_) { |
- context_.set_client_socket_factory(&mock_socket_factory_); |
- context_.set_network_delegate(&reporting_network_delegate_); |
- context_.Init(); |
+ DoublingAmortizer() {} |
+ ~DoublingAmortizer() override {} |
+ |
+ void Amortize(std::vector<DataUse>* data_use_sequence, |
+ int64_t extra_tx_bytes, |
+ int64_t extra_rx_bytes) override { |
+ for (DataUse& data_use : *data_use_sequence) { |
+ data_use.tx_bytes *= 2; |
+ data_use.rx_bytes *= 2; |
+ } |
} |
+}; |
+class DataUseAggregatorTest : public testing::Test { |
+ public: |
+ DataUseAggregatorTest() {} |
~DataUseAggregatorTest() override {} |
+ void Initialize(scoped_ptr<DataUseAmortizer> data_use_amortizer) { |
+ // Ensure that nothing outlives the |data_use_aggregator_|. |
+ test_observer_.reset(); |
+ context_.reset(); |
+ reporting_network_delegate_.reset(); |
+ mock_socket_factory_.reset(); |
+ |
+ data_use_aggregator_.reset( |
+ new DataUseAggregator(data_use_amortizer.Pass())); |
+ test_observer_.reset(new TestObserver(data_use_aggregator_.get())); |
+ |
+ context_.reset(new net::TestURLRequestContext(true)); |
+ mock_socket_factory_.reset(new net::MockClientSocketFactory()); |
+ context_->set_client_socket_factory(mock_socket_factory_.get()); |
+ reporting_network_delegate_.reset( |
+ new ReportingNetworkDelegate(data_use_aggregator_.get())); |
+ context_->set_network_delegate(reporting_network_delegate_.get()); |
+ context_->Init(); |
+ } |
+ |
scoped_ptr<net::URLRequest> ExecuteRequest( |
const GURL& url, |
const GURL& first_party_for_cookies) { |
@@ -127,11 +156,11 @@ class DataUseAggregatorTest : public testing::Test { |
net::MockRead(net::SYNCHRONOUS, net::OK), |
}; |
net::StaticSocketDataProvider socket(reads, arraysize(reads), nullptr, 0); |
- mock_socket_factory_.AddSocketDataProvider(&socket); |
+ mock_socket_factory_->AddSocketDataProvider(&socket); |
net::TestDelegate delegate; |
scoped_ptr<net::URLRequest> request = |
- context_.CreateRequest(url, net::IDLE, &delegate); |
+ context_->CreateRequest(url, net::IDLE, &delegate); |
request->set_first_party_for_cookies(first_party_for_cookies); |
request->Start(); |
loop_.RunUntilIdle(); |
@@ -146,83 +175,106 @@ class DataUseAggregatorTest : public testing::Test { |
} |
void set_tab_id_for_requests(int32_t tab_id_for_requests) { |
- reporting_network_delegate_.set_tab_id_for_requests(tab_id_for_requests); |
+ reporting_network_delegate_->set_tab_id_for_requests(tab_id_for_requests); |
} |
- DataUseAggregator* data_use_aggregator() { return &data_use_aggregator_; } |
+ DataUseAggregator* data_use_aggregator() { |
+ return data_use_aggregator_.get(); |
+ } |
const std::vector<DataUse>& observed_data_use() const { |
- return test_observer_.observed_data_use(); |
+ return test_observer_->observed_data_use(); |
} |
private: |
base::MessageLoopForIO loop_; |
TestNetworkChangeNotifier test_network_change_notifier_; |
- DataUseAggregator data_use_aggregator_; |
- net::MockClientSocketFactory mock_socket_factory_; |
- ReportingNetworkDelegate reporting_network_delegate_; |
- net::TestURLRequestContext context_; |
- TestObserver test_observer_; |
+ scoped_ptr<DataUseAggregator> data_use_aggregator_; |
+ scoped_ptr<net::MockClientSocketFactory> mock_socket_factory_; |
+ scoped_ptr<ReportingNetworkDelegate> reporting_network_delegate_; |
+ scoped_ptr<net::TestURLRequestContext> context_; |
+ scoped_ptr<TestObserver> test_observer_; |
DISALLOW_COPY_AND_ASSIGN(DataUseAggregatorTest); |
}; |
TEST_F(DataUseAggregatorTest, ReportDataUse) { |
- const net::NetworkChangeNotifier::ConnectionType kFooConnectionType = |
- net::NetworkChangeNotifier::CONNECTION_2G; |
- SimulateNetworkConnectionChange(kFooConnectionType); |
- const int32_t kFooTabId = 10; |
- set_tab_id_for_requests(kFooTabId); |
- const scoped_ptr<net::URLRequest> foo_request = |
- ExecuteRequest(GURL("http://foo.com"), GURL("http://foofirstparty.com")); |
- |
- const net::NetworkChangeNotifier::ConnectionType kBarConnectionType = |
- net::NetworkChangeNotifier::CONNECTION_WIFI; |
- SimulateNetworkConnectionChange(kBarConnectionType); |
- const int32_t kBarTabId = 20; |
- set_tab_id_for_requests(kBarTabId); |
- scoped_ptr<net::URLRequest> bar_request = |
- ExecuteRequest(GURL("http://bar.com"), GURL("http://barfirstparty.com")); |
- |
- auto data_use_it = observed_data_use().begin(); |
- |
- // First, the |foo_request| data use should have happened. |
- int64_t observed_foo_tx_bytes = 0, observed_foo_rx_bytes = 0; |
- while (data_use_it != observed_data_use().end() && |
- data_use_it->url == GURL("http://foo.com")) { |
- EXPECT_EQ(foo_request->request_time(), data_use_it->request_time); |
- EXPECT_EQ(GURL("http://foofirstparty.com"), |
- data_use_it->first_party_for_cookies); |
- EXPECT_EQ(kFooTabId, data_use_it->tab_id); |
- EXPECT_EQ(kFooConnectionType, data_use_it->connection_type); |
- |
- observed_foo_tx_bytes += data_use_it->tx_bytes; |
- observed_foo_rx_bytes += data_use_it->rx_bytes; |
- ++data_use_it; |
- } |
- EXPECT_EQ(foo_request->GetTotalSentBytes(), observed_foo_tx_bytes); |
- EXPECT_EQ(foo_request->GetTotalReceivedBytes(), observed_foo_rx_bytes); |
- |
- // Then, the |bar_request| data use should have happened. |
- int64_t observed_bar_tx_bytes = 0, observed_bar_rx_bytes = 0; |
- while (data_use_it != observed_data_use().end()) { |
- EXPECT_EQ(GURL("http://bar.com"), data_use_it->url); |
- EXPECT_EQ(bar_request->request_time(), data_use_it->request_time); |
- EXPECT_EQ(GURL("http://barfirstparty.com"), |
- data_use_it->first_party_for_cookies); |
- EXPECT_EQ(kBarTabId, data_use_it->tab_id); |
- EXPECT_EQ(kBarConnectionType, data_use_it->connection_type); |
- |
- observed_bar_tx_bytes += data_use_it->tx_bytes; |
- observed_bar_rx_bytes += data_use_it->rx_bytes; |
- ++data_use_it; |
- } |
- EXPECT_EQ(bar_request->GetTotalSentBytes(), observed_bar_tx_bytes); |
- EXPECT_EQ(bar_request->GetTotalReceivedBytes(), observed_bar_rx_bytes); |
+ const bool kBooleans[] = {false, true}; |
+ for (bool use_doubling_amortizer : kBooleans) { |
+ Initialize(use_doubling_amortizer |
+ ? scoped_ptr<DataUseAmortizer>(new DoublingAmortizer()) |
+ : scoped_ptr<DataUseAmortizer>()); |
+ |
+ const net::NetworkChangeNotifier::ConnectionType kFooConnectionType = |
+ net::NetworkChangeNotifier::CONNECTION_2G; |
+ SimulateNetworkConnectionChange(kFooConnectionType); |
+ const int32_t kFooTabId = 10; |
+ set_tab_id_for_requests(kFooTabId); |
+ const scoped_ptr<net::URLRequest> foo_request = ExecuteRequest( |
+ GURL("http://foo.com"), GURL("http://foofirstparty.com")); |
+ |
+ const net::NetworkChangeNotifier::ConnectionType kBarConnectionType = |
+ net::NetworkChangeNotifier::CONNECTION_WIFI; |
+ SimulateNetworkConnectionChange(kBarConnectionType); |
+ const int32_t kBarTabId = 20; |
+ set_tab_id_for_requests(kBarTabId); |
+ scoped_ptr<net::URLRequest> bar_request = ExecuteRequest( |
+ GURL("http://bar.com"), GURL("http://barfirstparty.com")); |
+ |
+ auto data_use_it = observed_data_use().begin(); |
+ |
+ // First, the |foo_request| data use should have happened. |
+ int64_t observed_foo_tx_bytes = 0, observed_foo_rx_bytes = 0; |
+ while (data_use_it != observed_data_use().end() && |
+ data_use_it->url == GURL("http://foo.com")) { |
+ EXPECT_EQ(foo_request->request_time(), data_use_it->request_time); |
+ EXPECT_EQ(GURL("http://foofirstparty.com"), |
+ data_use_it->first_party_for_cookies); |
+ EXPECT_EQ(kFooTabId, data_use_it->tab_id); |
+ EXPECT_EQ(kFooConnectionType, data_use_it->connection_type); |
+ |
+ observed_foo_tx_bytes += data_use_it->tx_bytes; |
+ observed_foo_rx_bytes += data_use_it->rx_bytes; |
+ ++data_use_it; |
+ } |
+ if (use_doubling_amortizer) { |
+ EXPECT_EQ(2 * foo_request->GetTotalSentBytes(), observed_foo_tx_bytes); |
+ EXPECT_EQ(2 * foo_request->GetTotalReceivedBytes(), |
+ observed_foo_rx_bytes); |
+ } else { |
+ EXPECT_EQ(foo_request->GetTotalSentBytes(), observed_foo_tx_bytes); |
+ EXPECT_EQ(foo_request->GetTotalReceivedBytes(), observed_foo_rx_bytes); |
+ } |
+ |
+ // Then, the |bar_request| data use should have happened. |
+ int64_t observed_bar_tx_bytes = 0, observed_bar_rx_bytes = 0; |
+ while (data_use_it != observed_data_use().end()) { |
+ EXPECT_EQ(GURL("http://bar.com"), data_use_it->url); |
+ EXPECT_EQ(bar_request->request_time(), data_use_it->request_time); |
+ EXPECT_EQ(GURL("http://barfirstparty.com"), |
+ data_use_it->first_party_for_cookies); |
+ EXPECT_EQ(kBarTabId, data_use_it->tab_id); |
+ EXPECT_EQ(kBarConnectionType, data_use_it->connection_type); |
+ |
+ observed_bar_tx_bytes += data_use_it->tx_bytes; |
+ observed_bar_rx_bytes += data_use_it->rx_bytes; |
+ ++data_use_it; |
+ } |
+ if (use_doubling_amortizer) { |
+ EXPECT_EQ(2 * bar_request->GetTotalSentBytes(), observed_bar_tx_bytes); |
+ EXPECT_EQ(2 * bar_request->GetTotalReceivedBytes(), |
+ observed_bar_rx_bytes); |
+ } else { |
+ EXPECT_EQ(bar_request->GetTotalSentBytes(), observed_bar_tx_bytes); |
+ EXPECT_EQ(bar_request->GetTotalReceivedBytes(), observed_bar_rx_bytes); |
+ } |
+ } |
} |
TEST_F(DataUseAggregatorTest, ReportOffTheRecordDataUse) { |
+ Initialize(scoped_ptr<DataUseAmortizer>(new DoublingAmortizer())); |
+ |
// Off the record data use should not be reported to observers. |
data_use_aggregator()->ReportOffTheRecordDataUse(1000, 1000); |
base::MessageLoop::current()->RunUntilIdle(); |