| 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_source_sender.h" | |
| 12 #include "device/serial/data_stream.mojom.h" | |
| 13 #include "extensions/renderer/api_test_base.h" | |
| 14 #include "gin/dictionary.h" | |
| 15 #include "gin/wrappable.h" | |
| 16 #include "grit/extensions_renderer_resources.h" | |
| 17 #include "mojo/edk/js/handle.h" | |
| 18 | |
| 19 namespace extensions { | |
| 20 | |
| 21 class DataReceiverFactory : public gin::Wrappable<DataReceiverFactory> { | |
| 22 public: | |
| 23 using Callback = base::Callback<void( | |
| 24 mojo::InterfaceRequest<device::serial::DataSource>, | |
| 25 mojo::InterfacePtr<device::serial::DataSourceClient>)>; | |
| 26 static gin::Handle<DataReceiverFactory> Create(v8::Isolate* isolate, | |
| 27 const Callback& callback) { | |
| 28 return gin::CreateHandle(isolate, | |
| 29 new DataReceiverFactory(callback, isolate)); | |
| 30 } | |
| 31 | |
| 32 gin::ObjectTemplateBuilder GetObjectTemplateBuilder( | |
| 33 v8::Isolate* isolate) override { | |
| 34 return Wrappable<DataReceiverFactory>::GetObjectTemplateBuilder(isolate) | |
| 35 .SetMethod("create", &DataReceiverFactory::CreateReceiver); | |
| 36 } | |
| 37 | |
| 38 gin::Dictionary CreateReceiver() { | |
| 39 mojo::InterfacePtr<device::serial::DataSource> sink; | |
| 40 mojo::InterfacePtr<device::serial::DataSourceClient> client; | |
| 41 mojo::InterfaceRequest<device::serial::DataSourceClient> client_request = | |
| 42 mojo::GetProxy(&client); | |
| 43 callback_.Run(mojo::GetProxy(&sink), std::move(client)); | |
| 44 | |
| 45 gin::Dictionary result = gin::Dictionary::CreateEmpty(isolate_); | |
| 46 result.Set("source", sink.PassInterface().PassHandle().release()); | |
| 47 result.Set("client", client_request.PassMessagePipe().release()); | |
| 48 return result; | |
| 49 } | |
| 50 | |
| 51 static gin::WrapperInfo kWrapperInfo; | |
| 52 | |
| 53 private: | |
| 54 DataReceiverFactory(const Callback& callback, v8::Isolate* isolate) | |
| 55 : callback_(callback), isolate_(isolate) {} | |
| 56 | |
| 57 base::Callback<void(mojo::InterfaceRequest<device::serial::DataSource>, | |
| 58 mojo::InterfacePtr<device::serial::DataSourceClient>)> | |
| 59 callback_; | |
| 60 v8::Isolate* isolate_; | |
| 61 }; | |
| 62 | |
| 63 gin::WrapperInfo DataReceiverFactory::kWrapperInfo = {gin::kEmbedderNativeGin}; | |
| 64 | |
| 65 // Runs tests defined in extensions/test/data/data_receiver_unittest.js | |
| 66 class DataReceiverTest : public ApiTestBase { | |
| 67 public: | |
| 68 DataReceiverTest() {} | |
| 69 | |
| 70 void SetUp() override { | |
| 71 ApiTestBase::SetUp(); | |
| 72 gin::ModuleRegistry::From(env()->context()->v8_context()) | |
| 73 ->AddBuiltinModule(env()->isolate(), | |
| 74 "device/serial/data_receiver_test_factory", | |
| 75 DataReceiverFactory::Create( | |
| 76 env()->isolate(), | |
| 77 base::Bind(&DataReceiverTest::CreateDataSource, | |
| 78 base::Unretained(this))).ToV8()); | |
| 79 } | |
| 80 | |
| 81 void TearDown() override { | |
| 82 if (sender_.get()) { | |
| 83 sender_->ShutDown(); | |
| 84 sender_ = NULL; | |
| 85 } | |
| 86 ApiTestBase::TearDown(); | |
| 87 } | |
| 88 | |
| 89 std::queue<int32_t> error_to_send_; | |
| 90 std::queue<std::string> data_to_send_; | |
| 91 | |
| 92 private: | |
| 93 void CreateDataSource( | |
| 94 mojo::InterfaceRequest<device::serial::DataSource> request, | |
| 95 mojo::InterfacePtr<device::serial::DataSourceClient> client) { | |
| 96 sender_ = new device::DataSourceSender( | |
| 97 std::move(request), std::move(client), | |
| 98 base::Bind(&DataReceiverTest::ReadyToSend, base::Unretained(this)), | |
| 99 base::Bind(base::DoNothing)); | |
| 100 } | |
| 101 | |
| 102 void ReadyToSend(std::unique_ptr<device::WritableBuffer> buffer) { | |
| 103 if (data_to_send_.empty() && error_to_send_.empty()) | |
| 104 return; | |
| 105 | |
| 106 std::string data; | |
| 107 int32_t error = 0; | |
| 108 if (!data_to_send_.empty()) { | |
| 109 data = data_to_send_.front(); | |
| 110 data_to_send_.pop(); | |
| 111 } | |
| 112 if (!error_to_send_.empty()) { | |
| 113 error = error_to_send_.front(); | |
| 114 error_to_send_.pop(); | |
| 115 } | |
| 116 DCHECK(buffer->GetSize() >= static_cast<uint32_t>(data.size())); | |
| 117 memcpy(buffer->GetData(), data.c_str(), data.size()); | |
| 118 if (error) | |
| 119 buffer->DoneWithError(static_cast<uint32_t>(data.size()), error); | |
| 120 else | |
| 121 buffer->Done(static_cast<uint32_t>(data.size())); | |
| 122 } | |
| 123 | |
| 124 scoped_refptr<device::DataSourceSender> sender_; | |
| 125 | |
| 126 DISALLOW_COPY_AND_ASSIGN(DataReceiverTest); | |
| 127 }; | |
| 128 | |
| 129 // https://crbug.com/599898 | |
| 130 #if defined(LEAK_SANITIZER) | |
| 131 #define MAYBE_Receive DISABLED_Receive | |
| 132 #else | |
| 133 #define MAYBE_Receive Receive | |
| 134 #endif | |
| 135 TEST_F(DataReceiverTest, MAYBE_Receive) { | |
| 136 data_to_send_.push("a"); | |
| 137 RunTest("data_receiver_unittest.js", "testReceive"); | |
| 138 } | |
| 139 | |
| 140 // https://crbug.com/599898 | |
| 141 #if defined(LEAK_SANITIZER) | |
| 142 #define MAYBE_ReceiveError DISABLED_ReceiveError | |
| 143 #else | |
| 144 #define MAYBE_ReceiveError ReceiveError | |
| 145 #endif | |
| 146 TEST_F(DataReceiverTest, MAYBE_ReceiveError) { | |
| 147 error_to_send_.push(1); | |
| 148 RunTest("data_receiver_unittest.js", "testReceiveError"); | |
| 149 } | |
| 150 | |
| 151 TEST_F(DataReceiverTest, ReceiveDataAndError) { | |
| 152 data_to_send_.push("a"); | |
| 153 data_to_send_.push("b"); | |
| 154 error_to_send_.push(1); | |
| 155 RunTest("data_receiver_unittest.js", "testReceiveDataAndError"); | |
| 156 } | |
| 157 | |
| 158 TEST_F(DataReceiverTest, ReceiveErrorThenData) { | |
| 159 data_to_send_.push(""); | |
| 160 data_to_send_.push("a"); | |
| 161 error_to_send_.push(1); | |
| 162 RunTest("data_receiver_unittest.js", "testReceiveErrorThenData"); | |
| 163 } | |
| 164 | |
| 165 TEST_F(DataReceiverTest, ReceiveBeforeAndAfterSerialization) { | |
| 166 data_to_send_.push("a"); | |
| 167 data_to_send_.push("b"); | |
| 168 RunTest("data_receiver_unittest.js", | |
| 169 "testReceiveBeforeAndAfterSerialization"); | |
| 170 } | |
| 171 | |
| 172 TEST_F(DataReceiverTest, ReceiveErrorSerialization) { | |
| 173 error_to_send_.push(1); | |
| 174 error_to_send_.push(3); | |
| 175 RunTest("data_receiver_unittest.js", "testReceiveErrorSerialization"); | |
| 176 } | |
| 177 | |
| 178 TEST_F(DataReceiverTest, ReceiveDataAndErrorSerialization) { | |
| 179 data_to_send_.push("a"); | |
| 180 data_to_send_.push("b"); | |
| 181 error_to_send_.push(1); | |
| 182 error_to_send_.push(3); | |
| 183 RunTest("data_receiver_unittest.js", "testReceiveDataAndErrorSerialization"); | |
| 184 } | |
| 185 | |
| 186 TEST_F(DataReceiverTest, SerializeDuringReceive) { | |
| 187 data_to_send_.push("a"); | |
| 188 RunTest("data_receiver_unittest.js", "testSerializeDuringReceive"); | |
| 189 } | |
| 190 | |
| 191 // https://crbug.com/599898 | |
| 192 #if defined(LEAK_SANITIZER) | |
| 193 #define MAYBE_SerializeAfterClose DISABLED_SerializeAfterClose | |
| 194 #else | |
| 195 #define MAYBE_SerializeAfterClose SerializeAfterClose | |
| 196 #endif | |
| 197 TEST_F(DataReceiverTest, MAYBE_SerializeAfterClose) { | |
| 198 data_to_send_.push("a"); | |
| 199 RunTest("data_receiver_unittest.js", "testSerializeAfterClose"); | |
| 200 } | |
| 201 | |
| 202 } // namespace extensions | |
| OLD | NEW |