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