Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(465)

Side by Side Diff: mojo/system/core_impl_unittest.cc

Issue 23621056: Initial in-process implementation of some Mojo primitives. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: build fix Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "mojo/system/core_impl.h"
6
7 #include "mojo/system/core_test_base.h"
8
9 namespace mojo {
10 namespace system {
11 namespace {
12
13 class CoreImplTest : public test::CoreTestBase {
14 };
15
16 TEST_F(CoreImplTest, Basic) {
17 MockHandleInfo info;
18
19 EXPECT_EQ(0u, info.GetCtorCallCount());
20 MojoHandle h = CreateMockHandle(&info);
21 EXPECT_EQ(1u, info.GetCtorCallCount());
22 EXPECT_NE(h, MOJO_HANDLE_INVALID);
23
24 EXPECT_EQ(0u, info.GetWriteMessageCallCount());
25 EXPECT_EQ(MOJO_RESULT_OK,
26 core()->WriteMessage(h, NULL, 0, NULL, 0,
27 MOJO_WRITE_MESSAGE_FLAG_NONE));
28 EXPECT_EQ(1u, info.GetWriteMessageCallCount());
29 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
30 core()->WriteMessage(h, NULL, 1, NULL, 0,
31 MOJO_WRITE_MESSAGE_FLAG_NONE));
32 EXPECT_EQ(2u, info.GetWriteMessageCallCount());
33
34 EXPECT_EQ(0u, info.GetReadMessageCallCount());
35 uint32_t num_bytes = 0;
36 EXPECT_EQ(MOJO_RESULT_OK,
37 core()->ReadMessage(h, NULL, &num_bytes, NULL, NULL,
38 MOJO_READ_MESSAGE_FLAG_NONE));
39 EXPECT_EQ(1u, info.GetReadMessageCallCount());
40 num_bytes = 1;
41 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
42 core()->ReadMessage(h, NULL, &num_bytes, NULL, NULL,
43 MOJO_READ_MESSAGE_FLAG_NONE));
44 EXPECT_EQ(2u, info.GetReadMessageCallCount());
45
46 EXPECT_EQ(0u, info.GetAddWaiterCallCount());
47 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
48 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING,
49 MOJO_DEADLINE_INDEFINITE));
50 EXPECT_EQ(1u, info.GetAddWaiterCallCount());
51 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
52 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 0));
53 EXPECT_EQ(2u, info.GetAddWaiterCallCount());
54 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
55 core()->Wait(h, MOJO_WAIT_FLAG_EVERYTHING, 10 * 1000));
56 EXPECT_EQ(3u, info.GetAddWaiterCallCount());
57 MojoWaitFlags wait_flags = MOJO_WAIT_FLAG_EVERYTHING;
58 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
59 core()->WaitMany(&h, &wait_flags, 1, MOJO_DEADLINE_INDEFINITE));
60 EXPECT_EQ(4u, info.GetAddWaiterCallCount());
61
62 EXPECT_EQ(0u, info.GetDtorCallCount());
63 EXPECT_EQ(0u, info.GetCloseCallCount());
64 EXPECT_EQ(0u, info.GetCancelAllWaitersCallCount());
65 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
66 EXPECT_EQ(1u, info.GetCancelAllWaitersCallCount());
67 EXPECT_EQ(1u, info.GetCloseCallCount());
68 EXPECT_EQ(1u, info.GetDtorCallCount());
69
70 // No waiters should ever have ever been added.
71 EXPECT_EQ(0u, info.GetRemoveWaiterCallCount());
72 }
73
74 TEST_F(CoreImplTest, InvalidArguments) {
75 // |Close()|:
76 {
77 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(MOJO_HANDLE_INVALID));
78 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(10));
79 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(1000000000));
80
81 // Test a double-close.
82 MockHandleInfo info;
83 MojoHandle h = CreateMockHandle(&info);
84 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h));
85 EXPECT_EQ(1u, info.GetCloseCallCount());
86 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT, core()->Close(h));
87 EXPECT_EQ(1u, info.GetCloseCallCount());
88 }
89
90 // |Wait()|:
91 {
92 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
93 core()->Wait(MOJO_HANDLE_INVALID, MOJO_WAIT_FLAG_EVERYTHING,
94 MOJO_DEADLINE_INDEFINITE));
95 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
96 core()->Wait(10, MOJO_WAIT_FLAG_EVERYTHING,
97 MOJO_DEADLINE_INDEFINITE));
98 }
99
100 // |WaitMany()|:
101 {
102 MojoHandle handles[2] = { MOJO_HANDLE_INVALID, MOJO_HANDLE_INVALID };
103 MojoWaitFlags flags[2] = { MOJO_WAIT_FLAG_EVERYTHING,
104 MOJO_WAIT_FLAG_EVERYTHING };
105 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
106 core()->WaitMany(handles, flags, 0, MOJO_DEADLINE_INDEFINITE));
107 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
108 core()->WaitMany(NULL, flags, 0, MOJO_DEADLINE_INDEFINITE));
109 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
110 core()->WaitMany(handles, NULL, 0, MOJO_DEADLINE_INDEFINITE));
111
112 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
113 core()->WaitMany(NULL, flags, 1, MOJO_DEADLINE_INDEFINITE));
114 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
115 core()->WaitMany(handles, NULL, 1, MOJO_DEADLINE_INDEFINITE));
116 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
117 core()->WaitMany(handles, flags, 1, MOJO_DEADLINE_INDEFINITE));
118
119 MockHandleInfo info[2];
120 handles[0] = CreateMockHandle(&info[0]);
121
122 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
123 core()->WaitMany(handles, flags, 1, MOJO_DEADLINE_INDEFINITE));
124 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
125 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE));
126 handles[1] = handles[0] + 1; // Invalid handle.
127 EXPECT_EQ(MOJO_RESULT_INVALID_ARGUMENT,
128 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE));
129 handles[1] = CreateMockHandle(&info[1]);
130 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
131 core()->WaitMany(handles, flags, 2, MOJO_DEADLINE_INDEFINITE));
132
133 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[0]));
134 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(handles[1]));
135 }
136 }
137
138 // TODO(vtl): test |Wait()| and |WaitMany()| properly
139 // - including |WaitMany()| with the same handle more than once (with
140 // same/different flags)
141
142 TEST_F(CoreImplTest, MessagePipe) {
143 MojoHandle h[2];
144
145 EXPECT_EQ(MOJO_RESULT_OK, core()->CreateMessagePipe(&h[0], &h[1]));
146 // Should get two distinct, valid handles.
147 EXPECT_NE(h[0], MOJO_HANDLE_INVALID);
148 EXPECT_NE(h[1], MOJO_HANDLE_INVALID);
149 EXPECT_NE(h[0], h[1]);
150
151 // Neither should be readable.
152 MojoWaitFlags flags[2] = { MOJO_WAIT_FLAG_READABLE, MOJO_WAIT_FLAG_READABLE };
153 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
154 core()->WaitMany(h, flags, 2, 0));
155
156 // Try to read anyway.
157 char buffer[1] = { 'a' };
158 uint32_t buffer_size = 1;
159 EXPECT_EQ(MOJO_RESULT_NOT_FOUND,
160 core()->ReadMessage(h[0], buffer, &buffer_size, NULL, NULL,
161 MOJO_READ_MESSAGE_FLAG_NONE));
162 // Check that it left its inputs alone.
163 EXPECT_EQ('a', buffer[0]);
164 EXPECT_EQ(1u, buffer_size);
165
166 // Both should be writable.
167 EXPECT_EQ(MOJO_RESULT_OK,
168 core()->Wait(h[0], MOJO_WAIT_FLAG_WRITABLE, 1000000000));
169 EXPECT_EQ(MOJO_RESULT_OK,
170 core()->Wait(h[1], MOJO_WAIT_FLAG_WRITABLE, 1000000000));
171
172 // Also check that |h[1]| is writable using |WaitMany()|.
173 flags[0] = MOJO_WAIT_FLAG_READABLE;
174 flags[1] = MOJO_WAIT_FLAG_WRITABLE;
175 EXPECT_EQ(1, core()->WaitMany(h, flags, 2, MOJO_DEADLINE_INDEFINITE));
176
177 // Write to |h[1]|.
178 buffer[0] = 'b';
179 EXPECT_EQ(MOJO_RESULT_OK,
180 core()->WriteMessage(h[1], buffer, 1, NULL, 0,
181 MOJO_WRITE_MESSAGE_FLAG_NONE));
182
183 // Check that |h[0]| is now readable.
184 flags[0] = MOJO_WAIT_FLAG_READABLE;
185 flags[1] = MOJO_WAIT_FLAG_READABLE;
186 EXPECT_EQ(0, core()->WaitMany(h, flags, 2, MOJO_DEADLINE_INDEFINITE));
187
188 // Read from |h[0]|.
189 // First, get only the size.
190 buffer_size = 0;
191 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
192 core()->ReadMessage(h[0], NULL, &buffer_size, NULL, NULL,
193 MOJO_READ_MESSAGE_FLAG_NONE));
194 EXPECT_EQ(1u, buffer_size);
195 // Then actually read it.
196 buffer[0] = 'c';
197 buffer_size = 1;
198 EXPECT_EQ(MOJO_RESULT_OK,
199 core()->ReadMessage(h[0], buffer, &buffer_size, NULL, NULL,
200 MOJO_READ_MESSAGE_FLAG_NONE));
201 EXPECT_EQ('b', buffer[0]);
202 EXPECT_EQ(1u, buffer_size);
203
204 // |h[0]| should no longer be readable.
205 EXPECT_EQ(MOJO_RESULT_DEADLINE_EXCEEDED,
206 core()->Wait(h[0], MOJO_WAIT_FLAG_READABLE, 0));
207
208 // Write to |h[0]|.
209 buffer[0] = 'd';
210 EXPECT_EQ(MOJO_RESULT_OK,
211 core()->WriteMessage(h[0], buffer, 1, NULL, 0,
212 MOJO_WRITE_MESSAGE_FLAG_NONE));
213
214 // Close |h[0]|.
215 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[0]));
216
217 // Check that |h[1]| is no longer writable (and will never be).
218 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
219 core()->Wait(h[1], MOJO_WAIT_FLAG_WRITABLE, 1000000000));
220
221 // Check that |h[1]| is still readable (for the moment).
222 EXPECT_EQ(MOJO_RESULT_OK,
223 core()->Wait(h[1], MOJO_WAIT_FLAG_READABLE, 1000000000));
224
225 // Discard a message from |h[1]|.
226 EXPECT_EQ(MOJO_RESULT_RESOURCE_EXHAUSTED,
227 core()->ReadMessage(h[1], NULL, NULL, NULL, NULL,
228 MOJO_READ_MESSAGE_FLAG_MAY_DISCARD));
229
230 // |h[1]| is no longer readable (and will never be).
231 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
232 core()->Wait(h[1], MOJO_WAIT_FLAG_READABLE, 1000000000));
233
234 // Try writing to |h[1]|.
235 buffer[0] = 'e';
236 EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION,
237 core()->WriteMessage(h[1], buffer, 1, NULL, 0,
238 MOJO_WRITE_MESSAGE_FLAG_NONE));
239
240 EXPECT_EQ(MOJO_RESULT_OK, core()->Close(h[1]));
241 }
242
243 } // namespace
244 } // namespace system
245 } // namespace mojo
OLDNEW
« mojo/mojo.gyp ('K') | « mojo/system/core_impl.cc ('k') | mojo/system/core_test_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698