blob: 827c4e3b339c772d8f4ebc7271f760e89573815c [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 <fcntl.h>
#include <fuchsia/virtualconsole/c/fidl.h>
#include <lib/fdio/directory.h>
#include <lib/zx/channel.h>
#include <lib/zx/time.h>
#include <stdio.h>
#include <sys/types.h>
#include <zircon/status.h>
#include <zircon/syscalls.h>
#include <zircon/types.h>
#include <zxtest/zxtest.h>
static zx_status_t connect_to_service(const char* service, zx::channel* channel_out) {
zx::channel channel_local, channel_remote;
zx_status_t status = zx::channel::create(0, &channel_local, &channel_remote);
if (status != ZX_OK) {
fprintf(stderr, "vc-intergration-test: failed to create channel: %s\n",
zx_status_get_string(status));
return status;
}
status = fdio_service_connect(service, channel_remote.release());
if (status != ZX_OK) {
fprintf(stderr, "vc-integration-test: failed to connect to service: %s\n",
zx_status_get_string(status));
return status;
}
*channel_out = std::move(channel_local);
return ZX_OK;
}
TEST(VirtualConsole, HasPrimaryConnected) {
int fd = open("/dev/class/display-controller/000", O_RDWR);
if (fd < 0) {
fprintf(stderr, "Skipping test because device has no display controller driver\n");
return;
}
close(fd);
zx::channel session_manager;
EXPECT_OK(connect_to_service("/svc/fuchsia.virtualconsole.SessionManager", &session_manager));
constexpr uint32_t kRetryCount = 50;
constexpr uint32_t kRetryDelaySeconds = 1;
bool connected = false;
for (uint32_t i = 0; i < kRetryCount; i++) {
// Retry because it might take some time for the display to appear on
// startup.
EXPECT_OK(fuchsia_virtualconsole_SessionManagerHasPrimaryConnected(session_manager.get(),
&connected));
if (connected)
break;
zx::nanosleep(zx::deadline_after(zx::sec(kRetryDelaySeconds)));
}
// If this fails, either there's a bug in virtcon/the display driver, or there
// isn't actually a display connected.
EXPECT_TRUE(connected);
}