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 f2bf80006ca4b630a8cea6537f7ef91393b09110..cd2a2df64278d8014adca690015216a838e78d20 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 |
@@ -10,6 +10,7 @@ |
#include "base/message_loop/message_loop.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" |
@@ -44,32 +45,34 @@ namespace android { |
class DataUseTabModelTest : public testing::Test { |
public: |
- DataUseTabModelTest() : data_use_tab_model_(nullptr, task_runner_.get()) { |
+ DataUseTabModelTest() {} |
+ |
+ protected: |
+ void SetUp() override { |
// TODO(rajendrant): Create a mock class for ExternalDataUseObserver to |
// spoof the Matches call and test the OnNavigationEvent. |
+ data_use_tab_model_.reset(new DataUseTabModel(nullptr, task_runner_.get())); |
} |
- void SetUp() override {} |
- |
base::SingleThreadTaskRunner* task_runner() { return task_runner_.get(); } |
// Returns true if tab entry for |tab_id| exists in |active_tabs_|. |
bool IsTabEntryExists(int32_t tab_id) const { |
- return data_use_tab_model_.active_tabs_.find(tab_id) != |
- data_use_tab_model_.active_tabs_.end(); |
+ return data_use_tab_model_->active_tabs_.find(tab_id) != |
+ data_use_tab_model_->active_tabs_.end(); |
} |
// Checks if there are |expected_size| tab entries being tracked in |
// |active_tabs_|. |
void ExpectTabEntrySize(uint32_t expected_size) const { |
- EXPECT_EQ(expected_size, data_use_tab_model_.active_tabs_.size()); |
+ EXPECT_EQ(expected_size, data_use_tab_model_->active_tabs_.size()); |
} |
// Returns true if the tracking session for tab with id |tab_id| is currently |
// active. |
bool IsTrackingDataUse(int32_t 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()) |
+ 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; |
return tab_entry_iterator->second.IsTrackingDataUse(); |
} |
@@ -110,13 +113,21 @@ class DataUseTabModelTest : public testing::Test { |
std::string(), 1000, 1000); |
std::string actual_label; |
bool actual_return = |
- data_use_tab_model_.GetLabelForDataUse(data_use, &actual_label); |
+ data_use_tab_model_->GetLabelForDataUse(data_use, &actual_label); |
EXPECT_EQ(expected_return, actual_return); |
EXPECT_EQ(expected_label, actual_label); |
} |
+ void StartTrackingDataUse(int32_t tab_id, const std::string& label) { |
tbansal1
2015/11/16 17:17:38
It would be easier if DataUseTabModelTest was a de
Raj
2015/11/16 20:09:36
DataUseTabModelTest derives from testing::Test.
No
|
+ data_use_tab_model_->StartTrackingDataUse(tab_id, label); |
+ } |
+ |
+ void EndTrackingDataUse(int32_t tab_id) { |
+ data_use_tab_model_->EndTrackingDataUse(tab_id); |
+ } |
+ |
scoped_refptr<base::SingleThreadTaskRunner> task_runner_; |
tbansal1
2015/11/16 17:17:38
#include the file for SingleThreadTaskRunner.
Raj
2015/11/16 20:09:36
Done.
|
- DataUseTabModel data_use_tab_model_; |
+ scoped_ptr<DataUseTabModel> data_use_tab_model_; |
base::MessageLoop message_loop_; |
}; |
@@ -136,14 +147,14 @@ TEST_F(DataUseTabModelTest, SingleTabTracking) { |
ExpectEmptyDataUseLabel(kTabID1); |
ExpectEmptyDataUseLabel(kTabID2); |
- data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); |
+ StartTrackingDataUse(kTabID1, kTestLabel1); |
ExpectTabEntrySize(TabEntrySize::ONE); |
EXPECT_TRUE(IsTrackingDataUse(kTabID1)); |
ExpectDataUseLabel(kTabID1, kTestLabel1); |
ExpectEmptyDataUseLabel(kTabID2); |
- data_use_tab_model_.EndTrackingDataUse(kTabID1); |
+ EndTrackingDataUse(kTabID1); |
ExpectTabEntrySize(TabEntrySize::ONE); |
EXPECT_FALSE(IsTrackingDataUse(kTabID1)); |
} |
@@ -156,9 +167,9 @@ TEST_F(DataUseTabModelTest, MultipleTabTracking) { |
ExpectEmptyDataUseLabel(kTabID2); |
ExpectEmptyDataUseLabel(kTabID3); |
- data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); |
- data_use_tab_model_.StartTrackingDataUse(kTabID2, kTestLabel2); |
- data_use_tab_model_.StartTrackingDataUse(kTabID3, kTestLabel3); |
+ StartTrackingDataUse(kTabID1, kTestLabel1); |
+ StartTrackingDataUse(kTabID2, kTestLabel2); |
+ StartTrackingDataUse(kTabID3, kTestLabel3); |
ExpectTabEntrySize(TabEntrySize::THREE); |
EXPECT_TRUE(IsTrackingDataUse(kTabID1)); |
@@ -168,9 +179,9 @@ TEST_F(DataUseTabModelTest, MultipleTabTracking) { |
ExpectDataUseLabel(kTabID2, kTestLabel2); |
ExpectDataUseLabel(kTabID3, kTestLabel3); |
- data_use_tab_model_.EndTrackingDataUse(kTabID1); |
- data_use_tab_model_.EndTrackingDataUse(kTabID2); |
- data_use_tab_model_.EndTrackingDataUse(kTabID3); |
+ EndTrackingDataUse(kTabID1); |
+ EndTrackingDataUse(kTabID2); |
+ EndTrackingDataUse(kTabID3); |
ExpectTabEntrySize(TabEntrySize::THREE); |
EXPECT_FALSE(IsTrackingDataUse(kTabID1)); |
EXPECT_FALSE(IsTrackingDataUse(kTabID2)); |
@@ -192,9 +203,9 @@ 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_.StartTrackingDataUse(kTabID1, kTestLabel1); |
- data_use_tab_model_.EndTrackingDataUse(kTabID1); |
+ data_use_tab_model_->AddObserver(&mock_observer); |
+ StartTrackingDataUse(kTabID1, kTestLabel1); |
+ EndTrackingDataUse(kTabID1); |
message_loop_.RunUntilIdle(); |
} |
@@ -206,7 +217,7 @@ TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) { |
for (auto& mock_observer : mock_observers) { |
// Add the observer. |
- data_use_tab_model_.AddObserver(&mock_observer); |
+ data_use_tab_model_->AddObserver(&mock_observer); |
// Expect start and end events for tab ids 1-3. |
EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(1); |
@@ -218,12 +229,12 @@ TEST_F(DataUseTabModelTest, MultipleObserverMultipleStartEndEvents) { |
} |
// Start and end tracking for tab ids 1-3. |
- data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); |
- data_use_tab_model_.StartTrackingDataUse(kTabID2, kTestLabel2); |
- data_use_tab_model_.StartTrackingDataUse(kTabID3, kTestLabel3); |
- data_use_tab_model_.EndTrackingDataUse(kTabID1); |
- data_use_tab_model_.EndTrackingDataUse(kTabID2); |
- data_use_tab_model_.EndTrackingDataUse(kTabID3); |
+ StartTrackingDataUse(kTabID1, kTestLabel1); |
+ StartTrackingDataUse(kTabID2, kTestLabel2); |
+ StartTrackingDataUse(kTabID3, kTestLabel3); |
+ EndTrackingDataUse(kTabID1); |
+ EndTrackingDataUse(kTabID2); |
+ EndTrackingDataUse(kTabID3); |
message_loop_.RunUntilIdle(); |
} |
@@ -237,9 +248,9 @@ 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); |
- data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); |
- data_use_tab_model_.EndTrackingDataUse(kTabID1); |
+ data_use_tab_model_->AddObserver(&mock_observer); |
+ StartTrackingDataUse(kTabID1, kTestLabel1); |
+ EndTrackingDataUse(kTabID1); |
message_loop_.RunUntilIdle(); |
testing::Mock::VerifyAndClear(&mock_observer); |
@@ -248,35 +259,35 @@ TEST_F(DataUseTabModelTest, ObserverNotNotifiedAfterRemove) { |
EXPECT_CALL(mock_observer, NotifyTrackingStarting(kTabID1)).Times(0); |
EXPECT_CALL(mock_observer, NotifyTrackingEnding(kTabID1)).Times(0); |
- data_use_tab_model_.RemoveObserver(&mock_observer); |
- data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); |
- data_use_tab_model_.EndTrackingDataUse(kTabID1); |
+ data_use_tab_model_->RemoveObserver(&mock_observer); |
+ StartTrackingDataUse(kTabID1, kTestLabel1); |
+ EndTrackingDataUse(kTabID1); |
message_loop_.RunUntilIdle(); |
} |
// Checks that tab close event updates the close time of the tab entry. |
TEST_F(DataUseTabModelTest, TabCloseEvent) { |
- data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); |
- data_use_tab_model_.EndTrackingDataUse(kTabID1); |
+ StartTrackingDataUse(kTabID1, kTestLabel1); |
+ EndTrackingDataUse(kTabID1); |
ExpectTabEntrySize(TabEntrySize::ONE); |
EXPECT_TRUE( |
- data_use_tab_model_.active_tabs_[kTabID1].tab_close_time_.is_null()); |
+ data_use_tab_model_->active_tabs_[kTabID1].tab_close_time_.is_null()); |
- data_use_tab_model_.OnTabCloseEvent(kTabID1); |
+ data_use_tab_model_->OnTabCloseEvent(kTabID1); |
ExpectTabEntrySize(TabEntrySize::ONE); |
EXPECT_FALSE( |
- data_use_tab_model_.active_tabs_[kTabID1].tab_close_time_.is_null()); |
+ data_use_tab_model_->active_tabs_[kTabID1].tab_close_time_.is_null()); |
} |
// Checks that tab close event ends the active tracking session for the tab. |
TEST_F(DataUseTabModelTest, TabCloseEventEndsTracking) { |
- data_use_tab_model_.StartTrackingDataUse(kTabID1, kTestLabel1); |
+ StartTrackingDataUse(kTabID1, kTestLabel1); |
EXPECT_TRUE(IsTrackingDataUse(kTabID1)); |
- data_use_tab_model_.OnTabCloseEvent(kTabID1); |
+ data_use_tab_model_->OnTabCloseEvent(kTabID1); |
EXPECT_FALSE(IsTrackingDataUse(kTabID1)); |
// Future data use object should be labeled as an empty string. |
@@ -293,9 +304,9 @@ TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) { |
ExpectTabEntrySize(TabEntrySize::ZERO); |
while (tab_id <= max_tab_entries) { |
- std::string tab_label = base::StringPrintf("track_label_%d", tab_id); |
- data_use_tab_model_.StartTrackingDataUse(tab_id, tab_label); |
- data_use_tab_model_.EndTrackingDataUse(tab_id); |
+ std::string tab_label = base::StringPrintf("label_%d", tab_id); |
+ StartTrackingDataUse(tab_id, tab_label); |
+ EndTrackingDataUse(tab_id); |
ExpectTabEntrySize(tab_id); |
++tab_id; |
@@ -308,8 +319,8 @@ TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) { |
while (tab_id < max_tab_entries + 10) { |
EXPECT_TRUE(IsTabEntryExists(oldest_tab_id)); |
std::string tab_label = base::StringPrintf("label_%d", tab_id); |
- data_use_tab_model_.StartTrackingDataUse(tab_id, tab_label); |
- data_use_tab_model_.EndTrackingDataUse(tab_id); |
+ StartTrackingDataUse(tab_id, tab_label); |
+ EndTrackingDataUse(tab_id); |
// Oldest entry got removed. |
EXPECT_FALSE(IsTabEntryExists(oldest_tab_id)); |
@@ -324,7 +335,7 @@ TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) { |
while (tab_id < max_tab_entries + 20) { |
EXPECT_TRUE(IsTabEntryExists(oldest_tab_id)); |
std::string tab_label = base::StringPrintf("label_%d", tab_id); |
- data_use_tab_model_.StartTrackingDataUse(tab_id, tab_label); |
+ StartTrackingDataUse(tab_id, tab_label); |
// Oldest entry got removed. |
EXPECT_FALSE(IsTabEntryExists(oldest_tab_id)); |
@@ -335,6 +346,97 @@ TEST_F(DataUseTabModelTest, CompactTabEntriesWithinMaxLimit) { |
} |
} |
+// Test version of |MockDataUseTabModel|, which permits mocking of calls to Now. |
tbansal1
2015/11/16 17:17:38
I don't understand why this class is needed. Is it
Raj
2015/11/16 20:09:36
Removed the word 'mock', since not using gmock her
|
+class MockDataUseTabModel : public DataUseTabModel { |
+ public: |
+ MockDataUseTabModel( |
+ const ExternalDataUseObserver* data_use_observer, |
+ scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner) |
+ : DataUseTabModel(data_use_observer, ui_task_runner) {} |
+ |
+ ~MockDataUseTabModel() override {} |
+ |
+ void AdvanceTime(base::TimeDelta now_offset) { now_offset_ = now_offset; } |
+ |
+ private: |
+ // Returns the mocked time as Now. |
+ base::TimeTicks Now() const override { |
+ return base::TimeTicks::Now() + now_offset_; |
+ } |
+ |
+ // Represents the delta offset to be added to current time that is returned by |
+ // Now. |
+ base::TimeDelta now_offset_; |
+}; |
+ |
+class MockDataUseTabModelTest : public DataUseTabModelTest { |
+ protected: |
+ void SetUp() override { |
+ mock_data_use_tab_model_ = |
+ new MockDataUseTabModel(nullptr, task_runner_.get()); |
+ data_use_tab_model_.reset(mock_data_use_tab_model_); |
+ } |
+ MockDataUseTabModel* mock_data_use_tab_model_; |
+}; |
+ |
+TEST_F(MockDataUseTabModelTest, ExpiredInactiveTabEntryRemovaltimeHistogram) { |
+ const char kUMAExpiredInactiveTabEntryRemovaltimeSecondsHistogram[] = |
+ "DataUse.TabModel.ExpiredInactiveTabEntryRemovaltime"; |
+ base::HistogramTester histogram_tester; |
+ |
+ StartTrackingDataUse(kTabID1, kTestLabel1); |
+ EndTrackingDataUse(kTabID1); |
+ EXPECT_FALSE(IsTrackingDataUse(kTabID1)); |
+ mock_data_use_tab_model_->OnTabCloseEvent(kTabID1); |
+ |
+ // Fake tab close time to make it as expired. |
+ EXPECT_TRUE(IsTabEntryExists(kTabID1)); |
+ auto& tab_entry = mock_data_use_tab_model_->active_tabs_[kTabID1]; |
+ EXPECT_FALSE(tab_entry.tab_close_time_.is_null()); |
+ tab_entry.tab_close_time_ -= base::TimeDelta::FromSeconds( |
+ TabDataUseEntry::GetClosedTabExpirationDurationSecondsForTests() + 1); |
+ EXPECT_TRUE(tab_entry.IsExpired()); |
+ |
+ // Fast forward 50 seconds. |
+ mock_data_use_tab_model_->AdvanceTime(base::TimeDelta::FromSeconds(50)); |
+ |
+ mock_data_use_tab_model_->CompactTabEntries(); |
+ EXPECT_FALSE(IsTabEntryExists(kTabID1)); |
+ |
+ histogram_tester.ExpectTotalCount( |
+ kUMAExpiredInactiveTabEntryRemovaltimeSecondsHistogram, 1); |
+ histogram_tester.ExpectBucketCount( |
+ kUMAExpiredInactiveTabEntryRemovaltimeSecondsHistogram, 50, 1); |
+} |
+ |
+TEST_F(MockDataUseTabModelTest, UnexpiredTabEntryRemovaltimeHistogram) { |
+ const char kUMAUnexpiredTabEntryRemovaltimeMinutesHistogram[] = |
+ "DataUse.TabModel.UnexpiredTabEntryLifetime"; |
+ base::HistogramTester histogram_tester; |
+ const size_t max_tab_entries = DataUseTabModel::GetMaxTabEntriesForTests(); |
+ uint32_t tab_id = 1; |
+ |
+ while (tab_id <= max_tab_entries) { |
+ std::string tab_label = base::StringPrintf("label_%d", tab_id); |
+ StartTrackingDataUse(tab_id, tab_label); |
+ EndTrackingDataUse(tab_id); |
+ ++tab_id; |
+ } |
+ |
+ // Fast forward 10 minutes. |
+ mock_data_use_tab_model_->AdvanceTime(base::TimeDelta::FromMinutes(10)); |
+ |
+ // Adding another tab entry triggers CompactTabEntries. |
+ std::string tab_label = base::StringPrintf("label_%d", tab_id); |
+ StartTrackingDataUse(tab_id, tab_label); |
+ EndTrackingDataUse(tab_id); |
+ |
+ histogram_tester.ExpectTotalCount( |
+ kUMAUnexpiredTabEntryRemovaltimeMinutesHistogram, 1); |
+ histogram_tester.ExpectBucketCount( |
+ kUMAUnexpiredTabEntryRemovaltimeMinutesHistogram, 10, 1); |
+} |
+ |
} // namespace android |
} // namespace chrome |