1// Copyright 2018 The Fuchsia 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
5#include <fcntl.h>
6#include <unistd.h>
7
8#include <fbl/unique_fd.h>
9#include <fuchsia/io/c/fidl.h>
10#include <lib/fdio/limits.h>
11#include <lib/fdio/util.h>
12#include <unittest/unittest.h>
13#include <zircon/processargs.h>
14#include <zircon/syscalls.h>
15
16namespace {
17
18bool test_device_clone() {
19    BEGIN_TEST;
20
21    fbl::unique_fd fd(open("/dev/zero", O_RDONLY));
22
23    zx_handle_t handles[FDIO_MAX_HANDLES] = {};
24    uint32_t types[FDIO_MAX_HANDLES] = {};
25    zx_status_t r = fdio_clone_fd(fd.get(), 0, handles, types);
26    ASSERT_EQ(r, 1);
27    ASSERT_NE(handles[0], ZX_HANDLE_INVALID);
28    ASSERT_EQ(types[0], PA_FDIO_REMOTE);
29    zx_handle_close(handles[0]);
30
31    END_TEST;
32}
33
34bool test_device_transfer() {
35    BEGIN_TEST;
36
37    fbl::unique_fd fd(open("/dev/zero", O_RDONLY));
38
39    zx_handle_t handles[FDIO_MAX_HANDLES] = {};
40    uint32_t types[FDIO_MAX_HANDLES] = {};
41    zx_status_t r = fdio_transfer_fd(fd.release(), 0, handles, types);
42    ASSERT_EQ(r, 1);
43    ASSERT_NE(handles[0], ZX_HANDLE_INVALID);
44    ASSERT_EQ(types[0], PA_FDIO_REMOTE);
45    zx_handle_close(handles[0]);
46
47    END_TEST;
48}
49
50} // namespace
51
52BEGIN_TEST_CASE(fdio_tests)
53RUN_TEST(test_device_clone)
54RUN_TEST(test_device_transfer)
55END_TEST_CASE(fdio_tests)
56