data_sender_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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 <queue>
6
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"
11
12namespace extensions {
13
14// Runs tests defined in extensions/test/data/data_sender_unittest.js
15class DataSenderTest : public ApiTestBase {
16 public:
17  DataSenderTest() {}
18
19  virtual void SetUp() OVERRIDE {
20    ApiTestBase::SetUp();
21    env()->RegisterModule("async_waiter", IDR_ASYNC_WAITER_JS);
22    env()->RegisterModule("data_sender", IDR_DATA_SENDER_JS);
23    env()->RegisterModule("device/serial/data_stream.mojom",
24                          IDR_DATA_STREAM_MOJOM_JS);
25    service_provider()->AddService(
26        base::Bind(&DataSenderTest::CreateDataSink, base::Unretained(this)));
27  }
28
29  virtual void TearDown() OVERRIDE {
30    if (receiver_) {
31      receiver_->ShutDown();
32      receiver_ = NULL;
33    }
34    EXPECT_FALSE(buffer_);
35    buffer_.reset();
36    ApiTestBase::TearDown();
37  }
38
39  std::queue<int32_t> error_to_report_;
40  std::queue<std::string> expected_data_;
41
42 private:
43  void CreateDataSink(
44      mojo::InterfaceRequest<device::serial::DataSink> request) {
45    receiver_ = mojo::WeakBindToRequest(
46        new device::DataSinkReceiver(
47            base::Bind(&DataSenderTest::ReadyToReceive, base::Unretained(this)),
48            base::Bind(&DataSenderTest::OnCancel, base::Unretained(this)),
49            base::Bind(base::DoNothing)),
50        &request);
51  }
52
53  void ReadyToReceive(scoped_ptr<device::ReadOnlyBuffer> buffer) {
54    std::string data(buffer->GetData(), buffer->GetSize());
55    if (expected_data_.empty()) {
56      buffer_ = buffer.Pass();
57      return;
58    }
59
60    std::string& expected = expected_data_.front();
61    if (expected.size() > buffer->GetSize()) {
62      EXPECT_EQ(expected.substr(0, buffer->GetSize()), data);
63      expected = expected.substr(buffer->GetSize());
64      buffer->Done(buffer->GetSize());
65      return;
66    }
67    if (expected.size() < buffer->GetSize())
68      data = data.substr(0, expected.size());
69    EXPECT_EQ(expected, data);
70    expected_data_.pop();
71    int32_t error = 0;
72    if (!error_to_report_.empty()) {
73      error = error_to_report_.front();
74      error_to_report_.pop();
75    }
76    if (error)
77      buffer->DoneWithError(data.size(), error);
78    else
79      buffer->Done(data.size());
80  }
81
82  void OnCancel(int32_t error) {
83    ASSERT_TRUE(buffer_);
84    buffer_->DoneWithError(0, error);
85    buffer_.reset();
86  }
87
88  scoped_refptr<device::DataSinkReceiver> receiver_;
89  scoped_ptr<device::ReadOnlyBuffer> buffer_;
90
91  DISALLOW_COPY_AND_ASSIGN(DataSenderTest);
92};
93
94TEST_F(DataSenderTest, Send) {
95  expected_data_.push("aa");
96  RunTest("data_sender_unittest.js", "testSend");
97}
98
99TEST_F(DataSenderTest, LargeSend) {
100  std::string pattern = "1234567890";
101  std::string expected_data;
102  for (int i = 0; i < 110; i++)
103    expected_data += pattern;
104  expected_data_.push(expected_data);
105  RunTest("data_sender_unittest.js", "testLargeSend");
106}
107
108TEST_F(DataSenderTest, SendError) {
109  expected_data_.push("");
110  expected_data_.push("a");
111  error_to_report_.push(1);
112  RunTest("data_sender_unittest.js", "testSendError");
113}
114
115TEST_F(DataSenderTest, SendErrorPartialSuccess) {
116  expected_data_.push(std::string(5, 'b'));
117  expected_data_.push("a");
118  error_to_report_.push(1);
119  RunTest("data_sender_unittest.js", "testSendErrorPartialSuccess");
120}
121
122TEST_F(DataSenderTest, SendErrorBetweenPackets) {
123  expected_data_.push(std::string(2, 'b'));
124  expected_data_.push("a");
125  error_to_report_.push(1);
126  RunTest("data_sender_unittest.js", "testSendErrorBetweenPackets");
127}
128
129TEST_F(DataSenderTest, SendErrorInSecondPacket) {
130  expected_data_.push(std::string(3, 'b'));
131  expected_data_.push("a");
132  error_to_report_.push(1);
133  RunTest("data_sender_unittest.js", "testSendErrorInSecondPacket");
134}
135
136TEST_F(DataSenderTest, SendErrorInLargeSend) {
137  expected_data_.push("123456789012");
138  expected_data_.push("a");
139  error_to_report_.push(1);
140  RunTest("data_sender_unittest.js", "testSendErrorInLargeSend");
141}
142
143TEST_F(DataSenderTest, SendErrorBeforeLargeSend) {
144  expected_data_.push(std::string(2, 'b'));
145  expected_data_.push("a");
146  error_to_report_.push(1);
147  RunTest("data_sender_unittest.js", "testSendErrorBeforeLargeSend");
148}
149
150TEST_F(DataSenderTest, CancelWithoutSend) {
151  RunTest("data_sender_unittest.js", "testCancelWithoutSend");
152}
153
154TEST_F(DataSenderTest, Cancel) {
155  RunTest("data_sender_unittest.js", "testCancel");
156}
157
158TEST_F(DataSenderTest, Close) {
159  RunTest("data_sender_unittest.js", "testClose");
160}
161
162}  // namespace extensions
163