Home | History | Annotate | Download | only in serial
      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_sink_receiver.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 
     12 namespace extensions {
     13 
     14 // Runs tests defined in extensions/test/data/data_sender_unittest.js
     15 class DataSenderTest : public ApiTestBase {
     16  public:
     17   DataSenderTest() {}
     18 
     19   virtual void SetUp() OVERRIDE {
     20     ApiTestBase::SetUp();
     21     env()->RegisterModule("async_waiter", IDR_ASYNC_WAITER_JS);
     22     env()->RegisterModule("data_sender", IDR_DATA_SENDER_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(
     28         base::Bind(&DataSenderTest::CreateDataSink, base::Unretained(this)));
     29   }
     30 
     31   virtual void TearDown() OVERRIDE {
     32     if (receiver_.get()) {
     33       receiver_->ShutDown();
     34       receiver_ = NULL;
     35     }
     36     EXPECT_FALSE(buffer_);
     37     buffer_.reset();
     38     ApiTestBase::TearDown();
     39   }
     40 
     41   std::queue<int32_t> error_to_report_;
     42   std::queue<std::string> expected_data_;
     43 
     44  private:
     45   void CreateDataSink(
     46       mojo::InterfaceRequest<device::serial::DataSink> request) {
     47     receiver_ = mojo::WeakBindToRequest(
     48         new device::DataSinkReceiver(
     49             base::Bind(&DataSenderTest::ReadyToReceive, base::Unretained(this)),
     50             base::Bind(&DataSenderTest::OnCancel, base::Unretained(this)),
     51             base::Bind(base::DoNothing)),
     52         &request);
     53   }
     54 
     55   void ReadyToReceive(scoped_ptr<device::ReadOnlyBuffer> buffer) {
     56     std::string data(buffer->GetData(), buffer->GetSize());
     57     if (expected_data_.empty()) {
     58       buffer_ = buffer.Pass();
     59       return;
     60     }
     61 
     62     std::string& expected = expected_data_.front();
     63     if (expected.size() > buffer->GetSize()) {
     64       EXPECT_EQ(expected.substr(0, buffer->GetSize()), data);
     65       expected = expected.substr(buffer->GetSize());
     66       buffer->Done(buffer->GetSize());
     67       return;
     68     }
     69     if (expected.size() < buffer->GetSize())
     70       data = data.substr(0, expected.size());
     71     EXPECT_EQ(expected, data);
     72     expected_data_.pop();
     73     int32_t error = 0;
     74     if (!error_to_report_.empty()) {
     75       error = error_to_report_.front();
     76       error_to_report_.pop();
     77     }
     78     if (error)
     79       buffer->DoneWithError(data.size(), error);
     80     else
     81       buffer->Done(data.size());
     82   }
     83 
     84   void OnCancel(int32_t error) {
     85     ASSERT_TRUE(buffer_);
     86     buffer_->DoneWithError(0, error);
     87     buffer_.reset();
     88   }
     89 
     90   scoped_refptr<device::DataSinkReceiver> receiver_;
     91   scoped_ptr<device::ReadOnlyBuffer> buffer_;
     92 
     93   DISALLOW_COPY_AND_ASSIGN(DataSenderTest);
     94 };
     95 
     96 TEST_F(DataSenderTest, Send) {
     97   expected_data_.push("aa");
     98   RunTest("data_sender_unittest.js", "testSend");
     99 }
    100 
    101 TEST_F(DataSenderTest, LargeSend) {
    102   std::string pattern = "123";
    103   std::string expected_data;
    104   for (int i = 0; i < 11; i++)
    105     expected_data += pattern;
    106   expected_data_.push(expected_data);
    107   RunTest("data_sender_unittest.js", "testLargeSend");
    108 }
    109 
    110 TEST_F(DataSenderTest, SendError) {
    111   expected_data_.push("");
    112   expected_data_.push("a");
    113   error_to_report_.push(1);
    114   RunTest("data_sender_unittest.js", "testSendError");
    115 }
    116 
    117 TEST_F(DataSenderTest, SendErrorPartialSuccess) {
    118   expected_data_.push(std::string(5, 'b'));
    119   expected_data_.push("a");
    120   error_to_report_.push(1);
    121   RunTest("data_sender_unittest.js", "testSendErrorPartialSuccess");
    122 }
    123 
    124 TEST_F(DataSenderTest, SendErrorBetweenPackets) {
    125   expected_data_.push(std::string(2, 'b'));
    126   expected_data_.push("a");
    127   error_to_report_.push(1);
    128   RunTest("data_sender_unittest.js", "testSendErrorBetweenPackets");
    129 }
    130 
    131 TEST_F(DataSenderTest, SendErrorInSecondPacket) {
    132   expected_data_.push(std::string(3, 'b'));
    133   expected_data_.push("a");
    134   error_to_report_.push(1);
    135   RunTest("data_sender_unittest.js", "testSendErrorInSecondPacket");
    136 }
    137 
    138 TEST_F(DataSenderTest, SendErrorInLargeSend) {
    139   expected_data_.push("123456789012");
    140   expected_data_.push("a");
    141   error_to_report_.push(1);
    142   RunTest("data_sender_unittest.js", "testSendErrorInLargeSend");
    143 }
    144 
    145 TEST_F(DataSenderTest, SendErrorBeforeLargeSend) {
    146   expected_data_.push(std::string(2, 'b'));
    147   expected_data_.push("a");
    148   error_to_report_.push(1);
    149   RunTest("data_sender_unittest.js", "testSendErrorBeforeLargeSend");
    150 }
    151 
    152 TEST_F(DataSenderTest, CancelWithoutSend) {
    153   RunTest("data_sender_unittest.js", "testCancelWithoutSend");
    154 }
    155 
    156 TEST_F(DataSenderTest, Cancel) {
    157   RunTest("data_sender_unittest.js", "testCancel");
    158 }
    159 
    160 TEST_F(DataSenderTest, Close) {
    161   RunTest("data_sender_unittest.js", "testClose");
    162 }
    163 
    164 TEST_F(DataSenderTest, SendAfterSerialization) {
    165   expected_data_.push("aa");
    166   RunTest("data_sender_unittest.js", "testSendAfterSerialization");
    167 }
    168 
    169 TEST_F(DataSenderTest, SendErrorAfterSerialization) {
    170   expected_data_.push("");
    171   expected_data_.push("a");
    172   error_to_report_.push(1);
    173   RunTest("data_sender_unittest.js", "testSendErrorAfterSerialization");
    174 }
    175 
    176 TEST_F(DataSenderTest, CancelAfterSerialization) {
    177   RunTest("data_sender_unittest.js", "testCancelAfterSerialization");
    178 }
    179 
    180 TEST_F(DataSenderTest, SerializeCancelsSendsInProgress) {
    181   RunTest("data_sender_unittest.js", "testSerializeCancelsSendsInProgress");
    182 }
    183 
    184 TEST_F(DataSenderTest, SerializeWaitsForCancel) {
    185   RunTest("data_sender_unittest.js", "testSerializeWaitsForCancel");
    186 }
    187 
    188 TEST_F(DataSenderTest, SerializeAfterClose) {
    189   RunTest("data_sender_unittest.js", "testSerializeAfterClose");
    190 }
    191 
    192 }  // namespace extensions
    193