123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321 |
- // Copyright 2016 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "components/media_router/browser/media_router_metrics.h"
- #include <string>
- #include "base/bind.h"
- #include "base/callback.h"
- #include "base/metrics/histogram_macros.h"
- #include "base/strings/strcat.h"
- #include "base/test/metrics/histogram_tester.h"
- #include "base/test/simple_test_clock.h"
- #include "base/time/time.h"
- #include "components/media_router/common/media_sink.h"
- #include "testing/gmock/include/gmock/gmock.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "url/gurl.h"
- using base::Bucket;
- using testing::ElementsAre;
- namespace media_router {
- namespace {
- // Tests that calling |recording_cb| with a TimeDelta records it in
- // |histogram_name|.
- void TestRecordTimeDeltaMetric(
- base::RepeatingCallback<void(const base::TimeDelta&)> recording_cb,
- const std::string& histogram_name) {
- base::HistogramTester tester;
- const base::TimeDelta delta = base::Milliseconds(10);
- tester.ExpectTotalCount(histogram_name, 0);
- recording_cb.Run(delta);
- tester.ExpectUniqueSample(histogram_name, delta.InMilliseconds(), 1);
- }
- // Tests that calling |recording_cb| with boolean values records them in
- // |histogram_name|.
- void TestRecordBooleanMetric(base::RepeatingCallback<void(bool)> recording_cb,
- const std::string& histogram_name) {
- base::HistogramTester tester;
- tester.ExpectTotalCount(histogram_name, 0);
- recording_cb.Run(true);
- recording_cb.Run(false);
- recording_cb.Run(true);
- tester.ExpectTotalCount(histogram_name, 3);
- EXPECT_THAT(tester.GetAllSamples(histogram_name),
- ElementsAre(Bucket(false, 1), Bucket(true, 2)));
- }
- // Tests that |record_cb| records metrics for each MediaRouteProvider in a
- // histogram specific to the provider.
- void TestRouteResultCodeHistogramsWithProviders(
- base::RepeatingCallback<void(mojom::RouteRequestResultCode,
- absl::optional<mojom::MediaRouteProviderId>)>
- record_cb,
- mojom::MediaRouteProviderId provider1,
- const std::string& histogram_provider1,
- mojom::MediaRouteProviderId provider2,
- const std::string& histogram_provider2) {
- base::HistogramTester tester;
- tester.ExpectTotalCount(histogram_provider1, 0);
- tester.ExpectTotalCount(histogram_provider2, 0);
- record_cb.Run(mojom::RouteRequestResultCode::SINK_NOT_FOUND, provider1);
- record_cb.Run(mojom::RouteRequestResultCode::OK, provider2);
- record_cb.Run(mojom::RouteRequestResultCode::SINK_NOT_FOUND, provider1);
- record_cb.Run(mojom::RouteRequestResultCode::ROUTE_NOT_FOUND, provider2);
- record_cb.Run(mojom::RouteRequestResultCode::OK, provider1);
- tester.ExpectTotalCount(histogram_provider1, 3);
- EXPECT_THAT(
- tester.GetAllSamples(histogram_provider1),
- ElementsAre(
- Bucket(static_cast<int>(mojom::RouteRequestResultCode::OK), 1),
- Bucket(
- static_cast<int>(mojom::RouteRequestResultCode::SINK_NOT_FOUND),
- 2)));
- tester.ExpectTotalCount(histogram_provider2, 2);
- EXPECT_THAT(
- tester.GetAllSamples(histogram_provider2),
- ElementsAre(
- Bucket(static_cast<int>(mojom::RouteRequestResultCode::OK), 1),
- Bucket(
- static_cast<int>(mojom::RouteRequestResultCode::ROUTE_NOT_FOUND),
- 1)));
- }
- void TestRouteResultCodeHistograms(
- base::RepeatingCallback<void(mojom::RouteRequestResultCode,
- absl::optional<mojom::MediaRouteProviderId>)>
- record_cb,
- const std::string& base_histogram_name) {
- TestRouteResultCodeHistogramsWithProviders(
- record_cb, mojom::MediaRouteProviderId::WIRED_DISPLAY,
- base_histogram_name + ".WiredDisplay", mojom::MediaRouteProviderId::DIAL,
- base_histogram_name + ".DIAL");
- TestRouteResultCodeHistogramsWithProviders(
- record_cb, mojom::MediaRouteProviderId::CAST,
- base_histogram_name + ".Cast", mojom::MediaRouteProviderId::ANDROID_CAF,
- base_histogram_name + ".AndroidCaf");
- }
- } // namespace
- TEST(MediaRouterMetricsTest, RecordMediaRouterDialogActivationLocation) {
- base::HistogramTester tester;
- const MediaRouterDialogActivationLocation activation_location1 =
- MediaRouterDialogActivationLocation::TOOLBAR;
- const MediaRouterDialogActivationLocation activation_location2 =
- MediaRouterDialogActivationLocation::CONTEXTUAL_MENU;
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramIconClickLocation, 0);
- MediaRouterMetrics::RecordMediaRouterDialogActivationLocation(
- activation_location1);
- MediaRouterMetrics::RecordMediaRouterDialogActivationLocation(
- activation_location2);
- MediaRouterMetrics::RecordMediaRouterDialogActivationLocation(
- activation_location1);
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramIconClickLocation, 3);
- EXPECT_THAT(
- tester.GetAllSamples(MediaRouterMetrics::kHistogramIconClickLocation),
- ElementsAre(Bucket(static_cast<int>(activation_location1), 2),
- Bucket(static_cast<int>(activation_location2), 1)));
- }
- TEST(MediaRouterMetricsTest, RecordMediaRouterDialogPaint) {
- TestRecordTimeDeltaMetric(
- base::BindRepeating(&MediaRouterMetrics::RecordMediaRouterDialogPaint),
- MediaRouterMetrics::kHistogramUiDialogPaint);
- }
- TEST(MediaRouterMetricsTest, RecordMediaRouterDialogLoaded) {
- TestRecordTimeDeltaMetric(
- base::BindRepeating(&MediaRouterMetrics::RecordMediaRouterDialogLoaded),
- MediaRouterMetrics::kHistogramUiDialogLoadedWithData);
- }
- TEST(MediaRouterMetricsTest, RecordCloseDialogLatency) {
- TestRecordTimeDeltaMetric(
- base::BindRepeating(&MediaRouterMetrics::RecordCloseDialogLatency),
- MediaRouterMetrics::kHistogramCloseLatency);
- }
- TEST(MediaRouterMetricsTest, RecordMediaRouterInitialUserAction) {
- base::HistogramTester tester;
- const MediaRouterUserAction action1 = MediaRouterUserAction::START_LOCAL;
- const MediaRouterUserAction action2 = MediaRouterUserAction::CLOSE;
- const MediaRouterUserAction action3 = MediaRouterUserAction::STATUS_REMOTE;
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramUiFirstAction, 0);
- MediaRouterMetrics::RecordMediaRouterInitialUserAction(action3);
- MediaRouterMetrics::RecordMediaRouterInitialUserAction(action2);
- MediaRouterMetrics::RecordMediaRouterInitialUserAction(action3);
- MediaRouterMetrics::RecordMediaRouterInitialUserAction(action1);
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramUiFirstAction, 4);
- EXPECT_THAT(tester.GetAllSamples(MediaRouterMetrics::kHistogramUiFirstAction),
- ElementsAre(Bucket(static_cast<int>(action1), 1),
- Bucket(static_cast<int>(action2), 1),
- Bucket(static_cast<int>(action3), 2)));
- }
- TEST(MediaRouterMetricsTest, RecordRouteCreationOutcome) {
- base::HistogramTester tester;
- const MediaRouterRouteCreationOutcome outcome1 =
- MediaRouterRouteCreationOutcome::SUCCESS;
- const MediaRouterRouteCreationOutcome outcome2 =
- MediaRouterRouteCreationOutcome::FAILURE_NO_ROUTE;
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramRouteCreationOutcome,
- 0);
- MediaRouterMetrics::RecordRouteCreationOutcome(outcome2);
- MediaRouterMetrics::RecordRouteCreationOutcome(outcome1);
- MediaRouterMetrics::RecordRouteCreationOutcome(outcome2);
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramRouteCreationOutcome,
- 3);
- EXPECT_THAT(
- tester.GetAllSamples(MediaRouterMetrics::kHistogramRouteCreationOutcome),
- ElementsAre(Bucket(static_cast<int>(outcome1), 1),
- Bucket(static_cast<int>(outcome2), 2)));
- }
- TEST(MediaRouterMetricsTest, RecordPresentationUrlType) {
- base::HistogramTester tester;
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramPresentationUrlType, 0);
- MediaRouterMetrics::RecordPresentationUrlType(GURL("cast:DEADBEEF"));
- MediaRouterMetrics::RecordPresentationUrlType(GURL("dial:AppName"));
- MediaRouterMetrics::RecordPresentationUrlType(GURL("cast-dial:AppName"));
- MediaRouterMetrics::RecordPresentationUrlType(GURL("https://example.com"));
- MediaRouterMetrics::RecordPresentationUrlType(GURL("http://example.com"));
- MediaRouterMetrics::RecordPresentationUrlType(
- GURL("https://google.com/cast#__castAppId__=DEADBEEF"));
- MediaRouterMetrics::RecordPresentationUrlType(GURL("remote-playback:foo"));
- MediaRouterMetrics::RecordPresentationUrlType(GURL("test:test"));
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramPresentationUrlType, 8);
- EXPECT_THAT(
- tester.GetAllSamples(MediaRouterMetrics::kHistogramPresentationUrlType),
- ElementsAre(
- Bucket(static_cast<int>(PresentationUrlType::kOther), 1),
- Bucket(static_cast<int>(PresentationUrlType::kCast), 1),
- Bucket(static_cast<int>(PresentationUrlType::kCastDial), 1),
- Bucket(static_cast<int>(PresentationUrlType::kCastLegacy), 1),
- Bucket(static_cast<int>(PresentationUrlType::kDial), 1),
- Bucket(static_cast<int>(PresentationUrlType::kHttp), 1),
- Bucket(static_cast<int>(PresentationUrlType::kHttps), 1),
- Bucket(static_cast<int>(PresentationUrlType::kRemotePlayback), 1)));
- }
- TEST(MediaRouterMetricsTest, RecordMediaSinkType) {
- base::HistogramTester tester;
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramMediaSinkType, 0);
- MediaRouterMetrics::RecordMediaSinkType(SinkIconType::WIRED_DISPLAY);
- MediaRouterMetrics::RecordMediaSinkType(SinkIconType::CAST);
- MediaRouterMetrics::RecordMediaSinkType(SinkIconType::CAST_AUDIO);
- MediaRouterMetrics::RecordMediaSinkType(SinkIconType::CAST);
- MediaRouterMetrics::RecordMediaSinkType(SinkIconType::GENERIC);
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramMediaSinkType, 5);
- EXPECT_THAT(
- tester.GetAllSamples(MediaRouterMetrics::kHistogramMediaSinkType),
- ElementsAre(Bucket(static_cast<int>(SinkIconType::CAST), 2),
- Bucket(static_cast<int>(SinkIconType::CAST_AUDIO), 1),
- Bucket(static_cast<int>(SinkIconType::WIRED_DISPLAY), 1),
- Bucket(static_cast<int>(SinkIconType::GENERIC), 1)));
- }
- TEST(MediaRouterMetricsTest, RecordDeviceCount) {
- base::HistogramTester tester;
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramUiDeviceCount, 0);
- MediaRouterMetrics::RecordDeviceCount(30);
- MediaRouterMetrics::RecordDeviceCount(0);
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramUiDeviceCount, 2);
- EXPECT_THAT(tester.GetAllSamples(MediaRouterMetrics::kHistogramUiDeviceCount),
- ElementsAre(Bucket(0, 1), Bucket(30, 1)));
- }
- TEST(MediaRouterMetricsTest, RecordStartRouteDeviceIndex) {
- base::HistogramTester tester;
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramStartLocalPosition, 0);
- MediaRouterMetrics::RecordStartRouteDeviceIndex(30);
- MediaRouterMetrics::RecordStartRouteDeviceIndex(0);
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramStartLocalPosition, 2);
- EXPECT_THAT(
- tester.GetAllSamples(MediaRouterMetrics::kHistogramStartLocalPosition),
- ElementsAre(Bucket(0, 1), Bucket(30, 1)));
- }
- TEST(MediaRouterMetricsTest, RecordStartLocalSessionLatency) {
- TestRecordTimeDeltaMetric(
- base::BindRepeating(&MediaRouterMetrics::RecordStartLocalSessionLatency),
- MediaRouterMetrics::kHistogramStartLocalLatency);
- }
- TEST(MediaRouterMetricsTest, RecordStartLocalSessionSuccessful) {
- TestRecordBooleanMetric(
- base::BindRepeating(
- &MediaRouterMetrics::RecordStartLocalSessionSuccessful),
- MediaRouterMetrics::kHistogramStartLocalSessionSuccessful);
- }
- TEST(MediaRouterMetricsTest, RecordStopRoute) {
- base::HistogramTester tester;
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramStopRoute, 0);
- MediaRouterMetrics::RecordStopLocalRoute();
- MediaRouterMetrics::RecordStopRemoteRoute();
- MediaRouterMetrics::RecordStopLocalRoute();
- tester.ExpectTotalCount(MediaRouterMetrics::kHistogramStopRoute, 3);
- EXPECT_THAT(tester.GetAllSamples(MediaRouterMetrics::kHistogramStopRoute),
- ElementsAre(Bucket(/* Local route */ 0, 2),
- Bucket(/* Remote route */ 1, 1)));
- }
- TEST(MediaRouterMetricsTest, RecordIconStateAtDialogOpen) {
- TestRecordBooleanMetric(
- base::BindRepeating(&MediaRouterMetrics::RecordIconStateAtDialogOpen),
- MediaRouterMetrics::kHistogramUiDialogIconStateAtOpen);
- }
- TEST(MediaRouterMetricsTest, RecordIconStateAtInit) {
- TestRecordBooleanMetric(
- base::BindRepeating(&MediaRouterMetrics::RecordIconStateAtInit),
- MediaRouterMetrics::kHistogramUiIconStateAtInit);
- }
- TEST(MediaRouterMetricsTest, RecordCreateRouteResultCode) {
- TestRouteResultCodeHistograms(
- base::BindRepeating(&MediaRouterMetrics::RecordCreateRouteResultCode),
- "MediaRouter.Provider.CreateRoute.Result");
- }
- TEST(MediaRouterMetricsTest, RecordJoinRouteResultCode) {
- TestRouteResultCodeHistograms(
- base::BindRepeating(&MediaRouterMetrics::RecordJoinRouteResultCode),
- "MediaRouter.Provider.JoinRoute.Result");
- }
- TEST(MediaRouterMetricsTest, RecordTerminateRouteResultCode) {
- TestRouteResultCodeHistograms(
- base::BindRepeating(
- &MediaRouterMetrics::RecordMediaRouteProviderTerminateRoute),
- "MediaRouter.Provider.TerminateRoute.Result");
- }
- } // namespace media_router
|