blob: 4722fa658a552513066afca248a283b4123a4412 [file] [log] [blame]
// Copyright 2022 The Fuchsia 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 <fidl/fuchsia.ui.composition/cpp/fidl.h>
#include <fidl/fuchsia.ui.composition/cpp/test_base.h>
#include <lib/component/incoming/cpp/constants.h>
#include <lib/component/outgoing/cpp/outgoing_directory.h>
#include <lib/fdio/directory.h>
#include <lib/ui/scenic/cpp/view_creation_tokens.h>
#include <lib/zx/time.h>
#include <gtest/gtest.h>
#include "src/lib/testing/loop_fixture/test_loop_fixture.h"
#include "src/lib/testing/predicates/status.h"
#include "src/lib/vulkan/flatland_view/flatland_view.h"
namespace {
constexpr uint32_t kWidth = 100;
constexpr uint32_t kHeight = 50;
class FakeFlatland : public fidl::testing::TestBase<fuchsia_ui_composition::Flatland>,
public fidl::testing::TestBase<fuchsia_ui_composition::ParentViewportWatcher> {
public:
// `dispatcher` must be non-null.
explicit FakeFlatland(async_dispatcher_t* dispatcher) : dispatcher_(dispatcher) {
ZX_DEBUG_ASSERT(dispatcher != nullptr);
}
void NotImplemented_(const std::string& name, fidl::CompleterBase& completer) override {}
fidl::ProtocolHandler<fuchsia_ui_composition::Flatland> GetHandler(
async_dispatcher_t* dispatcher) {
return [this, dispatcher](fidl::ServerEnd<fuchsia_ui_composition::Flatland> request) {
flatland_bindings_.AddBinding(dispatcher, std::move(request), this,
fidl::kIgnoreBindingClosure);
};
}
// `fuchsia_ui_composition::Flatland`:
void CreateView2(CreateView2Request& request, CreateView2Completer::Sync& completer) override {
parent_viewport_watcher_bindings_.AddBinding(dispatcher_,
std::move(request.parent_viewport_watcher()), this,
fidl::kIgnoreBindingClosure);
}
// `fuchsia_ui_composition::ParentViewportWatcher`:
void GetLayout(GetLayoutCompleter::Sync& completer) override {
fuchsia_ui_composition::LayoutInfo info = {{
.logical_size = fuchsia_math::SizeU{{.width = kWidth, .height = kHeight}},
}};
completer.Reply({{.info = std::move(info)}});
}
private:
fidl::ServerBindingGroup<fuchsia_ui_composition::Flatland> flatland_bindings_;
fidl::ServerBindingGroup<fuchsia_ui_composition::ParentViewportWatcher>
parent_viewport_watcher_bindings_;
async_dispatcher_t* const dispatcher_;
};
} // namespace
class FlatlandViewTest : public gtest::TestLoopFixture {
public:
void SetUp() override {
TestLoopFixture::SetUp();
fake_flatland_ = std::make_unique<FakeFlatland>(dispatcher());
zx::result<> add_protocol_result =
flatland_outgoing_.AddUnmanagedProtocol<fuchsia_ui_composition::Flatland>(
fake_flatland_->GetHandler(dispatcher()));
ASSERT_OK(add_protocol_result);
auto [root_dir_client, root_dir_server] = fidl::Endpoints<fuchsia_io::Directory>::Create();
zx::result<> serve_result = flatland_outgoing_.Serve(std::move(root_dir_server));
ASSERT_OK(serve_result);
auto [svc_dir_client, svc_dir_server] = fidl::Endpoints<fuchsia_io::Directory>::Create();
zx_status_t open_status = fdio_open3_at(
/*directory=*/root_dir_client.channel().get(), /*path=*/component::kServiceDirectory,
/*flags=*/uint64_t{fuchsia_io::Flags::kProtocolDirectory},
/*request=*/std::move(svc_dir_server).TakeChannel().release());
ASSERT_OK(open_status);
view_incoming_ = std::move(svc_dir_client);
}
component::OutgoingDirectory flatland_outgoing_{dispatcher()};
fidl::ClientEnd<fuchsia_io::Directory> view_incoming_;
std::unique_ptr<FakeFlatland> fake_flatland_;
std::unique_ptr<FlatlandView> view_;
uint32_t width_ = 0;
uint32_t height_ = 0;
};
TEST_F(FlatlandViewTest, Initialize) {
FlatlandView::ResizeCallback resize_callback = [this](uint32_t width, uint32_t height) {
width_ = width;
height_ = height;
QuitLoop();
};
zx::eventpair view_token_0, view_token_1;
EXPECT_EQ(ZX_OK, zx::eventpair::create(0, &view_token_0, &view_token_1));
auto [view_token, viewport_token] = scenic::cpp::ViewCreationTokenPair::New();
auto view = FlatlandView::Create(view_incoming_.borrow(), std::move(view_token),
std::move(resize_callback), dispatcher());
ASSERT_TRUE(view);
EXPECT_EQ(0.0, width_);
EXPECT_EQ(0.0, height_);
RunLoopFor(zx::sec(3));
EXPECT_EQ(kWidth, width_);
EXPECT_EQ(kHeight, height_);
}