• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
12 namespace extensions {
13 
14 // Runs tests defined in extensions/test/data/data_receiver_unittest.js
15 class DataReceiverTest : public ApiTestBase {
16  public:
DataReceiverTest()17   DataReceiverTest() {}
18 
SetUp()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 
TearDown()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:
CreateDataSource(mojo::InterfaceRequest<device::serial::DataSource> request)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 
ReadyToSend(scoped_ptr<device::WritableBuffer> buffer)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 
TEST_F(DataReceiverTest,Receive)84 TEST_F(DataReceiverTest, Receive) {
85   data_to_send_.push("a");
86   RunTest("data_receiver_unittest.js", "testReceive");
87 }
88 
TEST_F(DataReceiverTest,ReceiveError)89 TEST_F(DataReceiverTest, ReceiveError) {
90   error_to_send_.push(1);
91   RunTest("data_receiver_unittest.js", "testReceiveError");
92 }
93 
TEST_F(DataReceiverTest,ReceiveDataAndError)94 TEST_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 
TEST_F(DataReceiverTest,ReceiveErrorThenData)101 TEST_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 
TEST_F(DataReceiverTest,ReceiveBeforeAndAfterSerialization)108 TEST_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 
TEST_F(DataReceiverTest,ReceiveErrorSerialization)115 TEST_F(DataReceiverTest, ReceiveErrorSerialization) {
116   error_to_send_.push(1);
117   error_to_send_.push(3);
118   RunTest("data_receiver_unittest.js", "testReceiveErrorSerialization");
119 }
120 
TEST_F(DataReceiverTest,ReceiveDataAndErrorSerialization)121 TEST_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 
TEST_F(DataReceiverTest,SerializeDuringReceive)129 TEST_F(DataReceiverTest, SerializeDuringReceive) {
130   data_to_send_.push("a");
131   RunTest("data_receiver_unittest.js", "testSerializeDuringReceive");
132 }
133 
TEST_F(DataReceiverTest,SerializeAfterClose)134 TEST_F(DataReceiverTest, SerializeAfterClose) {
135   data_to_send_.push("a");
136   RunTest("data_receiver_unittest.js", "testSerializeAfterClose");
137 }
138 
TEST_F(DataReceiverTest,SourceShutdown)139 TEST_F(DataReceiverTest, SourceShutdown) {
140   error_to_send_.push(2);
141   RunTest("data_receiver_unittest.js", "testSourceShutdown");
142 }
143 
144 }  // namespace extensions
145