1717#include " google/cloud/grpc_options.h"
1818#include " google/cloud/options.h"
1919#include " google/cloud/testing_util/is_proto_equal.h"
20+ #include " google/cloud/testing_util/mock_completion_queue_impl.h"
2021#include " google/cloud/testing_util/status_matchers.h"
2122#include " absl/memory/memory.h"
2223#include < gmock/gmock.h>
@@ -28,76 +29,42 @@ GOOGLE_CLOUD_CPP_INLINE_NAMESPACE_BEGIN
2829namespace internal {
2930namespace {
3031
31- using ::google::cloud::storage::testing::MockAsyncInsertStream ;
32+ using ::google::cloud::storage::testing::MockInsertStream ;
3233using ::google::cloud::storage::testing::MockStorageStub;
34+ using ::google::cloud::testing_util::MockCompletionQueueImpl;
3335using ::google::cloud::testing_util::StatusIs;
3436using ::testing::ByMove;
3537using ::testing::HasSubstr;
3638using ::testing::Return;
3739
38- // / @verify that stall timeouts are reported correctly.
39- TEST (GrpcClientUploadChunkTest, StallTimeoutStart) {
40- // The mock will satisfy this promise when `Cancel()` is called.
41- promise<void > hold_response;
42-
43- auto mock = std::make_shared<MockStorageStub>();
44- EXPECT_CALL (*mock, AsyncWriteObject)
45- .WillOnce ([&](google::cloud::CompletionQueue const &,
46- std::unique_ptr<grpc::ClientContext>) {
47- ::testing::InSequence sequence;
48- auto stream = absl::make_unique<MockAsyncInsertStream>();
49- EXPECT_CALL (*stream, Start).WillOnce ([&] {
50- return hold_response.get_future ().then (
51- [](future<void >) { return false ; });
52- });
53- EXPECT_CALL (*stream, Cancel).WillOnce ([&] {
54- hold_response.set_value ();
55- });
56- EXPECT_CALL (*stream, Finish)
57- .WillOnce (Return (ByMove (make_ready_future (
58- make_status_or (google::storage::v2::WriteObjectResponse{})))));
59- return stream;
60- });
61-
62- auto client = GrpcClient::CreateMock (mock);
63- google::cloud::internal::OptionsSpan const span (
64- Options{}.set <TransferStallTimeoutOption>(std::chrono::seconds (1 )));
65- auto const payload = std::string (UploadChunkRequest::kChunkSizeQuantum , ' A' );
66- auto response = client->UploadChunk (UploadChunkRequest (
67- " test-only-upload-id" , /* offset=*/ 0 , {ConstBuffer{payload}}));
68- EXPECT_THAT (response,
69- StatusIs (StatusCode::kDeadlineExceeded , HasSubstr (" Start()" )));
70- }
71-
7240// / @verify that stall timeouts are reported correctly.
7341TEST (GrpcClientUploadChunkTest, StallTimeoutWrite) {
74- // The mock will satisfy this promise when `Cancel()` is called.
75- promise<void > hold_response;
76-
7742 auto mock = std::make_shared<MockStorageStub>();
78- EXPECT_CALL (*mock, AsyncWriteObject)
79- .WillOnce ([&](google::cloud::CompletionQueue const &,
80- std::unique_ptr<grpc::ClientContext>) {
43+ EXPECT_CALL (*mock, WriteObject)
44+ .WillOnce ([&](std::unique_ptr<grpc::ClientContext>) {
8145 ::testing::InSequence sequence;
82- auto stream = absl::make_unique<MockAsyncInsertStream>();
83- EXPECT_CALL (*stream, Start)
84- .WillOnce (Return (ByMove (make_ready_future (true ))));
85- EXPECT_CALL (*stream, Write).WillOnce ([&] {
86- return hold_response.get_future ().then (
87- [](future<void >) { return false ; });
88- });
89- EXPECT_CALL (*stream, Cancel).WillOnce ([&] {
90- hold_response.set_value ();
91- });
92- EXPECT_CALL (*stream, Finish)
93- .WillOnce (Return (ByMove (make_ready_future (
94- make_status_or (google::storage::v2::WriteObjectResponse{})))));
46+ auto stream = absl::make_unique<MockInsertStream>();
47+ EXPECT_CALL (*stream, Cancel).Times (1 );
48+ EXPECT_CALL (*stream, Write).WillOnce (Return (false ));
49+ EXPECT_CALL (*stream, Close)
50+ .WillOnce (Return (
51+ make_status_or (google::storage::v2::WriteObjectResponse{})));
9552 return stream;
9653 });
9754
98- auto client = GrpcClient::CreateMock (mock);
55+ auto const expected = std::chrono::seconds (42 );
56+ auto mock_cq = std::make_shared<MockCompletionQueueImpl>();
57+ EXPECT_CALL (*mock_cq, MakeRelativeTimer (std::chrono::nanoseconds (expected)))
58+ .WillOnce (Return (ByMove (make_ready_future (
59+ make_status_or (std::chrono::system_clock::now ())))));
60+ auto cq = CompletionQueue (mock_cq);
61+
62+ auto client = GrpcClient::CreateMock (
63+ mock, Options{}
64+ .set <TransferStallTimeoutOption>(expected)
65+ .set <GrpcCompletionQueueOption>(cq));
9966 google::cloud::internal::OptionsSpan const span (
100- Options{}.set <TransferStallTimeoutOption>(std::chrono::seconds ( 1 ) ));
67+ Options{}.set <TransferStallTimeoutOption>(expected ));
10168 auto const payload = std::string (UploadChunkRequest::kChunkSizeQuantum , ' A' );
10269 auto response = client->UploadChunk (UploadChunkRequest (
10370 " test-only-upload-id" , /* offset=*/ 0 , {ConstBuffer{payload}}));
@@ -107,35 +74,35 @@ TEST(GrpcClientUploadChunkTest, StallTimeoutWrite) {
10774
10875// / @verify that stall timeouts are reported correctly.
10976TEST (GrpcClientUploadChunkTest, StallTimeoutWritesDone) {
110- // The mock will satisfy this promise when `Cancel()` is called.
111- promise<void > hold_response;
112-
11377 auto mock = std::make_shared<MockStorageStub>();
114- EXPECT_CALL (*mock, AsyncWriteObject)
115- .WillOnce ([&](google::cloud::CompletionQueue const &,
116- std::unique_ptr<grpc::ClientContext>) {
78+ EXPECT_CALL (*mock, WriteObject)
79+ .WillOnce ([&](std::unique_ptr<grpc::ClientContext>) {
11780 ::testing::InSequence sequence;
118- auto stream = absl::make_unique<MockAsyncInsertStream>();
119- EXPECT_CALL (*stream, Start)
120- .WillOnce (Return (ByMove (make_ready_future (true ))));
121- EXPECT_CALL (*stream, Write)
122- .WillOnce (Return (ByMove (make_ready_future (true ))));
123- EXPECT_CALL (*stream, WritesDone).WillOnce ([&] {
124- return hold_response.get_future ().then (
125- [](future<void >) { return false ; });
126- });
127- EXPECT_CALL (*stream, Cancel).WillOnce ([&] {
128- hold_response.set_value ();
129- });
130- EXPECT_CALL (*stream, Finish)
131- .WillOnce (Return (ByMove (make_ready_future (
132- make_status_or (google::storage::v2::WriteObjectResponse{})))));
81+ auto stream = absl::make_unique<MockInsertStream>();
82+ EXPECT_CALL (*stream, Write).WillOnce (Return (true ));
83+ EXPECT_CALL (*stream, Cancel).Times (1 );
84+ EXPECT_CALL (*stream, Write).WillOnce (Return (false ));
85+ EXPECT_CALL (*stream, Close)
86+ .WillOnce (Return (google::storage::v2::WriteObjectResponse{}));
13387 return stream;
13488 });
13589
136- auto client = GrpcClient::CreateMock (mock);
90+ auto const expected = std::chrono::seconds (42 );
91+ auto mock_cq = std::make_shared<MockCompletionQueueImpl>();
92+ EXPECT_CALL (*mock_cq, MakeRelativeTimer (std::chrono::nanoseconds (expected)))
93+ .WillOnce (Return (ByMove (
94+ make_ready_future (StatusOr<std::chrono::system_clock::time_point>(
95+ Status{StatusCode::kCancelled , " test-only" })))))
96+ .WillOnce (Return (ByMove (make_ready_future (
97+ make_status_or (std::chrono::system_clock::now ())))));
98+ auto cq = CompletionQueue (mock_cq);
99+
100+ auto client = GrpcClient::CreateMock (
101+ mock, Options{}
102+ .set <TransferStallTimeoutOption>(expected)
103+ .set <GrpcCompletionQueueOption>(cq));
137104 google::cloud::internal::OptionsSpan const span (
138- Options{}.set <TransferStallTimeoutOption>(std::chrono::seconds ( 1 ) ));
105+ Options{}.set <TransferStallTimeoutOption>(expected ));
139106 auto const payload = std::string (UploadChunkRequest::kChunkSizeQuantum , ' A' );
140107 auto response = client->UploadChunk (UploadChunkRequest (
141108 " test-only-upload-id" , /* offset=*/ 0 , {ConstBuffer{payload}}));
@@ -144,41 +111,44 @@ TEST(GrpcClientUploadChunkTest, StallTimeoutWritesDone) {
144111}
145112
146113// / @verify that stall timeouts are reported correctly.
147- TEST (GrpcClientUploadChunkTest, StallTimeoutFinish) {
148- // The mock will satisfy this promise when `Cancel()` is called.
149- promise<void > hold_response;
150-
114+ TEST (GrpcClientUploadChunkTest, StallTimeoutClose) {
151115 auto mock = std::make_shared<MockStorageStub>();
152- EXPECT_CALL (*mock, AsyncWriteObject)
153- .WillOnce ([&](google::cloud::CompletionQueue const &,
154- std::unique_ptr<grpc::ClientContext>) {
116+ EXPECT_CALL (*mock, WriteObject)
117+ .WillOnce ([&](std::unique_ptr<grpc::ClientContext>) {
155118 ::testing::InSequence sequence;
156- auto stream = absl::make_unique<MockAsyncInsertStream>();
157- EXPECT_CALL (*stream, Start)
158- .WillOnce (Return (ByMove (make_ready_future (true ))));
159- EXPECT_CALL (*stream, Write)
160- .WillOnce (Return (ByMove (make_ready_future (true ))));
161- EXPECT_CALL (*stream, WritesDone)
162- .WillOnce (Return (ByMove (make_ready_future (true ))));
163- EXPECT_CALL (*stream, Finish).WillOnce ([&] {
164- return hold_response.get_future ().then ([](future<void >) {
165- return make_status_or (google::storage::v2::WriteObjectResponse{});
166- });
167- });
168- EXPECT_CALL (*stream, Cancel).WillOnce ([&] {
169- hold_response.set_value ();
170- });
119+ auto stream = absl::make_unique<MockInsertStream>();
120+ EXPECT_CALL (*stream, Write).Times (2 ).WillRepeatedly (Return (true ));
121+ EXPECT_CALL (*stream, Cancel).Times (1 );
122+ EXPECT_CALL (*stream, Close)
123+ .WillOnce (Return (
124+ make_status_or (google::storage::v2::WriteObjectResponse{})));
171125 return stream;
172126 });
173127
174- auto client = GrpcClient::CreateMock (mock);
128+ auto const expected = std::chrono::seconds (42 );
129+ auto mock_cq = std::make_shared<MockCompletionQueueImpl>();
130+ EXPECT_CALL (*mock_cq, MakeRelativeTimer (std::chrono::nanoseconds (expected)))
131+ .WillOnce (Return (ByMove (
132+ make_ready_future (StatusOr<std::chrono::system_clock::time_point>(
133+ Status{StatusCode::kCancelled , " test-only" })))))
134+ .WillOnce (Return (ByMove (
135+ make_ready_future (StatusOr<std::chrono::system_clock::time_point>(
136+ Status{StatusCode::kCancelled , " test-only" })))))
137+ .WillOnce (Return (ByMove (make_ready_future (
138+ make_status_or (std::chrono::system_clock::now ())))));
139+ auto cq = CompletionQueue (mock_cq);
140+
141+ auto client = GrpcClient::CreateMock (
142+ mock, Options{}
143+ .set <TransferStallTimeoutOption>(expected)
144+ .set <GrpcCompletionQueueOption>(cq));
175145 google::cloud::internal::OptionsSpan const span (
176- Options{}.set <TransferStallTimeoutOption>(std::chrono::seconds ( 1 ) ));
146+ Options{}.set <TransferStallTimeoutOption>(expected ));
177147 auto const payload = std::string (UploadChunkRequest::kChunkSizeQuantum , ' A' );
178148 auto response = client->UploadChunk (UploadChunkRequest (
179149 " test-only-upload-id" , /* offset=*/ 0 , {ConstBuffer{payload}}));
180150 EXPECT_THAT (response,
181- StatusIs (StatusCode::kDeadlineExceeded , HasSubstr (" Finish ()" )));
151+ StatusIs (StatusCode::kDeadlineExceeded , HasSubstr (" Close ()" )));
182152}
183153
184154} // namespace
0 commit comments