25 #include <gtest/gtest.h>
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"
47 using ::testing::Expectation;
48 using ::testing::NiceMock;
59 grpc::experimental::binder::UntrustedSecurityPolicy>())) {
61 gbt->
wire_writer = absl::make_unique<MockWireWriter>();
65 ~BinderTransportTest()
override {
70 gbs->~grpc_binder_stream();
95 MockWireWriter& GetWireWriter() {
96 return *
reinterpret_cast<MockWireWriter*
>(
97 GetBinderTransport()->wire_writer.get());
100 static void SetUpTestSuite() {
grpc_init(); }
112 class MockGrpcClosure {
129 MockGrpcClosure* mock_closure =
static_cast<MockGrpcClosure*
>(
arg);
130 mock_closure->Callback(
error);
131 if (mock_closure->notification_) {
132 mock_closure->notification_->Notify();
141 [](
std::string*
out,
const std::pair<std::string, std::string>& kv) {
143 absl::StrCat(
"\"", kv.first,
"\": \"", kv.second,
"\""));
149 std::sort(
a.begin(),
a.end());
150 std::sort(
b.begin(),
b.end());
158 if (
arg->GetFlags() !=
flag)
return false;
160 if (
arg->GetMethodRef() != method_ref) {
161 printf(
"METHOD REF NOT EQ: %s %s\n",
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());
185 class MetadataEncoder {
192 template <
typename Which>
210 MetadataEncoder encoder;
216 struct MakeSendInitialMetadata {
217 MakeSendInitialMetadata(
const Metadata& initial_metadata,
220 for (
const auto&
md : initial_metadata) {
227 if (!method_ref.empty()) {
231 op->send_initial_metadata =
true;
232 op->payload->send_initial_metadata.send_initial_metadata =
235 ~MakeSendInitialMetadata() {}
242 struct MakeSendMessage {
247 op->send_message =
true;
254 struct MakeSendTrailingMetadata {
259 op->send_trailing_metadata =
true;
260 op->payload->send_trailing_metadata.send_trailing_metadata =
269 struct MakeRecvInitialMetadata {
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();
285 ~MakeRecvInitialMetadata() {}
294 struct MakeRecvMessage {
298 op->recv_message =
true;
300 op->payload->recv_message.recv_message_ready =
ready.GetGrpcClosure();
308 MockGrpcClosure
ready;
313 struct MakeRecvTrailingMetadata {
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();
329 ~MakeRecvTrailingMetadata() {}
331 MockGrpcClosure
ready;
345 constexpr
char kDefaultMethodRef[] =
"/some/path";
346 constexpr
char kDefaultMessage[] =
"binder transport message";
347 constexpr
int kDefaultStatus = 0x1234;
351 result.emplace_back(
":path", method_ref);
363 TEST_F(BinderTransportTest, CreateBinderTransport) {
367 TEST_F(BinderTransportTest, TransactionIdIncrement) {
379 TEST_F(BinderTransportTest, PerformSendInitialMetadata) {
385 const Metadata kInitialMetadata = kDefaultMetadata;
387 MockGrpcClosure mock_on_complete;
388 op.on_complete = mock_on_complete.GetGrpcClosure();
391 EXPECT_CALL(GetWireWriter(), RpcCall(TransactionMatches(
399 TEST_F(BinderTransportTest, PerformSendInitialMetadataMethodRef) {
405 const Metadata kInitialMetadata = kDefaultMetadata;
409 MockGrpcClosure mock_on_complete;
410 op.on_complete = mock_on_complete.GetGrpcClosure();
414 RpcCall(TransactionMatches(
kFlagPrefix, kMethodRef.substr(1),
415 kInitialMetadata,
"")));
422 TEST_F(BinderTransportTest, PerformSendMessage) {
431 MockGrpcClosure mock_on_complete;
432 op.on_complete = mock_on_complete.GetGrpcClosure();
444 TEST_F(BinderTransportTest, PerformSendTrailingMetadata) {
453 const Metadata kTrailingMetadata = {};
454 MakeSendTrailingMetadata send_trailing_metadata(kTrailingMetadata, &
op);
455 MockGrpcClosure mock_on_complete;
456 op.on_complete = mock_on_complete.GetGrpcClosure();
459 EXPECT_CALL(GetWireWriter(), RpcCall(TransactionMatches(
467 TEST_F(BinderTransportTest, PerformSendAll) {
474 const Metadata kInitialMetadata = kDefaultMetadata;
485 const Metadata kTrailingMetadata = {};
486 MakeSendTrailingMetadata send_trailing_metadata(kTrailingMetadata, &
op);
488 MockGrpcClosure mock_on_complete;
489 op.on_complete = mock_on_complete.GetGrpcClosure();
493 RpcCall(TransactionMatches(
495 kMethodRef.substr(1), kInitialMetadata, kMessage)));
502 TEST_F(BinderTransportTest, PerformRecvInitialMetadata) {
509 MakeRecvInitialMetadata recv_initial_metadata(&
op);
511 const Metadata kInitialMetadata = kDefaultMetadata;
517 recv_initial_metadata.notification.WaitForNotification();
519 VerifyMetadataEqual(kInitialMetadata,
520 recv_initial_metadata.grpc_initial_metadata);
523 TEST_F(BinderTransportTest, PerformRecvInitialMetadataWithMethodRef) {
530 MakeRecvInitialMetadata recv_initial_metadata(&
op);
533 const Metadata kInitialMetadataWithMethodRef =
534 AppendMethodRef(kDefaultMetadata, kDefaultMethodRef);
535 gbt->transport_stream_receiver->NotifyRecvInitialMetadata(
536 gbs->
tx_code, kInitialMetadataWithMethodRef);
539 recv_initial_metadata.notification.WaitForNotification();
541 VerifyMetadataEqual(kInitialMetadataWithMethodRef,
542 recv_initial_metadata.grpc_initial_metadata);
545 TEST_F(BinderTransportTest, PerformRecvMessage) {
552 MakeRecvMessage recv_message(&
op);
556 gbt->transport_stream_receiver->NotifyRecvMessage(gbs->
tx_code, kMessage);
560 recv_message.notification.WaitForNotification();
562 EXPECT_EQ(kMessage, recv_message.grpc_message->JoinIntoString());
565 TEST_F(BinderTransportTest, PerformRecvTrailingMetadata) {
572 MakeRecvTrailingMetadata recv_trailing_metadata(&
op);
574 const Metadata kTrailingMetadata = kDefaultMetadata;
576 constexpr
int kStatus = kDefaultStatus;
578 gbs->
tx_code, kTrailingMetadata, kStatus);
581 recv_trailing_metadata.notification.WaitForNotification();
583 VerifyMetadataEqual(AppendStatus(kTrailingMetadata, kStatus),
584 recv_trailing_metadata.grpc_trailing_metadata);
587 TEST_F(BinderTransportTest, PerformRecvAll) {
594 MakeRecvInitialMetadata recv_initial_metadata(&
op);
595 MakeRecvMessage recv_message(&
op);
596 MakeRecvTrailingMetadata recv_trailing_metadata(&
op);
599 const Metadata kInitialMetadataWithMethodRef =
600 AppendMethodRef(kDefaultMetadata, kDefaultMethodRef);
601 gbt->transport_stream_receiver->NotifyRecvInitialMetadata(
602 gbs->
tx_code, kInitialMetadataWithMethodRef);
605 gbt->transport_stream_receiver->NotifyRecvMessage(gbs->
tx_code, kMessage);
608 constexpr
int kStatus = kDefaultStatus;
609 gbt->transport_stream_receiver->NotifyRecvTrailingMetadata(
613 recv_trailing_metadata.notification.WaitForNotification();
615 VerifyMetadataEqual(kInitialMetadataWithMethodRef,
616 recv_initial_metadata.grpc_initial_metadata);
619 recv_trailing_metadata.grpc_trailing_metadata);
620 EXPECT_EQ(kMessage, recv_message.grpc_message->JoinIntoString());
623 TEST_F(BinderTransportTest, PerformAllOps) {
630 const Metadata kSendInitialMetadata = kDefaultMetadata;
641 const Metadata kSendTrailingMetadata = {};
642 MakeSendTrailingMetadata send_trailing_metadata(kSendTrailingMetadata, &
op);
644 MockGrpcClosure mock_on_complete;
645 op.on_complete = mock_on_complete.GetGrpcClosure();
651 RpcCall(TransactionMatches(
653 kMethodRef.substr(1), kSendInitialMetadata, kSendMessage)));
657 MakeRecvInitialMetadata recv_initial_metadata(
659 MakeRecvMessage recv_message(&
op, &on_complete);
660 MakeRecvTrailingMetadata recv_trailing_metadata(
670 const Metadata kRecvInitialMetadata =
671 AppendMethodRef(kDefaultMetadata, kDefaultMethodRef);
672 gbt->transport_stream_receiver->NotifyRecvInitialMetadata(
673 gbs->
tx_code, kRecvInitialMetadata);
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);
682 recv_initial_metadata.notification.WaitForNotification();
683 recv_message.notification.WaitForNotification();
684 recv_trailing_metadata.notification.WaitForNotification();
686 VerifyMetadataEqual(kRecvInitialMetadata,
687 recv_initial_metadata.grpc_initial_metadata);
688 VerifyMetadataEqual(AppendStatus(kRecvTrailingMetadata, kStatus),
689 recv_trailing_metadata.grpc_trailing_metadata);
691 EXPECT_EQ(kRecvMessage, recv_message.grpc_message->JoinIntoString());
694 TEST_F(BinderTransportTest, WireWriterRpcCallErrorPropagates) {
698 MockGrpcClosure mock_on_complete1;
699 MockGrpcClosure mock_on_complete2;
706 Callback(GrpcErrorMessageContains(
"WireWriter::RpcCall failed")));
708 const Metadata kInitialMetadata = {};
711 op1.payload = &payload1;
712 MakeSendInitialMetadata send_initial_metadata1(kInitialMetadata,
"", &op1);
713 op1.on_complete = mock_on_complete1.GetGrpcClosure();
717 op2.payload = &payload2;
718 MakeSendInitialMetadata send_initial_metadata2(kInitialMetadata,
"", &op2);
719 op2.on_complete = mock_on_complete2.GetGrpcClosure();
728 int main(
int argc,
char** argv) {