1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include <queue> 6 7#include "device/serial/data_source_sender.h" 8#include "device/serial/data_stream.mojom.h" 9#include "extensions/renderer/api_test_base.h" 10#include "grit/extensions_renderer_resources.h" 11 12namespace extensions { 13 14// Runs tests defined in extensions/test/data/data_receiver_unittest.js 15class DataReceiverTest : public ApiTestBase { 16 public: 17 DataReceiverTest() {} 18 19 virtual void SetUp() OVERRIDE { 20 ApiTestBase::SetUp(); 21 env()->RegisterModule("async_waiter", IDR_ASYNC_WAITER_JS); 22 env()->RegisterModule("data_receiver", IDR_DATA_RECEIVER_JS); 23 env()->RegisterModule("device/serial/data_stream.mojom", 24 IDR_DATA_STREAM_MOJOM_JS); 25 env()->RegisterModule("device/serial/data_stream_serialization.mojom", 26 IDR_DATA_STREAM_SERIALIZATION_MOJOM_JS); 27 service_provider()->AddService(base::Bind( 28 &DataReceiverTest::CreateDataSource, base::Unretained(this))); 29 } 30 31 virtual void TearDown() OVERRIDE { 32 if (sender_.get()) { 33 sender_->ShutDown(); 34 sender_ = NULL; 35 } 36 ApiTestBase::TearDown(); 37 } 38 39 std::queue<int32_t> error_to_send_; 40 std::queue<std::string> data_to_send_; 41 42 private: 43 void CreateDataSource( 44 mojo::InterfaceRequest<device::serial::DataSource> request) { 45 sender_ = mojo::WeakBindToRequest( 46 new device::DataSourceSender( 47 base::Bind(&DataReceiverTest::ReadyToSend, base::Unretained(this)), 48 base::Bind(base::DoNothing)), 49 &request); 50 } 51 52 void ReadyToSend(scoped_ptr<device::WritableBuffer> buffer) { 53 if (data_to_send_.empty() && error_to_send_.empty()) 54 return; 55 56 std::string data; 57 int32_t error = 0; 58 if (!data_to_send_.empty()) { 59 data = data_to_send_.front(); 60 data_to_send_.pop(); 61 } 62 if (!error_to_send_.empty()) { 63 error = error_to_send_.front(); 64 error_to_send_.pop(); 65 } 66 if (error == 2) { 67 sender_->ShutDown(); 68 sender_ = NULL; 69 return; 70 } 71 DCHECK(buffer->GetSize() >= static_cast<uint32_t>(data.size())); 72 memcpy(buffer->GetData(), data.c_str(), data.size()); 73 if (error) 74 buffer->DoneWithError(data.size(), error); 75 else 76 buffer->Done(data.size()); 77 } 78 79 scoped_refptr<device::DataSourceSender> sender_; 80 81 DISALLOW_COPY_AND_ASSIGN(DataReceiverTest); 82}; 83 84TEST_F(DataReceiverTest, Receive) { 85 data_to_send_.push("a"); 86 RunTest("data_receiver_unittest.js", "testReceive"); 87} 88 89TEST_F(DataReceiverTest, ReceiveError) { 90 error_to_send_.push(1); 91 RunTest("data_receiver_unittest.js", "testReceiveError"); 92} 93 94TEST_F(DataReceiverTest, ReceiveDataAndError) { 95 data_to_send_.push("a"); 96 data_to_send_.push("b"); 97 error_to_send_.push(1); 98 RunTest("data_receiver_unittest.js", "testReceiveDataAndError"); 99} 100 101TEST_F(DataReceiverTest, ReceiveErrorThenData) { 102 data_to_send_.push(""); 103 data_to_send_.push("a"); 104 error_to_send_.push(1); 105 RunTest("data_receiver_unittest.js", "testReceiveErrorThenData"); 106} 107 108TEST_F(DataReceiverTest, ReceiveBeforeAndAfterSerialization) { 109 data_to_send_.push("a"); 110 data_to_send_.push("b"); 111 RunTest("data_receiver_unittest.js", 112 "testReceiveBeforeAndAfterSerialization"); 113} 114 115TEST_F(DataReceiverTest, ReceiveErrorSerialization) { 116 error_to_send_.push(1); 117 error_to_send_.push(3); 118 RunTest("data_receiver_unittest.js", "testReceiveErrorSerialization"); 119} 120 121TEST_F(DataReceiverTest, ReceiveDataAndErrorSerialization) { 122 data_to_send_.push("a"); 123 data_to_send_.push("b"); 124 error_to_send_.push(1); 125 error_to_send_.push(3); 126 RunTest("data_receiver_unittest.js", "testReceiveDataAndErrorSerialization"); 127} 128 129TEST_F(DataReceiverTest, SerializeDuringReceive) { 130 data_to_send_.push("a"); 131 RunTest("data_receiver_unittest.js", "testSerializeDuringReceive"); 132} 133 134TEST_F(DataReceiverTest, SerializeAfterClose) { 135 data_to_send_.push("a"); 136 RunTest("data_receiver_unittest.js", "testSerializeAfterClose"); 137} 138 139TEST_F(DataReceiverTest, SourceShutdown) { 140 error_to_send_.push(2); 141 RunTest("data_receiver_unittest.js", "testSourceShutdown"); 142} 143 144} // namespace extensions 145