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

Side by Side Diff: device/serial/data_pipe_receiver_unittest.cc

Issue 437933002: Add data pipe wrappers to be used to implement serial receive. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@serial-buffer
Patch Set: Created 6 years, 4 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
OLDNEW
(Empty)
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
5 #include "base/bind.h"
6 #include "base/message_loop/message_loop.h"
7 #include "base/run_loop.h"
8 #include "base/strings/string_piece.h"
9 #include "device/serial/async_waiter.h"
10 #include "device/serial/buffer.h"
11 #include "device/serial/data_pipe.mojom.h"
12 #include "device/serial/data_pipe_producer.h"
13 #include "device/serial/data_pipe_receiver.h"
14 #include "mojo/public/cpp/bindings/interface_ptr.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 namespace device {
18
19 class DataPipeReceiverTest : public testing::Test {
20 public:
21 DataPipeReceiverTest() : error_(0), seen_connection_error_(false) {}
22
23 virtual void SetUp() OVERRIDE {
24 message_loop_.reset(new base::MessageLoop);
25 mojo::InterfacePtr<serial::DataPipeProducer> producer_handle;
26 producer_ = mojo::WeakBindToProxy(
27 new DataPipeProducer(
28 base::Bind(&DataPipeReceiverTest::CanWriteData,
29 base::Unretained(this)),
30 base::Bind(&DataPipeReceiverTest::OnError,
31 base::Unretained(this))),
32 &producer_handle);
33 receiver_ = new DataPipeReceiver(producer_handle.Pass(), 100, -10);
34 }
35
36 virtual void TearDown() OVERRIDE {
37 write_buffer_.reset();
38 buffer_.reset();
39 message_loop_.reset();
40 }
41
42 void OnError() {
43 seen_connection_error_ = true;
44 StopMessageLoop();
45 }
46
47 void RunMessageLoop() {
48 base::RunLoop run_loop;
49 stop_run_loop_ = run_loop.QuitClosure();
50 run_loop.Run();
51 }
52
53 void StopMessageLoop() {
54 if (!stop_run_loop_.is_null())
55 stop_run_loop_.Run();
56 }
57
58 bool Receive() {
59 return receiver_->Receive(base::Bind(&DataPipeReceiverTest::OnDataReceived,
60 base::Unretained(this)),
61 base::Bind(&DataPipeReceiverTest::OnReceiveError,
62 base::Unretained(this)));
63 }
64
65 bool FillWriteBuffer(const base::StringPiece& data, int32_t error) {
66 if (!write_buffer_)
67 RunMessageLoop();
68 if (!write_buffer_)
69 return false;
70 if (write_buffer_->GetSize() < static_cast<uint32_t>(data.size())) {
71 write_buffer_->Done(0);
72 write_buffer_.reset();
73 return false;
74 }
75
76 memcpy(write_buffer_->GetData(), data.data(), data.size());
77 if (error)
78 write_buffer_->DoneWithError(static_cast<uint32_t>(data.size()), error);
79 else
80 write_buffer_->Done(static_cast<uint32_t>(data.size()));
81 write_buffer_.reset();
82 return true;
83 }
84
85 bool ReceiveAndWait() {
86 if (!Receive())
87 return false;
88 RunMessageLoop();
89 return true;
90 }
91
92 void OnDataReceived(scoped_ptr<ReadOnlyBuffer> buffer) {
93 ASSERT_TRUE(buffer);
94 error_ = 0;
95 buffer_ = buffer.Pass();
96 buffer_contents_ = std::string(buffer_->GetData(), buffer_->GetSize());
97 StopMessageLoop();
98 }
99
100 void OnReceiveError(int32_t error) {
101 buffer_contents_.clear();
102 error_ = error;
103 StopMessageLoop();
104 }
105
106 void CanWriteData(scoped_ptr<WritableBuffer> buffer) {
107 write_buffer_ = buffer.Pass();
108 StopMessageLoop();
109 }
110
111 protected:
112 scoped_ptr<base::MessageLoop> message_loop_;
113 base::Closure stop_run_loop_;
114
115 scoped_refptr<DataPipeProducer> producer_;
116 scoped_refptr<DataPipeReceiver> receiver_;
117
118 scoped_ptr<ReadOnlyBuffer> buffer_;
119 std::string buffer_contents_;
120 int32_t error_;
121 scoped_ptr<WritableBuffer> write_buffer_;
122
123 bool seen_connection_error_;
124
125 private:
126 DISALLOW_COPY_AND_ASSIGN(DataPipeReceiverTest);
127 };
128
129 TEST_F(DataPipeReceiverTest, Basic) {
130 FillWriteBuffer("a", 0);
131
132 // Wait until we get a new write_buffer_ before we wait to receive.
133 RunMessageLoop();
134 ASSERT_TRUE(write_buffer_);
135
136 ASSERT_TRUE(ReceiveAndWait());
137 EXPECT_EQ(0, error_);
138 ASSERT_TRUE(buffer_);
139 EXPECT_EQ("a", buffer_contents_);
140 buffer_->Done(1);
141
142 FillWriteBuffer("b", 0);
143
144 // Wait until we get a new write_buffer_ before we wait to receive.
145 RunMessageLoop();
146 ASSERT_TRUE(write_buffer_);
147
148 ASSERT_TRUE(ReceiveAndWait());
149 EXPECT_EQ(0, error_);
150 ASSERT_TRUE(buffer_);
151 EXPECT_EQ("b", buffer_contents_);
152 }
153
154 TEST_F(DataPipeReceiverTest, PartialReceive) {
155 FillWriteBuffer("ab", 0);
156
157 // Wait until we get a new write_buffer_ before we wait to receive.
158 RunMessageLoop();
159 ASSERT_TRUE(write_buffer_);
160
161 ASSERT_TRUE(ReceiveAndWait());
162 EXPECT_EQ(0, error_);
163 ASSERT_TRUE(buffer_);
164 EXPECT_EQ("ab", buffer_contents_);
165 buffer_->Done(1);
166
167 ASSERT_TRUE(ReceiveAndWait());
168 EXPECT_EQ(0, error_);
169 ASSERT_TRUE(buffer_);
170 EXPECT_EQ("b", buffer_contents_);
171 }
172
173 TEST_F(DataPipeReceiverTest, ErrorAndData) {
174 FillWriteBuffer("abc", -1);
175
176 ASSERT_TRUE(ReceiveAndWait());
177 ASSERT_TRUE(buffer_);
178 EXPECT_EQ("abc", buffer_contents_);
179 buffer_->Done(1);
180 EXPECT_EQ(0, error_);
181 ASSERT_TRUE(ReceiveAndWait());
182 ASSERT_TRUE(buffer_);
183 EXPECT_EQ("bc", buffer_contents_);
184 buffer_->Done(1);
185 EXPECT_EQ(0, error_);
186 ASSERT_TRUE(ReceiveAndWait());
187 ASSERT_TRUE(buffer_);
188 EXPECT_EQ("c", buffer_contents_);
189 buffer_->Done(1);
190 EXPECT_EQ(0, error_);
191 ASSERT_TRUE(ReceiveAndWait());
192 EXPECT_EQ(-1, error_);
193 ASSERT_FALSE(write_buffer_);
194
195 ASSERT_TRUE(Receive());
196 FillWriteBuffer("d", -2);
197
198 RunMessageLoop();
199 ASSERT_TRUE(buffer_);
200 EXPECT_EQ("d", buffer_contents_);
201 buffer_->Done(1);
202 EXPECT_EQ(0, error_);
203 ASSERT_TRUE(ReceiveAndWait());
204 EXPECT_EQ(-2, error_);
205 }
206
207 TEST_F(DataPipeReceiverTest, ErrorOnly) {
208 FillWriteBuffer("", -1);
209
210 ASSERT_TRUE(ReceiveAndWait());
211 EXPECT_FALSE(buffer_);
212 EXPECT_EQ(-1, error_);
213 ASSERT_FALSE(write_buffer_);
214
215 ASSERT_TRUE(Receive());
216 FillWriteBuffer("", -2);
217
218 RunMessageLoop();
219 EXPECT_FALSE(buffer_);
220 EXPECT_EQ(-2, error_);
221 ASSERT_FALSE(write_buffer_);
222 }
223
224 TEST_F(DataPipeReceiverTest, ProducerShutdown) {
225 producer_ = NULL;
226 ASSERT_TRUE(ReceiveAndWait());
227 EXPECT_FALSE(buffer_);
228 EXPECT_EQ(-10, error_);
229 ASSERT_FALSE(write_buffer_);
230 ASSERT_FALSE(Receive());
231 }
232
233 TEST_F(DataPipeReceiverTest, ReceiverShutdown) {
234 Receive();
235 receiver_ = NULL;
236 EXPECT_EQ(-10, error_);
237 RunMessageLoop();
238 EXPECT_TRUE(seen_connection_error_);
239 }
240
241 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698