blob: 7ed589b0ea1a045983bb9a860053cb4fe1daea69 [file] [log] [blame]
// Copyright 2018 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 "chrome/browser/ui/views/media_router/cast_dialog_metrics.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/time/time.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/testing_profile.h"
#include "components/prefs/pref_service.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::Bucket;
using testing::ElementsAre;
namespace media_router {
namespace {
const base::Time init_time = base::Time::Now();
const base::Time paint_time = init_time + base::TimeDelta::FromMilliseconds(50);
const base::Time sink_load_time =
init_time + base::TimeDelta::FromMilliseconds(300);
const base::Time start_casting_time =
init_time + base::TimeDelta::FromMilliseconds(2000);
const base::Time close_dialog_time =
init_time + base::TimeDelta::FromMilliseconds(3000);
} // namespace
class CastDialogMetricsTest : public testing::Test {
public:
CastDialogMetricsTest() = default;
~CastDialogMetricsTest() override = default;
protected:
content::BrowserTaskEnvironment task_environment_;
TestingProfile profile_;
base::HistogramTester tester_;
CastDialogMetrics metrics_{init_time, MediaRouterDialogOpenOrigin::TOOLBAR,
&profile_};
};
TEST_F(CastDialogMetricsTest, OnSinksLoaded) {
metrics_.OnSinksLoaded(sink_load_time);
tester_.ExpectUniqueSample(
MediaRouterMetrics::kHistogramUiDialogLoadedWithData,
(sink_load_time - init_time).InMilliseconds(), 1);
}
TEST_F(CastDialogMetricsTest, OnPaint) {
metrics_.OnPaint(paint_time);
tester_.ExpectUniqueSample(MediaRouterMetrics::kHistogramUiDialogPaint,
(paint_time - init_time).InMilliseconds(), 1);
}
TEST_F(CastDialogMetricsTest, OnStartCasting) {
constexpr int kSinkIndex = 4;
metrics_.OnSinksLoaded(sink_load_time);
metrics_.OnStartCasting(start_casting_time, kSinkIndex, TAB_MIRROR);
tester_.ExpectUniqueSample(
MediaRouterMetrics::kHistogramStartLocalLatency,
(start_casting_time - sink_load_time).InMilliseconds(), 1);
}
TEST_F(CastDialogMetricsTest, OnStopCasting) {
metrics_.OnStopCasting(/* is_local_route*/ false);
tester_.ExpectUniqueSample(MediaRouterMetrics::kHistogramStopRoute,
/* Remote route */ 1, 1);
}
TEST_F(CastDialogMetricsTest, OnCloseDialog) {
metrics_.OnPaint(paint_time);
metrics_.OnCloseDialog(close_dialog_time);
tester_.ExpectUniqueSample(MediaRouterMetrics::kHistogramCloseLatency,
(close_dialog_time - paint_time).InMilliseconds(),
1);
}
TEST_F(CastDialogMetricsTest, OnRecordSinkCount) {
constexpr int kSinkCount = 3;
metrics_.OnRecordSinkCount(kSinkCount);
tester_.ExpectUniqueSample(MediaRouterMetrics::kHistogramUiDeviceCount,
kSinkCount, 1);
}
TEST_F(CastDialogMetricsTest, RecordFirstAction) {
metrics_.OnStopCasting(true);
metrics_.OnCastModeSelected();
metrics_.OnCloseDialog(close_dialog_time);
// Only the first action should be recorded for the first action metric.
tester_.ExpectUniqueSample(MediaRouterMetrics::kHistogramUiFirstAction,
MediaRouterUserAction::STOP_LOCAL, 1);
}
TEST_F(CastDialogMetricsTest, RecordIconState) {
tester_.ExpectUniqueSample(
MediaRouterMetrics::kHistogramUiDialogIconStateAtOpen,
/* is_pinned */ false, 1);
profile_.GetPrefs()->SetBoolean(prefs::kShowCastIconInToolbar, true);
CastDialogMetrics metrics_with_pinned_icon{
init_time, MediaRouterDialogOpenOrigin::PAGE, &profile_};
tester_.ExpectBucketCount(
MediaRouterMetrics::kHistogramUiDialogIconStateAtOpen,
/* is_pinned */ true, 1);
}
TEST_F(CastDialogMetricsTest, RecordDialogActivationLocationAndCastMode) {
constexpr int kSinkIndex = 4;
metrics_.OnSinksLoaded(sink_load_time);
metrics_.OnStartCasting(start_casting_time, kSinkIndex, TAB_MIRROR);
tester_.ExpectUniqueSample(
MediaRouterMetrics::kHistogramUiDialogActivationLocationAndCastMode,
DialogActivationLocationAndCastMode::kEphemeralIconAndTabMirror, 1);
CastDialogMetrics metrics_opened_from_page{
init_time, MediaRouterDialogOpenOrigin::PAGE, &profile_};
metrics_opened_from_page.OnSinksLoaded(sink_load_time);
metrics_opened_from_page.OnStartCasting(start_casting_time, kSinkIndex,
PRESENTATION);
tester_.ExpectBucketCount(
MediaRouterMetrics::kHistogramUiDialogActivationLocationAndCastMode,
DialogActivationLocationAndCastMode::kPageAndPresentation, 1);
profile_.GetPrefs()->SetBoolean(prefs::kShowCastIconInToolbar, true);
CastDialogMetrics metrics_with_pinned_icon{
init_time, MediaRouterDialogOpenOrigin::TOOLBAR, &profile_};
metrics_with_pinned_icon.OnSinksLoaded(sink_load_time);
metrics_with_pinned_icon.OnStartCasting(start_casting_time, kSinkIndex,
DESKTOP_MIRROR);
tester_.ExpectBucketCount(
MediaRouterMetrics::kHistogramUiDialogActivationLocationAndCastMode,
DialogActivationLocationAndCastMode::kPinnedIconAndDesktopMirror, 1);
}
} // namespace media_router