data_receiver_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_source_sender.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_receiver_unittest.js
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class DataReceiverTest : public ApiTestBase {
1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public:
1703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DataReceiverTest() {}
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_receiver", IDR_DATA_RECEIVER_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(base::Bind(
2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        &DataReceiverTest::CreateDataSource, base::Unretained(this)));
2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (sender_) {
3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      sender_->ShutDown();
3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      sender_ = NULL;
3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ApiTestBase::TearDown();
3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::queue<int32_t> error_to_send_;
3803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  std::queue<std::string> data_to_send_;
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
4003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) private:
4103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void CreateDataSource(
4203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      mojo::InterfaceRequest<device::serial::DataSource> request) {
4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    sender_ = mojo::WeakBindToRequest(
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        new device::DataSourceSender(
4503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            base::Bind(&DataReceiverTest::ReadyToSend, base::Unretained(this)),
4603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)            base::Bind(base::DoNothing)),
4703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        &request);
4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void ReadyToSend(scoped_ptr<device::WritableBuffer> buffer) {
5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (data_to_send_.empty() && error_to_send_.empty())
5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return;
5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string data;
5503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    int32_t error = 0;
5603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (!data_to_send_.empty()) {
5703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      data = data_to_send_.front();
5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      data_to_send_.pop();
5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (!error_to_send_.empty()) {
6103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      error = error_to_send_.front();
6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      error_to_send_.pop();
6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
6403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (error == 2) {
6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      sender_->ShutDown();
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      sender_ = NULL;
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      return;
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    DCHECK(buffer->GetSize() >= static_cast<uint32_t>(data.size()));
7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    memcpy(buffer->GetData(), data.c_str(), data.size());
7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (error)
7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer->DoneWithError(data.size(), error);
7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    else
7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      buffer->Done(data.size());
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_refptr<device::DataSourceSender> sender_;
7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DataReceiverTest);
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataReceiverTest, Receive) {
8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data_to_send_.push("a");
8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_receiver_unittest.js", "testReceive");
8503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
8603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
8703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataReceiverTest, ReceiveError) {
8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_send_.push(1);
8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_receiver_unittest.js", "testReceiveError");
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataReceiverTest, ReceiveDataAndError) {
9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data_to_send_.push("a");
9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data_to_send_.push("b");
9503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_send_.push(1);
9603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_receiver_unittest.js", "testReceiveDataAndError");
9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
9903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataReceiverTest, ReceiveErrorThenData) {
10003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data_to_send_.push("");
10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  data_to_send_.push("a");
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_send_.push(1);
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_receiver_unittest.js", "testReceiveErrorThenData");
10403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(DataReceiverTest, SourceShutdown) {
10703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  error_to_send_.push(2);
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  RunTest("data_receiver_unittest.js", "testSourceShutdown");
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}  // namespace extensions
112