chromium/chrome/browser/ash/crosapi/fullscreen_controller_ash_unittest.cc

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ash/crosapi/fullscreen_controller_ash.h"

#include "base/test/task_environment.h"
#include "base/test/test_future.h"
#include "chromeos/crosapi/mojom/fullscreen_controller.mojom.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace crosapi {

using mojom::FullscreenControllerClient;

using ShouldExitFullscreenBeforeLockCallback =
    mojom::FullscreenControllerClient::ShouldExitFullscreenBeforeLockCallback;

class FullscreenControllerAshBaseTest : public testing::Test {
 public:
  void InvokeShouldExitFullscreenBeforeLock(bool expected_result) {
    base::test::TestFuture<bool> future;
    fullscreen_controller_ash()->ShouldExitFullscreenBeforeLock(
        future.GetCallback());

    EXPECT_EQ(future.Get(), expected_result);
  }

  FullscreenControllerAsh* fullscreen_controller_ash() {
    return &fullscreen_controller_ash_;
  }

 private:
  base::test::SingleThreadTaskEnvironment task_environment_;
  FullscreenControllerAsh fullscreen_controller_ash_;
};

// Test that the default (True) is returned if
// `ShouldExitFullscreenBeforeLock()` is invoked with no client bound.
TEST_F(FullscreenControllerAshBaseTest,
       ShouldExitFullscreenBeforeLockWithoutBoundClient) {
  InvokeShouldExitFullscreenBeforeLock(/*expected_result=*/true);
}

class FullscreenControllerAshTest : public FullscreenControllerAshBaseTest,
                                    public testing::WithParamInterface<bool> {
 public:
  class MockFullscreenControllerClient : public FullscreenControllerClient {
   public:
    MOCK_METHOD(void,
                ShouldExitFullscreenBeforeLock,
                (ShouldExitFullscreenBeforeLockCallback callback),
                (override));
  };

 protected:
  testing::StrictMock<MockFullscreenControllerClient> client_;
};

// Test that the correct response is returned if
// `ShouldExitFullscreenBeforeLock()` is invoked with a client bound.
TEST_P(FullscreenControllerAshTest,
       ShouldExitFullscreenBeforeLockWithBoundClient) {
  bool expected_result = GetParam();

  // Bind `client_`.
  mojo::Receiver<FullscreenControllerClient> client_receiver{&client_};
  fullscreen_controller_ash()->AddClient(
      client_receiver.BindNewPipeAndPassRemoteWithVersion());

  // Mock `client_` response for `ShouldExitFullscreenBeforeLock()`.
  EXPECT_CALL(client_, ShouldExitFullscreenBeforeLock)
      .WillOnce(testing::Invoke(
          [expected_result](ShouldExitFullscreenBeforeLockCallback callback) {
            std::move(callback).Run(expected_result);
          }));

  InvokeShouldExitFullscreenBeforeLock(expected_result);
}

INSTANTIATE_TEST_SUITE_P(All, FullscreenControllerAshTest, testing::Bool());

}  // namespace crosapi