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