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.
7 #include "device/serial/data_sink_receiver.h"
8 #include "device/serial/data_stream.mojom.h"
9 #include "extensions/renderer/api_test_base.h"
10 #include "grit/extensions_renderer_resources.h"
12 namespace extensions {
14 // Runs tests defined in extensions/test/data/data_sender_unittest.js
15 class DataSenderTest : public ApiTestBase {
19 void SetUp() override {
21 service_provider()->AddService(
22 base::Bind(&DataSenderTest::CreateDataSink, base::Unretained(this)));
25 void TearDown() override {
26 if (receiver_.get()) {
27 receiver_->ShutDown();
30 EXPECT_FALSE(buffer_);
32 ApiTestBase::TearDown();
35 std::queue<int32_t> error_to_report_;
36 std::queue<std::string> expected_data_;
40 mojo::InterfaceRequest<device::serial::DataSink> request) {
41 receiver_ = mojo::WeakBindToRequest(
42 new device::DataSinkReceiver(
43 base::Bind(&DataSenderTest::ReadyToReceive, base::Unretained(this)),
44 base::Bind(&DataSenderTest::OnCancel, base::Unretained(this)),
45 base::Bind(base::DoNothing)),
49 void ReadyToReceive(scoped_ptr<device::ReadOnlyBuffer> buffer) {
50 std::string data(buffer->GetData(), buffer->GetSize());
51 if (expected_data_.empty()) {
52 buffer_ = buffer.Pass();
56 std::string& expected = expected_data_.front();
57 if (expected.size() > buffer->GetSize()) {
58 EXPECT_EQ(expected.substr(0, buffer->GetSize()), data);
59 expected = expected.substr(buffer->GetSize());
60 buffer->Done(buffer->GetSize());
63 if (expected.size() < buffer->GetSize())
64 data = data.substr(0, expected.size());
65 EXPECT_EQ(expected, data);
68 if (!error_to_report_.empty()) {
69 error = error_to_report_.front();
70 error_to_report_.pop();
73 buffer->DoneWithError(data.size(), error);
75 buffer->Done(data.size());
78 void OnCancel(int32_t error) {
80 buffer_->DoneWithError(0, error);
84 scoped_refptr<device::DataSinkReceiver> receiver_;
85 scoped_ptr<device::ReadOnlyBuffer> buffer_;
87 DISALLOW_COPY_AND_ASSIGN(DataSenderTest);
90 TEST_F(DataSenderTest, Send) {
91 expected_data_.push("aa");
92 RunTest("data_sender_unittest.js", "testSend");
95 TEST_F(DataSenderTest, LargeSend) {
96 std::string pattern = "123";
97 std::string expected_data;
98 for (int i = 0; i < 11; i++)
99 expected_data += pattern;
100 expected_data_.push(expected_data);
101 RunTest("data_sender_unittest.js", "testLargeSend");
104 TEST_F(DataSenderTest, SendError) {
105 expected_data_.push("");
106 expected_data_.push("a");
107 error_to_report_.push(1);
108 RunTest("data_sender_unittest.js", "testSendError");
111 TEST_F(DataSenderTest, SendErrorPartialSuccess) {
112 expected_data_.push(std::string(5, 'b'));
113 expected_data_.push("a");
114 error_to_report_.push(1);
115 RunTest("data_sender_unittest.js", "testSendErrorPartialSuccess");
118 TEST_F(DataSenderTest, SendErrorBetweenPackets) {
119 expected_data_.push(std::string(2, 'b'));
120 expected_data_.push("a");
121 error_to_report_.push(1);
122 RunTest("data_sender_unittest.js", "testSendErrorBetweenPackets");
125 TEST_F(DataSenderTest, SendErrorInSecondPacket) {
126 expected_data_.push(std::string(3, 'b'));
127 expected_data_.push("a");
128 error_to_report_.push(1);
129 RunTest("data_sender_unittest.js", "testSendErrorInSecondPacket");
132 TEST_F(DataSenderTest, SendErrorInLargeSend) {
133 expected_data_.push("123456789012");
134 expected_data_.push("a");
135 error_to_report_.push(1);
136 RunTest("data_sender_unittest.js", "testSendErrorInLargeSend");
139 TEST_F(DataSenderTest, SendErrorBeforeLargeSend) {
140 expected_data_.push(std::string(2, 'b'));
141 expected_data_.push("a");
142 error_to_report_.push(1);
143 RunTest("data_sender_unittest.js", "testSendErrorBeforeLargeSend");
146 TEST_F(DataSenderTest, CancelWithoutSend) {
147 RunTest("data_sender_unittest.js", "testCancelWithoutSend");
150 TEST_F(DataSenderTest, Cancel) {
151 RunTest("data_sender_unittest.js", "testCancel");
154 TEST_F(DataSenderTest, Close) {
155 RunTest("data_sender_unittest.js", "testClose");
158 TEST_F(DataSenderTest, SendAfterSerialization) {
159 expected_data_.push("aa");
160 RunTest("data_sender_unittest.js", "testSendAfterSerialization");
163 TEST_F(DataSenderTest, SendErrorAfterSerialization) {
164 expected_data_.push("");
165 expected_data_.push("a");
166 error_to_report_.push(1);
167 RunTest("data_sender_unittest.js", "testSendErrorAfterSerialization");
170 TEST_F(DataSenderTest, CancelAfterSerialization) {
171 RunTest("data_sender_unittest.js", "testCancelAfterSerialization");
174 TEST_F(DataSenderTest, SerializeCancelsSendsInProgress) {
175 RunTest("data_sender_unittest.js", "testSerializeCancelsSendsInProgress");
178 TEST_F(DataSenderTest, SerializeWaitsForCancel) {
179 RunTest("data_sender_unittest.js", "testSerializeWaitsForCancel");
182 TEST_F(DataSenderTest, SerializeAfterClose) {
183 RunTest("data_sender_unittest.js", "testSerializeAfterClose");
186 } // namespace extensions