| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 package org.chromium.mojo.system.impl; | 5 package org.chromium.mojo.system.impl; |
| 6 | 6 |
| 7 import android.support.test.filters.SmallTest; | 7 import android.support.test.filters.SmallTest; |
| 8 | 8 |
| 9 import org.chromium.mojo.MojoTestCase; | 9 import org.chromium.mojo.MojoTestCase; |
| 10 import org.chromium.mojo.system.Core; | 10 import org.chromium.mojo.system.Core; |
| 11 import org.chromium.mojo.system.Core.HandleSignals; | 11 import org.chromium.mojo.system.Core.HandleSignals; |
| 12 import org.chromium.mojo.system.Core.HandleSignalsState; | |
| 13 import org.chromium.mojo.system.Core.WaitManyResult; | |
| 14 import org.chromium.mojo.system.Core.WaitResult; | |
| 15 import org.chromium.mojo.system.DataPipe; | 12 import org.chromium.mojo.system.DataPipe; |
| 16 import org.chromium.mojo.system.Handle; | 13 import org.chromium.mojo.system.Handle; |
| 17 import org.chromium.mojo.system.InvalidHandle; | 14 import org.chromium.mojo.system.InvalidHandle; |
| 18 import org.chromium.mojo.system.MessagePipeHandle; | 15 import org.chromium.mojo.system.MessagePipeHandle; |
| 19 import org.chromium.mojo.system.MojoException; | 16 import org.chromium.mojo.system.MojoException; |
| 20 import org.chromium.mojo.system.MojoResult; | 17 import org.chromium.mojo.system.MojoResult; |
| 21 import org.chromium.mojo.system.Pair; | 18 import org.chromium.mojo.system.Pair; |
| 22 import org.chromium.mojo.system.ResultAnd; | 19 import org.chromium.mojo.system.ResultAnd; |
| 23 import org.chromium.mojo.system.SharedBufferHandle; | 20 import org.chromium.mojo.system.SharedBufferHandle; |
| 24 | 21 |
| 25 import java.nio.ByteBuffer; | 22 import java.nio.ByteBuffer; |
| 26 import java.util.ArrayList; | 23 import java.util.ArrayList; |
| 27 import java.util.Arrays; | 24 import java.util.Arrays; |
| 28 import java.util.Collections; | 25 import java.util.Collections; |
| 29 import java.util.List; | 26 import java.util.List; |
| 30 import java.util.Random; | 27 import java.util.Random; |
| 31 import java.util.concurrent.Executors; | 28 import java.util.concurrent.Executors; |
| 32 import java.util.concurrent.ScheduledExecutorService; | 29 import java.util.concurrent.ScheduledExecutorService; |
| 33 import java.util.concurrent.TimeUnit; | |
| 34 | 30 |
| 35 /** | 31 /** |
| 36 * Testing the core API. | 32 * Testing the core API. |
| 37 */ | 33 */ |
| 38 public class CoreImplTest extends MojoTestCase { | 34 public class CoreImplTest extends MojoTestCase { |
| 39 private static final long RUN_LOOP_TIMEOUT_MS = 5; | 35 private static final long RUN_LOOP_TIMEOUT_MS = 5; |
| 40 | 36 |
| 41 private static final ScheduledExecutorService WORKER = | 37 private static final ScheduledExecutorService WORKER = |
| 42 Executors.newSingleThreadScheduledExecutor(); | 38 Executors.newSingleThreadScheduledExecutor(); |
| 43 | 39 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 69 | 65 |
| 70 private void addHandleToClose(Handle handle) { | 66 private void addHandleToClose(Handle handle) { |
| 71 mHandlesToClose.add(handle); | 67 mHandlesToClose.add(handle); |
| 72 } | 68 } |
| 73 | 69 |
| 74 private void addHandlePairToClose(Pair<? extends Handle, ? extends Handle> h
andles) { | 70 private void addHandlePairToClose(Pair<? extends Handle, ? extends Handle> h
andles) { |
| 75 mHandlesToClose.add(handles.first); | 71 mHandlesToClose.add(handles.first); |
| 76 mHandlesToClose.add(handles.second); | 72 mHandlesToClose.add(handles.second); |
| 77 } | 73 } |
| 78 | 74 |
| 79 /** | |
| 80 * Runnable that will close the given handle. | |
| 81 */ | |
| 82 private static class CloseHandle implements Runnable { | |
| 83 private Handle mHandle; | |
| 84 | |
| 85 CloseHandle(Handle handle) { | |
| 86 mHandle = handle; | |
| 87 } | |
| 88 | |
| 89 @Override | |
| 90 public void run() { | |
| 91 mHandle.close(); | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 private static void checkSendingMessage(MessagePipeHandle in, MessagePipeHan
dle out) { | 75 private static void checkSendingMessage(MessagePipeHandle in, MessagePipeHan
dle out) { |
| 96 Random random = new Random(); | 76 Random random = new Random(); |
| 97 | 77 |
| 98 // Writing a random 8 bytes message. | 78 // Writing a random 8 bytes message. |
| 99 byte[] bytes = new byte[8]; | 79 byte[] bytes = new byte[8]; |
| 100 random.nextBytes(bytes); | 80 random.nextBytes(bytes); |
| 101 ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length); | 81 ByteBuffer buffer = ByteBuffer.allocateDirect(bytes.length); |
| 102 buffer.put(bytes); | 82 buffer.put(bytes); |
| 103 in.writeMessage(buffer, null, MessagePipeHandle.WriteFlags.NONE); | 83 in.writeMessage(buffer, null, MessagePipeHandle.WriteFlags.NONE); |
| 104 | 84 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 byte[] receivedBytes = new byte[bytes.length]; | 157 byte[] receivedBytes = new byte[bytes.length]; |
| 178 buffer2.get(receivedBytes); | 158 buffer2.get(receivedBytes); |
| 179 | 159 |
| 180 assertTrue(Arrays.equals(bytes, receivedBytes)); | 160 assertTrue(Arrays.equals(bytes, receivedBytes)); |
| 181 | 161 |
| 182 in.unmap(buffer1); | 162 in.unmap(buffer1); |
| 183 out.unmap(buffer2); | 163 out.unmap(buffer2); |
| 184 } | 164 } |
| 185 | 165 |
| 186 /** | 166 /** |
| 187 * Testing {@link Core#waitMany(List, long)}. | |
| 188 */ | |
| 189 @SmallTest | |
| 190 public void testWaitMany() { | |
| 191 Core core = CoreImpl.getInstance(); | |
| 192 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); | |
| 193 addHandlePairToClose(handles); | |
| 194 | |
| 195 // Test waiting on handles of a newly created message pipe - each should
be writable, but | |
| 196 // not readable. | |
| 197 List<Pair<Handle, Core.HandleSignals>> handlesToWaitOn = | |
| 198 new ArrayList<Pair<Handle, Core.HandleSignals>>(); | |
| 199 handlesToWaitOn.add( | |
| 200 new Pair<Handle, Core.HandleSignals>(handles.second, Core.Handle
Signals.READABLE)); | |
| 201 handlesToWaitOn.add( | |
| 202 new Pair<Handle, Core.HandleSignals>(handles.first, Core.HandleS
ignals.WRITABLE)); | |
| 203 WaitManyResult result = core.waitMany(handlesToWaitOn, 0); | |
| 204 assertEquals(MojoResult.OK, result.getMojoResult()); | |
| 205 assertEquals(1, result.getHandleIndex()); | |
| 206 for (HandleSignalsState state : result.getSignalStates()) { | |
| 207 assertEquals(HandleSignals.WRITABLE, state.getSatisfiedSignals()); | |
| 208 assertEquals(ALL_SIGNALS, state.getSatisfiableSignals()); | |
| 209 } | |
| 210 | |
| 211 // Same test, but swap the handles around. | |
| 212 handlesToWaitOn.clear(); | |
| 213 handlesToWaitOn.add( | |
| 214 new Pair<Handle, Core.HandleSignals>(handles.first, Core.HandleS
ignals.WRITABLE)); | |
| 215 handlesToWaitOn.add( | |
| 216 new Pair<Handle, Core.HandleSignals>(handles.second, Core.Handle
Signals.READABLE)); | |
| 217 result = core.waitMany(handlesToWaitOn, 0); | |
| 218 assertEquals(MojoResult.OK, result.getMojoResult()); | |
| 219 assertEquals(0, result.getHandleIndex()); | |
| 220 for (HandleSignalsState state : result.getSignalStates()) { | |
| 221 assertEquals(HandleSignals.WRITABLE, state.getSatisfiedSignals()); | |
| 222 assertEquals(ALL_SIGNALS, state.getSatisfiableSignals()); | |
| 223 } | |
| 224 } | |
| 225 | |
| 226 /** | |
| 227 * Testing that Core can be retrieved from a handle. | 167 * Testing that Core can be retrieved from a handle. |
| 228 */ | 168 */ |
| 229 @SmallTest | 169 @SmallTest |
| 230 public void testGetCore() { | 170 public void testGetCore() { |
| 231 Core core = CoreImpl.getInstance(); | 171 Core core = CoreImpl.getInstance(); |
| 232 | 172 |
| 233 Pair<? extends Handle, ? extends Handle> handles = core.createMessagePip
e(null); | 173 Pair<? extends Handle, ? extends Handle> handles = core.createMessagePip
e(null); |
| 234 addHandlePairToClose(handles); | 174 addHandlePairToClose(handles); |
| 235 assertEquals(core, handles.first.getCore()); | 175 assertEquals(core, handles.first.getCore()); |
| 236 assertEquals(core, handles.second.getCore()); | 176 assertEquals(core, handles.second.getCore()); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 267 } | 207 } |
| 268 | 208 |
| 269 /** | 209 /** |
| 270 * Testing {@link MessagePipeHandle}. | 210 * Testing {@link MessagePipeHandle}. |
| 271 */ | 211 */ |
| 272 @SmallTest | 212 @SmallTest |
| 273 public void testMessagePipeEmpty() { | 213 public void testMessagePipeEmpty() { |
| 274 Core core = CoreImpl.getInstance(); | 214 Core core = CoreImpl.getInstance(); |
| 275 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); | 215 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); |
| 276 addHandlePairToClose(handles); | 216 addHandlePairToClose(handles); |
| 277 // Test waiting on handles of a newly created message pipe. | |
| 278 WaitResult waitResult = handles.first.wait( | |
| 279 Core.HandleSignals.none().setReadable(true).setWritable(true), 0
); | |
| 280 assertEquals(MojoResult.OK, waitResult.getMojoResult()); | |
| 281 assertEquals( | |
| 282 HandleSignals.WRITABLE, waitResult.getHandleSignalsState().getSa
tisfiedSignals()); | |
| 283 assertEquals(ALL_SIGNALS, waitResult.getHandleSignalsState().getSatisfia
bleSignals()); | |
| 284 | |
| 285 waitResult = handles.first.wait(Core.HandleSignals.WRITABLE, 0); | |
| 286 assertEquals(MojoResult.OK, waitResult.getMojoResult()); | |
| 287 assertEquals( | |
| 288 HandleSignals.WRITABLE, waitResult.getHandleSignalsState().getSa
tisfiedSignals()); | |
| 289 assertEquals(ALL_SIGNALS, waitResult.getHandleSignalsState().getSatisfia
bleSignals()); | |
| 290 | |
| 291 waitResult = handles.first.wait(Core.HandleSignals.READABLE, 0); | |
| 292 assertEquals(MojoResult.DEADLINE_EXCEEDED, waitResult.getMojoResult()); | |
| 293 assertEquals( | |
| 294 HandleSignals.WRITABLE, waitResult.getHandleSignalsState().getSa
tisfiedSignals()); | |
| 295 assertEquals(ALL_SIGNALS, waitResult.getHandleSignalsState().getSatisfia
bleSignals()); | |
| 296 | 217 |
| 297 // Testing read on an empty pipe. | 218 // Testing read on an empty pipe. |
| 298 ResultAnd<MessagePipeHandle.ReadMessageResult> readResult = | 219 ResultAnd<MessagePipeHandle.ReadMessageResult> readResult = |
| 299 handles.first.readMessage(null, 0, MessagePipeHandle.ReadFlags.N
ONE); | 220 handles.first.readMessage(null, 0, MessagePipeHandle.ReadFlags.N
ONE); |
| 300 assertEquals(MojoResult.SHOULD_WAIT, readResult.getMojoResult()); | 221 assertEquals(MojoResult.SHOULD_WAIT, readResult.getMojoResult()); |
| 301 | 222 |
| 302 // Closing a pipe while waiting. | 223 handles.first.close(); |
| 303 WORKER.schedule(new CloseHandle(handles.first), 10, TimeUnit.MILLISECOND
S); | 224 handles.second.close(); |
| 304 waitResult = handles.first.wait(Core.HandleSignals.READABLE, 1000000L); | |
| 305 assertEquals(MojoResult.CANCELLED, waitResult.getMojoResult()); | |
| 306 assertEquals( | |
| 307 HandleSignals.none(), waitResult.getHandleSignalsState().getSati
sfiedSignals()); | |
| 308 assertEquals( | |
| 309 HandleSignals.none(), waitResult.getHandleSignalsState().getSati
sfiableSignals()); | |
| 310 | |
| 311 handles = core.createMessagePipe(null); | |
| 312 addHandlePairToClose(handles); | |
| 313 | |
| 314 // Closing the other pipe while waiting. | |
| 315 WORKER.schedule(new CloseHandle(handles.first), 10, TimeUnit.MILLISECOND
S); | |
| 316 waitResult = handles.second.wait(Core.HandleSignals.READABLE, 1000000L); | |
| 317 assertEquals(MojoResult.FAILED_PRECONDITION, waitResult.getMojoResult())
; | |
| 318 | |
| 319 // Waiting on a closed pipe. | |
| 320 waitResult = handles.second.wait(Core.HandleSignals.READABLE, 0); | |
| 321 assertEquals(MojoResult.FAILED_PRECONDITION, waitResult.getMojoResult())
; | |
| 322 waitResult = handles.second.wait(Core.HandleSignals.WRITABLE, 0); | |
| 323 assertEquals(MojoResult.FAILED_PRECONDITION, waitResult.getMojoResult())
; | |
| 324 } | 225 } |
| 325 | 226 |
| 326 /** | 227 /** |
| 327 * Testing {@link MessagePipeHandle}. | 228 * Testing {@link MessagePipeHandle}. |
| 328 */ | 229 */ |
| 329 @SmallTest | 230 @SmallTest |
| 330 public void testMessagePipeSend() { | 231 public void testMessagePipeSend() { |
| 331 Core core = CoreImpl.getInstance(); | 232 Core core = CoreImpl.getInstance(); |
| 332 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); | 233 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); |
| 333 addHandlePairToClose(handles); | 234 addHandlePairToClose(handles); |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 533 } | 434 } |
| 534 | 435 |
| 535 /** | 436 /** |
| 536 * Testing that invalid handle can be used with this implementation. | 437 * Testing that invalid handle can be used with this implementation. |
| 537 */ | 438 */ |
| 538 @SmallTest | 439 @SmallTest |
| 539 public void testInvalidHandle() { | 440 public void testInvalidHandle() { |
| 540 Core core = CoreImpl.getInstance(); | 441 Core core = CoreImpl.getInstance(); |
| 541 Handle handle = InvalidHandle.INSTANCE; | 442 Handle handle = InvalidHandle.INSTANCE; |
| 542 | 443 |
| 543 // Checking wait. | |
| 544 boolean exception = false; | |
| 545 try { | |
| 546 core.wait(handle, Core.HandleSignals.WRITABLE, 0); | |
| 547 } catch (MojoException e) { | |
| 548 assertEquals(MojoResult.INVALID_ARGUMENT, e.getMojoResult()); | |
| 549 exception = true; | |
| 550 } | |
| 551 assertTrue(exception); | |
| 552 | |
| 553 // Checking waitMany. | |
| 554 exception = false; | |
| 555 try { | |
| 556 List<Pair<Handle, Core.HandleSignals>> handles = | |
| 557 new ArrayList<Pair<Handle, Core.HandleSignals>>(); | |
| 558 handles.add(Pair.create(handle, Core.HandleSignals.WRITABLE)); | |
| 559 core.waitMany(handles, 0); | |
| 560 } catch (MojoException e) { | |
| 561 assertEquals(MojoResult.INVALID_ARGUMENT, e.getMojoResult()); | |
| 562 exception = true; | |
| 563 } | |
| 564 assertTrue(exception); | |
| 565 | |
| 566 // Checking sending an invalid handle. | 444 // Checking sending an invalid handle. |
| 567 // Until the behavior is changed on the C++ side, handle gracefully 2 di
fferent use case: | 445 // Until the behavior is changed on the C++ side, handle gracefully 2 di
fferent use case: |
| 568 // - Receive a INVALID_ARGUMENT exception | 446 // - Receive a INVALID_ARGUMENT exception |
| 569 // - Receive an invalid handle on the other side. | 447 // - Receive an invalid handle on the other side. |
| 570 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); | 448 Pair<MessagePipeHandle, MessagePipeHandle> handles = core.createMessageP
ipe(null); |
| 571 addHandlePairToClose(handles); | 449 addHandlePairToClose(handles); |
| 572 try { | 450 try { |
| 573 handles.first.writeMessage(null, Collections.<Handle>singletonList(h
andle), | 451 handles.first.writeMessage(null, Collections.<Handle>singletonList(h
andle), |
| 574 MessagePipeHandle.WriteFlags.NONE); | 452 MessagePipeHandle.WriteFlags.NONE); |
| 575 ResultAnd<MessagePipeHandle.ReadMessageResult> readMessageResult = | 453 ResultAnd<MessagePipeHandle.ReadMessageResult> readMessageResult = |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 MessagePipeHandle converted = | 536 MessagePipeHandle converted = |
| 659 core.acquireNativeHandle(handles.first.releaseNativeHandle()).to
MessagePipeHandle(); | 537 core.acquireNativeHandle(handles.first.releaseNativeHandle()).to
MessagePipeHandle(); |
| 660 addHandleToClose(converted); | 538 addHandleToClose(converted); |
| 661 | 539 |
| 662 assertFalse(handles.first.isValid()); | 540 assertFalse(handles.first.isValid()); |
| 663 | 541 |
| 664 checkSendingMessage(converted, handles.second); | 542 checkSendingMessage(converted, handles.second); |
| 665 checkSendingMessage(handles.second, converted); | 543 checkSendingMessage(handles.second, converted); |
| 666 } | 544 } |
| 667 } | 545 } |
| OLD | NEW |