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 <lib/zxio/inception.h>
6 #include <lib/zxio/zxio.h>
7 #include <lib/zx/channel.h>
8 #include <lib/zx/vmo.h>
9 
10 #include <unittest/unittest.h>
11 
12 #define ALPHABET "abcdefghijklmnopqrstuvwxyz"
13 
vmofile_basic_test(void)14 bool vmofile_basic_test(void) {
15     BEGIN_TEST;
16 
17     zx::vmo backing;
18     ASSERT_EQ(ZX_OK, zx::vmo::create(300u, 0u, &backing));
19     size_t len = strlen(ALPHABET);
20     ASSERT_EQ(ZX_OK, backing.write(ALPHABET, 0, len));
21     ASSERT_EQ(ZX_OK, backing.write(ALPHABET, len, len + len));
22 
23     zx::channel h1, h2;
24     ASSERT_EQ(ZX_OK, zx::channel::create(0u, &h1, &h2));
25 
26     zxio_storage_t storage;
27     zxio_vmofile_init(&storage, h1.release(), backing.release(), 4, len, 3);
28     zxio_t* io = &storage.io;
29 
30     zxio_signals_t observed = ZXIO_SIGNAL_NONE;
31     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_wait_one(io, ZXIO_READABLE,
32                                                   ZX_TIME_INFINITE, &observed));
33 
34     zx::channel clone1, clone2;
35     ASSERT_EQ(ZX_OK, zx::channel::create(0u, &clone1, &clone2));
36 
37     ASSERT_EQ(ZX_OK, zxio_clone_async(io, 0u, clone1.release()));
38     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_sync(io));
39 
40     zxio_node_attr_t attr = {};
41     ASSERT_EQ(ZX_OK, zxio_attr_get(io, &attr));
42     EXPECT_EQ(len, attr.content_size);
43     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_attr_set(io, 0u, &attr));
44     char buffer[1024];
45     memset(buffer, 0, sizeof(buffer));
46     size_t actual = 0u;
47     ASSERT_EQ(ZX_OK, zxio_read(io, buffer, 8, &actual));
48     EXPECT_EQ(actual, 8);
49     EXPECT_STR_EQ("hijklmno", buffer);
50     memset(buffer, 0, sizeof(buffer));
51     actual = 0u;
52     ASSERT_EQ(ZX_OK, zxio_read_at(io, 1u, buffer, 6, &actual));
53     EXPECT_EQ(actual, 6);
54     EXPECT_STR_EQ("fghijk", buffer);
55     ASSERT_EQ(ZX_ERR_WRONG_TYPE, zxio_write(io, buffer, sizeof(buffer), &actual));
56     ASSERT_EQ(ZX_ERR_WRONG_TYPE, zxio_write_at(io, 0u, buffer, sizeof(buffer), &actual));
57     size_t offset = 2u;
58     ASSERT_EQ(ZX_OK, zxio_seek(io, 2u, fuchsia_io_SeekOrigin_START, &offset));
59     EXPECT_EQ(offset, 2u);
60     memset(buffer, 0, sizeof(buffer));
61     actual = 0u;
62     ASSERT_EQ(ZX_OK, zxio_read(io, buffer, 3, &actual));
63     EXPECT_STR_EQ("ghi", buffer);
64     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_truncate(io, 0u));
65     uint32_t flags = 0u;
66     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_flags_get(io, &flags));
67     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_flags_set(io, flags));
68     zx_handle_t vmo = ZX_HANDLE_INVALID;
69     size_t size = 0u;
70     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_vmo_get_copy(io, &vmo, &size));
71     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_vmo_get_clone(io, &vmo, &size));
72     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_vmo_get_exact(io, &vmo, &size));
73 
74     zxio_t* result = nullptr;
75     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_open(io, 0u, 0u, "hello", &result));
76     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED,
77               zxio_open_async(io, 0u, 0u, "hello", ZX_HANDLE_INVALID));
78     ASSERT_EQ(ZX_ERR_NOT_SUPPORTED, zxio_unlink(io, "hello"));
79 
80     ASSERT_EQ(ZX_OK, zxio_close(io));
81 
82     END_TEST;
83 }
84 
85 BEGIN_TEST_CASE(vmofile_test)
86 RUN_TEST(vmofile_basic_test);
87 END_TEST_CASE(vmofile_test)
88