OLD | NEW |
---|---|
(Empty) | |
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 service_provider()->AddService( | |
26 base::Bind(&DataSenderTest::CreateDataSink, base::Unretained(this))); | |
27 } | |
28 | |
29 virtual void TearDown() OVERRIDE { | |
30 if (receiver_) { | |
31 receiver_->ShutDown(); | |
32 receiver_ = NULL; | |
33 } | |
34 EXPECT_FALSE(buffer_); | |
35 buffer_.reset(); | |
36 ApiTestBase::TearDown(); | |
37 } | |
38 | |
39 std::queue<int32_t> error_to_report_; | |
40 std::queue<std::string> expected_data_; | |
41 | |
42 private: | |
43 void CreateDataSink( | |
44 mojo::InterfaceRequest<device::serial::DataSink> request) { | |
45 receiver_ = mojo::WeakBindToRequest( | |
46 new device::DataSinkReceiver( | |
47 base::Bind(&DataSenderTest::ReadyToReceive, base::Unretained(this)), | |
48 base::Bind(&DataSenderTest::OnCancel, base::Unretained(this)), | |
49 base::Bind(base::DoNothing)), | |
50 &request); | |
51 } | |
52 | |
53 void ReadyToReceive(scoped_ptr<device::ReadOnlyBuffer> buffer) { | |
54 std::string data(buffer->GetData(), buffer->GetSize()); | |
55 if (expected_data_.empty()) { | |
56 buffer_ = buffer.Pass(); | |
57 return; | |
58 } | |
59 | |
60 std::string& expected = expected_data_.front(); | |
61 if (expected.size() > buffer->GetSize()) { | |
62 EXPECT_EQ(expected.substr(0, buffer->GetSize()), data); | |
63 expected = expected.substr(buffer->GetSize()); | |
64 buffer->Done(buffer->GetSize()); | |
raymes
2014/08/20 04:23:13
I guess we haven't tested the case where an error
Sam McNally
2014/08/20 04:50:15
Done.
| |
65 return; | |
66 } | |
67 if (expected.size() < buffer->GetSize()) | |
68 data = data.substr(0, expected.size()); | |
69 EXPECT_EQ(expected, data); | |
70 expected_data_.pop(); | |
71 int32_t error = 0; | |
72 if (!error_to_report_.empty()) { | |
73 error = error_to_report_.front(); | |
74 error_to_report_.pop(); | |
75 } | |
76 if (error) | |
77 buffer->DoneWithError(data.size(), error); | |
78 else | |
79 buffer->Done(data.size()); | |
80 } | |
81 | |
82 void OnCancel(int32_t error) { | |
83 ASSERT_TRUE(buffer_); | |
84 buffer_->DoneWithError(0, error); | |
85 buffer_.reset(); | |
86 } | |
87 | |
88 scoped_refptr<device::DataSinkReceiver> receiver_; | |
89 scoped_ptr<device::ReadOnlyBuffer> buffer_; | |
90 | |
91 DISALLOW_COPY_AND_ASSIGN(DataSenderTest); | |
92 }; | |
93 | |
94 TEST_F(DataSenderTest, Send) { | |
95 expected_data_.push("aa"); | |
96 RunTest("data_sender_unittest.js", "testSend"); | |
97 } | |
98 | |
99 TEST_F(DataSenderTest, LargeSend) { | |
100 expected_data_.push(std::string(100, 'a')); | |
101 RunTest("data_sender_unittest.js", "testLargeSend"); | |
102 } | |
103 | |
104 TEST_F(DataSenderTest, SendError) { | |
105 expected_data_.push(""); | |
106 expected_data_.push("a"); | |
107 error_to_report_.push(1); | |
108 RunTest("data_sender_unittest.js", "testSendError"); | |
109 } | |
110 | |
111 TEST_F(DataSenderTest, SendErrorPartialSuccess) { | |
112 expected_data_.push(std::string(5, 'b')); | |
113 expected_data_.push("a"); | |
114 error_to_report_.push(1); | |
115 RunTest("data_sender_unittest.js", "testSendErrorPartialSuccess"); | |
116 } | |
117 | |
118 TEST_F(DataSenderTest, SendErrorBetweenPackets) { | |
119 expected_data_.push(std::string(2, 'b')); | |
120 expected_data_.push("a"); | |
121 error_to_report_.push(1); | |
122 RunTest("data_sender_unittest.js", "testSendErrorBetweenPackets"); | |
123 } | |
124 | |
125 TEST_F(DataSenderTest, SendErrorInSecondPacket) { | |
126 expected_data_.push(std::string(3, 'b')); | |
127 expected_data_.push("a"); | |
128 error_to_report_.push(1); | |
129 RunTest("data_sender_unittest.js", "testSendErrorInSecondPacket"); | |
130 } | |
131 | |
132 TEST_F(DataSenderTest, SendErrorBeforeLargeSend) { | |
133 expected_data_.push(std::string(2, 'b')); | |
134 expected_data_.push("a"); | |
135 error_to_report_.push(1); | |
136 RunTest("data_sender_unittest.js", "testSendErrorBeforeLargeSend"); | |
137 } | |
138 | |
139 TEST_F(DataSenderTest, CancelWithoutSend) { | |
140 RunTest("data_sender_unittest.js", "testCancelWithoutSend"); | |
141 } | |
142 | |
143 TEST_F(DataSenderTest, Cancel) { | |
144 RunTest("data_sender_unittest.js", "testCancel"); | |
145 } | |
146 | |
147 } // namespace extensions | |
OLD | NEW |