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

Side by Side Diff: device/serial/data_source_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: address comments 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
« no previous file with comments | « device/serial/data_source_sender.cc ('k') | device/serial/data_stream.mojom » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_receiver.h"
12 #include "device/serial/data_source_sender.h"
13 #include "device/serial/data_stream.mojom.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 DataSourceTest : public testing::Test {
20 public:
21 DataSourceTest() : error_(0), seen_connection_error_(false) {}
22
23 virtual void SetUp() OVERRIDE {
24 message_loop_.reset(new base::MessageLoop);
25 mojo::InterfacePtr<serial::DataSource> source_sender_handle;
26 source_sender_ = mojo::WeakBindToProxy(
27 new DataSourceSender(
28 base::Bind(&DataSourceTest::CanWriteData, base::Unretained(this)),
29 base::Bind(&DataSourceTest::OnError, base::Unretained(this))),
30 &source_sender_handle);
31 receiver_ = new DataReceiver(source_sender_handle.Pass(), 100, -10);
32 }
33
34 virtual void TearDown() OVERRIDE {
35 write_buffer_.reset();
36 buffer_.reset();
37 message_loop_.reset();
38 }
39
40 void OnError() {
41 seen_connection_error_ = true;
42 StopMessageLoop();
43 }
44
45 void RunMessageLoop() {
46 base::RunLoop run_loop;
47 stop_run_loop_ = run_loop.QuitClosure();
48 run_loop.Run();
49 }
50
51 void StopMessageLoop() {
52 if (!stop_run_loop_.is_null())
53 stop_run_loop_.Run();
54 }
55
56 bool Receive() {
57 return receiver_->Receive(
58 base::Bind(&DataSourceTest::OnDataReceived, base::Unretained(this)),
59 base::Bind(&DataSourceTest::OnReceiveError, base::Unretained(this)));
60 }
61
62 bool FillWriteBuffer(const base::StringPiece& data, int32_t error) {
63 if (!write_buffer_)
64 RunMessageLoop();
raymes 2014/08/11 04:04:51 -Add a comment // Run the message loop until CanWr
Sam McNally 2014/08/11 04:56:42 Done.
65 if (!write_buffer_)
66 return false;
raymes 2014/08/11 04:04:51 We never check the return value, so you could just
Sam McNally 2014/08/11 04:56:42 Done.
67 if (write_buffer_->GetSize() < static_cast<uint32_t>(data.size())) {
raymes 2014/08/11 04:04:51 DCHECK(write_buffer_->GetSize() >= static_cast<uin
Sam McNally 2014/08/11 04:56:42 Done.
68 write_buffer_->Done(0);
69 write_buffer_.reset();
70 return false;
71 }
72
73 memcpy(write_buffer_->GetData(), data.data(), data.size());
74 if (error)
75 write_buffer_->DoneWithError(static_cast<uint32_t>(data.size()), error);
76 else
77 write_buffer_->Done(static_cast<uint32_t>(data.size()));
78 write_buffer_.reset();
79 return true;
80 }
81
82 bool ReceiveAndWait() {
83 if (!Receive())
84 return false;
85 RunMessageLoop();
raymes 2014/08/11 04:04:51 Add a comment here, // Run the message loop until
Sam McNally 2014/08/11 04:56:42 Done.
86 return true;
87 }
88
89 void OnDataReceived(scoped_ptr<ReadOnlyBuffer> buffer) {
90 ASSERT_TRUE(buffer);
91 error_ = 0;
92 buffer_ = buffer.Pass();
93 buffer_contents_ = std::string(buffer_->GetData(), buffer_->GetSize());
94 StopMessageLoop();
95 }
96
97 void OnReceiveError(int32_t error) {
98 buffer_contents_.clear();
99 error_ = error;
100 StopMessageLoop();
101 }
102
103 void CanWriteData(scoped_ptr<WritableBuffer> buffer) {
104 write_buffer_ = buffer.Pass();
105 StopMessageLoop();
106 }
107
108 protected:
109 scoped_ptr<base::MessageLoop> message_loop_;
110 base::Closure stop_run_loop_;
111
112 scoped_refptr<DataSourceSender> source_sender_;
113 scoped_refptr<DataReceiver> receiver_;
114
115 scoped_ptr<ReadOnlyBuffer> buffer_;
116 std::string buffer_contents_;
117 int32_t error_;
118 scoped_ptr<WritableBuffer> write_buffer_;
119
120 bool seen_connection_error_;
121
122 private:
123 DISALLOW_COPY_AND_ASSIGN(DataSourceTest);
124 };
125
126 TEST_F(DataSourceTest, Basic) {
raymes 2014/08/11 04:04:51 Add a comment above each test explaining what it i
Sam McNally 2014/08/11 04:56:43 Done.
127 FillWriteBuffer("a", 0);
128
129 // Wait until we get a new write_buffer_ before we wait to receive.
130 RunMessageLoop();
131 ASSERT_TRUE(write_buffer_);
132
133 ASSERT_TRUE(ReceiveAndWait());
134 EXPECT_EQ(0, error_);
135 ASSERT_TRUE(buffer_);
136 EXPECT_EQ("a", buffer_contents_);
137 buffer_->Done(1);
138
139 FillWriteBuffer("b", 0);
140
141 // Wait until we get a new write_buffer_ before we wait to receive.
142 RunMessageLoop();
143 ASSERT_TRUE(write_buffer_);
144
145 ASSERT_TRUE(ReceiveAndWait());
146 EXPECT_EQ(0, error_);
147 ASSERT_TRUE(buffer_);
148 EXPECT_EQ("b", buffer_contents_);
149 }
150
151 TEST_F(DataSourceTest, PartialReceive) {
152 FillWriteBuffer("ab", 0);
153
154 // Wait until we get a new write_buffer_ before we wait to receive.
155 RunMessageLoop();
156 ASSERT_TRUE(write_buffer_);
157
158 ASSERT_TRUE(ReceiveAndWait());
159 EXPECT_EQ(0, error_);
160 ASSERT_TRUE(buffer_);
161 EXPECT_EQ("ab", buffer_contents_);
162 buffer_->Done(1);
163
164 ASSERT_TRUE(ReceiveAndWait());
165 EXPECT_EQ(0, error_);
166 ASSERT_TRUE(buffer_);
167 EXPECT_EQ("b", buffer_contents_);
raymes 2014/08/11 04:04:51 You might as well call Done again and check that t
Sam McNally 2014/08/11 04:56:42 As discussed, the API doesn't support this.
168 }
169
170 TEST_F(DataSourceTest, ErrorAndData) {
171 FillWriteBuffer("abc", -1);
172
173 ASSERT_TRUE(ReceiveAndWait());
174 ASSERT_TRUE(buffer_);
175 EXPECT_EQ("abc", buffer_contents_);
176 buffer_->Done(1);
177 EXPECT_EQ(0, error_);
178 ASSERT_TRUE(ReceiveAndWait());
179 ASSERT_TRUE(buffer_);
180 EXPECT_EQ("bc", buffer_contents_);
181 buffer_->Done(1);
182 EXPECT_EQ(0, error_);
183 ASSERT_TRUE(ReceiveAndWait());
184 ASSERT_TRUE(buffer_);
185 EXPECT_EQ("c", buffer_contents_);
186 buffer_->Done(1);
187 EXPECT_EQ(0, error_);
188 ASSERT_TRUE(ReceiveAndWait());
189 EXPECT_EQ(-1, error_);
190 ASSERT_FALSE(write_buffer_);
191
192 ASSERT_TRUE(Receive());
193 FillWriteBuffer("d", -2);
raymes 2014/08/11 04:04:51 Maybe test a non-error transmission is successful
Sam McNally 2014/08/11 04:56:42 Done.
194
195 RunMessageLoop();
196 ASSERT_TRUE(buffer_);
197 EXPECT_EQ("d", buffer_contents_);
198 buffer_->Done(1);
199 EXPECT_EQ(0, error_);
200 ASSERT_TRUE(ReceiveAndWait());
201 EXPECT_EQ(-2, error_);
202 }
203
204 TEST_F(DataSourceTest, ErrorOnly) {
205 FillWriteBuffer("", -1);
206
207 ASSERT_TRUE(ReceiveAndWait());
208 EXPECT_FALSE(buffer_);
209 EXPECT_EQ(-1, error_);
210 ASSERT_FALSE(write_buffer_);
211
212 ASSERT_TRUE(Receive());
213 FillWriteBuffer("", -2);
214
215 RunMessageLoop();
216 EXPECT_FALSE(buffer_);
217 EXPECT_EQ(-2, error_);
218 ASSERT_FALSE(write_buffer_);
219 }
220
221 TEST_F(DataSourceTest, ProducerShutdown) {
raymes 2014/08/11 04:04:51 Maybe call this "SourceShutDown" since that matche
Sam McNally 2014/08/11 04:56:42 Done.
222 source_sender_->ShutDown();
223 source_sender_ = NULL;
224 ASSERT_TRUE(ReceiveAndWait());
225 EXPECT_FALSE(buffer_);
226 EXPECT_EQ(-10, error_);
raymes 2014/08/11 04:04:51 Make this a global constant to clarify what's happ
Sam McNally 2014/08/11 04:56:43 Done.
227 ASSERT_FALSE(write_buffer_);
228 ASSERT_FALSE(Receive());
229 }
230
231 TEST_F(DataSourceTest, ReceiverShutdown) {
232 Receive();
233 receiver_ = NULL;
234 EXPECT_EQ(-10, error_);
235 RunMessageLoop();
236 EXPECT_TRUE(seen_connection_error_);
237 }
238
239 } // namespace device
OLDNEW
« no previous file with comments | « device/serial/data_source_sender.cc ('k') | device/serial/data_stream.mojom » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698