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..f7ebe7c477ab447ed39afbf4577e9314bc73b5ba 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,17 +8,21 @@ |
#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 "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,20 +75,27 @@ 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_); |
@@ -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: |
+ MockTabDataUseObserver() : weak_ptr_factory_(this) {} |
MOCK_METHOD1(NotifyTrackingStarting, void(int32_t tab_id)); |
MOCK_METHOD1(NotifyTrackingEnding, void(int32_t 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)); |
@@ -558,11 +597,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. |
@@ -611,9 +645,6 @@ 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; |