binder_transport_test.cc
Go to the documentation of this file.
1 // Copyright 2021 gRPC authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 // Unit-tests for grpc_binder_transport
16 //
17 // Verify that a calls to the perform_stream_op of grpc_binder_transport
18 // transform into the correct sequence of binder transactions.
20 
21 #include <memory>
22 #include <string>
23 #include <vector>
24 
25 #include <gtest/gtest.h>
26 
27 #include "absl/memory/memory.h"
28 #include "absl/strings/match.h"
29 #include "absl/strings/str_join.h"
30 #include "absl/synchronization/notification.h"
31 
32 #include <grpc/grpc.h>
34 
39 
41  grpc_core::ResourceQuota::Default()->memory_quota()->CreateMemoryAllocator(
42  "test"));
43 
44 namespace grpc_binder {
45 namespace {
46 
47 using ::testing::Expectation;
48 using ::testing::NiceMock;
50 
51 class BinderTransportTest : public ::testing::Test {
52  public:
53  BinderTransportTest()
54  : arena_(grpc_core::Arena::Create(/* initial_size = */ 1,
57  absl::make_unique<NiceMock<MockBinder>>(),
58  std::make_shared<
59  grpc::experimental::binder::UntrustedSecurityPolicy>())) {
60  auto* gbt = reinterpret_cast<grpc_binder_transport*>(transport_);
61  gbt->wire_writer = absl::make_unique<MockWireWriter>();
62  GRPC_STREAM_REF_INIT(&ref_, 1, nullptr, nullptr, "phony ref");
63  }
64 
65  ~BinderTransportTest() override {
69  for (grpc_binder_stream* gbs : stream_buffer_) {
70  gbs->~grpc_binder_stream();
71  gpr_free(gbs);
72  }
73  arena_->Destroy();
74  }
75 
79  reinterpret_cast<grpc_stream*>(gbs), op);
80  }
81 
82  grpc_binder_transport* GetBinderTransport() {
83  return reinterpret_cast<grpc_binder_transport*>(transport_);
84  }
85 
86  grpc_binder_stream* InitNewBinderStream() {
87  grpc_binder_stream* gbs = static_cast<grpc_binder_stream*>(
89  grpc_transport_init_stream(transport_, reinterpret_cast<grpc_stream*>(gbs),
90  &ref_, nullptr, arena_);
91  stream_buffer_.push_back(gbs);
92  return gbs;
93  }
94 
95  MockWireWriter& GetWireWriter() {
96  return *reinterpret_cast<MockWireWriter*>(
97  GetBinderTransport()->wire_writer.get());
98  }
99 
100  static void SetUpTestSuite() { grpc_init(); }
101  static void TearDownTestSuite() { grpc_shutdown(); }
102 
103  protected:
107  std::vector<grpc_binder_stream*> stream_buffer_;
108 };
109 
110 void MockCallback(void* arg, grpc_error_handle error);
111 
112 class MockGrpcClosure {
113  public:
114  explicit MockGrpcClosure(absl::Notification* notification = nullptr)
116  GRPC_CLOSURE_INIT(&closure_, MockCallback, this, nullptr);
117  }
118 
119  grpc_closure* GetGrpcClosure() { return &closure_; }
120  MOCK_METHOD(void, Callback, (grpc_error_handle), ());
121 
123 
124  private:
126 };
127 
128 void MockCallback(void* arg, grpc_error_handle error) {
129  MockGrpcClosure* mock_closure = static_cast<MockGrpcClosure*>(arg);
130  mock_closure->Callback(error);
131  if (mock_closure->notification_) {
132  mock_closure->notification_->Notify();
133  }
134 }
135 
136 std::string MetadataString(const Metadata& a) {
137  return absl::StrCat(
138  "{",
140  a, ", ",
141  [](std::string* out, const std::pair<std::string, std::string>& kv) {
142  out->append(
143  absl::StrCat("\"", kv.first, "\": \"", kv.second, "\""));
144  }),
145  "}");
146 }
147 
148 bool MetadataEquivalent(Metadata a, Metadata b) {
149  std::sort(a.begin(), a.end());
150  std::sort(b.begin(), b.end());
151  return a == b;
152 }
153 
154 // Matches with transactions having the desired flag, method_ref,
155 // initial_metadata, and message_data.
156 MATCHER_P4(TransactionMatches, flag, method_ref, initial_metadata, message_data,
157  "") {
158  if (arg->GetFlags() != flag) return false;
159  if (flag & kFlagPrefix) {
160  if (arg->GetMethodRef() != method_ref) {
161  printf("METHOD REF NOT EQ: %s %s\n",
162  std::string(arg->GetMethodRef()).c_str(),
163  std::string(method_ref).c_str());
164  return false;
165  }
166  if (!MetadataEquivalent(arg->GetPrefixMetadata(), initial_metadata)) {
167  printf("METADATA NOT EQUIVALENT: %s %s\n",
168  MetadataString(arg->GetPrefixMetadata()).c_str(),
169  MetadataString(initial_metadata).c_str());
170  return false;
171  }
172  }
173  if (flag & kFlagMessageData) {
174  if (arg->GetMessageData() != message_data) return false;
175  }
176  return true;
177 }
178 
179 // Matches with grpc_error having error message containing |msg|.
180 MATCHER_P(GrpcErrorMessageContains, msg, "") {
182 }
183 
184 namespace {
185 class MetadataEncoder {
186  public:
187  void Encode(const grpc_core::Slice& key, const grpc_core::Slice& value) {
188  metadata_.emplace_back(std::string(key.as_string_view()),
189  std::string(value.as_string_view()));
190  }
191 
192  template <typename Which>
193  void Encode(Which, const typename Which::ValueType& value) {
194  metadata_.emplace_back(
196  std::string(grpc_core::Slice(Which::Encode(value)).as_string_view()));
197  }
198 
199  const Metadata& metadata() const { return metadata_; }
200 
201  private:
203 };
204 } // namespace
205 
206 // Verify that the lower-level metadata has the same content as the gRPC
207 // metadata.
208 void VerifyMetadataEqual(const Metadata& md,
209  const grpc_metadata_batch& grpc_md) {
210  MetadataEncoder encoder;
211  grpc_md.Encode(&encoder);
212  EXPECT_TRUE(MetadataEquivalent(encoder.metadata(), md));
213 }
214 
215 // RAII helper classes for constructing gRPC metadata and receiving callbacks.
216 struct MakeSendInitialMetadata {
217  MakeSendInitialMetadata(const Metadata& initial_metadata,
218  const std::string& method_ref,
220  for (const auto& md : initial_metadata) {
221  const std::string& key = md.first;
222  const std::string& value = md.second;
225  [](absl::string_view, const grpc_core::Slice&) { abort(); });
226  }
227  if (!method_ref.empty()) {
230  }
231  op->send_initial_metadata = true;
232  op->payload->send_initial_metadata.send_initial_metadata =
234  }
235  ~MakeSendInitialMetadata() {}
236 
240 };
241 
242 struct MakeSendMessage {
243  MakeSendMessage(const std::string& message,
246 
247  op->send_message = true;
248  op->payload->send_message.send_message = &send_stream;
249  }
250 
252 };
253 
254 struct MakeSendTrailingMetadata {
255  explicit MakeSendTrailingMetadata(const Metadata& trailing_metadata,
258 
259  op->send_trailing_metadata = true;
260  op->payload->send_trailing_metadata.send_trailing_metadata =
262  }
263 
267 };
268 
269 struct MakeRecvInitialMetadata {
270  explicit MakeRecvInitialMetadata(grpc_transport_stream_op_batch* op,
271  Expectation* call_before = nullptr)
272  : ready(&notification) {
273  op->recv_initial_metadata = true;
274  op->payload->recv_initial_metadata.recv_initial_metadata =
276  op->payload->recv_initial_metadata.recv_initial_metadata_ready =
277  ready.GetGrpcClosure();
278  if (call_before) {
279  EXPECT_CALL(ready, Callback).After(*call_before);
280  } else {
281  EXPECT_CALL(ready, Callback);
282  }
283  }
284 
285  ~MakeRecvInitialMetadata() {}
286 
287  MockGrpcClosure ready;
292 };
293 
294 struct MakeRecvMessage {
295  explicit MakeRecvMessage(grpc_transport_stream_op_batch* op,
296  Expectation* call_before = nullptr)
297  : ready(&notification) {
298  op->recv_message = true;
299  op->payload->recv_message.recv_message = &grpc_message;
300  op->payload->recv_message.recv_message_ready = ready.GetGrpcClosure();
301  if (call_before) {
302  EXPECT_CALL(ready, Callback).After(*call_before);
303  } else {
304  EXPECT_CALL(ready, Callback);
305  }
306  }
307 
308  MockGrpcClosure ready;
311 };
312 
313 struct MakeRecvTrailingMetadata {
314  explicit MakeRecvTrailingMetadata(grpc_transport_stream_op_batch* op,
315  Expectation* call_before = nullptr)
316  : ready(&notification) {
317  op->recv_trailing_metadata = true;
318  op->payload->recv_trailing_metadata.recv_trailing_metadata =
320  op->payload->recv_trailing_metadata.recv_trailing_metadata_ready =
321  ready.GetGrpcClosure();
322  if (call_before) {
323  EXPECT_CALL(ready, Callback).After(*call_before);
324  } else {
325  EXPECT_CALL(ready, Callback);
326  }
327  }
328 
329  ~MakeRecvTrailingMetadata() {}
330 
331  MockGrpcClosure ready;
336 };
337 
338 const Metadata kDefaultMetadata = {
339  {"", ""},
340  {"", "value"},
341  {"key", ""},
342  {"key", "value"},
343 };
344 
345 constexpr char kDefaultMethodRef[] = "/some/path";
346 constexpr char kDefaultMessage[] = "binder transport message";
347 constexpr int kDefaultStatus = 0x1234;
348 
349 Metadata AppendMethodRef(const Metadata& md, const std::string& method_ref) {
350  Metadata result = md;
351  result.emplace_back(":path", method_ref);
352  return result;
353 }
354 
355 Metadata AppendStatus(const Metadata& md, int status) {
356  Metadata result = md;
357  result.emplace_back("grpc-status", std::to_string(status));
358  return result;
359 }
360 
361 } // namespace
362 
363 TEST_F(BinderTransportTest, CreateBinderTransport) {
364  EXPECT_NE(transport_, nullptr);
365 }
366 
367 TEST_F(BinderTransportTest, TransactionIdIncrement) {
368  grpc_binder_stream* gbs0 = InitNewBinderStream();
369  EXPECT_EQ(gbs0->t, GetBinderTransport());
371  grpc_binder_stream* gbs1 = InitNewBinderStream();
372  EXPECT_EQ(gbs1->t, GetBinderTransport());
373  EXPECT_EQ(gbs1->tx_code, kFirstCallId + 1);
374  grpc_binder_stream* gbs2 = InitNewBinderStream();
375  EXPECT_EQ(gbs2->t, GetBinderTransport());
376  EXPECT_EQ(gbs2->tx_code, kFirstCallId + 2);
377 }
378 
379 TEST_F(BinderTransportTest, PerformSendInitialMetadata) {
381  grpc_binder_stream* gbs = InitNewBinderStream();
384  op.payload = &payload;
385  const Metadata kInitialMetadata = kDefaultMetadata;
386  MakeSendInitialMetadata send_initial_metadata(kInitialMetadata, "", &op);
387  MockGrpcClosure mock_on_complete;
388  op.on_complete = mock_on_complete.GetGrpcClosure();
389 
390  ::testing::InSequence sequence;
391  EXPECT_CALL(GetWireWriter(), RpcCall(TransactionMatches(
392  kFlagPrefix, "", kInitialMetadata, "")));
393  EXPECT_CALL(mock_on_complete, Callback);
394 
395  PerformStreamOp(gbs, &op);
397 }
398 
399 TEST_F(BinderTransportTest, PerformSendInitialMetadataMethodRef) {
401  grpc_binder_stream* gbs = InitNewBinderStream();
404  op.payload = &payload;
405  const Metadata kInitialMetadata = kDefaultMetadata;
406  const std::string kMethodRef = kDefaultMethodRef;
407  MakeSendInitialMetadata send_initial_metadata(kInitialMetadata, kMethodRef,
408  &op);
409  MockGrpcClosure mock_on_complete;
410  op.on_complete = mock_on_complete.GetGrpcClosure();
411 
412  ::testing::InSequence sequence;
413  EXPECT_CALL(GetWireWriter(),
414  RpcCall(TransactionMatches(kFlagPrefix, kMethodRef.substr(1),
415  kInitialMetadata, "")));
416  EXPECT_CALL(mock_on_complete, Callback);
417 
418  PerformStreamOp(gbs, &op);
420 }
421 
422 TEST_F(BinderTransportTest, PerformSendMessage) {
424  grpc_binder_stream* gbs = InitNewBinderStream();
427  op.payload = &payload;
428 
429  const std::string kMessage = kDefaultMessage;
430  MakeSendMessage send_message(kMessage, &op);
431  MockGrpcClosure mock_on_complete;
432  op.on_complete = mock_on_complete.GetGrpcClosure();
433 
434  ::testing::InSequence sequence;
435  EXPECT_CALL(
436  GetWireWriter(),
437  RpcCall(TransactionMatches(kFlagMessageData, "", Metadata{}, kMessage)));
438  EXPECT_CALL(mock_on_complete, Callback);
439 
440  PerformStreamOp(gbs, &op);
442 }
443 
444 TEST_F(BinderTransportTest, PerformSendTrailingMetadata) {
446  grpc_binder_stream* gbs = InitNewBinderStream();
449  op.payload = &payload;
450  // The wireformat guarantees that suffix metadata will always be empty.
451  // TODO(waynetu): Check whether gRPC can internally add extra trailing
452  // metadata.
453  const Metadata kTrailingMetadata = {};
454  MakeSendTrailingMetadata send_trailing_metadata(kTrailingMetadata, &op);
455  MockGrpcClosure mock_on_complete;
456  op.on_complete = mock_on_complete.GetGrpcClosure();
457 
458  ::testing::InSequence sequence;
459  EXPECT_CALL(GetWireWriter(), RpcCall(TransactionMatches(
460  kFlagSuffix, "", kTrailingMetadata, "")));
461  EXPECT_CALL(mock_on_complete, Callback);
462 
463  PerformStreamOp(gbs, &op);
465 }
466 
467 TEST_F(BinderTransportTest, PerformSendAll) {
469  grpc_binder_stream* gbs = InitNewBinderStream();
472  op.payload = &payload;
473 
474  const Metadata kInitialMetadata = kDefaultMetadata;
475  const std::string kMethodRef = kDefaultMethodRef;
476  MakeSendInitialMetadata send_initial_metadata(kInitialMetadata, kMethodRef,
477  &op);
478 
479  const std::string kMessage = kDefaultMessage;
480  MakeSendMessage send_message(kMessage, &op);
481 
482  // The wireformat guarantees that suffix metadata will always be empty.
483  // TODO(waynetu): Check whether gRPC can internally add extra trailing
484  // metadata.
485  const Metadata kTrailingMetadata = {};
486  MakeSendTrailingMetadata send_trailing_metadata(kTrailingMetadata, &op);
487 
488  MockGrpcClosure mock_on_complete;
489  op.on_complete = mock_on_complete.GetGrpcClosure();
490 
491  ::testing::InSequence sequence;
492  EXPECT_CALL(GetWireWriter(),
493  RpcCall(TransactionMatches(
495  kMethodRef.substr(1), kInitialMetadata, kMessage)));
496  EXPECT_CALL(mock_on_complete, Callback);
497 
498  PerformStreamOp(gbs, &op);
500 }
501 
502 TEST_F(BinderTransportTest, PerformRecvInitialMetadata) {
504  grpc_binder_stream* gbs = InitNewBinderStream();
507  op.payload = &payload;
508 
509  MakeRecvInitialMetadata recv_initial_metadata(&op);
510 
511  const Metadata kInitialMetadata = kDefaultMetadata;
512  auto* gbt = reinterpret_cast<grpc_binder_transport*>(transport_);
513  gbt->transport_stream_receiver->NotifyRecvInitialMetadata(gbs->tx_code,
514  kInitialMetadata);
515  PerformStreamOp(gbs, &op);
517  recv_initial_metadata.notification.WaitForNotification();
518 
519  VerifyMetadataEqual(kInitialMetadata,
520  recv_initial_metadata.grpc_initial_metadata);
521 }
522 
523 TEST_F(BinderTransportTest, PerformRecvInitialMetadataWithMethodRef) {
525  grpc_binder_stream* gbs = InitNewBinderStream();
528  op.payload = &payload;
529 
530  MakeRecvInitialMetadata recv_initial_metadata(&op);
531 
532  auto* gbt = reinterpret_cast<grpc_binder_transport*>(transport_);
533  const Metadata kInitialMetadataWithMethodRef =
534  AppendMethodRef(kDefaultMetadata, kDefaultMethodRef);
535  gbt->transport_stream_receiver->NotifyRecvInitialMetadata(
536  gbs->tx_code, kInitialMetadataWithMethodRef);
537  PerformStreamOp(gbs, &op);
539  recv_initial_metadata.notification.WaitForNotification();
540 
541  VerifyMetadataEqual(kInitialMetadataWithMethodRef,
542  recv_initial_metadata.grpc_initial_metadata);
543 }
544 
545 TEST_F(BinderTransportTest, PerformRecvMessage) {
547  grpc_binder_stream* gbs = InitNewBinderStream();
550  op.payload = &payload;
551 
552  MakeRecvMessage recv_message(&op);
553 
554  auto* gbt = reinterpret_cast<grpc_binder_transport*>(transport_);
555  const std::string kMessage = kDefaultMessage;
556  gbt->transport_stream_receiver->NotifyRecvMessage(gbs->tx_code, kMessage);
557 
558  PerformStreamOp(gbs, &op);
560  recv_message.notification.WaitForNotification();
561 
562  EXPECT_EQ(kMessage, recv_message.grpc_message->JoinIntoString());
563 }
564 
565 TEST_F(BinderTransportTest, PerformRecvTrailingMetadata) {
567  grpc_binder_stream* gbs = InitNewBinderStream();
570  op.payload = &payload;
571 
572  MakeRecvTrailingMetadata recv_trailing_metadata(&op);
573 
574  const Metadata kTrailingMetadata = kDefaultMetadata;
575  auto* gbt = reinterpret_cast<grpc_binder_transport*>(transport_);
576  constexpr int kStatus = kDefaultStatus;
577  gbt->transport_stream_receiver->NotifyRecvTrailingMetadata(
578  gbs->tx_code, kTrailingMetadata, kStatus);
579  PerformStreamOp(gbs, &op);
581  recv_trailing_metadata.notification.WaitForNotification();
582 
583  VerifyMetadataEqual(AppendStatus(kTrailingMetadata, kStatus),
584  recv_trailing_metadata.grpc_trailing_metadata);
585 }
586 
587 TEST_F(BinderTransportTest, PerformRecvAll) {
589  grpc_binder_stream* gbs = InitNewBinderStream();
592  op.payload = &payload;
593 
594  MakeRecvInitialMetadata recv_initial_metadata(&op);
595  MakeRecvMessage recv_message(&op);
596  MakeRecvTrailingMetadata recv_trailing_metadata(&op);
597 
598  auto* gbt = reinterpret_cast<grpc_binder_transport*>(transport_);
599  const Metadata kInitialMetadataWithMethodRef =
600  AppendMethodRef(kDefaultMetadata, kDefaultMethodRef);
601  gbt->transport_stream_receiver->NotifyRecvInitialMetadata(
602  gbs->tx_code, kInitialMetadataWithMethodRef);
603 
604  const std::string kMessage = kDefaultMessage;
605  gbt->transport_stream_receiver->NotifyRecvMessage(gbs->tx_code, kMessage);
606 
607  Metadata trailing_metadata = kDefaultMetadata;
608  constexpr int kStatus = kDefaultStatus;
609  gbt->transport_stream_receiver->NotifyRecvTrailingMetadata(
610  gbs->tx_code, trailing_metadata, kStatus);
611  PerformStreamOp(gbs, &op);
613  recv_trailing_metadata.notification.WaitForNotification();
614 
615  VerifyMetadataEqual(kInitialMetadataWithMethodRef,
616  recv_initial_metadata.grpc_initial_metadata);
617  trailing_metadata.emplace_back("grpc-status", std::to_string(kStatus));
618  VerifyMetadataEqual(trailing_metadata,
619  recv_trailing_metadata.grpc_trailing_metadata);
620  EXPECT_EQ(kMessage, recv_message.grpc_message->JoinIntoString());
621 }
622 
623 TEST_F(BinderTransportTest, PerformAllOps) {
625  grpc_binder_stream* gbs = InitNewBinderStream();
628  op.payload = &payload;
629 
630  const Metadata kSendInitialMetadata = kDefaultMetadata;
631  const std::string kMethodRef = kDefaultMethodRef;
632  MakeSendInitialMetadata send_initial_metadata(kSendInitialMetadata,
633  kMethodRef, &op);
634 
635  const std::string kSendMessage = kDefaultMessage;
636  MakeSendMessage send_message(kSendMessage, &op);
637 
638  // The wireformat guarantees that suffix metadata will always be empty.
639  // TODO(waynetu): Check whether gRPC can internally add extra trailing
640  // metadata.
641  const Metadata kSendTrailingMetadata = {};
642  MakeSendTrailingMetadata send_trailing_metadata(kSendTrailingMetadata, &op);
643 
644  MockGrpcClosure mock_on_complete;
645  op.on_complete = mock_on_complete.GetGrpcClosure();
646 
647  // TODO(waynetu): Currently, we simply drop the prefix '/' from the :path
648  // argument to obtain the method name. Update the test if this turns out to be
649  // incorrect.
650  EXPECT_CALL(GetWireWriter(),
651  RpcCall(TransactionMatches(
653  kMethodRef.substr(1), kSendInitialMetadata, kSendMessage)));
654  Expectation on_complete = EXPECT_CALL(mock_on_complete, Callback);
655 
656  // Recv callbacks can happen after the on_complete callback.
657  MakeRecvInitialMetadata recv_initial_metadata(
658  &op, /* call_before = */ &on_complete);
659  MakeRecvMessage recv_message(&op, /* call_before = */ &on_complete);
660  MakeRecvTrailingMetadata recv_trailing_metadata(
661  &op, /* call_before = */ &on_complete);
662 
663  PerformStreamOp(gbs, &op);
664 
665  // Flush the execution context to force on_complete to run before recv
666  // callbacks get scheduled.
668 
669  auto* gbt = reinterpret_cast<grpc_binder_transport*>(transport_);
670  const Metadata kRecvInitialMetadata =
671  AppendMethodRef(kDefaultMetadata, kDefaultMethodRef);
672  gbt->transport_stream_receiver->NotifyRecvInitialMetadata(
673  gbs->tx_code, kRecvInitialMetadata);
674  const std::string kRecvMessage = kDefaultMessage;
675  gbt->transport_stream_receiver->NotifyRecvMessage(gbs->tx_code, kRecvMessage);
676  const Metadata kRecvTrailingMetadata = kDefaultMetadata;
677  constexpr int kStatus = 0x1234;
678  gbt->transport_stream_receiver->NotifyRecvTrailingMetadata(
679  gbs->tx_code, kRecvTrailingMetadata, kStatus);
680 
682  recv_initial_metadata.notification.WaitForNotification();
683  recv_message.notification.WaitForNotification();
684  recv_trailing_metadata.notification.WaitForNotification();
685 
686  VerifyMetadataEqual(kRecvInitialMetadata,
687  recv_initial_metadata.grpc_initial_metadata);
688  VerifyMetadataEqual(AppendStatus(kRecvTrailingMetadata, kStatus),
689  recv_trailing_metadata.grpc_trailing_metadata);
690 
691  EXPECT_EQ(kRecvMessage, recv_message.grpc_message->JoinIntoString());
692 }
693 
694 TEST_F(BinderTransportTest, WireWriterRpcCallErrorPropagates) {
696  grpc_binder_stream* gbs = InitNewBinderStream();
697 
698  MockGrpcClosure mock_on_complete1;
699  MockGrpcClosure mock_on_complete2;
700 
701  EXPECT_CALL(GetWireWriter(), RpcCall)
702  .WillOnce(Return(absl::OkStatus()))
703  .WillOnce(Return(absl::InternalError("WireWriter::RpcCall failed")));
704  EXPECT_CALL(mock_on_complete1, Callback(GRPC_ERROR_NONE));
705  EXPECT_CALL(mock_on_complete2,
706  Callback(GrpcErrorMessageContains("WireWriter::RpcCall failed")));
707 
708  const Metadata kInitialMetadata = {};
710  grpc_transport_stream_op_batch_payload payload1(nullptr);
711  op1.payload = &payload1;
712  MakeSendInitialMetadata send_initial_metadata1(kInitialMetadata, "", &op1);
713  op1.on_complete = mock_on_complete1.GetGrpcClosure();
714 
716  grpc_transport_stream_op_batch_payload payload2(nullptr);
717  op2.payload = &payload2;
718  MakeSendInitialMetadata send_initial_metadata2(kInitialMetadata, "", &op2);
719  op2.on_complete = mock_on_complete2.GetGrpcClosure();
720 
721  PerformStreamOp(gbs, &op1);
722  PerformStreamOp(gbs, &op2);
724 }
725 
726 } // namespace grpc_binder
727 
728 int main(int argc, char** argv) {
729  ::testing::InitGoogleTest(&argc, argv);
730  grpc::testing::TestEnvironment env(&argc, argv);
731  return RUN_ALL_TESTS();
732 }
GRPC_CLOSURE_INIT
#define GRPC_CLOSURE_INIT(closure, cb, cb_arg, scheduler)
Definition: closure.h:115
_gevent_test_main.result
result
Definition: _gevent_test_main.py:96
flag
uint32_t flag
Definition: ssl_versions.cc:162
grpc_core::MakeScopedArena
ScopedArenaPtr MakeScopedArena(size_t initial_size, MemoryAllocator *memory_allocator)
Definition: src/core/lib/resource_quota/arena.h:130
transport_
grpc_transport * transport_
Definition: binder_transport_test.cc:105
gen_build_yaml.out
dictionary out
Definition: src/benchmark/gen_build_yaml.py:24
grpc_core::MetadataMap::Set
absl::enable_if_t< Which::kRepeatable==false, void > Set(Which, Args &&... args)
Definition: metadata_batch.h:1075
GRPC_ERROR_NONE
#define GRPC_ERROR_NONE
Definition: error.h:234
grpc_core::MetadataMap::Append
void Append(absl::string_view key, Slice value, MetadataParseErrorFn on_error)
Definition: metadata_batch.h:1156
generate.env
env
Definition: generate.py:37
MATCHER_P4
#define MATCHER_P4(name, p0, p1, p2, p3, description)
Definition: bloaty/third_party/googletest/googlemock/include/gmock/gmock-generated-matchers.h:485
absl::StrCat
std::string StrCat(const AlphaNum &a, const AlphaNum &b)
Definition: abseil-cpp/absl/strings/str_cat.cc:98
grpc_event_engine::experimental::MemoryAllocator
Definition: memory_allocator.h:35
grpc
Definition: grpcpp/alarm.h:33
notification
absl::Notification notification
Definition: binder_transport_test.cc:291
testing::Return
internal::ReturnAction< R > Return(R value)
Definition: bloaty/third_party/googletest/googlemock/include/gmock/gmock-actions.h:1004
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::Slice
Definition: src/core/lib/slice/slice.h:282
grpc_core::HttpPathMetadata
Definition: metadata_batch.h:262
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_binder
Definition: connection_id_generator.cc:45
printf
_Use_decl_annotations_ int __cdecl printf(const char *_Format,...)
Definition: cs_driver.c:91
Arena
Definition: arena.c:39
gpr_free
GPRAPI void gpr_free(void *ptr)
Definition: alloc.cc:51
metadata
struct metadata metadata
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_trailing_metadata
grpc_metadata_batch grpc_trailing_metadata
Definition: binder_transport_test.cc:266
error
grpc_error_handle error
Definition: retry_filter.cc:499
grpc_message
absl::optional< grpc_core::SliceBuffer > grpc_message
Definition: binder_transport_test.cc:310
mock_objects.h
absl::OkStatus
Status OkStatus()
Definition: third_party/abseil-cpp/absl/status/status.h:882
gpr_malloc
GPRAPI void * gpr_malloc(size_t size)
Definition: alloc.cc:29
status
absl::Status status
Definition: rls.cc:251
grpc_binder_stream::tx_code
int tx_code
Definition: binder_stream.h:83
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
absl::make_unique
memory_internal::MakeUniqueResult< T >::scalar make_unique(Args &&... args)
Definition: third_party/abseil-cpp/absl/memory/memory.h:168
absl::InternalError
Status InternalError(absl::string_view message)
Definition: third_party/abseil-cpp/absl/status/status.cc:347
grpc_create_binder_transport_client
grpc_transport * grpc_create_binder_transport_client(std::unique_ptr< grpc_binder::Binder > endpoint_binder, std::shared_ptr< grpc::experimental::binder::SecurityPolicy > security_policy)
Definition: binder_transport.cc:737
grpc_core::Arena
Definition: src/core/lib/resource_quota/arena.h:45
grpc_transport_perform_stream_op
void grpc_transport_perform_stream_op(grpc_transport *transport, grpc_stream *stream, grpc_transport_stream_op_batch *op)
Definition: transport.cc:108
message
char * message
Definition: libuv/docs/code/tty-gravity/main.c:12
testing::Test
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:402
arena
grpc_core::ScopedArenaPtr arena
Definition: binder_transport_test.cc:237
ref_
grpc_stream_refcount ref_
Definition: binder_transport_test.cc:106
EXPECT_EQ
#define EXPECT_EQ(a, b)
Definition: iomgr/time_averaged_stats_test.cc:27
phony_transport::PerformStreamOp
void PerformStreamOp(grpc_transport *, grpc_stream *, grpc_transport_stream_op_batch *op)
Definition: bm_call_create.cc:430
grpc_core::ScopedArenaPtr
std::unique_ptr< Arena, ScopedArenaDeleter > ScopedArenaPtr
Definition: src/core/lib/resource_quota/arena.h:129
absl::Notification
Definition: abseil-cpp/absl/synchronization/notification.h:66
grpc_binder_transport::transport_stream_receiver
std::shared_ptr< grpc_binder::TransportStreamReceiver > transport_stream_receiver
Definition: binder_transport.h:63
grpc_binder_stream
Definition: binder_stream.h:50
closure_
grpc_closure closure_
Definition: binder_transport_test.cc:125
ready
MockGrpcClosure ready
Definition: binder_transport_test.cc:287
binder_security_policy.h
grpc_core::slice_detail::CopyConstructors< Slice >::FromCopiedString
static Slice FromCopiedString(const char *s)
Definition: src/core/lib/slice/slice.h:173
grpc_status._async.trailing_metadata
trailing_metadata
Definition: grpcio_status/grpc_status/_async.py:36
grpc_binder::MATCHER_P
MATCHER_P(StrEqInt8Ptr, target, "")
Definition: wire_writer_test.cc:33
absl::StrJoin
std::string StrJoin(Iterator start, Iterator end, absl::string_view sep, Formatter &&fmt)
Definition: abseil-cpp/absl/strings/str_join.h:239
gen_stats_data.c_str
def c_str(s, encoding='ascii')
Definition: gen_stats_data.py:38
send_message
Definition: send_message.py:1
grpc_core::ExecCtx::Flush
bool Flush()
Definition: exec_ctx.cc:69
EXPECT_NE
#define EXPECT_NE(val1, val2)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2028
testing::InSequence
Definition: cares/cares/test/gmock-1.8.0/gmock/gmock.h:9838
grpc_transport_destroy
void grpc_transport_destroy(grpc_transport *transport)
Definition: transport.cc:96
grpc.h
main
int main(int argc, char **argv)
Definition: binder_transport_test.cc:728
grpc_binder_transport
Definition: binder_transport.h:45
absl::optional< grpc_core::SliceBuffer >
grpc_initial_metadata
grpc_metadata_batch grpc_initial_metadata
Definition: binder_transport_test.cc:239
arg
Definition: cmdline.cc:40
absl::StrContains
ABSL_NAMESPACE_BEGIN bool StrContains(absl::string_view haystack, absl::string_view needle) noexcept
Definition: third_party/abseil-cpp/absl/strings/match.h:46
grpc_core::ResourceQuota::Default
static ResourceQuotaRefPtr Default()
Definition: resource_quota.cc:27
grpc_binder_transport::wire_writer
std::shared_ptr< grpc_binder::WireWriter > wire_writer
Definition: binder_transport.h:65
RUN_ALL_TESTS
int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:2471
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
resource_quota.h
grpc_core::SliceBuffer::Append
void Append(Slice slice)
Definition: slice/slice_buffer.cc:38
grpc_core::ExecCtx
Definition: exec_ctx.h:97
arena_
grpc_core::Arena * arena_
Definition: binder_transport_test.cc:104
Json::ValueType
ValueType
Type of the value held by a Value object.
Definition: third_party/bloaty/third_party/protobuf/conformance/third_party/jsoncpp/json.h:463
msg
std::string msg
Definition: client_interceptors_end2end_test.cc:372
grpc_core::Arena::Destroy
size_t Destroy()
Definition: src/core/lib/resource_quota/arena.cc:73
stream_buffer_
std::vector< grpc_binder_stream * > stream_buffer_
Definition: binder_transport_test.cc:107
EXPECT_CALL
#define EXPECT_CALL(obj, call)
message_data
void * message_data(MessageHeader *msg)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/message.c:250
test_config.h
value
const char * value
Definition: hpack_parser_table.cc:165
grpc_transport_stream_op_batch_payload
Definition: transport.h:341
grpc_binder::kFlagPrefix
const int kFlagPrefix
Definition: transaction.cc:23
benchmark.md
md
Definition: benchmark.py:86
testing::InitGoogleTest
GTEST_API_ void InitGoogleTest(int *argc, char **argv)
Definition: bloaty/third_party/googletest/googletest/src/gtest.cc:6106
grpc_core::SliceBuffer
Definition: src/core/lib/slice/slice_buffer.h:44
key
const char * key
Definition: hpack_parser_table.cc:164
grpc_transport_stream_size
size_t grpc_transport_stream_size(grpc_transport *transport)
Definition: transport.cc:92
send_stream
grpc_core::SliceBuffer send_stream
Definition: binder_transport_test.cc:251
notification
Definition: alts_tsi_handshaker_test.cc:76
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
binder_stream.h
grpc_error_std_string
std::string grpc_error_std_string(grpc_error_handle error)
Definition: error.cc:944
grpc_binder::TEST_F
TEST_F(BinderTransportTest, CreateBinderTransport)
Definition: binder_transport_test.cc:363
grpc_binder::kFlagSuffix
const int kFlagSuffix
Definition: transaction.cc:25
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc::testing::TestEnvironment
Definition: test/core/util/test_config.h:54
Expectation
Definition: cq_verifier.cc:56
grpc_binder::kFlagMessageData
const int kFlagMessageData
Definition: transaction.cc:24
arg
struct arg arg
MOCK_METHOD
#define MOCK_METHOD(...)
Definition: bloaty/third_party/googletest/googlemock/include/gmock/gmock-function-mocker.h:42
GRPC_STREAM_REF_INIT
#define GRPC_STREAM_REF_INIT(rc, ir, cb, cb_arg, objtype)
Definition: transport.h:190
grpc_transport
Definition: transport_impl.h:89
grpc_stream
struct grpc_stream grpc_stream
Definition: transport.h:174
EXPECT_TRUE
#define EXPECT_TRUE(condition)
Definition: bloaty/third_party/googletest/googletest/include/gtest/gtest.h:1967
absl
Definition: abseil-cpp/absl/algorithm/algorithm.h:31
grpc_binder::Metadata
std::vector< std::pair< std::string, std::string > > Metadata
Definition: transaction.h:38
grpc_binder::kFirstCallId
const int kFirstCallId
Definition: binder_constants.cc:26
grpc_init
GRPCAPI void grpc_init(void)
Definition: init.cc:146
grpc_error
Definition: error_internal.h:42
grpc_binder_stream::t
grpc_binder_transport * t
Definition: binder_stream.h:80
grpc_metadata_batch
Definition: metadata_batch.h:1259
grpc_core::MetadataMap::Encode
void Encode(Encoder *encoder) const
Definition: metadata_batch.h:1011
gen_server_registered_method_bad_client_test_body.payload
list payload
Definition: gen_server_registered_method_bad_client_test_body.py:40
grpc_transport_stream_op_batch
Definition: transport.h:284
to_string
static bool to_string(zval *from)
Definition: protobuf/php/ext/google/protobuf/convert.c:333
grpc_closure
Definition: closure.h:56
op
static grpc_op * op
Definition: test/core/fling/client.cc:47
metadata_
Metadata metadata_
Definition: binder_transport_test.cc:202
send_initial_metadata
static void send_initial_metadata(void)
Definition: test/core/fling/server.cc:121
grpc_shutdown
GRPCAPI void grpc_shutdown(void)
Definition: init.cc:209
grpc_transport_init_stream
int grpc_transport_init_stream(grpc_transport *transport, grpc_stream *stream, grpc_stream_refcount *refcount, const void *server_data, grpc_core::Arena *arena)
Definition: transport.cc:100
g_memory_allocator
static auto * g_memory_allocator
Definition: binder_transport_test.cc:40
grpc_core::ExecCtx::Get
static ExecCtx * Get()
Definition: exec_ctx.h:205
grpc_stream_refcount
Definition: transport.h:178
binder_transport.h
notification_
absl::Notification * notification_
Definition: binder_transport_test.cc:122


grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:48