OLD | NEW |
(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 |
OLD | NEW |