| Index: chrome/browser/android/data_usage/data_use_tab_model_unittest.cc
|
| diff --git a/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc
|
| index 70777f6451d0c0346df7c7921d035ff7f3e17786..af34866a58282aab87a243e3028514c8ed3fb4a8 100644
|
| --- a/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc
|
| +++ b/chrome/browser/android/data_usage/data_use_tab_model_unittest.cc
|
| @@ -8,7 +8,9 @@
|
|
|
| #include <string>
|
|
|
| +#include "base/memory/weak_ptr.h"
|
| #include "base/message_loop/message_loop.h"
|
| +#include "base/run_loop.h"
|
| #include "base/single_thread_task_runner.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "base/test/histogram_tester.h"
|
| @@ -19,9 +21,13 @@
|
| #include "components/data_usage/core/data_use_aggregator.h"
|
| #include "components/data_usage/core/data_use_amortizer.h"
|
| #include "components/data_usage/core/data_use_annotator.h"
|
| +#include "components/sessions/core/session_id.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/public/test/test_browser_thread_bundle.h"
|
| #include "net/base/network_change_notifier.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| +#include "url/gurl.h"
|
|
|
| namespace {
|
|
|
| @@ -49,6 +55,7 @@ namespace chrome {
|
| namespace android {
|
|
|
| // Test version of |DataUseTabModel|, which permits overriding of calls to Now.
|
| +// TODO(rajendrant): Move this class to anonymous namespace.
|
| class DataUseTabModelNowTest : public DataUseTabModel {
|
| public:
|
| DataUseTabModelNowTest(
|
| @@ -58,6 +65,8 @@ class DataUseTabModelNowTest : public DataUseTabModel {
|
|
|
| ~DataUseTabModelNowTest() override {}
|
|
|
| + // TODO(rajendrant): Change this test class to use a SimpleTestTickClock
|
| + // instead.
|
| void AdvanceTime(base::TimeDelta now_offset) { now_offset_ = now_offset; }
|
|
|
| private:
|
| @@ -73,7 +82,8 @@ class DataUseTabModelNowTest : public DataUseTabModel {
|
|
|
| class DataUseTabModelTest : public testing::Test {
|
| public:
|
| - DataUseTabModelTest() {}
|
| + DataUseTabModelTest()
|
| + : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP) {}
|
|
|
| protected:
|
| void SetUp() override {
|
| @@ -81,17 +91,22 @@ class DataUseTabModelTest : public testing::Test {
|
| scoped_ptr<data_usage::DataUseAnnotator>(),
|
| scoped_ptr<data_usage::DataUseAmortizer>()));
|
| data_use_observer_.reset(new ExternalDataUseObserver(
|
| - data_use_aggregator_.get(), message_loop_.task_runner().get(),
|
| - message_loop_.task_runner().get()));
|
| + data_use_aggregator_.get(),
|
| + content::BrowserThread::GetMessageLoopProxyForThread(
|
| + content::BrowserThread::IO),
|
| + content::BrowserThread::GetMessageLoopProxyForThread(
|
| + content::BrowserThread::UI)));
|
| data_use_tab_model_ = new DataUseTabModelNowTest(
|
| - data_use_observer_.get(), message_loop_.task_runner().get());
|
| + data_use_observer_.get(),
|
| + content::BrowserThread::GetMessageLoopProxyForThread(
|
| + content::BrowserThread::UI));
|
|
|
| // |data_use_tab_model_| will be owned by |data_use_observer_|.
|
| data_use_observer_->data_use_tab_model_.reset(data_use_tab_model_);
|
| }
|
|
|
| // Returns true if tab entry for |tab_id| exists in |active_tabs_|.
|
| - bool IsTabEntryExists(int32_t tab_id) const {
|
| + bool IsTabEntryExists(SessionID::id_type tab_id) const {
|
| return data_use_tab_model_->active_tabs_.find(tab_id) !=
|
| data_use_tab_model_->active_tabs_.end();
|
| }
|
| @@ -104,7 +119,7 @@ class DataUseTabModelTest : public testing::Test {
|
|
|
| // Returns true if the tracking session for tab with id |tab_id| is currently
|
| // active.
|
| - bool IsTrackingDataUse(int32_t tab_id) const {
|
| + bool IsTrackingDataUse(SessionID::id_type tab_id) const {
|
| auto tab_entry_iterator = data_use_tab_model_->active_tabs_.find(tab_id);
|
| if (tab_entry_iterator == data_use_tab_model_->active_tabs_.end())
|
| return false;
|
| @@ -113,21 +128,21 @@ class DataUseTabModelTest : public testing::Test {
|
|
|
| // Checks if the DataUse object for the given |tab_id| with request start time
|
| // |at_time| is labeled as an empty string.
|
| - void ExpectEmptyDataUseLabelAtTime(int32_t tab_id,
|
| + void ExpectEmptyDataUseLabelAtTime(SessionID::id_type tab_id,
|
| const base::TimeTicks& at_time) const {
|
| ExpectDataUseLabelAtTimeWithReturn(tab_id, at_time, false, std::string());
|
| }
|
|
|
| // Checks if the DataUse object for the given |tab_id| is labeled as an empty
|
| // string.
|
| - void ExpectEmptyDataUseLabel(int32_t tab_id) const {
|
| + void ExpectEmptyDataUseLabel(SessionID::id_type tab_id) const {
|
| ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), false,
|
| std::string());
|
| }
|
|
|
| // Checks if the DataUse object for given |tab_id| is labeled as
|
| // |expected_label|.
|
| - void ExpectDataUseLabel(int32_t tab_id,
|
| + void ExpectDataUseLabel(SessionID::id_type tab_id,
|
| const std::string& expected_label) const {
|
| ExpectDataUseLabelAtTimeWithReturn(tab_id, base::TimeTicks::Now(), true,
|
| expected_label);
|
| @@ -137,7 +152,7 @@ class DataUseTabModelTest : public testing::Test {
|
| // request start time |at_time|, as |expected_label| and returns
|
| // |expected_return|.
|
| void ExpectDataUseLabelAtTimeWithReturn(
|
| - int32_t tab_id,
|
| + SessionID::id_type tab_id,
|
| const base::TimeTicks& at_time,
|
| bool expected_return,
|
| const std::string& expected_label) const {
|
| @@ -152,11 +167,12 @@ class DataUseTabModelTest : public testing::Test {
|
| EXPECT_EQ(expected_label, actual_label);
|
| }
|
|
|
| - void StartTrackingDataUse(int32_t tab_id, const std::string& label) {
|
| + void StartTrackingDataUse(SessionID::id_type tab_id,
|
| + const std::string& label) {
|
| data_use_tab_model_->StartTrackingDataUse(tab_id, label);
|
| }
|
|
|
| - void EndTrackingDataUse(int32_t tab_id) {
|
| + void EndTrackingDataUse(SessionID::id_type tab_id) {
|
| data_use_tab_model_->EndTrackingDataUse(tab_id);
|
| }
|
|
|
| @@ -168,20 +184,33 @@ class DataUseTabModelTest : public testing::Test {
|
| labels);
|
| }
|
|
|
| + content::TestBrowserThreadBundle thread_bundle_;
|
| scoped_ptr<data_usage::DataUseAggregator> data_use_aggregator_;
|
| scoped_ptr<ExternalDataUseObserver> data_use_observer_;
|
|
|
| // Pointer to the tab model within and owned by ExternalDataUseObserver.
|
| DataUseTabModelNowTest* data_use_tab_model_;
|
|
|
| - base::MessageLoop message_loop_;
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(DataUseTabModelTest);
|
| };
|
|
|
| // Mock observer to track the calls to start and end tracking events.
|
| +// TODO(rajendrant): Move this class to anonymous namespace.
|
| class MockTabDataUseObserver : public DataUseTabModel::TabDataUseObserver {
|
| public:
|
| - MOCK_METHOD1(NotifyTrackingStarting, void(int32_t tab_id));
|
| - MOCK_METHOD1(NotifyTrackingEnding, void(int32_t tab_id));
|
| + MockTabDataUseObserver() : weak_ptr_factory_(this) {}
|
| + MOCK_METHOD1(NotifyTrackingStarting, void(SessionID::id_type tab_id));
|
| + MOCK_METHOD1(NotifyTrackingEnding, void(SessionID::id_type tab_id));
|
| +
|
| + base::WeakPtr<MockTabDataUseObserver> GetWeakPtr() {
|
| + return weak_ptr_factory_.GetWeakPtr();
|
| + }
|
| +
|
| + private:
|
| + base::WeakPtrFactory<MockTabDataUseObserver> weak_ptr_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MockTabDataUseObserver);
|
| };
|
|
|
| // Starts and ends tracking a single tab and checks if its label is returned
|
| @@ -249,21 +278,26 @@ TEST_F(DataUseTabModelTest, ObserverStartEndEvents) {
|
| EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
|
| EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
|
|
|
| - data_use_tab_model_->AddObserver(&mock_observer);
|
| + data_use_tab_model_->AddObserver(mock_observer.GetWeakPtr());
|
| + EXPECT_EQ(1U, data_use_tab_model_->observers_.size());
|
| StartTrackingDataUse(kTabID1, kTestLabel1);
|
| EndTrackingDataUse(kTabID1);
|
|
|
| - message_loop_.RunUntilIdle();
|
| + base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| // Checks that multiple mock observers receive start and end tracking events for
|
| // multiple tabs.
|
| TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) {
|
| MockTabDataUseObserver mock_observers[kMaxMockObservers];
|
| + size_t expected_observer_count = 0;
|
| + EXPECT_EQ(expected_observer_count, data_use_tab_model_->observers_.size());
|
|
|
| for (auto& mock_observer : mock_observers) {
|
| // Add the observer.
|
| - data_use_tab_model_->AddObserver(&mock_observer);
|
| + data_use_tab_model_->AddObserver(mock_observer.GetWeakPtr());
|
| + ++expected_observer_count;
|
| + EXPECT_EQ(expected_observer_count, data_use_tab_model_->observers_.size());
|
|
|
| // Expect start and end events for tab ids 1-3.
|
| EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
|
| @@ -282,34 +316,7 @@ TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) {
|
| EndTrackingDataUse(kTabID2);
|
| EndTrackingDataUse(kTabID3);
|
|
|
| - message_loop_.RunUntilIdle();
|
| -}
|
| -
|
| -// Checks that the observer is not notified of start and end events after
|
| -// RemoveObserver.
|
| -TEST_F(DataUseTabModelTest, ObserverNotNotifiedAfterRemove) {
|
| - MockTabDataUseObserver mock_observer;
|
| -
|
| - // Observer notified of start and end events.
|
| - EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1);
|
| - EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1);
|
| -
|
| - data_use_tab_model_->AddObserver(&mock_observer);
|
| - StartTrackingDataUse(kTabID1, kTestLabel1);
|
| - EndTrackingDataUse(kTabID1);
|
| -
|
| - message_loop_.RunUntilIdle();
|
| - testing::Mock::VerifyAndClear(&mock_observer);
|
| -
|
| - // Observer should not be notified after RemoveObserver.
|
| - EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(0);
|
| - EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(0);
|
| -
|
| - data_use_tab_model_->RemoveObserver(&mock_observer);
|
| - StartTrackingDataUse(kTabID1, kTestLabel1);
|
| - EndTrackingDataUse(kTabID1);
|
| -
|
| - message_loop_.RunUntilIdle();
|
| + base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| // Checks that tab close event updates the close time of the tab entry.
|
| @@ -348,7 +355,7 @@ TEST_F(DataUseTabModelTest, OnTrackingLabelRemoved) {
|
| StartTrackingDataUse(kTabID1, kTestLabel1);
|
| StartTrackingDataUse(kTabID2, kTestLabel2);
|
| StartTrackingDataUse(kTabID3, kTestLabel3);
|
| - data_use_tab_model_->AddObserver(&mock_observer);
|
| + data_use_tab_model_->AddObserver(mock_observer.GetWeakPtr());
|
| ExpectTabEntrySize(TabEntrySize::THREE);
|
|
|
| EXPECT_TRUE(IsTrackingDataUse(kTabID1));
|
| @@ -359,7 +366,7 @@ TEST_F(DataUseTabModelTest, OnTrackingLabelRemoved) {
|
| EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID2)).Times(1);
|
|
|
| data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel2);
|
| - message_loop_.RunUntilIdle();
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| EXPECT_TRUE(IsTrackingDataUse(kTabID1));
|
| EXPECT_FALSE(IsTrackingDataUse(kTabID2));
|
| @@ -368,7 +375,7 @@ TEST_F(DataUseTabModelTest, OnTrackingLabelRemoved) {
|
| EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID3)).Times(1);
|
|
|
| data_use_tab_model_->OnTrackingLabelRemoved(kTestLabel3);
|
| - message_loop_.RunUntilIdle();
|
| + base::RunLoop().RunUntilIdle();
|
|
|
| EXPECT_TRUE(IsTrackingDataUse(kTabID1));
|
| EXPECT_FALSE(IsTrackingDataUse(kTabID2));
|
| @@ -378,8 +385,9 @@ TEST_F(DataUseTabModelTest, OnTrackingLabelRemoved) {
|
| // Checks that |active_tabs_| does not grow beyond GetMaxTabEntriesForTests tab
|
| // entries.
|
| TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) {
|
| - const size_t max_tab_entries = data_use_tab_model_->max_tab_entries_;
|
| - uint32_t tab_id = 1;
|
| + const int32_t max_tab_entries =
|
| + static_cast<int32_t>(data_use_tab_model_->max_tab_entries_);
|
| + SessionID::id_type tab_id = 1;
|
|
|
| ExpectTabEntrySize(TabEntrySize::ZERO);
|
|
|
| @@ -392,7 +400,8 @@ TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) {
|
| ++tab_id;
|
| }
|
|
|
| - uint32_t oldest_tab_id = 1; // oldest tab entry that will be removed first.
|
| + // Oldest tab entry that will be removed first.
|
| + SessionID::id_type oldest_tab_id = 1;
|
|
|
| // Starting and ending more tracking tab entries does not increase the size of
|
| // |active_tabs_|.
|
| @@ -461,8 +470,9 @@ TEST_F(DataUseTabModelTest, UnexpiredTabEntryRemovaltimeHistogram) {
|
| const char kUMAUnexpiredTabEntryRemovalDurationMinutesHistogram[] =
|
| "DataUse.TabModel.UnexpiredTabEntryRemovalDuration";
|
| base::HistogramTester histogram_tester;
|
| - const size_t max_tab_entries = data_use_tab_model_->max_tab_entries_;
|
| - uint32_t tab_id = 1;
|
| + const int32_t max_tab_entries =
|
| + static_cast<int32_t>(data_use_tab_model_->max_tab_entries_);
|
| + SessionID::id_type tab_id = 1;
|
|
|
| while (tab_id <= max_tab_entries) {
|
| std::string tab_label = base::StringPrintf("label_%d", tab_id);
|
| @@ -558,11 +568,6 @@ TEST_F(DataUseTabModelTest, NavigationEnterAndExitEvent) {
|
| GURL("http://foo.com/"), std::string());
|
| ExpectTabEntrySize(TabEntrySize::ONE);
|
| EXPECT_TRUE(IsTrackingDataUse(kTabID1));
|
| -
|
| - data_use_tab_model_->OnNavigationEvent(
|
| - kTabID1, DataUseTabModel::TRANSITION_FROM_NAVSUGGEST, GURL(),
|
| - std::string());
|
| - EXPECT_FALSE(IsTrackingDataUse(kTabID1));
|
| }
|
|
|
| // Tests that any of the Enter transition events start the tracking.
|
| @@ -581,7 +586,7 @@ TEST_F(DataUseTabModelTest, AllNavigationEnterEvents) {
|
| std::string(), kTestLabel2},
|
| };
|
| std::vector<std::string> app_package_names, domain_regexes, labels;
|
| - int32_t tab_id = 1;
|
| + SessionID::id_type tab_id = 1;
|
|
|
| app_package_names.push_back("com.google.package.foo");
|
| domain_regexes.push_back(std::string());
|
| @@ -611,13 +616,10 @@ TEST_F(DataUseTabModelTest, AllNavigationEnterEvents) {
|
| // Tests that any of the Exit transition events end the tracking.
|
| TEST_F(DataUseTabModelTest, AllNavigationExitEvents) {
|
| DataUseTabModel::TransitionType all_exit_transitions[] = {
|
| - DataUseTabModel::TRANSITION_TO_EXTERNAL_APP,
|
| - DataUseTabModel::TRANSITION_FROM_NAVSUGGEST,
|
| - DataUseTabModel::TRANSITION_OMNIBOX_NAVIGATION,
|
| DataUseTabModel::TRANSITION_BOOKMARK,
|
| DataUseTabModel::TRANSITION_HISTORY_ITEM};
|
| std::vector<std::string> app_package_names, domain_regexes, labels;
|
| - int32_t tab_id = 1;
|
| + SessionID::id_type tab_id = 1;
|
|
|
| app_package_names.push_back(std::string());
|
| domain_regexes.push_back("http://foo.com/");
|
|
|