20 #include <gmock/gmock.h>
21 #include <gtest/gtest.h>
23 #include "absl/memory/memory.h"
34 std::pair<StreamIdentifier, int> Decode(
const T& ) {
35 assert(
false &&
"This should not be called");
40 std::pair<StreamIdentifier, int> Decode<std::string>(
const std::string&
data) {
46 return std::make_pair(
id, seq_num);
50 std::pair<StreamIdentifier, int> Decode<Metadata>(
const Metadata&
data) {
51 assert(
data.size() == 1);
58 assert(
false &&
"This should not be called");
72 return {{Encode<std::string>(
id, seq_num),
""}};
75 MATCHER_P2(StreamIdAndSeqNumMatch,
id, seq_num,
"") {
77 return p.first ==
id &&
p.second == seq_num;
83 template <
typename FirstArg,
typename... TrailingArgs>
92 return [
this](FirstArg first_arg, TrailingArgs...) {
93 this->ActualCallback(first_arg);
97 void ExpectCallbackInvocation() {
106 using MockInitialMetadataCallback = MockCallback<absl::StatusOr<Metadata>>;
107 using MockMessageCallback = MockCallback<absl::StatusOr<std::string>>;
108 using MockTrailingMetadataCallback =
109 MockCallback<absl::StatusOr<Metadata>,
int>;
117 absl::make_unique<MockInitialMetadataCallback>(
id_,
seq_num_);
124 absl::make_unique<MockTrailingMetadataCallback>(
id_,
seq_num_);
128 void Complete(TransportStreamReceiver& receiver) {
131 receiver.NotifyRecvInitialMetadata(
id_, Encode<Metadata>(
id_,
seq_num_));
135 receiver.NotifyRecvMessage(
id_, Encode<std::string>(
id_,
seq_num_));
139 receiver.NotifyRecvTrailingMetadata(
id_, Encode<Metadata>(
id_,
seq_num_),
144 void RequestRecv(TransportStreamReceiver& receiver) {
146 receiver.RegisterRecvInitialMetadata(
153 receiver.RegisterRecvTrailingMetadata(
158 MockOpBatch NextBatch(
int flag)
const {
171 MockOpBatch NewGrpcStream(
int flag) {
182 TEST_F(TransportStreamReceiverTest, MultipleStreamRequestThenComplete) {
184 MockOpBatch
t0 = NewGrpcStream(kFlagAll);
185 t0.RequestRecv(receiver);
186 t0.Complete(receiver);
189 TEST_F(TransportStreamReceiverTest, MultipleStreamCompleteThenRequest) {
191 MockOpBatch
t0 = NewGrpcStream(kFlagAll);
192 t0.Complete(receiver);
193 t0.RequestRecv(receiver);
196 TEST_F(TransportStreamReceiverTest, MultipleStreamInterleaved) {
198 MockOpBatch
t0 = NewGrpcStream(kFlagAll);
199 MockOpBatch
t1 = NewGrpcStream(kFlagAll);
200 t1.Complete(receiver);
201 t0.Complete(receiver);
202 t0.RequestRecv(receiver);
203 t1.RequestRecv(receiver);
206 TEST_F(TransportStreamReceiverTest, MultipleStreamInterleavedReversed) {
208 MockOpBatch
t0 = NewGrpcStream(kFlagAll);
209 MockOpBatch
t1 = NewGrpcStream(kFlagAll);
210 t0.RequestRecv(receiver);
211 t1.RequestRecv(receiver);
212 t1.Complete(receiver);
213 t0.Complete(receiver);
216 TEST_F(TransportStreamReceiverTest, MultipleStreamMoreInterleaved) {
218 MockOpBatch
t0 = NewGrpcStream(kFlagAll);
219 MockOpBatch
t1 = NewGrpcStream(kFlagAll);
220 t0.RequestRecv(receiver);
221 t1.Complete(receiver);
222 MockOpBatch t2 = NewGrpcStream(kFlagAll);
223 t2.RequestRecv(receiver);
224 t0.Complete(receiver);
225 t1.RequestRecv(receiver);
226 t2.Complete(receiver);
229 TEST_F(TransportStreamReceiverTest, SingleStreamUnaryCall) {
234 t0.RequestRecv(receiver);
235 t1.RequestRecv(receiver);
236 t2.RequestRecv(receiver);
237 t0.Complete(receiver);
238 t1.Complete(receiver);
239 t2.Complete(receiver);
242 TEST_F(TransportStreamReceiverTest, SingleStreamStreamingCall) {
245 t0.RequestRecv(receiver);
246 t0.Complete(receiver);
248 t1.Complete(receiver);
249 t1.RequestRecv(receiver);
251 t2.RequestRecv(receiver);
252 t2.Complete(receiver);
255 t3.Complete(receiver);
256 t4.Complete(receiver);
257 t3.RequestRecv(receiver);
258 t4.RequestRecv(receiver);
261 TEST_F(TransportStreamReceiverTest, DISABLED_SingleStreamBufferedCallbacks) {
267 t0.RequestRecv(receiver);
270 t1.RequestRecv(receiver);
271 t2.RequestRecv(receiver);
272 t3.RequestRecv(receiver);
273 t0.Complete(receiver);
274 t1.Complete(receiver);
275 t2.Complete(receiver);
276 t3.Complete(receiver);
284 int main(
int argc,
char** argv) {