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