| 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 <stdint.h> | |
| 6 | |
| 7 #include <queue> | |
| 8 #include <utility> | |
| 9 | |
| 10 #include "base/macros.h" | |
| 11 #include "device/serial/data_sink_receiver.h" | |
| 12 #include "device/serial/data_stream.mojom.h" | |
| 13 #include "extensions/renderer/api_test_base.h" | |
| 14 #include "grit/extensions_renderer_resources.h" | |
| 15 | |
| 16 namespace extensions { | |
| 17 | |
| 18 // Runs tests defined in extensions/test/data/data_sender_unittest.js | |
| 19 class DataSenderTest : public ApiTestBase { | |
| 20 public: | |
| 21 DataSenderTest() {} | |
| 22 | |
| 23 void SetUp() override { | |
| 24 ApiTestBase::SetUp(); | |
| 25 interface_provider()->AddInterface( | |
| 26 base::Bind(&DataSenderTest::CreateDataSink, base::Unretained(this))); | |
| 27 } | |
| 28 | |
| 29 void TearDown() override { | |
| 30 if (receiver_.get()) { | |
| 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_ = new device::DataSinkReceiver( | |
| 46 std::move(request), | |
| 47 base::Bind(&DataSenderTest::ReadyToReceive, base::Unretained(this)), | |
| 48 base::Bind(&DataSenderTest::OnCancel, base::Unretained(this)), | |
| 49 base::Bind(base::DoNothing)); | |
| 50 } | |
| 51 | |
| 52 void ReadyToReceive(std::unique_ptr<device::ReadOnlyBuffer> buffer) { | |
| 53 std::string data(buffer->GetData(), buffer->GetSize()); | |
| 54 if (expected_data_.empty()) { | |
| 55 buffer_ = std::move(buffer); | |
| 56 return; | |
| 57 } | |
| 58 | |
| 59 std::string& expected = expected_data_.front(); | |
| 60 if (expected.size() > buffer->GetSize()) { | |
| 61 EXPECT_EQ(expected.substr(0, buffer->GetSize()), data); | |
| 62 expected = expected.substr(buffer->GetSize()); | |
| 63 buffer->Done(buffer->GetSize()); | |
| 64 return; | |
| 65 } | |
| 66 if (expected.size() < buffer->GetSize()) | |
| 67 data = data.substr(0, expected.size()); | |
| 68 EXPECT_EQ(expected, data); | |
| 69 expected_data_.pop(); | |
| 70 int32_t error = 0; | |
| 71 if (!error_to_report_.empty()) { | |
| 72 error = error_to_report_.front(); | |
| 73 error_to_report_.pop(); | |
| 74 } | |
| 75 if (error) | |
| 76 buffer->DoneWithError(static_cast<uint32_t>(data.size()), error); | |
| 77 else | |
| 78 buffer->Done(static_cast<uint32_t>(data.size())); | |
| 79 } | |
| 80 | |
| 81 void OnCancel(int32_t error) { | |
| 82 ASSERT_TRUE(buffer_); | |
| 83 buffer_->DoneWithError(0, error); | |
| 84 buffer_.reset(); | |
| 85 } | |
| 86 | |
| 87 scoped_refptr<device::DataSinkReceiver> receiver_; | |
| 88 std::unique_ptr<device::ReadOnlyBuffer> buffer_; | |
| 89 | |
| 90 DISALLOW_COPY_AND_ASSIGN(DataSenderTest); | |
| 91 }; | |
| 92 | |
| 93 TEST_F(DataSenderTest, Send) { | |
| 94 expected_data_.push("aa"); | |
| 95 RunTest("data_sender_unittest.js", "testSend"); | |
| 96 } | |
| 97 | |
| 98 // https://crbug.com/599898 | |
| 99 #if defined(LEAK_SANITIZER) | |
| 100 #define MAYBE_LargeSend DISABLED_LargeSend | |
| 101 #else | |
| 102 #define MAYBE_LargeSend LargeSend | |
| 103 #endif | |
| 104 TEST_F(DataSenderTest, MAYBE_LargeSend) { | |
| 105 std::string pattern = "123"; | |
| 106 std::string expected_data; | |
| 107 for (int i = 0; i < 11; i++) | |
| 108 expected_data += pattern; | |
| 109 expected_data_.push(expected_data); | |
| 110 RunTest("data_sender_unittest.js", "testLargeSend"); | |
| 111 } | |
| 112 | |
| 113 TEST_F(DataSenderTest, SendError) { | |
| 114 expected_data_.push(""); | |
| 115 expected_data_.push("a"); | |
| 116 error_to_report_.push(1); | |
| 117 RunTest("data_sender_unittest.js", "testSendError"); | |
| 118 } | |
| 119 | |
| 120 TEST_F(DataSenderTest, SendErrorPartialSuccess) { | |
| 121 expected_data_.push(std::string(5, 'b')); | |
| 122 expected_data_.push("a"); | |
| 123 error_to_report_.push(1); | |
| 124 RunTest("data_sender_unittest.js", "testSendErrorPartialSuccess"); | |
| 125 } | |
| 126 | |
| 127 TEST_F(DataSenderTest, SendErrorBetweenPackets) { | |
| 128 expected_data_.push(std::string(2, 'b')); | |
| 129 expected_data_.push("a"); | |
| 130 error_to_report_.push(1); | |
| 131 RunTest("data_sender_unittest.js", "testSendErrorBetweenPackets"); | |
| 132 } | |
| 133 | |
| 134 TEST_F(DataSenderTest, SendErrorInSecondPacket) { | |
| 135 expected_data_.push(std::string(3, 'b')); | |
| 136 expected_data_.push("a"); | |
| 137 error_to_report_.push(1); | |
| 138 RunTest("data_sender_unittest.js", "testSendErrorInSecondPacket"); | |
| 139 } | |
| 140 | |
| 141 TEST_F(DataSenderTest, SendErrorInLargeSend) { | |
| 142 expected_data_.push("123456789012"); | |
| 143 expected_data_.push("a"); | |
| 144 error_to_report_.push(1); | |
| 145 RunTest("data_sender_unittest.js", "testSendErrorInLargeSend"); | |
| 146 } | |
| 147 | |
| 148 TEST_F(DataSenderTest, SendErrorBeforeLargeSend) { | |
| 149 expected_data_.push(std::string(2, 'b')); | |
| 150 expected_data_.push("a"); | |
| 151 error_to_report_.push(1); | |
| 152 RunTest("data_sender_unittest.js", "testSendErrorBeforeLargeSend"); | |
| 153 } | |
| 154 | |
| 155 // https://crbug.com/599898 | |
| 156 #if defined(LEAK_SANITIZER) | |
| 157 #define MAYBE_CancelWithoutSend DISABLED_CancelWithoutSend | |
| 158 #else | |
| 159 #define MAYBE_CancelWithoutSend CancelWithoutSend | |
| 160 #endif | |
| 161 TEST_F(DataSenderTest, MAYBE_CancelWithoutSend) { | |
| 162 RunTest("data_sender_unittest.js", "testCancelWithoutSend"); | |
| 163 } | |
| 164 | |
| 165 TEST_F(DataSenderTest, Cancel) { | |
| 166 RunTest("data_sender_unittest.js", "testCancel"); | |
| 167 } | |
| 168 | |
| 169 // https://crbug.com/599898 | |
| 170 #if defined(LEAK_SANITIZER) | |
| 171 #define MAYBE_Close DISABLED_Close | |
| 172 #else | |
| 173 #define MAYBE_Close Close | |
| 174 #endif | |
| 175 TEST_F(DataSenderTest, MAYBE_Close) { | |
| 176 RunTest("data_sender_unittest.js", "testClose"); | |
| 177 } | |
| 178 | |
| 179 TEST_F(DataSenderTest, SendAfterSerialization) { | |
| 180 expected_data_.push("aa"); | |
| 181 RunTest("data_sender_unittest.js", "testSendAfterSerialization"); | |
| 182 } | |
| 183 | |
| 184 TEST_F(DataSenderTest, SendErrorAfterSerialization) { | |
| 185 expected_data_.push(""); | |
| 186 expected_data_.push("a"); | |
| 187 error_to_report_.push(1); | |
| 188 RunTest("data_sender_unittest.js", "testSendErrorAfterSerialization"); | |
| 189 } | |
| 190 | |
| 191 TEST_F(DataSenderTest, CancelAfterSerialization) { | |
| 192 RunTest("data_sender_unittest.js", "testCancelAfterSerialization"); | |
| 193 } | |
| 194 | |
| 195 TEST_F(DataSenderTest, SerializeCancelsSendsInProgress) { | |
| 196 RunTest("data_sender_unittest.js", "testSerializeCancelsSendsInProgress"); | |
| 197 } | |
| 198 | |
| 199 TEST_F(DataSenderTest, SerializeWaitsForCancel) { | |
| 200 RunTest("data_sender_unittest.js", "testSerializeWaitsForCancel"); | |
| 201 } | |
| 202 | |
| 203 // https://crbug.com/599898 | |
| 204 #if defined(LEAK_SANITIZER) | |
| 205 #define MAYBE_SerializeAfterClose DISABLED_SerializeAfterClose | |
| 206 #else | |
| 207 #define MAYBE_SerializeAfterClose SerializeAfterClose | |
| 208 #endif | |
| 209 TEST_F(DataSenderTest, MAYBE_SerializeAfterClose) { | |
| 210 RunTest("data_sender_unittest.js", "testSerializeAfterClose"); | |
| 211 } | |
| 212 | |
| 213 } // namespace extensions | |
| OLD | NEW |