123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672 |
- // Copyright 2020 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "remoting/base/protobuf_http_client.h"
- #include <memory>
- #include "base/callback_helpers.h"
- #include "base/run_loop.h"
- #include "base/test/bind.h"
- #include "base/test/gmock_callback_support.h"
- #include "base/test/mock_callback.h"
- #include "base/test/task_environment.h"
- #include "net/http/http_status_code.h"
- #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
- #include "remoting/base/protobuf_http_client_messages.pb.h"
- #include "remoting/base/protobuf_http_client_test_messages.pb.h"
- #include "remoting/base/protobuf_http_request.h"
- #include "remoting/base/protobuf_http_request_config.h"
- #include "remoting/base/protobuf_http_status.h"
- #include "remoting/base/protobuf_http_stream_request.h"
- #include "services/network/public/cpp/shared_url_loader_factory.h"
- #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
- #include "services/network/test/test_url_loader_factory.h"
- #include "testing/gmock/include/gmock/gmock.h"
- #include "testing/gtest/include/gtest/gtest.h"
- namespace remoting {
- namespace {
- using protobufhttpclient::Status;
- using protobufhttpclient::StreamBody;
- using protobufhttpclienttest::EchoRequest;
- using protobufhttpclienttest::EchoResponse;
- using ::base::test::RunOnceCallback;
- using ::testing::_;
- using ::testing::InSequence;
- using EchoResponseCallback =
- ProtobufHttpRequest::ResponseCallback<EchoResponse>;
- using MockEchoResponseCallback = base::MockCallback<EchoResponseCallback>;
- using MockEchoMessageCallback = base::MockCallback<
- ProtobufHttpStreamRequest::MessageCallback<EchoResponse>>;
- using MockStreamClosedCallback =
- base::MockCallback<ProtobufHttpStreamRequest::StreamClosedCallback>;
- constexpr char kTestServerEndpoint[] = "test.com";
- constexpr char kTestRpcPath[] = "/v1/echo:echo";
- constexpr char kTestFullUrl[] = "https://test.com/v1/echo:echo";
- constexpr char kRequestText[] = "This is a request";
- constexpr char kResponseText[] = "This is a response";
- constexpr char kAuthorizationHeaderKey[] = "Authorization";
- constexpr char kFakeAccessToken[] = "fake_access_token";
- constexpr char kFakeAccessTokenHeaderValue[] = "Bearer fake_access_token";
- MATCHER_P(HasErrorCode, error_code, "") {
- return arg.error_code() == error_code;
- }
- MATCHER_P(EqualsToStatus, expected_status, "") {
- return arg.error_code() == expected_status.error_code() &&
- arg.error_message() == expected_status.error_message();
- }
- MATCHER(IsDefaultResponseText, "") {
- return arg->text() == kResponseText;
- }
- MATCHER_P(IsResponseText, response_text, "") {
- return arg->text() == response_text;
- }
- MATCHER(IsNullResponse, "") {
- return arg.get() == nullptr;
- }
- class MockOAuthTokenGetter : public OAuthTokenGetter {
- public:
- MOCK_METHOD1(CallWithToken, void(TokenCallback));
- MOCK_METHOD0(InvalidateCache, void());
- };
- EchoResponseCallback DoNothingResponse() {
- return base::DoNothing();
- }
- std::unique_ptr<ProtobufHttpRequestConfig> CreateDefaultRequestConfig() {
- auto request_message = std::make_unique<EchoRequest>();
- request_message->set_text(kRequestText);
- auto request_config =
- std::make_unique<ProtobufHttpRequestConfig>(TRAFFIC_ANNOTATION_FOR_TESTS);
- request_config->request_message = std::move(request_message);
- request_config->path = kTestRpcPath;
- return request_config;
- }
- std::unique_ptr<ProtobufHttpRequest> CreateDefaultTestRequest() {
- auto request =
- std::make_unique<ProtobufHttpRequest>(CreateDefaultRequestConfig());
- request->SetResponseCallback(DoNothingResponse());
- return request;
- }
- std::unique_ptr<ProtobufHttpStreamRequest> CreateDefaultTestStreamRequest() {
- auto request =
- std::make_unique<ProtobufHttpStreamRequest>(CreateDefaultRequestConfig());
- request->SetStreamReadyCallback(base::DoNothing());
- request->SetStreamClosedCallback(base::DoNothing());
- request->SetMessageCallback(
- base::BindRepeating([](std::unique_ptr<EchoResponse>) {}));
- return request;
- }
- std::string CreateSerializedEchoResponse(
- const std::string& text = kResponseText) {
- EchoResponse response;
- response.set_text(text);
- return response.SerializeAsString();
- }
- std::string CreateSerializedStreamBodyWithText(
- const std::string& text = kResponseText) {
- StreamBody stream_body;
- stream_body.add_messages(CreateSerializedEchoResponse(text));
- return stream_body.SerializeAsString();
- }
- std::string CreateSerializedStreamBodyWithStatusCode(
- ProtobufHttpStatus::Code status_code) {
- StreamBody stream_body;
- stream_body.mutable_status()->set_code(static_cast<int32_t>(status_code));
- return stream_body.SerializeAsString();
- }
- } // namespace
- class ProtobufHttpClientTest : public testing::Test {
- protected:
- void ExpectCallWithTokenSuccess();
- void ExpectCallWithTokenAuthError();
- void ExpectCallWithTokenNetworkError();
- base::test::SingleThreadTaskEnvironment task_environment_{
- base::test::TaskEnvironment::TimeSource::MOCK_TIME};
- MockOAuthTokenGetter mock_token_getter_;
- network::TestURLLoaderFactory test_url_loader_factory_;
- scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_ =
- base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
- &test_url_loader_factory_);
- ProtobufHttpClient client_{kTestServerEndpoint, &mock_token_getter_,
- test_shared_loader_factory_};
- };
- void ProtobufHttpClientTest::ExpectCallWithTokenSuccess() {
- EXPECT_CALL(mock_token_getter_, CallWithToken(_))
- .WillOnce(RunOnceCallback<0>(OAuthTokenGetter::Status::SUCCESS, "",
- kFakeAccessToken));
- }
- void ProtobufHttpClientTest::ExpectCallWithTokenAuthError() {
- EXPECT_CALL(mock_token_getter_, CallWithToken(_))
- .WillOnce(
- RunOnceCallback<0>(OAuthTokenGetter::Status::AUTH_ERROR, "", ""));
- }
- void ProtobufHttpClientTest::ExpectCallWithTokenNetworkError() {
- EXPECT_CALL(mock_token_getter_, CallWithToken(_))
- .WillOnce(
- RunOnceCallback<0>(OAuthTokenGetter::Status::NETWORK_ERROR, "", ""));
- }
- // Unary request tests.
- TEST_F(ProtobufHttpClientTest, SendRequestAndDecodeResponse) {
- base::RunLoop run_loop;
- ExpectCallWithTokenSuccess();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(response_callback, Run(HasErrorCode(ProtobufHttpStatus::Code::OK),
- IsDefaultResponseText()))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestRequest();
- request->SetResponseCallback(response_callback.Get());
- client_.ExecuteRequest(std::move(request));
- // Verify request.
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_EQ(1, test_url_loader_factory_.NumPending());
- auto* pending_request = test_url_loader_factory_.GetPendingRequest(0);
- std::string auth_header;
- ASSERT_TRUE(pending_request->request.headers.GetHeader(
- kAuthorizationHeaderKey, &auth_header));
- ASSERT_EQ(kFakeAccessTokenHeaderValue, auth_header);
- const auto& data_element =
- pending_request->request.request_body->elements()->front();
- ASSERT_EQ(data_element.type(), network::DataElement::Tag::kBytes);
- std::string request_body_data(
- data_element.As<network::DataElementBytes>().AsStringPiece());
- EchoRequest request_message;
- ASSERT_TRUE(request_message.ParseFromString(request_body_data));
- ASSERT_EQ(kRequestText, request_message.text());
- // Respond.
- test_url_loader_factory_.AddResponse(kTestFullUrl,
- CreateSerializedEchoResponse());
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest,
- SendUnauthenticatedRequest_TokenGetterNotCalled) {
- EXPECT_CALL(mock_token_getter_, CallWithToken(_)).Times(0);
- auto request_config = CreateDefaultRequestConfig();
- request_config->authenticated = false;
- auto request =
- std::make_unique<ProtobufHttpRequest>(std::move(request_config));
- request->SetResponseCallback(DoNothingResponse());
- client_.ExecuteRequest(std::move(request));
- // Verify that the request is sent with no auth header.
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_EQ(1, test_url_loader_factory_.NumPending());
- auto* pending_request = test_url_loader_factory_.GetPendingRequest(0);
- ASSERT_FALSE(
- pending_request->request.headers.HasHeader(kAuthorizationHeaderKey));
- }
- TEST_F(ProtobufHttpClientTest,
- FailedToFetchAuthToken_RejectsWithUnauthorizedError) {
- base::RunLoop run_loop;
- ExpectCallWithTokenAuthError();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(response_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::UNAUTHENTICATED),
- IsNullResponse()))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestRequest();
- request->SetResponseCallback(response_callback.Get());
- client_.ExecuteRequest(std::move(request));
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest,
- FailedToFetchAuthToken_RejectsWithUnavailableError) {
- base::RunLoop run_loop;
- ExpectCallWithTokenNetworkError();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(response_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::UNAVAILABLE),
- IsNullResponse()))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestRequest();
- request->SetResponseCallback(response_callback.Get());
- client_.ExecuteRequest(std::move(request));
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, FailedToParseResponse_GetsInvalidResponseError) {
- base::RunLoop run_loop;
- ExpectCallWithTokenSuccess();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(
- response_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::INTERNAL), IsNullResponse()))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestRequest();
- request->SetResponseCallback(response_callback.Get());
- client_.ExecuteRequest(std::move(request));
- // Respond.
- test_url_loader_factory_.AddResponse(kTestFullUrl, "Invalid content");
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, ServerRespondsWithErrorStatusMessage) {
- base::RunLoop run_loop;
- ExpectCallWithTokenSuccess();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(response_callback,
- Run(EqualsToStatus(ProtobufHttpStatus(
- ProtobufHttpStatus::Code::FAILED_PRECONDITION,
- "Unauthenticated error message")),
- IsNullResponse()))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestRequest();
- request->SetResponseCallback(response_callback.Get());
- client_.ExecuteRequest(std::move(request));
- Status status_message;
- status_message.set_code(
- static_cast<int>(ProtobufHttpStatus::Code::FAILED_PRECONDITION));
- status_message.set_message("Unauthenticated error message");
- test_url_loader_factory_.AddResponse(
- kTestFullUrl, status_message.SerializeAsString(),
- net::HttpStatusCode::HTTP_INTERNAL_SERVER_ERROR);
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, ServerRespondsWithHttpErrorCode) {
- base::RunLoop run_loop;
- ExpectCallWithTokenSuccess();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(response_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::UNAUTHENTICATED),
- IsNullResponse()))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestRequest();
- request->SetResponseCallback(response_callback.Get());
- client_.ExecuteRequest(std::move(request));
- test_url_loader_factory_.AddResponse(kTestFullUrl, "",
- net::HttpStatusCode::HTTP_UNAUTHORIZED);
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest,
- CancelPendingRequestsBeforeTokenCallback_CallbackNotCalled) {
- base::RunLoop run_loop;
- OAuthTokenGetter::TokenCallback token_callback;
- EXPECT_CALL(mock_token_getter_, CallWithToken(_))
- .WillOnce([&](OAuthTokenGetter::TokenCallback callback) {
- token_callback = std::move(callback);
- });
- MockEchoResponseCallback not_called_response_callback;
- auto request = CreateDefaultTestRequest();
- request->SetResponseCallback(not_called_response_callback.Get());
- client_.ExecuteRequest(std::move(request));
- client_.CancelPendingRequests();
- ASSERT_TRUE(token_callback);
- std::move(token_callback)
- .Run(OAuthTokenGetter::Status::SUCCESS, "", kFakeAccessToken);
- // Verify no request.
- ASSERT_FALSE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest,
- CancelPendingRequestsAfterTokenCallback_CallbackNotCalled) {
- base::RunLoop run_loop;
- ExpectCallWithTokenSuccess();
- client_.ExecuteRequest(CreateDefaultTestRequest());
- // Respond.
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_EQ(1, test_url_loader_factory_.NumPending());
- client_.CancelPendingRequests();
- test_url_loader_factory_.AddResponse(kTestFullUrl,
- CreateSerializedEchoResponse());
- run_loop.RunUntilIdle();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, RequestTimeout_ReturnsDeadlineExceeded) {
- base::RunLoop run_loop;
- ExpectCallWithTokenSuccess();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(response_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::DEADLINE_EXCEEDED),
- IsNullResponse()))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestRequest();
- request->SetTimeoutDuration(base::Seconds(15));
- request->SetResponseCallback(response_callback.Get());
- client_.ExecuteRequest(std::move(request));
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_EQ(1, test_url_loader_factory_.NumPending());
- task_environment_.FastForwardBy(base::Seconds(16));
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, DeletesRequestHolderWhenRequestIsCanceled) {
- ExpectCallWithTokenSuccess();
- MockEchoResponseCallback never_called_response_callback;
- auto request = CreateDefaultTestRequest();
- request->SetResponseCallback(never_called_response_callback.Get());
- auto scoped_holder = request->CreateScopedRequest();
- client_.ExecuteRequest(std::move(request));
- // Verify request.
- ASSERT_TRUE(client_.HasPendingRequests());
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- scoped_holder.reset();
- ASSERT_FALSE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_FALSE(client_.HasPendingRequests());
- // Try to respond.
- test_url_loader_factory_.AddResponse(kTestFullUrl,
- CreateSerializedEchoResponse());
- // |never_called_response_callback| should not be called.
- base::RunLoop().RunUntilIdle();
- }
- TEST_F(ProtobufHttpClientTest, DeletesRequestHolderAfterResponseIsReceived) {
- base::RunLoop run_loop;
- ExpectCallWithTokenSuccess();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(response_callback, Run(HasErrorCode(ProtobufHttpStatus::Code::OK),
- IsDefaultResponseText()))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestRequest();
- request->SetResponseCallback(response_callback.Get());
- auto scoped_holder = request->CreateScopedRequest();
- client_.ExecuteRequest(std::move(request));
- // Verify request.
- ASSERT_TRUE(client_.HasPendingRequests());
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- // Try to respond.
- test_url_loader_factory_.AddResponse(kTestFullUrl,
- CreateSerializedEchoResponse());
- run_loop.Run();
- ASSERT_FALSE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_FALSE(client_.HasPendingRequests());
- scoped_holder.reset();
- }
- // Stream request tests.
- TEST_F(ProtobufHttpClientTest,
- StreamRequestFailedToFetchAuthToken_RejectsWithUnauthorizedError) {
- base::MockOnceClosure stream_ready_callback;
- MockEchoMessageCallback message_callback;
- MockStreamClosedCallback stream_closed_callback;
- base::RunLoop run_loop;
- ExpectCallWithTokenAuthError();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(stream_closed_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::UNAUTHENTICATED)))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestStreamRequest();
- request->SetStreamReadyCallback(stream_ready_callback.Get());
- request->SetMessageCallback(message_callback.Get());
- request->SetStreamClosedCallback(stream_closed_callback.Get());
- client_.ExecuteRequest(std::move(request));
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest,
- StreamRequestFailedToFetchAuthToken_RejectsWithUnavailableError) {
- base::MockOnceClosure stream_ready_callback;
- MockEchoMessageCallback message_callback;
- MockStreamClosedCallback stream_closed_callback;
- base::RunLoop run_loop;
- ExpectCallWithTokenNetworkError();
- MockEchoResponseCallback response_callback;
- EXPECT_CALL(stream_closed_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::UNAVAILABLE)))
- .WillOnce([&]() { run_loop.Quit(); });
- auto request = CreateDefaultTestStreamRequest();
- request->SetStreamReadyCallback(stream_ready_callback.Get());
- request->SetMessageCallback(message_callback.Get());
- request->SetStreamClosedCallback(stream_closed_callback.Get());
- client_.ExecuteRequest(std::move(request));
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, StartStreamRequestAndDecodeMessages) {
- base::MockOnceClosure stream_ready_callback;
- MockEchoMessageCallback message_callback;
- MockStreamClosedCallback stream_closed_callback;
- {
- InSequence s;
- ExpectCallWithTokenSuccess();
- EXPECT_CALL(stream_ready_callback, Run());
- EXPECT_CALL(message_callback, Run(IsResponseText("response text 1")));
- EXPECT_CALL(message_callback, Run(IsResponseText("response text 2")));
- EXPECT_CALL(stream_closed_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::CANCELLED)));
- }
- auto request = CreateDefaultTestStreamRequest();
- request->SetStreamReadyCallback(stream_ready_callback.Get());
- request->SetMessageCallback(message_callback.Get());
- request->SetStreamClosedCallback(stream_closed_callback.Get());
- network::SimpleURLLoaderStreamConsumer* stream_consumer = request.get();
- client_.ExecuteRequest(std::move(request));
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_EQ(1, test_url_loader_factory_.NumPending());
- // TestURLLoaderFactory can't simulate streaming, so we invoke the request
- // directly.
- stream_consumer->OnDataReceived(
- CreateSerializedStreamBodyWithText("response text 1"), base::DoNothing());
- stream_consumer->OnDataReceived(
- CreateSerializedStreamBodyWithText("response text 2"), base::DoNothing());
- stream_consumer->OnDataReceived(CreateSerializedStreamBodyWithStatusCode(
- ProtobufHttpStatus::Code::CANCELLED),
- base::DoNothing());
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, InvalidStreamData_Ignored) {
- base::RunLoop run_loop;
- base::MockOnceClosure stream_ready_callback;
- MockEchoMessageCallback not_called_message_callback;
- MockStreamClosedCallback stream_closed_callback;
- {
- InSequence s;
- ExpectCallWithTokenSuccess();
- EXPECT_CALL(stream_ready_callback, Run());
- EXPECT_CALL(stream_closed_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::OK)))
- .WillOnce([&]() { run_loop.Quit(); });
- }
- auto request = CreateDefaultTestStreamRequest();
- request->SetStreamReadyCallback(stream_ready_callback.Get());
- request->SetMessageCallback(not_called_message_callback.Get());
- request->SetStreamClosedCallback(stream_closed_callback.Get());
- client_.ExecuteRequest(std::move(request));
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_EQ(1, test_url_loader_factory_.NumPending());
- test_url_loader_factory_.AddResponse(kTestFullUrl, "Invalid stream data",
- net::HttpStatusCode::HTTP_OK);
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, SendHttpStatusOnly_StreamClosesWithHttpStatus) {
- base::RunLoop run_loop;
- base::MockOnceClosure stream_ready_callback;
- MockStreamClosedCallback stream_closed_callback;
- {
- InSequence s;
- ExpectCallWithTokenSuccess();
- EXPECT_CALL(stream_closed_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::UNAUTHENTICATED)))
- .WillOnce([&]() { run_loop.Quit(); });
- }
- auto request = CreateDefaultTestStreamRequest();
- request->SetStreamReadyCallback(stream_ready_callback.Get());
- request->SetStreamClosedCallback(stream_closed_callback.Get());
- client_.ExecuteRequest(std::move(request));
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_EQ(1, test_url_loader_factory_.NumPending());
- test_url_loader_factory_.AddResponse(kTestFullUrl, /* response_body= */ "",
- net::HttpStatusCode::HTTP_UNAUTHORIZED);
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, SendStreamStatusAndHttpStatus_StreamStatusWins) {
- base::RunLoop run_loop;
- base::MockOnceClosure stream_ready_callback;
- MockStreamClosedCallback stream_closed_callback;
- {
- InSequence s;
- ExpectCallWithTokenSuccess();
- EXPECT_CALL(stream_ready_callback, Run());
- EXPECT_CALL(stream_closed_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::CANCELLED)))
- .WillOnce([&]() { run_loop.Quit(); });
- }
- auto request = CreateDefaultTestStreamRequest();
- request->SetStreamReadyCallback(stream_ready_callback.Get());
- request->SetStreamClosedCallback(stream_closed_callback.Get());
- client_.ExecuteRequest(std::move(request));
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_EQ(1, test_url_loader_factory_.NumPending());
- test_url_loader_factory_.AddResponse(kTestFullUrl,
- CreateSerializedStreamBodyWithStatusCode(
- ProtobufHttpStatus::Code::CANCELLED),
- net::HttpStatusCode::HTTP_OK);
- run_loop.Run();
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- TEST_F(ProtobufHttpClientTest, StreamReadyTimeout) {
- base::MockOnceClosure not_called_stream_ready_callback;
- MockEchoMessageCallback not_called_message_callback;
- MockStreamClosedCallback stream_closed_callback;
- {
- InSequence s;
- ExpectCallWithTokenSuccess();
- EXPECT_CALL(stream_closed_callback,
- Run(HasErrorCode(ProtobufHttpStatus::Code::DEADLINE_EXCEEDED)));
- }
- auto request = CreateDefaultTestStreamRequest();
- request->SetStreamReadyCallback(not_called_stream_ready_callback.Get());
- request->SetMessageCallback(not_called_message_callback.Get());
- request->SetStreamClosedCallback(stream_closed_callback.Get());
- client_.ExecuteRequest(std::move(request));
- ASSERT_TRUE(client_.HasPendingRequests());
- ASSERT_TRUE(test_url_loader_factory_.IsPending(kTestFullUrl));
- ASSERT_EQ(1, test_url_loader_factory_.NumPending());
- task_environment_.FastForwardBy(
- ProtobufHttpStreamRequest::kStreamReadyTimeoutDuration +
- base::Seconds(1));
- ASSERT_FALSE(client_.HasPendingRequests());
- }
- } // namespace remoting
|