Index: components/data_use_measurement/core/data_use_measurement_unittest.cc |
diff --git a/components/data_use_measurement/core/data_use_measurement_unittest.cc b/components/data_use_measurement/core/data_use_measurement_unittest.cc |
index 6f0f66dbe9a656bef997d4969fa66a6be56435e7..e478605435514e92f93b03da20a8c5a5f6740368 100644 |
--- a/components/data_use_measurement/core/data_use_measurement_unittest.cc |
+++ b/components/data_use_measurement/core/data_use_measurement_unittest.cc |
@@ -12,6 +12,8 @@ |
#include "base/run_loop.h" |
#include "base/test/histogram_tester.h" |
#include "build/build_config.h" |
+#include "components/data_use_measurement/core/data_use_ascriber.h" |
+#include "components/data_use_measurement/core/data_use_recorder.h" |
#include "components/data_use_measurement/core/url_request_classifier.h" |
#include "net/base/network_change_notifier.h" |
#include "net/base/request_priority.h" |
@@ -41,6 +43,30 @@ class UserRequestUserDataForTesting : public base::SupportsUserData::Data, |
} |
}; |
+class TestDataUseAscriber : public DataUseAscriber { |
+ public: |
+ TestDataUseAscriber() {} |
+ |
+ DataUseRecorder* GetOrCreateDataUseRecorder( |
+ net::URLRequest* request) override { |
+ return &recorder_; |
+ } |
+ |
+ DataUseRecorder* GetDataUseRecorder(const net::URLRequest& request) override { |
+ return &recorder_; |
+ } |
+ |
+ std::unique_ptr<URLRequestClassifier> CreateURLRequestClassifier() |
+ const override { |
+ return nullptr; |
+ } |
+ |
+ void SetTabVisibility(bool visible) { recorder_.set_is_visible(visible); } |
+ |
+ private: |
+ DataUseRecorder recorder_; |
+}; |
+ |
// The more usual initialization of kUserDataKey would be along the lines of |
// const void* const UserRequestUserDataForTesting::kUserDataKey = |
// &UserRequestUserDataForTesting::kUserDataKey; |
@@ -63,7 +89,8 @@ class DataUseMeasurementTest : public testing::Test { |
: data_use_measurement_( |
base::MakeUnique<UserRequestUserDataForTesting>(), |
base::Bind(&DataUseMeasurementTest::FakeDataUseforwarder, |
- base::Unretained(this))) { |
+ base::Unretained(this)), |
+ &ascriber_) { |
// During the test it is expected to not have cellular connection. |
DCHECK(!net::NetworkChangeNotifier::IsConnectionCellular( |
net::NetworkChangeNotifier::GetConnectionType())); |
@@ -165,7 +192,10 @@ class DataUseMeasurementTest : public testing::Test { |
} |
base::MessageLoopForIO loop_; |
+ |
+ TestDataUseAscriber ascriber_; |
DataUseMeasurement data_use_measurement_; |
+ |
std::unique_ptr<net::MockClientSocketFactory> socket_factory_; |
std::unique_ptr<net::TestURLRequestContext> context_; |
const std::string kConnectionType = "NotCellular"; |
@@ -342,6 +372,48 @@ TEST_F(DataUseMeasurementTest, TimeOfBackgroundDownstreamBytes) { |
"DataUse.BackgroundToFirstDownstream.User", 0); |
} |
} |
+ |
+TEST_F(DataUseMeasurementTest, AppTabState) { |
+ base::HistogramTester histogram_tester; |
+ std::unique_ptr<net::URLRequest> request = CreateTestRequest(kUserRequest); |
+ |
+ // App in foreground, Tab in background. |
+ data_use_measurement_.OnBeforeURLRequest(request.get()); |
+ data_use_measurement_.OnNetworkBytesReceived(*request, 1000); |
+ data_use_measurement_.OnNetworkBytesSent(*request, 100); |
+ |
+ histogram_tester.ExpectTotalCount( |
+ "DataUse.AppTabState.Upstream.AppForeground.TabBackground", 1); |
+ histogram_tester.ExpectTotalCount( |
+ "DataUse.AppTabState.Downstream.AppForeground.TabBackground", 1); |
+ |
+ // App and Tab in foreground. |
+ ascriber_.SetTabVisibility(true); |
+ data_use_measurement_.OnBeforeURLRequest(request.get()); |
+ data_use_measurement_.OnNetworkBytesReceived(*request, 1000); |
+ data_use_measurement_.OnNetworkBytesSent(*request, 100); |
+ |
+ histogram_tester.ExpectTotalCount( |
+ "DataUse.AppTabState.Upstream.AppForeground.TabForeground", 1); |
+ histogram_tester.ExpectTotalCount( |
+ "DataUse.AppTabState.Downstream.AppForeground.TabForeground", 1); |
+ |
+ // App and Tab in background. |
+ data_use_measurement()->OnApplicationStateChangeForTesting( |
+ base::android::APPLICATION_STATE_HAS_STOPPED_ACTIVITIES); |
+ ascriber_.SetTabVisibility(false); |
+ data_use_measurement_.OnBeforeURLRequest(request.get()); |
+ // First network access changes the app state to UNKNOWN and the next nextwork |
+ // access changes to BACKGROUND. |
+ data_use_measurement_.OnNetworkBytesReceived(*request, 1000); |
+ data_use_measurement_.OnNetworkBytesReceived(*request, 1000); |
+ data_use_measurement_.OnNetworkBytesSent(*request, 100); |
+ |
+ histogram_tester.ExpectTotalCount( |
+ "DataUse.AppTabState.Upstream.AppBackground", 1); |
+ histogram_tester.ExpectTotalCount( |
+ "DataUse.AppTabState.Downstream.AppBackground", 1); |
+} |
#endif |
} // namespace data_use_measurement |