application_controller_impl_unittest.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // Copyright 2019 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 <fuchsia/web/cpp/fidl.h>
  5. #include <fuchsia/web/cpp/fidl_test_base.h>
  6. #include <lib/fidl/cpp/binding.h>
  7. #include <string>
  8. #include <utility>
  9. #include "base/logging.h"
  10. #include "base/test/task_environment.h"
  11. #include "base/test/test_future.h"
  12. #include "fuchsia_web/common/test/fit_adapter.h"
  13. #include "fuchsia_web/runners/cast/application_controller_impl.h"
  14. #include "fuchsia_web/runners/cast/fidl/fidl/chromium/cast/cpp/fidl.h"
  15. #include "testing/gmock/include/gmock/gmock.h"
  16. #include "testing/gtest/include/gtest/gtest.h"
  17. using testing::InvokeWithoutArgs;
  18. namespace {
  19. class MockFrame : public fuchsia::web::testing::Frame_TestBase {
  20. public:
  21. void NotImplemented_(const std::string& name) final {
  22. LOG(FATAL) << "No mock defined for " << name;
  23. }
  24. MOCK_METHOD(void,
  25. ConfigureInputTypes,
  26. (fuchsia::web::InputTypes types,
  27. fuchsia::web::AllowInputState allow));
  28. MOCK_METHOD(void,
  29. GetPrivateMemorySize,
  30. (GetPrivateMemorySizeCallback callback));
  31. };
  32. class ApplicationControllerImplTest : public chromium::cast::ApplicationContext,
  33. public testing::Test {
  34. public:
  35. ApplicationControllerImplTest()
  36. : application_context_binding_(this),
  37. application_context_(application_context_binding_.NewBinding().Bind()),
  38. application_(&frame_, application_context_.get()) {
  39. base::RunLoop run_loop;
  40. wait_for_controller_callback_ = run_loop.QuitClosure();
  41. run_loop.Run();
  42. }
  43. ApplicationControllerImplTest(const ApplicationControllerImplTest&) = delete;
  44. ApplicationControllerImplTest& operator=(
  45. const ApplicationControllerImplTest&) = delete;
  46. ~ApplicationControllerImplTest() override = default;
  47. protected:
  48. // chromium::cast::ApplicationContext implementation.
  49. void GetMediaSessionId(GetMediaSessionIdCallback callback) final {
  50. NOTREACHED();
  51. }
  52. void SetApplicationController(
  53. fidl::InterfaceHandle<chromium::cast::ApplicationController> application)
  54. final {
  55. EXPECT_TRUE(wait_for_controller_callback_);
  56. application_ptr_ = application.Bind();
  57. std::move(wait_for_controller_callback_).Run();
  58. }
  59. base::test::SingleThreadTaskEnvironment task_environment_{
  60. base::test::SingleThreadTaskEnvironment::MainThreadType::IO};
  61. MockFrame frame_;
  62. fidl::Binding<chromium::cast::ApplicationContext>
  63. application_context_binding_;
  64. chromium::cast::ApplicationContextPtr application_context_;
  65. ApplicationControllerImpl application_;
  66. chromium::cast::ApplicationControllerPtr application_ptr_;
  67. base::OnceClosure wait_for_controller_callback_;
  68. };
  69. // Verifies that SetTouchInputEnabled() calls the Frame API correctly.
  70. TEST_F(ApplicationControllerImplTest, ConfigureInputTypes) {
  71. base::RunLoop run_loop;
  72. EXPECT_CALL(frame_,
  73. ConfigureInputTypes(fuchsia::web::InputTypes::GESTURE_TAP |
  74. fuchsia::web::InputTypes::GESTURE_DRAG,
  75. fuchsia::web::AllowInputState::ALLOW))
  76. .Times(2);
  77. EXPECT_CALL(frame_,
  78. ConfigureInputTypes(fuchsia::web::InputTypes::GESTURE_TAP |
  79. fuchsia::web::InputTypes::GESTURE_DRAG,
  80. fuchsia::web::AllowInputState::DENY))
  81. .WillOnce(InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }));
  82. application_ptr_->SetTouchInputEnabled(true);
  83. application_ptr_->SetTouchInputEnabled(true);
  84. application_ptr_->SetTouchInputEnabled(false);
  85. run_loop.Run();
  86. }
  87. // Verifies that SetTouchInputEnabled() calls the Frame API correctly.
  88. TEST_F(ApplicationControllerImplTest, GetPrivateMemorySize) {
  89. constexpr uint64_t kMockSize = 12345;
  90. EXPECT_CALL(frame_, GetPrivateMemorySize(testing::_))
  91. .WillOnce(
  92. [](chromium::cast::ApplicationController::GetPrivateMemorySizeCallback
  93. callback) { callback(kMockSize); });
  94. base::test::TestFuture<uint64_t> result;
  95. application_ptr_->GetPrivateMemorySize(
  96. CallbackToFitFunction(result.GetCallback()));
  97. ASSERT_TRUE(result.Wait());
  98. EXPECT_EQ(result.Get(), kMockSize);
  99. }
  100. } // namespace