OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // This file tests the C API. | 5 // This file tests the C API. |
6 | 6 |
7 #include "mojo/public/c/system/core.h" | 7 #include "mojo/public/c/system/core.h" |
8 | 8 |
9 #include <string.h> | 9 #include <string.h> |
10 | 10 |
(...skipping 16 matching lines...) Expand all Loading... |
27 char buffer[10] = { 0 }; | 27 char buffer[10] = { 0 }; |
28 uint32_t buffer_size; | 28 uint32_t buffer_size; |
29 void* write_pointer; | 29 void* write_pointer; |
30 const void* read_pointer; | 30 const void* read_pointer; |
31 | 31 |
32 // Close: | 32 // Close: |
33 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(MOJO_HANDLE_INVALID)); | 33 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, MojoClose(MOJO_HANDLE_INVALID)); |
34 | 34 |
35 // Wait: | 35 // Wait: |
36 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 36 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
37 MojoWait(MOJO_HANDLE_INVALID, MOJO_WAIT_FLAG_EVERYTHING, 1000000)); | 37 MojoWait(MOJO_HANDLE_INVALID, ~MOJO_HANDLE_SIGNAL_NONE, 1000000)); |
38 h0 = MOJO_HANDLE_INVALID; | 38 h0 = MOJO_HANDLE_INVALID; |
39 sig = MOJO_WAIT_FLAG_EVERYTHING; | 39 sig = ~MOJO_HANDLE_SIGNAL_NONE; |
40 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 40 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
41 MojoWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE)); | 41 MojoWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE)); |
42 | 42 |
43 // Message pipe: | 43 // Message pipe: |
44 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 44 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
45 MojoWriteMessage(h0, buffer, 3, NULL, 0, | 45 MojoWriteMessage(h0, buffer, 3, NULL, 0, |
46 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 46 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
47 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 47 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
48 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, | 48 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, |
49 MojoReadMessage(h0, buffer, &buffer_size, NULL, NULL, | 49 MojoReadMessage(h0, buffer, &buffer_size, NULL, NULL, |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 uint32_t buffer_size; | 82 uint32_t buffer_size; |
83 | 83 |
84 h0 = MOJO_HANDLE_INVALID; | 84 h0 = MOJO_HANDLE_INVALID; |
85 h1 = MOJO_HANDLE_INVALID; | 85 h1 = MOJO_HANDLE_INVALID; |
86 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(NULL, &h0, &h1)); | 86 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateMessagePipe(NULL, &h0, &h1)); |
87 EXPECT_NE(h0, MOJO_HANDLE_INVALID); | 87 EXPECT_NE(h0, MOJO_HANDLE_INVALID); |
88 EXPECT_NE(h1, MOJO_HANDLE_INVALID); | 88 EXPECT_NE(h1, MOJO_HANDLE_INVALID); |
89 | 89 |
90 // Shouldn't be readable. | 90 // Shouldn't be readable. |
91 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 91 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
92 MojoWait(h0, MOJO_WAIT_FLAG_READABLE, 0)); | 92 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
93 | 93 |
94 // Should be writable. | 94 // Should be writable. |
95 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(h0, MOJO_WAIT_FLAG_WRITABLE, 0)); | 95 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(h0, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
96 | 96 |
97 // Try to read. | 97 // Try to read. |
98 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 98 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
99 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 99 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
100 MojoReadMessage(h0, buffer, &buffer_size, NULL, NULL, | 100 MojoReadMessage(h0, buffer, &buffer_size, NULL, NULL, |
101 MOJO_READ_MESSAGE_FLAG_NONE)); | 101 MOJO_READ_MESSAGE_FLAG_NONE)); |
102 | 102 |
103 // Write to |h1|. | 103 // Write to |h1|. |
104 static const char kHello[] = "hello"; | 104 static const char kHello[] = "hello"; |
105 buffer_size = static_cast<uint32_t>(sizeof(kHello)); | 105 buffer_size = static_cast<uint32_t>(sizeof(kHello)); |
106 EXPECT_EQ(MOJO_RESULT_OK, | 106 EXPECT_EQ(MOJO_RESULT_OK, |
107 MojoWriteMessage(h1, kHello, buffer_size, NULL, 0, | 107 MojoWriteMessage(h1, kHello, buffer_size, NULL, 0, |
108 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 108 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
109 | 109 |
110 // |h0| should be readable. | 110 // |h0| should be readable. |
111 sig = MOJO_WAIT_FLAG_READABLE; | 111 sig = MOJO_HANDLE_SIGNAL_READABLE; |
112 EXPECT_EQ(MOJO_RESULT_OK, | 112 EXPECT_EQ(MOJO_RESULT_OK, |
113 MojoWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE)); | 113 MojoWaitMany(&h0, &sig, 1, MOJO_DEADLINE_INDEFINITE)); |
114 | 114 |
115 // Read from |h0|. | 115 // Read from |h0|. |
116 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 116 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
117 EXPECT_EQ(MOJO_RESULT_OK, | 117 EXPECT_EQ(MOJO_RESULT_OK, |
118 MojoReadMessage(h0, buffer, &buffer_size, NULL, NULL, | 118 MojoReadMessage(h0, buffer, &buffer_size, NULL, NULL, |
119 MOJO_READ_MESSAGE_FLAG_NONE)); | 119 MOJO_READ_MESSAGE_FLAG_NONE)); |
120 EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size); | 120 EXPECT_EQ(static_cast<uint32_t>(sizeof(kHello)), buffer_size); |
121 EXPECT_STREQ(kHello, buffer); | 121 EXPECT_STREQ(kHello, buffer); |
122 | 122 |
123 // |h0| should no longer be readable. | 123 // |h0| should no longer be readable. |
124 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 124 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
125 MojoWait(h0, MOJO_WAIT_FLAG_READABLE, 10)); | 125 MojoWait(h0, MOJO_HANDLE_SIGNAL_READABLE, 10)); |
126 | 126 |
127 // Close |h0|. | 127 // Close |h0|. |
128 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0)); | 128 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h0)); |
129 | 129 |
130 // |h1| should no longer be readable or writable. | 130 // |h1| should no longer be readable or writable. |
131 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 131 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
132 MojoWait(h1, MOJO_WAIT_FLAG_READABLE | MOJO_WAIT_FLAG_WRITABLE, | 132 MojoWait(h1, |
| 133 MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE, |
133 1000)); | 134 1000)); |
134 | 135 |
135 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1)); | 136 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(h1)); |
136 } | 137 } |
137 | 138 |
138 TEST(CoreTest, BasicDataPipe) { | 139 TEST(CoreTest, BasicDataPipe) { |
139 MojoHandle hp, hc; | 140 MojoHandle hp, hc; |
140 MojoHandleSignals sig; | 141 MojoHandleSignals sig; |
141 char buffer[20] = { 0 }; | 142 char buffer[20] = { 0 }; |
142 uint32_t buffer_size; | 143 uint32_t buffer_size; |
143 void* write_pointer; | 144 void* write_pointer; |
144 const void* read_pointer; | 145 const void* read_pointer; |
145 | 146 |
146 hp = MOJO_HANDLE_INVALID; | 147 hp = MOJO_HANDLE_INVALID; |
147 hc = MOJO_HANDLE_INVALID; | 148 hc = MOJO_HANDLE_INVALID; |
148 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(NULL, &hp, &hc)); | 149 EXPECT_EQ(MOJO_RESULT_OK, MojoCreateDataPipe(NULL, &hp, &hc)); |
149 EXPECT_NE(hp, MOJO_HANDLE_INVALID); | 150 EXPECT_NE(hp, MOJO_HANDLE_INVALID); |
150 EXPECT_NE(hc, MOJO_HANDLE_INVALID); | 151 EXPECT_NE(hc, MOJO_HANDLE_INVALID); |
151 | 152 |
152 // The consumer |hc| shouldn't be readable. | 153 // The consumer |hc| shouldn't be readable. |
153 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, | 154 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED, |
154 MojoWait(hc, MOJO_WAIT_FLAG_READABLE, 0)); | 155 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
155 | 156 |
156 // The producer |hp| should be writable. | 157 // The producer |hp| should be writable. |
157 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(hp, MOJO_WAIT_FLAG_WRITABLE, 0)); | 158 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(hp, MOJO_HANDLE_SIGNAL_WRITABLE, 0)); |
158 | 159 |
159 // Try to read from |hc|. | 160 // Try to read from |hc|. |
160 buffer_size = static_cast<uint32_t>(sizeof(buffer)); | 161 buffer_size = static_cast<uint32_t>(sizeof(buffer)); |
161 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 162 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
162 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); | 163 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); |
163 | 164 |
164 // Try to begin a two-phase read from |hc|. | 165 // Try to begin a two-phase read from |hc|. |
165 read_pointer = NULL; | 166 read_pointer = NULL; |
166 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, | 167 EXPECT_EQ(MOJO_RESULT_SHOULD_WAIT, |
167 MojoBeginReadData(hc, &read_pointer, &buffer_size, | 168 MojoBeginReadData(hc, &read_pointer, &buffer_size, |
168 MOJO_READ_DATA_FLAG_NONE)); | 169 MOJO_READ_DATA_FLAG_NONE)); |
169 | 170 |
170 // Write to |hp|. | 171 // Write to |hp|. |
171 static const char kHello[] = "hello "; | 172 static const char kHello[] = "hello "; |
172 // Don't include terminating null. | 173 // Don't include terminating null. |
173 buffer_size = static_cast<uint32_t>(strlen(kHello)); | 174 buffer_size = static_cast<uint32_t>(strlen(kHello)); |
174 EXPECT_EQ(MOJO_RESULT_OK, | 175 EXPECT_EQ(MOJO_RESULT_OK, |
175 MojoWriteData(hp, kHello, &buffer_size, | 176 MojoWriteData(hp, kHello, &buffer_size, |
176 MOJO_WRITE_MESSAGE_FLAG_NONE)); | 177 MOJO_WRITE_MESSAGE_FLAG_NONE)); |
177 | 178 |
178 // |hc| should be(come) readable. | 179 // |hc| should be(come) readable. |
179 sig = MOJO_WAIT_FLAG_READABLE; | 180 sig = MOJO_HANDLE_SIGNAL_READABLE; |
180 EXPECT_EQ(MOJO_RESULT_OK, | 181 EXPECT_EQ(MOJO_RESULT_OK, |
181 MojoWaitMany(&hc, &sig, 1, MOJO_DEADLINE_INDEFINITE)); | 182 MojoWaitMany(&hc, &sig, 1, MOJO_DEADLINE_INDEFINITE)); |
182 | 183 |
183 // Do a two-phase write to |hp|. | 184 // Do a two-phase write to |hp|. |
184 EXPECT_EQ(MOJO_RESULT_OK, | 185 EXPECT_EQ(MOJO_RESULT_OK, |
185 MojoBeginWriteData(hp, &write_pointer, &buffer_size, | 186 MojoBeginWriteData(hp, &write_pointer, &buffer_size, |
186 MOJO_WRITE_DATA_FLAG_NONE)); | 187 MOJO_WRITE_DATA_FLAG_NONE)); |
187 static const char kWorld[] = "world"; | 188 static const char kWorld[] = "world"; |
188 ASSERT_GE(buffer_size, sizeof(kWorld)); | 189 ASSERT_GE(buffer_size, sizeof(kWorld)); |
189 // Include the terminating null. | 190 // Include the terminating null. |
190 memcpy(write_pointer, kWorld, sizeof(kWorld)); | 191 memcpy(write_pointer, kWorld, sizeof(kWorld)); |
191 EXPECT_EQ(MOJO_RESULT_OK, | 192 EXPECT_EQ(MOJO_RESULT_OK, |
192 MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld)))); | 193 MojoEndWriteData(hp, static_cast<uint32_t>(sizeof(kWorld)))); |
193 | 194 |
194 // Read one character from |hc|. | 195 // Read one character from |hc|. |
195 memset(buffer, 0, sizeof(buffer)); | 196 memset(buffer, 0, sizeof(buffer)); |
196 buffer_size = 1; | 197 buffer_size = 1; |
197 EXPECT_EQ(MOJO_RESULT_OK, | 198 EXPECT_EQ(MOJO_RESULT_OK, |
198 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); | 199 MojoReadData(hc, buffer, &buffer_size, MOJO_READ_DATA_FLAG_NONE)); |
199 | 200 |
200 // Close |hp|. | 201 // Close |hp|. |
201 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp)); | 202 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hp)); |
202 | 203 |
203 // |hc| should still be readable. | 204 // |hc| should still be readable. |
204 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(hc, MOJO_WAIT_FLAG_READABLE, 0)); | 205 EXPECT_EQ(MOJO_RESULT_OK, MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 0)); |
205 | 206 |
206 // Do a two-phase read from |hc|. | 207 // Do a two-phase read from |hc|. |
207 read_pointer = NULL; | 208 read_pointer = NULL; |
208 EXPECT_EQ(MOJO_RESULT_OK, | 209 EXPECT_EQ(MOJO_RESULT_OK, |
209 MojoBeginReadData(hc, &read_pointer, &buffer_size, | 210 MojoBeginReadData(hc, &read_pointer, &buffer_size, |
210 MOJO_READ_DATA_FLAG_NONE)); | 211 MOJO_READ_DATA_FLAG_NONE)); |
211 ASSERT_LE(buffer_size, sizeof(buffer) - 1); | 212 ASSERT_LE(buffer_size, sizeof(buffer) - 1); |
212 memcpy(&buffer[1], read_pointer, buffer_size); | 213 memcpy(&buffer[1], read_pointer, buffer_size); |
213 EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size)); | 214 EXPECT_EQ(MOJO_RESULT_OK, MojoEndReadData(hc, buffer_size)); |
214 EXPECT_STREQ("hello world", buffer); | 215 EXPECT_STREQ("hello world", buffer); |
215 | 216 |
216 // |hc| should no longer be readable. | 217 // |hc| should no longer be readable. |
217 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, | 218 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, |
218 MojoWait(hc, MOJO_WAIT_FLAG_READABLE, 1000)); | 219 MojoWait(hc, MOJO_HANDLE_SIGNAL_READABLE, 1000)); |
219 | 220 |
220 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hc)); | 221 EXPECT_EQ(MOJO_RESULT_OK, MojoClose(hc)); |
221 | 222 |
222 // TODO(vtl): Test the other way around -- closing the consumer should make | 223 // TODO(vtl): Test the other way around -- closing the consumer should make |
223 // the producer never-writable? | 224 // the producer never-writable? |
224 } | 225 } |
225 | 226 |
226 TEST(CoreTest, BasicSharedBuffer) { | 227 TEST(CoreTest, BasicSharedBuffer) { |
227 MojoHandle h0, h1; | 228 MojoHandle h0, h1; |
228 void* pointer; | 229 void* pointer; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 // This checks that things actually work in C (not C++). | 276 // This checks that things actually work in C (not C++). |
276 TEST(CoreTest, MinimalCTest) { | 277 TEST(CoreTest, MinimalCTest) { |
277 const char* failure = MinimalCTest(); | 278 const char* failure = MinimalCTest(); |
278 EXPECT_TRUE(failure == NULL) << failure; | 279 EXPECT_TRUE(failure == NULL) << failure; |
279 } | 280 } |
280 | 281 |
281 // TODO(vtl): Add multi-threaded tests. | 282 // TODO(vtl): Add multi-threaded tests. |
282 | 283 |
283 } // namespace | 284 } // namespace |
284 } // namespace mojo | 285 } // namespace mojo |
OLD | NEW |