blob: 59704ad7696f89ed9909607bef35a813ece1d3ea [file] [log] [blame]
// Copyright 2019 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 <fuchsia/sysmem/cpp/fidl.h>
#include <lib/async-loop/cpp/loop.h>
#include <lib/fdio/directory.h>
#include <lib/fdio/fd.h>
#include <lib/fdio/fdio.h>
#include <lib/sys/cpp/component_context.h>
#include "gtest/gtest.h"
#include "lib/fidl/cpp/interface_ptr.h"
#include "src/lib/fxl/logging.h"
// The sysmem-test in zircon covers more functionality of sysmem itself. This
// test is only meant to verify that sysmem_connector establishes a connection
// to the sysmem driver.
TEST(SysmemConnectorTest, Connect) {
async::Loop main_loop(&kAsyncLoopConfigAttachToThread);
auto component_context = sys::ComponentContext::Create();
std::mutex is_sync_complete_lock;
bool is_sync_complete = false;
fuchsia::sysmem::AllocatorPtr allocator;
allocator.set_error_handler([](zx_status_t status) { ASSERT_TRUE(false); });
component_context->svc()->Connect(
allocator.NewRequest(main_loop.dispatcher()));
fuchsia::sysmem::BufferCollectionTokenPtr token;
token.set_error_handler([](zx_status_t status) { ASSERT_TRUE(false); });
allocator->AllocateSharedCollection(token.NewRequest(main_loop.dispatcher()));
token->Sync([&] {
{ // scope lock
std::lock_guard<std::mutex> lock(is_sync_complete_lock);
is_sync_complete = true;
} // ~lock
});
while (true) {
{ // scope lock
std::lock_guard<std::mutex> lock(is_sync_complete_lock);
if (is_sync_complete) {
break;
}
} // ~lock
zx_status_t status = main_loop.Run(zx::deadline_after(zx::sec(30)), true);
// If this didn't work after 30 seconds, consider that a test failure.
ASSERT_EQ(status, ZX_OK);
}
ASSERT_TRUE(is_sync_complete);
// The Sync() working means the Allocator connection was established to the
// sysmem driver, and the driver responded.
allocator.set_error_handler(
[](zx_status_t status) { ASSERT_EQ(status, ZX_ERR_CANCELED); });
token.set_error_handler(
[](zx_status_t status) { ASSERT_EQ(status, ZX_ERR_CANCELED); });
}