| 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();
|
|
|