media_router_metrics_unittest.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/media_router/browser/media_router_metrics.h"
  5. #include <string>
  6. #include "base/bind.h"
  7. #include "base/callback.h"
  8. #include "base/metrics/histogram_macros.h"
  9. #include "base/strings/strcat.h"
  10. #include "base/test/metrics/histogram_tester.h"
  11. #include "base/test/simple_test_clock.h"
  12. #include "base/time/time.h"
  13. #include "components/media_router/common/media_sink.h"
  14. #include "testing/gmock/include/gmock/gmock.h"
  15. #include "testing/gtest/include/gtest/gtest.h"
  16. #include "url/gurl.h"
  17. using base::Bucket;
  18. using testing::ElementsAre;
  19. namespace media_router {
  20. namespace {
  21. // Tests that calling |recording_cb| with a TimeDelta records it in
  22. // |histogram_name|.
  23. void TestRecordTimeDeltaMetric(
  24. base::RepeatingCallback<void(const base::TimeDelta&)> recording_cb,
  25. const std::string& histogram_name) {
  26. base::HistogramTester tester;
  27. const base::TimeDelta delta = base::Milliseconds(10);
  28. tester.ExpectTotalCount(histogram_name, 0);
  29. recording_cb.Run(delta);
  30. tester.ExpectUniqueSample(histogram_name, delta.InMilliseconds(), 1);
  31. }
  32. // Tests that calling |recording_cb| with boolean values records them in
  33. // |histogram_name|.
  34. void TestRecordBooleanMetric(base::RepeatingCallback<void(bool)> recording_cb,
  35. const std::string& histogram_name) {
  36. base::HistogramTester tester;
  37. tester.ExpectTotalCount(histogram_name, 0);
  38. recording_cb.Run(true);
  39. recording_cb.Run(false);
  40. recording_cb.Run(true);
  41. tester.ExpectTotalCount(histogram_name, 3);
  42. EXPECT_THAT(tester.GetAllSamples(histogram_name),
  43. ElementsAre(Bucket(false, 1), Bucket(true, 2)));
  44. }
  45. // Tests that |record_cb| records metrics for each MediaRouteProvider in a
  46. // histogram specific to the provider.
  47. void TestRouteResultCodeHistogramsWithProviders(
  48. base::RepeatingCallback<void(mojom::RouteRequestResultCode,
  49. absl::optional<mojom::MediaRouteProviderId>)>
  50. record_cb,
  51. mojom::MediaRouteProviderId provider1,
  52. const std::string& histogram_provider1,
  53. mojom::MediaRouteProviderId provider2,
  54. const std::string& histogram_provider2) {
  55. base::HistogramTester tester;
  56. tester.ExpectTotalCount(histogram_provider1, 0);
  57. tester.ExpectTotalCount(histogram_provider2, 0);
  58. record_cb.Run(mojom::RouteRequestResultCode::SINK_NOT_FOUND, provider1);
  59. record_cb.Run(mojom::RouteRequestResultCode::OK, provider2);
  60. record_cb.Run(mojom::RouteRequestResultCode::SINK_NOT_FOUND, provider1);
  61. record_cb.Run(mojom::RouteRequestResultCode::ROUTE_NOT_FOUND, provider2);
  62. record_cb.Run(mojom::RouteRequestResultCode::OK, provider1);
  63. tester.ExpectTotalCount(histogram_provider1, 3);
  64. EXPECT_THAT(
  65. tester.GetAllSamples(histogram_provider1),
  66. ElementsAre(
  67. Bucket(static_cast<int>(mojom::RouteRequestResultCode::OK), 1),
  68. Bucket(
  69. static_cast<int>(mojom::RouteRequestResultCode::SINK_NOT_FOUND),
  70. 2)));
  71. tester.ExpectTotalCount(histogram_provider2, 2);
  72. EXPECT_THAT(
  73. tester.GetAllSamples(histogram_provider2),
  74. ElementsAre(
  75. Bucket(static_cast<int>(mojom::RouteRequestResultCode::OK), 1),
  76. Bucket(
  77. static_cast<int>(mojom::RouteRequestResultCode::ROUTE_NOT_FOUND),
  78. 1)));
  79. }
  80. void TestRouteResultCodeHistograms(
  81. base::RepeatingCallback<void(mojom::RouteRequestResultCode,
  82. absl::optional<mojom::MediaRouteProviderId>)>
  83. record_cb,
  84. const std::string& base_histogram_name) {
  85. TestRouteResultCodeHistogramsWithProviders(
  86. record_cb, mojom::MediaRouteProviderId::WIRED_DISPLAY,
  87. base_histogram_name + ".WiredDisplay", mojom::MediaRouteProviderId::DIAL,
  88. base_histogram_name + ".DIAL");
  89. TestRouteResultCodeHistogramsWithProviders(
  90. record_cb, mojom::MediaRouteProviderId::CAST,
  91. base_histogram_name + ".Cast", mojom::MediaRouteProviderId::ANDROID_CAF,
  92. base_histogram_name + ".AndroidCaf");
  93. }
  94. } // namespace
  95. TEST(MediaRouterMetricsTest, RecordMediaRouterDialogActivationLocation) {
  96. base::HistogramTester tester;
  97. const MediaRouterDialogActivationLocation activation_location1 =
  98. MediaRouterDialogActivationLocation::TOOLBAR;
  99. const MediaRouterDialogActivationLocation activation_location2 =
  100. MediaRouterDialogActivationLocation::CONTEXTUAL_MENU;
  101. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramIconClickLocation, 0);
  102. MediaRouterMetrics::RecordMediaRouterDialogActivationLocation(
  103. activation_location1);
  104. MediaRouterMetrics::RecordMediaRouterDialogActivationLocation(
  105. activation_location2);
  106. MediaRouterMetrics::RecordMediaRouterDialogActivationLocation(
  107. activation_location1);
  108. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramIconClickLocation, 3);
  109. EXPECT_THAT(
  110. tester.GetAllSamples(MediaRouterMetrics::kHistogramIconClickLocation),
  111. ElementsAre(Bucket(static_cast<int>(activation_location1), 2),
  112. Bucket(static_cast<int>(activation_location2), 1)));
  113. }
  114. TEST(MediaRouterMetricsTest, RecordMediaRouterDialogPaint) {
  115. TestRecordTimeDeltaMetric(
  116. base::BindRepeating(&MediaRouterMetrics::RecordMediaRouterDialogPaint),
  117. MediaRouterMetrics::kHistogramUiDialogPaint);
  118. }
  119. TEST(MediaRouterMetricsTest, RecordMediaRouterDialogLoaded) {
  120. TestRecordTimeDeltaMetric(
  121. base::BindRepeating(&MediaRouterMetrics::RecordMediaRouterDialogLoaded),
  122. MediaRouterMetrics::kHistogramUiDialogLoadedWithData);
  123. }
  124. TEST(MediaRouterMetricsTest, RecordCloseDialogLatency) {
  125. TestRecordTimeDeltaMetric(
  126. base::BindRepeating(&MediaRouterMetrics::RecordCloseDialogLatency),
  127. MediaRouterMetrics::kHistogramCloseLatency);
  128. }
  129. TEST(MediaRouterMetricsTest, RecordMediaRouterInitialUserAction) {
  130. base::HistogramTester tester;
  131. const MediaRouterUserAction action1 = MediaRouterUserAction::START_LOCAL;
  132. const MediaRouterUserAction action2 = MediaRouterUserAction::CLOSE;
  133. const MediaRouterUserAction action3 = MediaRouterUserAction::STATUS_REMOTE;
  134. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramUiFirstAction, 0);
  135. MediaRouterMetrics::RecordMediaRouterInitialUserAction(action3);
  136. MediaRouterMetrics::RecordMediaRouterInitialUserAction(action2);
  137. MediaRouterMetrics::RecordMediaRouterInitialUserAction(action3);
  138. MediaRouterMetrics::RecordMediaRouterInitialUserAction(action1);
  139. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramUiFirstAction, 4);
  140. EXPECT_THAT(tester.GetAllSamples(MediaRouterMetrics::kHistogramUiFirstAction),
  141. ElementsAre(Bucket(static_cast<int>(action1), 1),
  142. Bucket(static_cast<int>(action2), 1),
  143. Bucket(static_cast<int>(action3), 2)));
  144. }
  145. TEST(MediaRouterMetricsTest, RecordRouteCreationOutcome) {
  146. base::HistogramTester tester;
  147. const MediaRouterRouteCreationOutcome outcome1 =
  148. MediaRouterRouteCreationOutcome::SUCCESS;
  149. const MediaRouterRouteCreationOutcome outcome2 =
  150. MediaRouterRouteCreationOutcome::FAILURE_NO_ROUTE;
  151. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramRouteCreationOutcome,
  152. 0);
  153. MediaRouterMetrics::RecordRouteCreationOutcome(outcome2);
  154. MediaRouterMetrics::RecordRouteCreationOutcome(outcome1);
  155. MediaRouterMetrics::RecordRouteCreationOutcome(outcome2);
  156. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramRouteCreationOutcome,
  157. 3);
  158. EXPECT_THAT(
  159. tester.GetAllSamples(MediaRouterMetrics::kHistogramRouteCreationOutcome),
  160. ElementsAre(Bucket(static_cast<int>(outcome1), 1),
  161. Bucket(static_cast<int>(outcome2), 2)));
  162. }
  163. TEST(MediaRouterMetricsTest, RecordPresentationUrlType) {
  164. base::HistogramTester tester;
  165. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramPresentationUrlType, 0);
  166. MediaRouterMetrics::RecordPresentationUrlType(GURL("cast:DEADBEEF"));
  167. MediaRouterMetrics::RecordPresentationUrlType(GURL("dial:AppName"));
  168. MediaRouterMetrics::RecordPresentationUrlType(GURL("cast-dial:AppName"));
  169. MediaRouterMetrics::RecordPresentationUrlType(GURL("https://example.com"));
  170. MediaRouterMetrics::RecordPresentationUrlType(GURL("http://example.com"));
  171. MediaRouterMetrics::RecordPresentationUrlType(
  172. GURL("https://google.com/cast#__castAppId__=DEADBEEF"));
  173. MediaRouterMetrics::RecordPresentationUrlType(GURL("remote-playback:foo"));
  174. MediaRouterMetrics::RecordPresentationUrlType(GURL("test:test"));
  175. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramPresentationUrlType, 8);
  176. EXPECT_THAT(
  177. tester.GetAllSamples(MediaRouterMetrics::kHistogramPresentationUrlType),
  178. ElementsAre(
  179. Bucket(static_cast<int>(PresentationUrlType::kOther), 1),
  180. Bucket(static_cast<int>(PresentationUrlType::kCast), 1),
  181. Bucket(static_cast<int>(PresentationUrlType::kCastDial), 1),
  182. Bucket(static_cast<int>(PresentationUrlType::kCastLegacy), 1),
  183. Bucket(static_cast<int>(PresentationUrlType::kDial), 1),
  184. Bucket(static_cast<int>(PresentationUrlType::kHttp), 1),
  185. Bucket(static_cast<int>(PresentationUrlType::kHttps), 1),
  186. Bucket(static_cast<int>(PresentationUrlType::kRemotePlayback), 1)));
  187. }
  188. TEST(MediaRouterMetricsTest, RecordMediaSinkType) {
  189. base::HistogramTester tester;
  190. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramMediaSinkType, 0);
  191. MediaRouterMetrics::RecordMediaSinkType(SinkIconType::WIRED_DISPLAY);
  192. MediaRouterMetrics::RecordMediaSinkType(SinkIconType::CAST);
  193. MediaRouterMetrics::RecordMediaSinkType(SinkIconType::CAST_AUDIO);
  194. MediaRouterMetrics::RecordMediaSinkType(SinkIconType::CAST);
  195. MediaRouterMetrics::RecordMediaSinkType(SinkIconType::GENERIC);
  196. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramMediaSinkType, 5);
  197. EXPECT_THAT(
  198. tester.GetAllSamples(MediaRouterMetrics::kHistogramMediaSinkType),
  199. ElementsAre(Bucket(static_cast<int>(SinkIconType::CAST), 2),
  200. Bucket(static_cast<int>(SinkIconType::CAST_AUDIO), 1),
  201. Bucket(static_cast<int>(SinkIconType::WIRED_DISPLAY), 1),
  202. Bucket(static_cast<int>(SinkIconType::GENERIC), 1)));
  203. }
  204. TEST(MediaRouterMetricsTest, RecordDeviceCount) {
  205. base::HistogramTester tester;
  206. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramUiDeviceCount, 0);
  207. MediaRouterMetrics::RecordDeviceCount(30);
  208. MediaRouterMetrics::RecordDeviceCount(0);
  209. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramUiDeviceCount, 2);
  210. EXPECT_THAT(tester.GetAllSamples(MediaRouterMetrics::kHistogramUiDeviceCount),
  211. ElementsAre(Bucket(0, 1), Bucket(30, 1)));
  212. }
  213. TEST(MediaRouterMetricsTest, RecordStartRouteDeviceIndex) {
  214. base::HistogramTester tester;
  215. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramStartLocalPosition, 0);
  216. MediaRouterMetrics::RecordStartRouteDeviceIndex(30);
  217. MediaRouterMetrics::RecordStartRouteDeviceIndex(0);
  218. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramStartLocalPosition, 2);
  219. EXPECT_THAT(
  220. tester.GetAllSamples(MediaRouterMetrics::kHistogramStartLocalPosition),
  221. ElementsAre(Bucket(0, 1), Bucket(30, 1)));
  222. }
  223. TEST(MediaRouterMetricsTest, RecordStartLocalSessionLatency) {
  224. TestRecordTimeDeltaMetric(
  225. base::BindRepeating(&MediaRouterMetrics::RecordStartLocalSessionLatency),
  226. MediaRouterMetrics::kHistogramStartLocalLatency);
  227. }
  228. TEST(MediaRouterMetricsTest, RecordStartLocalSessionSuccessful) {
  229. TestRecordBooleanMetric(
  230. base::BindRepeating(
  231. &MediaRouterMetrics::RecordStartLocalSessionSuccessful),
  232. MediaRouterMetrics::kHistogramStartLocalSessionSuccessful);
  233. }
  234. TEST(MediaRouterMetricsTest, RecordStopRoute) {
  235. base::HistogramTester tester;
  236. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramStopRoute, 0);
  237. MediaRouterMetrics::RecordStopLocalRoute();
  238. MediaRouterMetrics::RecordStopRemoteRoute();
  239. MediaRouterMetrics::RecordStopLocalRoute();
  240. tester.ExpectTotalCount(MediaRouterMetrics::kHistogramStopRoute, 3);
  241. EXPECT_THAT(tester.GetAllSamples(MediaRouterMetrics::kHistogramStopRoute),
  242. ElementsAre(Bucket(/* Local route */ 0, 2),
  243. Bucket(/* Remote route */ 1, 1)));
  244. }
  245. TEST(MediaRouterMetricsTest, RecordIconStateAtDialogOpen) {
  246. TestRecordBooleanMetric(
  247. base::BindRepeating(&MediaRouterMetrics::RecordIconStateAtDialogOpen),
  248. MediaRouterMetrics::kHistogramUiDialogIconStateAtOpen);
  249. }
  250. TEST(MediaRouterMetricsTest, RecordIconStateAtInit) {
  251. TestRecordBooleanMetric(
  252. base::BindRepeating(&MediaRouterMetrics::RecordIconStateAtInit),
  253. MediaRouterMetrics::kHistogramUiIconStateAtInit);
  254. }
  255. TEST(MediaRouterMetricsTest, RecordCreateRouteResultCode) {
  256. TestRouteResultCodeHistograms(
  257. base::BindRepeating(&MediaRouterMetrics::RecordCreateRouteResultCode),
  258. "MediaRouter.Provider.CreateRoute.Result");
  259. }
  260. TEST(MediaRouterMetricsTest, RecordJoinRouteResultCode) {
  261. TestRouteResultCodeHistograms(
  262. base::BindRepeating(&MediaRouterMetrics::RecordJoinRouteResultCode),
  263. "MediaRouter.Provider.JoinRoute.Result");
  264. }
  265. TEST(MediaRouterMetricsTest, RecordTerminateRouteResultCode) {
  266. TestRouteResultCodeHistograms(
  267. base::BindRepeating(
  268. &MediaRouterMetrics::RecordMediaRouteProviderTerminateRoute),
  269. "MediaRouter.Provider.TerminateRoute.Result");
  270. }
  271. } // namespace media_router