1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/modules/webtransport/test_utils.h"
#include "base/check.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
#include "third_party/blink/renderer/bindings/core/v8/iterable.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise_tester.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream_read_result.h"
#include "third_party/blink/renderer/bindings/modules/v8/v8_web_transport_options.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/streams/readable_stream.h"
#include "third_party/blink/renderer/core/streams/readable_stream_generic_reader.h"
#include "third_party/blink/renderer/modules/webtransport/web_transport.h"
#include "third_party/blink/renderer/platform/heap/visitor.h"
#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
#include "third_party/blink/renderer/platform/wtf/functional.h"
namespace blink {
bool CreateDataPipeForWebTransportTests(
mojo::ScopedDataPipeProducerHandle* producer,
mojo::ScopedDataPipeConsumerHandle* consumer) {
MojoCreateDataPipeOptions options;
options.struct_size = sizeof(MojoCreateDataPipeOptions);
options.flags = MOJO_CREATE_DATA_PIPE_FLAG_NONE;
options.element_num_bytes = 1;
options.capacity_num_bytes = 0; // 0 means the system default size.
MojoResult result = mojo::CreateDataPipe(&options, *producer, *consumer);
if (result != MOJO_RESULT_OK) {
ADD_FAILURE() << "CreateDataPipe() returned " << result;
return false;
}
return true;
}
v8::Local<v8::Value> ReadValueFromStream(const V8TestingScope& scope,
ReadableStream* stream) {
auto* script_state = scope.GetScriptState();
auto* reader =
stream->GetDefaultReaderForTesting(script_state, ASSERT_NO_EXCEPTION);
auto read_promise = reader->read(script_state, ASSERT_NO_EXCEPTION);
ScriptPromiseTester read_tester(script_state, read_promise);
read_tester.WaitUntilSettled();
EXPECT_TRUE(read_tester.IsFulfilled());
v8::Local<v8::Value> result = read_tester.Value().V8Value();
DCHECK(result->IsObject());
v8::Local<v8::Value> v8value;
bool done = false;
EXPECT_TRUE(V8UnpackIterationResult(script_state, result.As<v8::Object>(),
&v8value, &done));
EXPECT_FALSE(done);
return v8value;
}
TestWebTransportCreator::TestWebTransportCreator() = default;
void TestWebTransportCreator::Init(ScriptState* script_state,
CreateStubCallback create_stub) {
browser_interface_broker_ =
&ExecutionContext::From(script_state)->GetBrowserInterfaceBroker();
create_stub_ = std::move(create_stub);
browser_interface_broker_->SetBinderForTesting(
mojom::blink::WebTransportConnector::Name_,
WTF::BindRepeating(&TestWebTransportCreator::BindConnector,
weak_ptr_factory_.GetWeakPtr()));
web_transport_ = WebTransport::Create(
script_state, "https://example.com/",
MakeGarbageCollected<WebTransportOptions>(), ASSERT_NO_EXCEPTION);
test::RunPendingTasks();
}
TestWebTransportCreator::~TestWebTransportCreator() {
browser_interface_broker_->SetBinderForTesting(
mojom::blink::WebTransportConnector::Name_, {});
}
// Implementation of mojom::blink::WebTransportConnector.
void TestWebTransportCreator::Connect(
const KURL&,
Vector<network::mojom::blink::WebTransportCertificateFingerprintPtr>,
mojo::PendingRemote<network::mojom::blink::WebTransportHandshakeClient>
pending_handshake_client) {
mojo::Remote<network::mojom::blink::WebTransportHandshakeClient>
handshake_client(std::move(pending_handshake_client));
mojo::PendingRemote<network::mojom::blink::WebTransport>
web_transport_to_pass;
create_stub_.Run(web_transport_to_pass);
mojo::PendingRemote<network::mojom::blink::WebTransportClient> client_remote;
handshake_client->OnConnectionEstablished(
std::move(web_transport_to_pass),
client_remote.InitWithNewPipeAndPassReceiver(),
network::mojom::blink::HttpResponseHeaders::New(),
network::mojom::blink::WebTransportStats::New());
client_remote_.Bind(std::move(client_remote));
}
void TestWebTransportCreator::BindConnector(
mojo::ScopedMessagePipeHandle handle) {
connector_receiver_.Bind(
mojo::PendingReceiver<mojom::blink::WebTransportConnector>(
std::move(handle)));
}
void TestWebTransportCreator::Reset() {
client_remote_.reset();
connector_receiver_.reset();
}
} // namespace blink
|