Chromium Code Reviews| 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..b2d35a4e35e2bb71525e3137d2cacc12c14b1ddf 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 |
| @@ -4,21 +4,24 @@ |
| #include "chrome/browser/android/data_usage/data_use_tab_model.h" |
|
sclittle
2015/11/24 04:11:51
You still need <stdint.h> for the int32_t's used i
tbansal1
2015/11/24 20:01:12
Done.
|
| -#include <stdint.h> |
| - |
| #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" |
| #include "base/time/time.h" |
| #include "chrome/browser/android/data_usage/external_data_use_observer.h" |
| #include "chrome/browser/android/data_usage/tab_data_use_entry.h" |
| +#include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| #include "components/data_usage/core/data_use.h" |
| #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 "net/base/network_change_notifier.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| @@ -71,27 +74,34 @@ class DataUseTabModelNowTest : public DataUseTabModel { |
| base::TimeDelta now_offset_; |
| }; |
| -class DataUseTabModelTest : public testing::Test { |
| +class DataUseTabModelTest : public ChromeRenderViewHostTestHarness { |
| public: |
| DataUseTabModelTest() {} |
| protected: |
| void SetUp() override { |
| + ChromeRenderViewHostTestHarness::SetUp(); |
| + |
| data_use_aggregator_.reset(new data_usage::DataUseAggregator( |
| 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 +114,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 +123,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 +147,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 +162,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); |
| } |
| @@ -174,14 +185,25 @@ class DataUseTabModelTest : public testing::Test { |
| // 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. |
| 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 +271,27 @@ 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, 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, |
| + 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,7 +310,15 @@ TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) { |
| EndTrackingDataUse(kTabID2); |
| EndTrackingDataUse(kTabID3); |
| - message_loop_.RunUntilIdle(); |
| + base::RunLoop().RunUntilIdle(); |
| + |
| + for (auto& mock_observer : mock_observers) { |
| + // Remove the observer. |
| + data_use_tab_model_->RemoveObserver(&mock_observer); |
| + --expected_observer_count; |
| + EXPECT_EQ(expected_observer_count, data_use_tab_model_->observers_.size()); |
| + } |
| + EXPECT_EQ(0U, data_use_tab_model_->observers_.size()); |
| } |
| // Checks that the observer is not notified of start and end events after |
| @@ -294,11 +330,13 @@ TEST_F(DataUseTabModelTest, ObserverNotNotifiedAfterRemove) { |
| EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); |
| EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(1); |
| - data_use_tab_model_->AddObserver(&mock_observer); |
| + EXPECT_EQ(0U, data_use_tab_model_->observers_.size()); |
| + data_use_tab_model_->AddObserver(&mock_observer, mock_observer.GetWeakPtr()); |
| + EXPECT_EQ(1U, data_use_tab_model_->observers_.size()); |
| StartTrackingDataUse(kTabID1, kTestLabel1); |
| EndTrackingDataUse(kTabID1); |
| - message_loop_.RunUntilIdle(); |
| + base::RunLoop().RunUntilIdle(); |
| testing::Mock::VerifyAndClear(&mock_observer); |
| // Observer should not be notified after RemoveObserver. |
| @@ -306,10 +344,11 @@ TEST_F(DataUseTabModelTest, ObserverNotNotifiedAfterRemove) { |
| EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(0); |
| data_use_tab_model_->RemoveObserver(&mock_observer); |
| + EXPECT_EQ(0U, data_use_tab_model_->observers_.size()); |
| 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 +387,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, mock_observer.GetWeakPtr()); |
| ExpectTabEntrySize(TabEntrySize::THREE); |
| EXPECT_TRUE(IsTrackingDataUse(kTabID1)); |
| @@ -359,7 +398,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 +407,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 +417,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 +432,8 @@ TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) { |
| ++tab_id; |
| } |
| - uint32_t oldest_tab_id = 1; // oldest tab entry that will be removed first. |
| + SessionID::id_type oldest_tab_id = |
| + 1; // oldest tab entry that will be removed first. |
| // Starting and ending more tracking tab entries does not increase the size of |
| // |active_tabs_|. |
| @@ -461,8 +502,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 +600,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 +618,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 +648,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/"); |