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

Side by Side Diff: mojo/public/tests/bindings_connector_unittest.cc

Issue 54743003: Mojo: bindings connector (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Extract SimpleBindingsSupport Created 7 years, 1 month 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 <stdlib.h>
6 #include <string.h>
7
8 #include <list>
viettrungluu 2013/11/05 22:45:29 <queue> instead?
9
10 #include "mojo/public/bindings/lib/bindings_support.h"
11 #include "mojo/public/bindings/lib/connector.h"
12 #include "mojo/public/tests/simple_bindings_support.h"
13 #include "mojo/public/tests/test_support.h"
14
15 namespace mojo {
16 namespace test {
17
18 class MessageQueue : public MessageReceiver {
19 public:
20 virtual bool Accept(Message* message) MOJO_OVERRIDE {
21 queue_.push(Message());
22 queue_.back().Swap(message);
23 return true;
24 }
25
26 bool IsEmpty() const {
27 return queue_.empty();
28 }
29
30 void Pop(Message* message) {
31 queue_.front().Swap(message);
viettrungluu 2013/11/05 22:45:29 assert nonempty?
32 queue_.pop();
33 }
34
35 private:
36 std::queue<Message> queue_;
37 };
38
39 class BindingsConnectorTest : public TestBase {
40 public:
41 BindingsConnectorTest()
42 : handle0_(kInvalidHandle),
43 handle1_(kInvalidHandle) {
44 }
45
46 virtual void SetUp() OVERRIDE {
47 CreateMessagePipe(&handle0_, &handle1_);
48 }
49
50 virtual void TearDown() OVERRIDE {
51 Close(handle0_);
52 Close(handle1_);
53 }
54
55 void AllocMessage(const char* text, Message* message) {
56 size_t payload_size = strlen(text) + 1; // Plus null terminator.
57 size_t num_bytes = sizeof(MessageHeader) + payload_size;
58 message->data = static_cast<MessageData*>(malloc(num_bytes));
59 message->data->header.num_bytes = num_bytes;
60 message->data->header.name = 1;
61 memcpy(message->data->payload, text, payload_size);
62 }
63
64 void PumpMessages() {
65 bindings_support_.Process();
66 }
67
68 protected:
69 Handle handle0_;
70 Handle handle1_;
71
72 private:
73 SimpleBindingsSupport bindings_support_;
74 };
75
76 TEST_F(BindingsConnectorTest, Basic) {
77 Connector connector0(handle0_);
78 Connector connector1(handle1_);
79
80 const char kText[] = "hello world";
81
82 Message message;
83 AllocMessage(kText, &message);
84
85 connector0.Accept(&message);
86
87 MessageQueue message_queue;
88 connector1.SetIncomingReceiver(&message_queue);
89
90 PumpMessages();
91
92 ASSERT_FALSE(message_queue.IsEmpty());
93
94 Message message_received;
95 message_queue.Pop(&message_received);
96
97 EXPECT_EQ(std::string(kText),
98 std::string(
99 reinterpret_cast<char*>(message_received.data->payload)));
100 }
101
102 TEST_F(BindingsConnectorTest, Basic_EarlyIncomingReceiver) {
103 Connector connector0(handle0_);
104 Connector connector1(handle1_);
105
106 MessageQueue message_queue;
107 connector1.SetIncomingReceiver(&message_queue);
108
109 const char kText[] = "hello world";
110
111 Message message;
112 AllocMessage(kText, &message);
113
114 connector0.Accept(&message);
115
116 PumpMessages();
117
118 ASSERT_FALSE(message_queue.IsEmpty());
119
120 Message message_received;
121 message_queue.Pop(&message_received);
122
123 EXPECT_EQ(std::string(kText),
124 std::string(
125 reinterpret_cast<char*>(message_received.data->payload)));
126 }
127
128 TEST_F(BindingsConnectorTest, Basic_TwoMessages) {
129 Connector connector0(handle0_);
130 Connector connector1(handle1_);
131
132 const char* kText[] = { "hello", "world" };
133
134 for (size_t i = 0; i < arraysize(kText); ++i) {
135 Message message;
136 AllocMessage(kText[i], &message);
137
138 connector0.Accept(&message);
139 }
140
141 MessageQueue message_queue;
142 connector1.SetIncomingReceiver(&message_queue);
143
144 PumpMessages();
145
146 for (size_t i = 0; i < arraysize(kText); ++i) {
147 ASSERT_FALSE(message_queue.IsEmpty());
148
149 Message message_received;
150 message_queue.Pop(&message_received);
151
152 EXPECT_EQ(std::string(kText[i]),
153 std::string(
154 reinterpret_cast<char*>(message_received.data->payload)));
155 }
156 }
157
158 TEST_F(BindingsConnectorTest, WriteToClosedPipe) {
159 Connector connector0(handle0_);
160
161 const char kText[] = "hello world";
162
163 Message message;
164 AllocMessage(kText, &message);
165
166 Close(handle0_); // Close the handle before writing to it.
167
168 bool ok = connector0.Accept(&message);
169 EXPECT_FALSE(ok);
170
171 EXPECT_TRUE(connector0.EncounteredError());
172 }
173
174 } // namespace test
175 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698