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
3// found in the LICENSE file.
4
5package org.chromium.mojo.bindings;
6
7import org.chromium.mojo.TestUtils;
8import org.chromium.mojo.system.Handle;
9import org.chromium.mojo.system.MojoException;
10import org.chromium.mojo.system.Pair;
11
12import java.nio.ByteBuffer;
13import java.util.ArrayList;
14import java.util.List;
15
16/**
17 * Utility class for bindings tests.
18 */
19public class BindingsTestUtils {
20
21    /**
22     * {@link MessageReceiver} that records any message it receives.
23     */
24    public static class RecordingMessageReceiver extends SideEffectFreeCloseable
25            implements MessageReceiver {
26
27        public final List<Message> messages = new ArrayList<Message>();
28
29        /**
30         * @see MessageReceiver#accept(Message)
31         */
32        @Override
33        public boolean accept(Message message) {
34            messages.add(message);
35            return true;
36        }
37    }
38
39    /**
40     * {@link MessageReceiverWithResponder} that records any message it receives.
41     */
42    public static class RecordingMessageReceiverWithResponder extends RecordingMessageReceiver
43            implements MessageReceiverWithResponder {
44
45        public final List<Pair<Message, MessageReceiver>> messagesWithReceivers =
46                new ArrayList<Pair<Message, MessageReceiver>>();
47
48        /**
49         * @see MessageReceiverWithResponder#acceptWithResponder(Message, MessageReceiver)
50         */
51        @Override
52        public boolean acceptWithResponder(Message message, MessageReceiver responder) {
53            messagesWithReceivers.add(Pair.create(message, responder));
54            return true;
55        }
56    }
57
58    /**
59     * {@link ConnectionErrorHandler} that records any error it received.
60     */
61    public static class CapturingErrorHandler implements ConnectionErrorHandler {
62
63        private MojoException mLastMojoException = null;
64
65        /**
66         * @see ConnectionErrorHandler#onConnectionError(MojoException)
67         */
68        @Override
69        public void onConnectionError(MojoException e) {
70            mLastMojoException = e;
71        }
72
73        /**
74         * Returns the last recorded exception.
75         */
76        public MojoException getLastMojoException() {
77            return mLastMojoException;
78        }
79
80    }
81
82    /**
83     * Creates a new valid {@link Message}. The message will have a valid header.
84     */
85    public static Message newRandomMessage(int size) {
86        assert size > 16;
87        ByteBuffer message = TestUtils.newRandomBuffer(size);
88        int[] headerAsInts = { 16, 2, 0, 0 };
89        for (int i = 0; i < 4; ++i) {
90            message.putInt(4 * i, headerAsInts[i]);
91        }
92        message.position(0);
93        return new Message(message, new ArrayList<Handle>());
94    }
95}
96