Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(513)

Unified Diff: chrome/browser/android/data_usage/data_use_tab_model_unittest.cc

Issue 1444133002: Add UMA histograms for data usage tab model (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698