data_sender_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// found in the LICENSE file.
403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <queue>
603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "device/serial/data_sink_receiver.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "device/serial/data_stream.mojom.h"
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "extensions/renderer/api_test_base.h"
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "grit/extensions_renderer_resources.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace extensions {
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Runs tests defined in extensions/test/data/data_sender_unittest.js
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class DataSenderTest : public ApiTestBase {
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public:
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DataSenderTest() {}
1803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
2003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ApiTestBase::SetUp();
2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    env()->RegisterModule("async_waiter", IDR_ASYNC_WAITER_JS);
2203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    env()->RegisterModule("data_sender", IDR_DATA_SENDER_JS);
2303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    env()->RegisterModule("device/serial/data_stream.mojom",
2403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                          IDR_DATA_STREAM_MOJOM_JS);
2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    service_provider()->AddService(
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        base::Bind(&DataSenderTest::CreateDataSink, base::Unretained(this)));
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (receiver_) {
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      receiver_->ShutDown();
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      receiver_ = NULL;
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_FALSE(buffer_);
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    buffer_.reset();
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ApiTestBase::TearDown();
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::queue<int32_t> error_to_report_;
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::queue<std::string> expected_data_;
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private:
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void CreateDataSink(
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      mojo::InterfaceRequest<device::serial::DataSink> request) {
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    receiver_ = mojo::WeakBindToRequest(
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        new device::DataSinkReceiver(
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            base::Bind(&DataSenderTest::ReadyToReceive, base::Unretained(this)),
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            base::Bind(&DataSenderTest::OnCancel, base::Unretained(this)),
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            base::Bind(base::DoNothing)),
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        &request);
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void ReadyToReceive(scoped_ptr<device::ReadOnlyBuffer> buffer) {
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string data(buffer->GetData(), buffer->GetSize());
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (expected_data_.empty()) {
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer_ = buffer.Pass();
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return;
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string& expected = expected_data_.front();
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (expected.size() > buffer->GetSize()) {
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      EXPECT_EQ(expected.substr(0, buffer->GetSize()), data);
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      expected = expected.substr(buffer->GetSize());
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer->Done(buffer->GetSize());
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return;
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (expected.size() < buffer->GetSize())
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      data = data.substr(0, expected.size());
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_EQ(expected, data);
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    expected_data_.pop();
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int32_t error = 0;
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (!error_to_report_.empty()) {
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      error = error_to_report_.front();
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      error_to_report_.pop();
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (error)
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer->DoneWithError(data.size(), error);
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    else
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer->Done(data.size());
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void OnCancel(int32_t error) {
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ASSERT_TRUE(buffer_);
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    buffer_->DoneWithError(0, error);
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    buffer_.reset();
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<device::DataSinkReceiver> receiver_;
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<device::ReadOnlyBuffer> buffer_;
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DataSenderTest);
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, Send) {
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("aa");
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSend");
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, LargeSend) {
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string pattern = "1234567890";
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string expected_data;
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (int i = 0; i < 110; i++)
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    expected_data += pattern;
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(expected_data);
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testLargeSend");
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendError) {
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("");
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendError");
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorPartialSuccess) {
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(std::string(5, 'b'));
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorPartialSuccess");
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorBetweenPackets) {
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(std::string(2, 'b'));
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorBetweenPackets");
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorInSecondPacket) {
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(std::string(3, 'b'));
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorInSecondPacket");
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorInLargeSend) {
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("123456789012");
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorInLargeSend");
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorBeforeLargeSend) {
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(std::string(2, 'b'));
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorBeforeLargeSend");
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, CancelWithoutSend) {
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testCancelWithoutSend");
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, Cancel) {
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testCancel");
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, Close) {
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testClose");
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace extensions
163