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 
16 namespace {
17 
TestDeviceClone()18 bool TestDeviceClone() {
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 
TestDeviceTransfer()34 bool TestDeviceTransfer() {
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 
52 BEGIN_TEST_CASE(fdio_tests)
53 RUN_TEST(TestDeviceClone)
54 RUN_TEST(TestDeviceTransfer)
55 END_TEST_CASE(fdio_tests)
56