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);
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    env()->RegisterModule("device/serial/data_stream_serialization.mojom",
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          IDR_DATA_STREAM_SERIALIZATION_MOJOM_JS);
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    service_provider()->AddService(
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        base::Bind(&DataSenderTest::CreateDataSink, base::Unretained(this)));
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (receiver_.get()) {
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      receiver_->ShutDown();
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      receiver_ = NULL;
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_FALSE(buffer_);
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    buffer_.reset();
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ApiTestBase::TearDown();
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::queue<int32_t> error_to_report_;
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::queue<std::string> expected_data_;
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private:
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void CreateDataSink(
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      mojo::InterfaceRequest<device::serial::DataSink> request) {
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    receiver_ = mojo::WeakBindToRequest(
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        new device::DataSinkReceiver(
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            base::Bind(&DataSenderTest::ReadyToReceive, base::Unretained(this)),
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            base::Bind(&DataSenderTest::OnCancel, base::Unretained(this)),
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            base::Bind(base::DoNothing)),
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        &request);
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void ReadyToReceive(scoped_ptr<device::ReadOnlyBuffer> buffer) {
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string data(buffer->GetData(), buffer->GetSize());
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (expected_data_.empty()) {
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer_ = buffer.Pass();
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return;
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string& expected = expected_data_.front();
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (expected.size() > buffer->GetSize()) {
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      EXPECT_EQ(expected.substr(0, buffer->GetSize()), data);
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      expected = expected.substr(buffer->GetSize());
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer->Done(buffer->GetSize());
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return;
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (expected.size() < buffer->GetSize())
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      data = data.substr(0, expected.size());
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_EQ(expected, data);
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    expected_data_.pop();
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int32_t error = 0;
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (!error_to_report_.empty()) {
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      error = error_to_report_.front();
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      error_to_report_.pop();
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (error)
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer->DoneWithError(data.size(), error);
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    else
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer->Done(data.size());
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void OnCancel(int32_t error) {
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ASSERT_TRUE(buffer_);
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    buffer_->DoneWithError(0, error);
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    buffer_.reset();
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<device::DataSinkReceiver> receiver_;
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<device::ReadOnlyBuffer> buffer_;
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DataSenderTest);
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, Send) {
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("aa");
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSend");
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, LargeSend) {
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::string pattern = "123";
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::string expected_data;
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (int i = 0; i < 11; i++)
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    expected_data += pattern;
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(expected_data);
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testLargeSend");
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendError) {
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("");
11203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
11303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendError");
11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
11603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorPartialSuccess) {
11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(std::string(5, 'b'));
11903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
12003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
12103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorPartialSuccess");
12203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
12403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorBetweenPackets) {
12503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(std::string(2, 'b'));
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
12703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorBetweenPackets");
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorInSecondPacket) {
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(std::string(3, 'b'));
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorInSecondPacket");
13603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
13703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
13803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorInLargeSend) {
13903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("123456789012");
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
14203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorInLargeSend");
14303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, SendErrorBeforeLargeSend) {
14603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push(std::string(2, 'b'));
14703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  expected_data_.push("a");
14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_report_.push(1);
14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testSendErrorBeforeLargeSend");
15003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, CancelWithoutSend) {
15303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testCancelWithoutSend");
15403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
15503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
15603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, Cancel) {
15703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testCancel");
15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
15903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataSenderTest, Close) {
16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_sender_unittest.js", "testClose");
16203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
16303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataSenderTest, SendAfterSerialization) {
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_data_.push("aa");
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunTest("data_sender_unittest.js", "testSendAfterSerialization");
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataSenderTest, SendErrorAfterSerialization) {
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_data_.push("");
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  expected_data_.push("a");
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  error_to_report_.push(1);
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunTest("data_sender_unittest.js", "testSendErrorAfterSerialization");
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataSenderTest, CancelAfterSerialization) {
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunTest("data_sender_unittest.js", "testCancelAfterSerialization");
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataSenderTest, SerializeCancelsSendsInProgress) {
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunTest("data_sender_unittest.js", "testSerializeCancelsSendsInProgress");
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataSenderTest, SerializeWaitsForCancel) {
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunTest("data_sender_unittest.js", "testSerializeWaitsForCancel");
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DataSenderTest, SerializeAfterClose) {
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RunTest("data_sender_unittest.js", "testSerializeAfterClose");
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace extensions
193