#include "ash/capture_mode/capture_mode_bar_view.h"
#include "ash/capture_mode/capture_mode_camera_preview_view.h"
#include "ash/capture_mode/capture_mode_constants.h"
#include "ash/capture_mode/capture_mode_controller.h"
#include "ash/capture_mode/capture_mode_metrics.h"
#include "ash/capture_mode/capture_mode_session.h"
#include "ash/capture_mode/capture_mode_session_focus_cycler.h"
#include "ash/capture_mode/capture_mode_session_test_api.h"
#include "ash/capture_mode/capture_mode_settings_test_api.h"
#include "ash/capture_mode/capture_mode_settings_view.h"
#include "ash/capture_mode/capture_mode_test_util.h"
#include "ash/capture_mode/capture_mode_types.h"
#include "ash/capture_mode/test_capture_mode_delegate.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "ash/display/window_tree_host_manager.h"
#include "ash/game_dashboard/game_dashboard_context_test_api.h"
#include "ash/game_dashboard/game_dashboard_controller.h"
#include "ash/public/cpp/capture_mode/capture_mode_test_api.h"
#include "ash/public/cpp/window_properties.h"
#include "ash/screen_util.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/style/pill_button.h"
#include "ash/system/unified/feature_tile.h"
#include "ash/test/ash_test_base.h"
#include "ash/test/ash_test_util.h"
#include "ash/wm/desks/desks_test_util.h"
#include "ash/wm/tablet_mode/tablet_mode_controller_test_api.h"
#include "base/system/sys_info.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "chromeos/ui/base/window_properties.h"
#include "extensions/common/constants.h"
#include "ui/base/cursor/mojom/cursor_type.mojom-shared.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/wm/core/window_util.h"
namespace message_center {
bool operator==(const ButtonInfo& lhs, const ButtonInfo& rhs) {
return std::tie(lhs.title, lhs.icon, lhs.placeholder, lhs.type) ==
std::tie(rhs.title, rhs.icon, rhs.placeholder, rhs.type);
}
}
namespace ash {
namespace {
using ::ui::mojom::CursorType;
}
using ButtonInfo = message_center::ButtonInfo;
class GameDashboardCaptureModeTest : public AshTestBase {
public:
GameDashboardCaptureModeTest() {
scoped_feature_list_.InitWithFeatures(
{features::
kFeatureManagementGameDashboardRecordGame},
{});
}
GameDashboardCaptureModeTest(const GameDashboardCaptureModeTest&) = delete;
GameDashboardCaptureModeTest& operator=(const GameDashboardCaptureModeTest&) =
delete;
~GameDashboardCaptureModeTest() override = default;
aura::Window* game_window() const { return game_window_.get(); }
void CloseGameWindow() { game_window_.reset(); }
void SetUp() override {
AshTestBase::SetUp();
PrefService* active_user_prefs =
Shell::Get()->session_controller()->GetActivePrefService();
ASSERT_TRUE(active_user_prefs);
active_user_prefs->SetBoolean(prefs::kGameDashboardShowWelcomeDialog,
false);
game_window_ = CreateAppWindow(gfx::Rect(0, 100, 300, 200));
game_window_->SetProperty(kAppIDKey,
std::string(extension_misc::kGeForceNowAppId));
}
void TearDown() override {
game_window_.reset();
AshTestBase::TearDown();
}
CaptureModeController* StartGameCaptureModeSession() {
auto* controller = CaptureModeController::Get();
controller->StartForGameDashboard(game_window_.get());
CHECK(controller->IsActive());
return controller;
}
void VerifyCaptureBarPosition() {
views::Widget* bar_widget = GetCaptureModeBarWidget();
CHECK(bar_widget);
const gfx::Rect window_bounds = game_window()->GetBoundsInScreen();
const gfx::Rect bar_bounds = bar_widget->GetWindowBoundsInScreen();
EXPECT_TRUE(window_bounds.Contains(bar_bounds));
EXPECT_EQ(bar_bounds.CenterPoint().x(), window_bounds.CenterPoint().x());
EXPECT_EQ(bar_bounds.bottom() + capture_mode::kGameCaptureBarBottomPadding,
window_bounds.bottom());
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
std::unique_ptr<aura::Window> game_window_;
};
TEST_F(GameDashboardCaptureModeTest, GameDashboardBehavior) {
CaptureModeController* controller = StartGameCaptureModeSession();
BaseCaptureModeSession* session = controller->capture_mode_session();
CaptureModeBehavior* active_behavior = session->active_behavior();
ASSERT_TRUE(active_behavior);
EXPECT_FALSE(active_behavior->ShouldImageCaptureTypeBeAllowed());
EXPECT_TRUE(active_behavior->ShouldVideoCaptureTypeBeAllowed());
EXPECT_FALSE(active_behavior->ShouldFulscreenCaptureSourceBeAllowed());
EXPECT_FALSE(active_behavior->ShouldRegionCaptureSourceBeAllowed());
EXPECT_TRUE(active_behavior->ShouldWindowCaptureSourceBeAllowed());
EXPECT_TRUE(
active_behavior->SupportsAudioRecordingMode(AudioRecordingMode::kOff));
EXPECT_TRUE(active_behavior->SupportsAudioRecordingMode(
AudioRecordingMode::kSystemAndMicrophone));
EXPECT_TRUE(active_behavior->ShouldCameraSelectionSettingsBeIncluded());
EXPECT_FALSE(active_behavior->ShouldDemoToolsSettingsBeIncluded());
EXPECT_TRUE(active_behavior->ShouldSaveToSettingsBeIncluded());
EXPECT_FALSE(active_behavior->ShouldGifBeSupported());
EXPECT_TRUE(active_behavior->ShouldShowPreviewNotification());
EXPECT_FALSE(active_behavior->ShouldSkipVideoRecordingCountDown());
EXPECT_FALSE(active_behavior->ShouldCreateAnnotationsOverlayController());
EXPECT_FALSE(active_behavior->ShouldShowUserNudge());
EXPECT_TRUE(active_behavior->ShouldAutoSelectFirstCamera());
}
TEST_F(GameDashboardCaptureModeTest, FullscreenScreenshotKeyCombo) {
StartGameCaptureModeSession();
PressAndReleaseKey(ui::VKEY_MEDIA_LAUNCH_APP1, ui::EF_CONTROL_DOWN);
WaitForCaptureFileToBeSaved();
VerifyActiveBehavior(BehaviorType::kGameDashboard);
}
TEST_F(GameDashboardCaptureModeTest, SwitchToDefaultCaptureMode) {
StartGameCaptureModeSession();
VerifyActiveBehavior(BehaviorType::kGameDashboard);
PressAndReleaseKey(ui::VKEY_MEDIA_LAUNCH_APP1,
ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN);
VerifyActiveBehavior(BehaviorType::kGameDashboard);
}
TEST_F(GameDashboardCaptureModeTest, StartForGameDashboardTest) {
UpdateDisplay("1000x700");
std::unique_ptr<aura::Window> other_window(
CreateAppWindow(gfx::Rect(0, 300, 500, 300)));
CaptureModeController* controller = StartGameCaptureModeSession();
BaseCaptureModeSession* capture_mode_session =
controller->capture_mode_session();
ASSERT_TRUE(capture_mode_session);
EXPECT_EQ(capture_mode_session->GetSelectedWindow(), game_window());
auto* event_generator = GetEventGenerator();
event_generator->MoveMouseToCenterOf(other_window.get());
EXPECT_EQ(capture_mode_session->GetSelectedWindow(), game_window());
CloseGameWindow();
EXPECT_FALSE(controller->IsActive());
}
TEST_F(GameDashboardCaptureModeTest, CaptureBar) {
CaptureModeController* controller = StartGameCaptureModeSession();
views::Widget* bar_widget = GetCaptureModeBarWidget();
ASSERT_TRUE(bar_widget);
auto* start_recording_button = GetStartRecordingButton();
EXPECT_TRUE(start_recording_button);
EXPECT_FALSE(GetImageToggleButton());
EXPECT_FALSE(GetVideoToggleButton());
EXPECT_FALSE(GetFullscreenToggleButton());
EXPECT_FALSE(GetRegionToggleButton());
EXPECT_FALSE(GetWindowToggleButton());
EXPECT_TRUE(GetSettingsButton());
EXPECT_TRUE(GetCloseButton());
BaseCaptureModeSession* session = controller->capture_mode_session();
EXPECT_EQ(game_window(), session->GetSelectedWindow());
ClickOnView(start_recording_button, GetEventGenerator());
WaitForRecordingToStart();
EXPECT_TRUE(controller->is_recording_in_progress());
}
TEST_F(GameDashboardCaptureModeTest, CaptureBarPosition) {
StartGameCaptureModeSession();
views::Widget* bar_widget = GetCaptureModeBarWidget();
ASSERT_TRUE(bar_widget);
VerifyCaptureBarPosition();
SwitchToTabletMode();
VerifyCaptureBarPosition();
LeaveTabletMode();
VerifyCaptureBarPosition();
}
TEST_F(GameDashboardCaptureModeTest, CaptureBarPositionOnDisplayRotation) {
StartGameCaptureModeSession();
views::Widget* bar_widget = GetCaptureModeBarWidget();
ASSERT_TRUE(bar_widget);
VerifyCaptureBarPosition();
auto* display_manager = Shell::Get()->display_manager();
const int64_t display_id = WindowTreeHostManager::GetPrimaryDisplayId();
for (const auto rotation :
{display::Display::ROTATE_90, display::Display::ROTATE_180,
display::Display::ROTATE_270}) {
display_manager->SetDisplayRotation(display_id, rotation,
display::Display::RotationSource::USER);
VerifyCaptureBarPosition();
}
}
TEST_F(GameDashboardCaptureModeTest, NotificationView) {
CaptureModeController* controller = StartGameCaptureModeSession();
BaseCaptureModeSession* session = controller->capture_mode_session();
CaptureModeBehavior* active_behavior = session->active_behavior();
ASSERT_TRUE(active_behavior);
StartVideoRecordingImmediately();
CaptureModeTestApi().FlushRecordingServiceForTesting();
auto* test_delegate =
static_cast<TestCaptureModeDelegate*>(controller->delegate_for_testing());
test_delegate->RequestAndWaitForVideoFrame();
SkBitmap service_thumbnail =
gfx::Image(test_delegate->GetVideoThumbnail()).AsBitmap();
EXPECT_FALSE(service_thumbnail.drawsNothing());
controller->EndVideoRecording(EndRecordingReason::kStopRecordingButton);
EXPECT_FALSE(controller->is_recording_in_progress());
EXPECT_FALSE(controller->can_start_new_recording());
CaptureNotificationWaiter().Wait();
EXPECT_TRUE(controller->can_start_new_recording());
const message_center::Notification* notification = GetPreviewNotification();
EXPECT_TRUE(notification);
EXPECT_FALSE(notification->image().IsEmpty());
std::vector<ButtonInfo> expected_buttons_info = {
ButtonInfo(
l10n_util::GetStringUTF16(IDS_ASH_SCREEN_CAPTURE_SHARE_TO_YOUTUBE)),
ButtonInfo(
l10n_util::GetStringUTF16(IDS_ASH_SCREEN_CAPTURE_BUTTON_DELETE))};
auto actual_buttons_info =
active_behavior->GetNotificationButtonsInfo(true);
EXPECT_EQ(actual_buttons_info.size(), 2u);
EXPECT_TRUE(actual_buttons_info == expected_buttons_info);
const int share_to_youtube_button = 0;
ClickOnNotification(share_to_youtube_button);
EXPECT_FALSE(GetPreviewNotification());
}
TEST_F(GameDashboardCaptureModeTest, CameraPreviewWidgetTest) {
AddDefaultCamera();
auto* camera_controller = CaptureModeController::Get()->camera_controller();
EXPECT_FALSE(camera_controller->selected_camera().is_valid());
auto* controller = StartGameCaptureModeSession();
EXPECT_TRUE(camera_controller->selected_camera().is_valid());
EXPECT_TRUE(camera_controller->should_show_preview());
GetEventGenerator()->MoveMouseToCenterOf(game_window());
EXPECT_TRUE(camera_controller->camera_preview_widget());
controller->StartVideoRecordingImmediatelyForTesting();
EXPECT_TRUE(camera_controller->should_show_preview());
EXPECT_TRUE(camera_controller->camera_preview_widget());
controller->EndVideoRecording(EndRecordingReason::kStopRecordingButton);
EXPECT_FALSE(camera_controller->should_show_preview());
EXPECT_FALSE(camera_controller->camera_preview_widget());
}
TEST_F(GameDashboardCaptureModeTest, FocusNavigationOfCaptureBar) {
UpdateDisplay("1200x1100");
AddDefaultCamera();
auto* camera_controller = CaptureModeController::Get()->camera_controller();
auto* controller = StartGameCaptureModeSession();
ASSERT_TRUE(GetCaptureModeBarWidget());
EXPECT_EQ(controller->capture_mode_session()->GetSelectedWindow(),
game_window());
game_window()->SetBounds({0, 0, 800, 700});
CaptureModeSessionTestApi test_api(controller->capture_mode_session());
using FocusGroup = CaptureModeSessionFocusCycler::FocusGroup;
auto* event_generator = GetEventGenerator();
auto* start_recording_button = GetStartRecordingButton();
SendKey(ui::VKEY_TAB, event_generator);
EXPECT_EQ(FocusGroup::kStartRecordingButton, test_api.GetCurrentFocusGroup());
EXPECT_EQ(0u, test_api.GetCurrentFocusIndex());
EXPECT_TRUE(CaptureModeSessionFocusCycler::HighlightHelper::Get(
start_recording_button)
->has_focus());
auto* camera_preview_view = camera_controller->camera_preview_view();
SendKey(ui::VKEY_TAB, event_generator);
EXPECT_EQ(FocusGroup::kCameraPreview, test_api.GetCurrentFocusGroup());
EXPECT_EQ(0u, test_api.GetCurrentFocusIndex());
EXPECT_TRUE(camera_preview_view->has_focus());
auto* resize_button = camera_preview_view->resize_button();
SendKey(ui::VKEY_TAB, event_generator);
EXPECT_EQ(FocusGroup::kCameraPreview, test_api.GetCurrentFocusGroup());
EXPECT_EQ(1u, test_api.GetCurrentFocusIndex());
EXPECT_TRUE(resize_button->has_focus());
auto* settings_button = GetSettingsButton();
SendKey(ui::VKEY_TAB, event_generator);
EXPECT_EQ(FocusGroup::kSettingsClose, test_api.GetCurrentFocusGroup());
EXPECT_EQ(0u, test_api.GetCurrentFocusIndex());
EXPECT_TRUE(
CaptureModeSessionFocusCycler::HighlightHelper::Get(settings_button)
->has_focus());
auto* close_button = GetCloseButton();
SendKey(ui::VKEY_TAB, event_generator);
EXPECT_EQ(FocusGroup::kSettingsClose, test_api.GetCurrentFocusGroup());
EXPECT_EQ(1u, test_api.GetCurrentFocusIndex());
EXPECT_TRUE(CaptureModeSessionFocusCycler::HighlightHelper::Get(close_button)
->has_focus());
SendKey(ui::VKEY_TAB, event_generator, ui::EF_SHIFT_DOWN);
EXPECT_EQ(FocusGroup::kSettingsClose, test_api.GetCurrentFocusGroup());
EXPECT_EQ(0u, test_api.GetCurrentFocusIndex());
EXPECT_TRUE(
CaptureModeSessionFocusCycler::HighlightHelper::Get(settings_button)
->has_focus());
SendKey(ui::VKEY_TAB, event_generator, ui::EF_SHIFT_DOWN);
EXPECT_EQ(FocusGroup::kCameraPreview, test_api.GetCurrentFocusGroup());
EXPECT_EQ(1u, test_api.GetCurrentFocusIndex());
EXPECT_TRUE(resize_button->has_focus());
SendKey(ui::VKEY_TAB, event_generator, ui::EF_SHIFT_DOWN);
EXPECT_EQ(FocusGroup::kCameraPreview, test_api.GetCurrentFocusGroup());
EXPECT_EQ(0u, test_api.GetCurrentFocusIndex());
EXPECT_TRUE(camera_preview_view->has_focus());
SendKey(ui::VKEY_TAB, event_generator, ui::EF_SHIFT_DOWN);
EXPECT_EQ(FocusGroup::kStartRecordingButton, test_api.GetCurrentFocusGroup());
EXPECT_EQ(0u, test_api.GetCurrentFocusIndex());
EXPECT_TRUE(CaptureModeSessionFocusCycler::HighlightHelper::Get(
start_recording_button)
->has_focus());
}
TEST_F(GameDashboardCaptureModeTest, GameCaptureModeSessionConfigs) {
auto* controller = StartGameCaptureModeSession();
EXPECT_EQ(controller->type(), CaptureModeType::kVideo);
EXPECT_EQ(controller->source(), CaptureModeSource::kWindow);
EXPECT_EQ(controller->recording_type(), RecordingType::kWebM);
EXPECT_EQ(controller->audio_recording_mode(),
AudioRecordingMode::kSystemAndMicrophone);
EXPECT_EQ(controller->enable_demo_tools(), false);
controller->SetAudioRecordingMode(AudioRecordingMode::kSystem);
controller->EnableDemoTools(true);
controller->Stop();
StartGameCaptureModeSession();
EXPECT_EQ(controller->type(), CaptureModeType::kVideo);
EXPECT_EQ(controller->source(), CaptureModeSource::kWindow);
EXPECT_EQ(controller->recording_type(), RecordingType::kWebM);
EXPECT_EQ(controller->audio_recording_mode(), AudioRecordingMode::kSystem);
EXPECT_TRUE(controller->enable_demo_tools());
controller->Stop();
StartCaptureSession(CaptureModeSource::kFullscreen, CaptureModeType::kImage);
EXPECT_EQ(controller->type(), CaptureModeType::kImage);
EXPECT_EQ(controller->source(), CaptureModeSource::kFullscreen);
EXPECT_EQ(controller->recording_type(), RecordingType::kWebM);
EXPECT_EQ(controller->audio_recording_mode(), AudioRecordingMode::kOff);
EXPECT_FALSE(controller->enable_demo_tools());
controller->Stop();
}
TEST_F(GameDashboardCaptureModeTest, MultiDisplay) {
UpdateDisplay("800x700,801+0-900x800");
const auto& displays = display_manager()->active_display_list();
ASSERT_EQ(2u, displays.size());
EXPECT_EQ(displays[0].size(), gfx::Size(800, 700));
EXPECT_EQ(displays[1].size(), gfx::Size(900, 800));
display::Screen* screen = display::Screen::Get();
auto* controller = StartGameCaptureModeSession();
BaseCaptureModeSession* capture_mode_session =
controller->capture_mode_session();
auto* event_generator = GetEventGenerator();
EXPECT_EQ(displays[0].id(),
screen->GetDisplayNearestWindow(game_window()).id());
EXPECT_EQ(Shell::GetAllRootWindows()[0],
capture_mode_session->current_root());
VerifyCaptureBarPosition();
event_generator->MoveMouseTo(displays[1].bounds().CenterPoint());
EXPECT_EQ(Shell::GetAllRootWindows()[0],
capture_mode_session->current_root());
PressAndReleaseKey(ui::VKEY_M, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN);
EXPECT_EQ(displays[1].id(),
screen->GetDisplayNearestWindow(game_window()).id());
EXPECT_EQ(Shell::GetAllRootWindows()[1],
capture_mode_session->current_root());
VerifyCaptureBarPosition();
event_generator->MoveMouseTo(displays[0].bounds().CenterPoint());
EXPECT_EQ(Shell::GetAllRootWindows()[1],
capture_mode_session->current_root());
PressAndReleaseKey(ui::VKEY_M, ui::EF_COMMAND_DOWN | ui::EF_ALT_DOWN);
EXPECT_EQ(displays[0].id(),
screen->GetDisplayNearestWindow(game_window()).id());
EXPECT_EQ(Shell::GetAllRootWindows()[0],
capture_mode_session->current_root());
VerifyCaptureBarPosition();
}
TEST_F(GameDashboardCaptureModeTest, NoLabelInTabletMode) {
auto* controller = StartGameCaptureModeSession();
BaseCaptureModeSession* session = controller->capture_mode_session();
ASSERT_EQ(game_window(), session->GetSelectedWindow());
SwitchToTabletMode();
views::Label* label_internal_view =
CaptureModeSessionTestApi(session).GetCaptureLabelInternalView();
EXPECT_FALSE(label_internal_view->GetVisible());
}
TEST_F(GameDashboardCaptureModeTest, SettingsMenuHeightFullAboveBar) {
UpdateDisplay("1000x500");
game_window()->SetBounds(gfx::Rect(0, 50, 500, 450));
StartGameCaptureModeSession();
BaseCaptureModeSession* session =
CaptureModeController::Get()->capture_mode_session();
ASSERT_TRUE(session);
ClickOnView(GetSettingsButton(), GetEventGenerator());
CaptureModeSessionTestApi test_api(session);
ASSERT_TRUE(test_api.GetCaptureModeSettingsWidget());
const gfx::Rect settings_bounds =
test_api.GetCaptureModeSettingsWidget()->GetWindowBoundsInScreen();
EXPECT_GE(settings_bounds.y(),
capture_mode::kMinDistanceFromSettingsToScreen);
EXPECT_EQ(settings_bounds.height(),
test_api.GetCaptureModeSettingsView()->GetPreferredSize().height());
EXPECT_EQ(
settings_bounds.size(),
CaptureModeSettingsTestApi().GetSettingsView()->GetVisibleRect().size());
}
TEST_F(GameDashboardCaptureModeTest, SettingsMenuHeightFullBelowBar) {
UpdateDisplay("1000x500");
game_window()->SetBounds(gfx::Rect(0, 0, 500, 100));
StartGameCaptureModeSession();
BaseCaptureModeSession* session =
CaptureModeController::Get()->capture_mode_session();
ASSERT_TRUE(session);
ClickOnView(GetSettingsButton(), GetEventGenerator());
CaptureModeSessionTestApi test_api(session);
ASSERT_TRUE(test_api.GetCaptureModeSettingsWidget());
const gfx::Rect settings_bounds =
test_api.GetCaptureModeSettingsWidget()->GetWindowBoundsInScreen();
const auto bar_bounds = test_api.GetCaptureModeBarView()->GetBoundsInScreen();
EXPECT_EQ(settings_bounds.y(),
bar_bounds.bottom() +
capture_mode::kSpaceBetweenCaptureBarAndSettingsMenu);
EXPECT_GE(settings_bounds.y(),
capture_mode::kMinDistanceFromSettingsToScreen);
EXPECT_EQ(settings_bounds.height(),
test_api.GetCaptureModeSettingsView()->GetPreferredSize().height());
EXPECT_EQ(
settings_bounds.size(),
CaptureModeSettingsTestApi().GetSettingsView()->GetVisibleRect().size());
}
TEST_F(GameDashboardCaptureModeTest, SettingsMenuHeightConstrainedAboveBar) {
UpdateDisplay("1000x250");
game_window()->SetBounds(gfx::Rect(0, 50, 500, 200));
StartGameCaptureModeSession();
BaseCaptureModeSession* session =
CaptureModeController::Get()->capture_mode_session();
ASSERT_TRUE(session);
ClickOnView(GetSettingsButton(), GetEventGenerator());
CaptureModeSessionTestApi test_api(session);
ASSERT_TRUE(test_api.GetCaptureModeSettingsWidget());
const gfx::Rect settings_bounds =
test_api.GetCaptureModeSettingsWidget()->GetWindowBoundsInScreen();
EXPECT_EQ(settings_bounds.y(),
capture_mode::kMinDistanceFromSettingsToScreen);
EXPECT_LT(settings_bounds.height(),
test_api.GetCaptureModeSettingsView()->GetPreferredSize().height());
EXPECT_GT(settings_bounds.height(), capture_mode::kSettingsMenuMinHeight);
EXPECT_EQ(
settings_bounds.size(),
CaptureModeSettingsTestApi().GetSettingsView()->GetVisibleRect().size());
}
TEST_F(GameDashboardCaptureModeTest, SettingsMenuHeightConstrainedBelowBar) {
UpdateDisplay("1000x500");
game_window()->SetBounds(gfx::Rect(0, 0, 500, 200));
StartGameCaptureModeSession();
BaseCaptureModeSession* session =
CaptureModeController::Get()->capture_mode_session();
ASSERT_TRUE(session);
ClickOnView(GetSettingsButton(), GetEventGenerator());
CaptureModeSessionTestApi test_api(session);
ASSERT_TRUE(test_api.GetCaptureModeSettingsWidget());
const gfx::Rect settings_bounds =
test_api.GetCaptureModeSettingsWidget()->GetWindowBoundsInScreen();
const auto bar_bounds = test_api.GetCaptureModeBarView()->GetBoundsInScreen();
EXPECT_EQ(settings_bounds.y(),
bar_bounds.bottom() +
capture_mode::kSpaceBetweenCaptureBarAndSettingsMenu);
EXPECT_LT(settings_bounds.height(),
test_api.GetCaptureModeSettingsView()->GetPreferredSize().height());
EXPECT_GT(settings_bounds.height(), capture_mode::kSettingsMenuMinHeight);
EXPECT_EQ(
settings_bounds.size(),
CaptureModeSettingsTestApi().GetSettingsView()->GetVisibleRect().size());
}
TEST_F(GameDashboardCaptureModeTest, SettingsMenuHeightMinimumAboveBar) {
UpdateDisplay("1000x100");
game_window()->SetBounds(gfx::Rect(0, 50, 500, 50));
StartGameCaptureModeSession();
BaseCaptureModeSession* session =
CaptureModeController::Get()->capture_mode_session();
ASSERT_TRUE(session);
ClickOnView(GetSettingsButton(), GetEventGenerator());
CaptureModeSessionTestApi test_api(session);
ASSERT_TRUE(test_api.GetCaptureModeSettingsWidget());
const gfx::Rect settings_bounds =
test_api.GetCaptureModeSettingsWidget()->GetWindowBoundsInScreen();
EXPECT_EQ(settings_bounds.y(),
capture_mode::kMinDistanceFromSettingsToScreen);
EXPECT_EQ(settings_bounds.height(), capture_mode::kSettingsMenuMinHeight);
EXPECT_EQ(
settings_bounds.size(),
CaptureModeSettingsTestApi().GetSettingsView()->GetVisibleRect().size());
}
TEST_F(GameDashboardCaptureModeTest, StopOnWindowSentToDifferentDesk) {
NewDesk();
auto* controller = StartGameCaptureModeSession();
PressAndReleaseKey(ui::VKEY_OEM_6, ui::EF_COMMAND_DOWN | ui::EF_SHIFT_DOWN);
EXPECT_FALSE(controller->IsActive());
}
TEST_F(GameDashboardCaptureModeTest, StopOnActiveDeskChanged) {
NewDesk();
auto* controller = StartGameCaptureModeSession();
DeskSwitchAnimationWaiter waiter;
PressAndReleaseKey(ui::VKEY_OEM_6, ui::EF_COMMAND_DOWN);
waiter.Wait();
EXPECT_FALSE(controller->IsActive());
}
TEST_F(GameDashboardCaptureModeTest, SettingsMenuHeightMinimumBelowBar) {
UpdateDisplay("1000x100");
game_window()->SetBounds(gfx::Rect(0, 0, 500, 50));
StartGameCaptureModeSession();
BaseCaptureModeSession* session =
CaptureModeController::Get()->capture_mode_session();
ASSERT_TRUE(session);
ClickOnView(GetSettingsButton(), GetEventGenerator());
CaptureModeSessionTestApi test_api(session);
ASSERT_TRUE(test_api.GetCaptureModeSettingsWidget());
const gfx::Rect settings_bounds =
test_api.GetCaptureModeSettingsWidget()->GetWindowBoundsInScreen();
const auto bar_bounds = test_api.GetCaptureModeBarView()->GetBoundsInScreen();
EXPECT_EQ(settings_bounds.y(),
bar_bounds.bottom() +
capture_mode::kSpaceBetweenCaptureBarAndSettingsMenu);
EXPECT_EQ(settings_bounds.height(), capture_mode::kSettingsMenuMinHeight);
EXPECT_EQ(
settings_bounds.size(),
CaptureModeSettingsTestApi().GetSettingsView()->GetVisibleRect().size());
}
TEST_F(GameDashboardCaptureModeTest, GameCaptureModeRecordInstantlyTest) {
AddDefaultCamera();
auto* controller = StartGameCaptureModeSession();
EXPECT_FALSE(controller->enable_demo_tools());
EXPECT_EQ(controller->audio_recording_mode(),
AudioRecordingMode::kSystemAndMicrophone);
auto* camera_controller = controller->camera_controller();
ASSERT_TRUE(camera_controller->camera_preview_widget());
const CameraId camera_id(kDefaultCameraModelId, 1);
EXPECT_EQ(camera_id, camera_controller->selected_camera());
controller->SetAudioRecordingMode(AudioRecordingMode::kOff);
controller->EnableDemoTools(true);
controller->Stop();
controller->StartRecordingInstantlyForGameDashboard(game_window());
EXPECT_TRUE(controller->is_recording_in_progress());
CaptureModeBehavior* behavior =
CaptureModeTestApi().GetBehavior(BehaviorType::kGameDashboard);
const auto capture_mode_configs = behavior->capture_mode_configs();
EXPECT_EQ(capture_mode_configs.audio_recording_mode,
AudioRecordingMode::kOff);
EXPECT_TRUE(capture_mode_configs.demo_tools_enabled);
EXPECT_EQ(controller->audio_recording_mode(), AudioRecordingMode::kOff);
EXPECT_FALSE(controller->enable_demo_tools());
const auto* camera_preview_widget =
camera_controller->camera_preview_widget();
ASSERT_TRUE(camera_preview_widget);
EXPECT_EQ(camera_preview_widget->GetNativeWindow()->parent(), game_window());
}
TEST_F(GameDashboardCaptureModeTest, UserTurnsOffCamera) {
AddDefaultCamera();
auto* controller = StartGameCaptureModeSession();
auto* camera_controller = controller->camera_controller();
ASSERT_TRUE(camera_controller->camera_preview_widget());
const CameraId camera_id(kDefaultCameraModelId, 1);
EXPECT_EQ(camera_id, camera_controller->selected_camera());
LeftClickOn(GetSettingsButton());
CaptureModeSettingsTestApi test_api;
CaptureModeMenuGroup* camera_menu_group = test_api.GetCameraMenuGroup();
ASSERT_TRUE(camera_menu_group);
EXPECT_TRUE(camera_menu_group->GetVisible());
auto* off_option = test_api.GetCameraOption(kCameraOff);
EXPECT_TRUE(off_option);
LeftClickOn(off_option);
EXPECT_FALSE(camera_controller->selected_camera().is_valid());
EXPECT_FALSE(camera_controller->camera_preview_widget());
controller->Stop();
StartGameCaptureModeSession();
EXPECT_FALSE(camera_controller->selected_camera().is_valid());
EXPECT_FALSE(camera_controller->camera_preview_widget());
controller->Stop();
StartCaptureSession(CaptureModeSource::kFullscreen, CaptureModeType::kVideo);
camera_controller->SetSelectedCamera(camera_id);
EXPECT_TRUE(camera_controller->camera_preview_widget());
controller->Stop();
StartGameCaptureModeSession();
EXPECT_EQ(camera_id, camera_controller->selected_camera());
EXPECT_TRUE(camera_controller->camera_preview_widget());
controller->Stop();
}
TEST_F(GameDashboardCaptureModeTest, StartWithNoCamera) {
auto* controller = StartGameCaptureModeSession();
auto* camera_controller = controller->camera_controller();
EXPECT_FALSE(camera_controller->selected_camera().is_valid());
EXPECT_FALSE(camera_controller->camera_preview_widget());
controller->Stop();
AddDefaultCamera();
StartGameCaptureModeSession();
EXPECT_TRUE(camera_controller->camera_preview_widget());
const CameraId camera_id(kDefaultCameraModelId, 1);
EXPECT_EQ(camera_id, camera_controller->selected_camera());
controller->Stop();
StartGameCaptureModeSession();
EXPECT_TRUE(camera_controller->camera_preview_widget());
EXPECT_EQ(camera_id, camera_controller->selected_camera());
}
TEST_F(GameDashboardCaptureModeTest, CameraAutoSelectionDisabledOnChange) {
const std::string device_id_1 = "/dev/video0";
const std::string display_name_1 = "Integrated Webcam";
const std::string device_id_2 = "/dev/video1";
const std::string display_name_2 = "Integrated Webcam 1";
AddFakeCamera(device_id_1, display_name_1, display_name_1);
AddFakeCamera(device_id_2, display_name_2, display_name_2);
auto* controller = StartGameCaptureModeSession();
auto* camera_controller = controller->camera_controller();
EXPECT_TRUE(camera_controller->camera_preview_widget());
const CameraId camera_id1(display_name_1, 1);
EXPECT_EQ(camera_id1, camera_controller->selected_camera());
const CameraId camera_id2(display_name_2, 1);
camera_controller->SetSelectedCamera(camera_id2);
EXPECT_EQ(camera_id2, camera_controller->selected_camera());
controller->Stop();
EXPECT_EQ(camera_id2, camera_controller->selected_camera());
}
TEST_F(GameDashboardCaptureModeTest, NoDimmingOfGameDashboardWidgets) {
auto* controller = CaptureModeController::Get();
controller->StartRecordingInstantlyForGameDashboard(game_window());
EXPECT_TRUE(controller->is_recording_in_progress());
auto* recording_watcher = controller->video_recording_watcher_for_testing();
ASSERT_EQ(game_window(), recording_watcher->window_being_recorded());
EXPECT_FALSE(recording_watcher->IsWindowDimmedForTesting(game_window()));
GameDashboardContextTestApi context_test_api{
GameDashboardController::Get()->GetGameDashboardContext(game_window()),
GetEventGenerator()};
auto* game_dashboard_button_widget =
context_test_api.GetGameDashboardButtonWidget();
ASSERT_TRUE(game_dashboard_button_widget);
EXPECT_FALSE(recording_watcher->IsWindowDimmedForTesting(
game_dashboard_button_widget->GetNativeWindow()));
context_test_api.OpenTheMainMenu();
auto* game_dashboard_menu_widget = context_test_api.GetMainMenuWidget();
ASSERT_TRUE(game_dashboard_menu_widget);
EXPECT_FALSE(recording_watcher->IsWindowDimmedForTesting(
game_dashboard_menu_widget->GetNativeWindow()));
context_test_api.OpenTheToolbar();
auto* game_dashboard_toolbar_widget = context_test_api.GetToolbarWidget();
ASSERT_TRUE(game_dashboard_toolbar_widget);
EXPECT_FALSE(recording_watcher->IsWindowDimmedForTesting(
game_dashboard_toolbar_widget->GetNativeWindow()));
}
TEST_F(GameDashboardCaptureModeTest, AvoidToolbarAndCameraPreviewIntersection) {
UpdateDisplay("1200x1100");
AddDefaultCamera();
game_window()->SetBounds({50, 50, 1100, 1000});
auto* controller = CaptureModeController::Get();
controller->StartRecordingInstantlyForGameDashboard(game_window());
auto* camera_controller = controller->camera_controller();
ASSERT_TRUE(camera_controller->should_show_preview());
GameDashboardContextTestApi context_test_api{
GameDashboardController::Get()->GetGameDashboardContext(game_window()),
GetEventGenerator()};
context_test_api.OpenTheMainMenu();
context_test_api.OpenTheToolbar();
context_test_api.CloseTheMainMenu();
auto* game_dashboard_toolbar_widget = context_test_api.GetToolbarWidget();
ASSERT_TRUE(game_dashboard_toolbar_widget);
const auto* camera_preview_widget =
camera_controller->camera_preview_widget();
ASSERT_TRUE(camera_preview_widget);
auto* preview_window = camera_preview_widget->GetNativeWindow();
auto* toolbar_window = game_dashboard_toolbar_widget->GetNativeWindow();
EXPECT_FALSE(preview_window->GetBoundsInScreen().Intersects(
toolbar_window->GetBoundsInScreen()));
auto* event_generator = GetEventGenerator();
event_generator->MoveMouseTo(
preview_window->GetBoundsInScreen().CenterPoint());
event_generator->DragMouseTo(
toolbar_window->GetBoundsInScreen().CenterPoint());
EXPECT_FALSE(preview_window->GetBoundsInScreen().Intersects(
toolbar_window->GetBoundsInScreen()));
auto preview_bounds_before_dragging_toolbar =
preview_window->GetBoundsInScreen();
event_generator->MoveMouseTo(
toolbar_window->GetBoundsInScreen().CenterPoint());
event_generator->DragMouseTo(
preview_window->GetBoundsInScreen().CenterPoint());
EXPECT_FALSE(preview_window->GetBoundsInScreen().Intersects(
toolbar_window->GetBoundsInScreen()));
EXPECT_NE(preview_window->GetBoundsInScreen(),
preview_bounds_before_dragging_toolbar);
}
TEST_F(GameDashboardCaptureModeTest, CursorAndClickBehaviorWhenAnchored) {
std::unique_ptr<aura::Window> window(
CreateTestWindow(gfx::Rect(50, 150, 100, 100)));
wm::ActivateWindow(game_window());
auto* controller = StartGameCaptureModeSession();
auto* event_generator = GetEventGenerator();
event_generator->MoveMouseTo(gfx::Point(0, 0));
auto* cursor_manager = Shell::Get()->cursor_manager();
EXPECT_EQ(CursorType::kPointer, cursor_manager->GetCursor().type());
event_generator->ClickLeftButton();
EXPECT_TRUE(controller->IsActive());
EXPECT_FALSE(controller->is_recording_in_progress());
event_generator->MoveMouseTo(gfx::Point(125, 225));
EXPECT_EQ(CursorType::kPointer, cursor_manager->GetCursor().type());
event_generator->ClickLeftButton();
EXPECT_TRUE(controller->IsActive());
EXPECT_FALSE(controller->is_recording_in_progress());
event_generator->MoveMouseTo(gfx::Point(75, 175));
EXPECT_EQ(CursorType::kCustom, cursor_manager->GetCursor().type());
EXPECT_TRUE(
CaptureModeSessionTestApi().IsUsingCustomCursor(CaptureModeType::kVideo));
event_generator->ClickLeftButton();
WaitForRecordingToStart();
EXPECT_FALSE(controller->IsActive());
EXPECT_TRUE(controller->is_recording_in_progress());
}
class GameDashboardCaptureModeHistogramTest
: public GameDashboardCaptureModeTest,
public ::testing::WithParamInterface<bool> {
public:
GameDashboardCaptureModeHistogramTest() = default;
~GameDashboardCaptureModeHistogramTest() override = default;
void SetUp() override {
GameDashboardCaptureModeTest::SetUp();
if (GetParam()) {
SwitchToTabletMode();
}
}
protected:
base::HistogramTester histogram_tester_;
};
TEST_P(GameDashboardCaptureModeHistogramTest,
GameCaptureConfigurationHistogram) {
constexpr char kCaptureConfigurationBase[] = "CaptureConfiguration";
CaptureModeTestApi test_api;
const std::string histogram_name =
BuildHistogramName(kCaptureConfigurationBase,
test_api.GetBehavior(BehaviorType::kGameDashboard),
true);
histogram_tester_.ExpectBucketCount(
histogram_name, CaptureModeConfiguration::kWindowRecording, 0);
auto* controller = StartGameCaptureModeSession();
StartVideoRecordingImmediately();
EXPECT_TRUE(controller->is_recording_in_progress());
test_api.StopVideoRecording();
WaitForCaptureFileToBeSaved();
EXPECT_FALSE(controller->is_recording_in_progress());
histogram_tester_.ExpectBucketCount(
histogram_name, CaptureModeConfiguration::kWindowRecording, 1);
}
TEST_P(GameDashboardCaptureModeHistogramTest,
GameCaptureConfigurationHistogramForInstantScreenshot) {
constexpr char kCaptureConfigurationBase[] = "CaptureConfiguration";
CaptureModeTestApi test_api;
const std::string histogram_name =
BuildHistogramName(kCaptureConfigurationBase,
test_api.GetBehavior(BehaviorType::kGameDashboard),
true);
histogram_tester_.ExpectBucketCount(
histogram_name, CaptureModeConfiguration::kWindowScreenshot, 0);
CaptureModeController::Get()->CaptureScreenshotOfGivenWindow(game_window());
histogram_tester_.ExpectBucketCount(
histogram_name, CaptureModeConfiguration::kWindowScreenshot, 1);
}
TEST_P(GameDashboardCaptureModeHistogramTest,
GameScreenRecordingLengthHistogram) {
constexpr char kRecordLenthHistogramBase[] = "ScreenRecordingLength";
auto* controller = StartGameCaptureModeSession();
StartVideoRecordingImmediately();
EXPECT_TRUE(controller->is_recording_in_progress());
WaitForSeconds(1);
CaptureModeTestApi test_api;
test_api.StopVideoRecording();
EXPECT_FALSE(controller->is_recording_in_progress());
WaitForCaptureFileToBeSaved();
histogram_tester_.ExpectUniqueSample(
BuildHistogramName(kRecordLenthHistogramBase,
test_api.GetBehavior(BehaviorType::kGameDashboard),
true),
1, 1);
}
TEST_P(GameDashboardCaptureModeHistogramTest,
GameScreenRecordingFileSizeHistogram) {
constexpr char kHistogramNameBase[] = "ScreenRecordingFileSize";
CaptureModeTestApi test_api;
const auto histogram_name = BuildHistogramName(
kHistogramNameBase, test_api.GetBehavior(BehaviorType::kGameDashboard),
true);
histogram_tester_.ExpectTotalCount(histogram_name, 0);
StartGameCaptureModeSession();
StartVideoRecordingImmediately();
test_api.StopVideoRecording();
WaitForCaptureFileToBeSaved();
histogram_tester_.ExpectTotalCount(histogram_name,
1);
}
TEST_P(GameDashboardCaptureModeHistogramTest, GameSaveToLocationHistogram) {
constexpr char kHistogramNameBase[] = "SaveLocation";
CaptureModeTestApi test_api;
const auto histogram_name = BuildHistogramName(
kHistogramNameBase, test_api.GetBehavior(BehaviorType::kGameDashboard),
true);
auto* test_delegate = CaptureModeController::Get()->delegate_for_testing();
const auto downloads_folder = test_delegate->GetUserDefaultDownloadsFolder();
const base::FilePath custom_folder =
CreateCustomFolderInUserDownloadsPath("test");
base::FilePath mount_point_path;
test_delegate->GetDriveFsMountPointPath(&mount_point_path);
const auto root_drive_folder = mount_point_path.Append("root");
const base::FilePath non_root_drive_folder = CreateFolderOnDriveFS("test");
struct {
base::FilePath set_save_file_folder;
CaptureModeSaveToLocation save_location;
} kTestCases[] = {
{downloads_folder, CaptureModeSaveToLocation::kDefault},
{custom_folder, CaptureModeSaveToLocation::kCustomizedFolder},
{root_drive_folder, CaptureModeSaveToLocation::kDrive},
{non_root_drive_folder, CaptureModeSaveToLocation::kDriveFolder},
};
for (auto test_case : kTestCases) {
histogram_tester_.ExpectBucketCount(histogram_name, test_case.save_location,
0);
auto* controller = StartGameCaptureModeSession();
controller->SetCustomCaptureFolder(test_case.set_save_file_folder);
StartVideoRecordingImmediately();
test_api.StopVideoRecording();
auto file_saved_path = WaitForCaptureFileToBeSaved();
histogram_tester_.ExpectBucketCount(histogram_name, test_case.save_location,
1);
}
}
TEST_P(GameDashboardCaptureModeHistogramTest,
GameRecordingStartsWithCameraHistogram) {
UpdateDisplay("1000x700");
constexpr char kHistogramNameBase[] = "RecordingStartsWithCamera";
AddDefaultCamera();
for (const auto camera_on : {true, false}) {
CaptureModeTestApi test_api;
const std::string histogram_name = BuildHistogramName(
kHistogramNameBase, test_api.GetBehavior(BehaviorType::kGameDashboard),
true);
histogram_tester_.ExpectBucketCount(histogram_name, camera_on, 0);
auto* controller = StartGameCaptureModeSession();
EXPECT_EQ(controller->type(), CaptureModeType::kVideo);
auto* camera_controller = controller->camera_controller();
if (!camera_on) {
camera_controller->SetSelectedCamera(CameraId());
}
test_api.PerformCapture();
WaitForRecordingToStart();
EXPECT_TRUE(controller->is_recording_in_progress());
test_api.StopVideoRecording();
EXPECT_FALSE(controller->is_recording_in_progress());
WaitForCaptureFileToBeSaved();
histogram_tester_.ExpectBucketCount(histogram_name, camera_on, 1);
}
}
TEST_P(GameDashboardCaptureModeHistogramTest,
GameDemoToolsEnabledOnRecordingHistogram) {
constexpr char kHistogramNameBase[] = "DemoToolsEnabledOnRecordingStart";
CaptureModeTestApi test_api;
for (const auto enable_demo_tools : {false, true}) {
const auto histogram_name = BuildHistogramName(
kHistogramNameBase, test_api.GetBehavior(BehaviorType::kGameDashboard),
true);
histogram_tester_.ExpectBucketCount(histogram_name, enable_demo_tools, 0);
auto* controller = StartGameCaptureModeSession();
controller->EnableDemoTools(enable_demo_tools);
StartVideoRecordingImmediately();
test_api.StopVideoRecording();
WaitForCaptureFileToBeSaved();
histogram_tester_.ExpectBucketCount(histogram_name, enable_demo_tools, 1);
}
}
TEST_P(GameDashboardCaptureModeHistogramTest, GameAudioRecordingModeHistogram) {
constexpr char kHistogramNameBase[] = "AudioRecordingMode";
CaptureModeTestApi test_api;
for (const auto audio_mode :
{AudioRecordingMode::kOff, AudioRecordingMode::kMicrophone,
AudioRecordingMode::kSystem,
AudioRecordingMode::kSystemAndMicrophone}) {
const auto histogram_name = BuildHistogramName(
kHistogramNameBase, test_api.GetBehavior(BehaviorType::kGameDashboard),
true);
histogram_tester_.ExpectBucketCount(histogram_name, audio_mode, 0);
auto* controller = StartGameCaptureModeSession();
controller->SetAudioRecordingMode(audio_mode);
controller->Stop();
histogram_tester_.ExpectBucketCount(histogram_name, audio_mode, 1);
}
}
TEST_P(GameDashboardCaptureModeHistogramTest,
GameDashboardEndRecordingReasonHistogram) {
constexpr char kHistogramNameBase[] = "EndRecordingReason";
CaptureModeTestApi test_api;
const std::string histogram_name = BuildHistogramName(
kHistogramNameBase, test_api.GetBehavior(BehaviorType::kDefault),
true);
histogram_tester_.ExpectBucketCount(
histogram_name,
EndRecordingReason::kGameDashboardStopRecordingButton,
0);
StartGameCaptureModeSession();
StartVideoRecordingImmediately();
CaptureModeController::Get()->EndVideoRecording(
EndRecordingReason::kGameDashboardStopRecordingButton);
WaitForCaptureFileToBeSaved();
histogram_tester_.ExpectBucketCount(
histogram_name,
EndRecordingReason::kGameDashboardStopRecordingButton,
1);
histogram_tester_.ExpectBucketCount(
histogram_name,
EndRecordingReason::kGameToolbarStopRecordingButton,
0);
StartGameCaptureModeSession();
StartVideoRecordingImmediately();
CaptureModeController::Get()->EndVideoRecording(
EndRecordingReason::kGameToolbarStopRecordingButton);
WaitForCaptureFileToBeSaved();
histogram_tester_.ExpectBucketCount(
histogram_name,
EndRecordingReason::kGameToolbarStopRecordingButton,
1);
if (GetParam()) {
return;
}
histogram_tester_.ExpectBucketCount(
histogram_name,
EndRecordingReason::kGameDashboardTabletMode,
0);
auto game_dashboard_test_api = std::make_unique<GameDashboardContextTestApi>(
GameDashboardController::Get()->GetGameDashboardContext(game_window()),
GetEventGenerator());
game_dashboard_test_api->OpenTheMainMenu();
LeftClickOn(game_dashboard_test_api->GetMainMenuRecordGameTile());
base::RunLoop().RunUntilIdle();
LeftClickOn(GetStartRecordingButton());
WaitForRecordingToStart();
EXPECT_TRUE(CaptureModeController::Get()->is_recording_in_progress());
TabletModeControllerTestApi().EnterTabletMode();
WaitForCaptureFileToBeSaved();
histogram_tester_.ExpectBucketCount(
BuildHistogramName(kHistogramNameBase,
test_api.GetBehavior(BehaviorType::kDefault),
true),
EndRecordingReason::kGameDashboardTabletMode,
1);
}
TEST_P(GameDashboardCaptureModeHistogramTest,
CaptureScreenshotOfGivenWindowMetric) {
constexpr char kHistogramNameBase[] = "SaveLocation";
const base::FilePath custom_folder =
CreateCustomFolderInUserDownloadsPath("test");
const auto histogram_name = BuildHistogramName(
kHistogramNameBase,
CaptureModeTestApi().GetBehavior(BehaviorType::kGameDashboard),
true);
histogram_tester_.ExpectBucketCount(
histogram_name, CaptureModeSaveToLocation::kCustomizedFolder, 0);
CaptureModeController* controller = CaptureModeController::Get();
controller->SetCustomCaptureFolder(custom_folder);
controller->CaptureScreenshotOfGivenWindow(game_window());
const auto file_saved_path = WaitForCaptureFileToBeSaved();
histogram_tester_.ExpectBucketCount(
histogram_name, CaptureModeSaveToLocation::kCustomizedFolder, 1);
}
TEST_P(GameDashboardCaptureModeHistogramTest, EntryPointTest) {
constexpr char kCaptureConfigurationBase[] = "EntryPoint";
CaptureModeTestApi test_api;
const std::string histogram_name =
BuildHistogramName(kCaptureConfigurationBase, nullptr,
true);
histogram_tester_.ExpectBucketCount(histogram_name,
CaptureModeEntryType::kGameDashboard, 0);
auto* controller = StartGameCaptureModeSession();
controller->Stop();
histogram_tester_.ExpectBucketCount(histogram_name,
CaptureModeEntryType::kGameDashboard, 1);
controller->StartRecordingInstantlyForGameDashboard(game_window());
histogram_tester_.ExpectBucketCount(histogram_name,
CaptureModeEntryType::kGameDashboard, 2);
}
INSTANTIATE_TEST_SUITE_P(All,
GameDashboardCaptureModeHistogramTest,
::testing::Bool());
}