fake_binder.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 
16 
17 #include <string>
18 #include <utility>
19 
20 #include <grpc/support/log.h>
21 
22 namespace grpc_binder {
23 namespace end2end_testing {
24 
26 
28 
30  data_.push_back(data);
31  data_size_ += sizeof(int32_t);
32  return absl::OkStatus();
33 }
34 
36  data_.push_back(data);
37  data_size_ += sizeof(int64_t);
38  return absl::OkStatus();
39 }
40 
42  data_.push_back(binder->GetRawBinder());
43  data_size_ += sizeof(void*);
44  return absl::OkStatus();
45 }
46 
48  data_.push_back(std::string(s));
49  data_size_ += s.size();
50  return absl::OkStatus();
51 }
52 
54  int32_t length) {
55  data_.push_back(std::vector<int8_t>(buffer, buffer + length));
56  data_size_ += length;
57  return absl::OkStatus();
58 }
59 
61 
63  if (data_position_ >= data_.size() ||
64  !absl::holds_alternative<int32_t>(data_[data_position_])) {
65  return absl::InternalError("ReadInt32 failed");
66  }
67  *data = absl::get<int32_t>(data_[data_position_++]);
68  return absl::OkStatus();
69 }
70 
72  if (data_position_ >= data_.size() ||
73  !absl::holds_alternative<int64_t>(data_[data_position_])) {
74  return absl::InternalError("ReadInt64 failed");
75  }
76  *data = absl::get<int64_t>(data_[data_position_++]);
77  return absl::OkStatus();
78 }
79 
81  if (data_position_ >= data_.size() ||
82  !absl::holds_alternative<void*>(data_[data_position_])) {
83  return absl::InternalError("ReadBinder failed");
84  }
85  void* endpoint = absl::get<void*>(data_[data_position_++]);
86  if (!endpoint) return absl::InternalError("ReadBinder failed");
87  *data = absl::make_unique<FakeBinder>(static_cast<FakeEndpoint*>(endpoint));
88  return absl::OkStatus();
89 }
90 
92  if (data_position_ >= data_.size() ||
93  !absl::holds_alternative<std::string>(data_[data_position_])) {
94  return absl::InternalError("ReadString failed");
95  }
96  *str = absl::get<std::string>(data_[data_position_++]);
97  return absl::OkStatus();
98 }
99 
101  if (data_position_ >= data_.size() ||
102  !absl::holds_alternative<std::vector<int8_t>>(data_[data_position_])) {
103  return absl::InternalError("ReadByteArray failed");
104  }
105  const std::vector<int8_t>& byte_array =
106  absl::get<std::vector<int8_t>>(data_[data_position_++]);
107  data->resize(byte_array.size());
108  for (size_t i = 0; i < byte_array.size(); ++i) {
109  (*data)[i] = byte_array[i];
110  }
111  return absl::OkStatus();
112 }
113 
116  input_->MoveData());
117  return absl::OkStatus();
118 }
119 
121  grpc_core::RefCountedPtr<WireReader> wire_reader_ref,
122  TransactionReceiver::OnTransactCb transact_cb) {
124  std::move(wire_reader_ref), std::move(transact_cb),
125  absl::make_unique<FakeBinderTunnel>());
126 }
127 
128 std::unique_ptr<TransactionReceiver> FakeBinder::ConstructTxReceiver(
129  grpc_core::RefCountedPtr<WireReader> wire_reader_ref,
131  return absl::make_unique<FakeTransactionReceiver>(wire_reader_ref, cb);
132 }
133 
135  return persistent_tx_receiver_->tunnel_->GetSendEndpoint();
136 }
137 
138 std::unique_ptr<Binder> FakeTransactionReceiver::GetSender() const {
139  return absl::make_unique<FakeBinder>(
140  persistent_tx_receiver_->tunnel_->GetSendEndpoint());
141 }
142 
144  grpc_core::RefCountedPtr<WireReader> wire_reader_ref,
146  std::unique_ptr<FakeBinderTunnel> tunnel)
147  : wire_reader_ref_(std::move(wire_reader_ref)),
148  callback_(std::move(cb)),
149  tunnel_(std::move(tunnel)) {
150  FakeEndpoint* recv_endpoint = tunnel_->GetRecvEndpoint();
151  recv_endpoint->owner = this;
152 }
153 
155  : delay_nsec_(absl::ToInt64Nanoseconds(delay)),
156  tx_thread_(
157  "process-thread",
158  [](void* arg) {
160  auto* self = static_cast<TransactionProcessor*>(arg);
161  self->ProcessLoop();
162  },
163  this),
164  terminated_(false) {
165  tx_thread_.Start();
166 }
167 
170 }
171 
173  if (!terminated_.load(std::memory_order_seq_cst)) {
174  gpr_log(GPR_INFO, "Terminating the processor");
175  terminated_.store(true, std::memory_order_seq_cst);
176  tx_thread_.Join();
177  gpr_log(GPR_INFO, "Processor terminated");
178  }
179 }
180 
183  if (now < deliver_time_) {
184  absl::Duration diff = deliver_time_ - now;
185  // Release the lock before going to sleep.
186  mu_.Unlock();
188  mu_.Lock();
189  }
190 }
191 
193  while (true) {
194  FakeEndpoint* target = nullptr;
196  FakeData data;
197  mu_.Lock();
198  if (tx_queue_.empty()) {
199  mu_.Unlock();
200  break;
201  }
203  std::tie(target, tx_code, data) = std::move(tx_queue_.front());
204  tx_queue_.pop();
205  if (!tx_queue_.empty()) {
206  deliver_time_ = absl::Now() + GetRandomDelay();
207  }
208  mu_.Unlock();
209  auto* tx_receiver =
210  static_cast<PersistentFakeTransactionReceiver*>(target->owner);
211  auto parcel = absl::make_unique<FakeReadableParcel>(std::move(data));
212  tx_receiver->Receive(tx_code, parcel.get()).IgnoreError();
213  }
214 }
215 
217  while (!terminated_.load(std::memory_order_seq_cst)) {
218  FakeEndpoint* target = nullptr;
220  FakeData data;
221  mu_.Lock();
222  if (tx_queue_.empty()) {
223  mu_.Unlock();
224  continue;
225  }
227  std::tie(target, tx_code, data) = std::move(tx_queue_.front());
228  tx_queue_.pop();
229  if (!tx_queue_.empty()) {
230  deliver_time_ = absl::Now() + GetRandomDelay();
231  }
232  mu_.Unlock();
233  auto* tx_receiver =
234  static_cast<PersistentFakeTransactionReceiver*>(target->owner);
235  auto parcel = absl::make_unique<FakeReadableParcel>(std::move(data));
236  tx_receiver->Receive(tx_code, parcel.get()).IgnoreError();
238  }
239  Flush();
240 }
241 
243  int64_t delay =
244  absl::Uniform<int64_t>(bit_gen_, delay_nsec_ / 2, delay_nsec_);
245  return absl::Nanoseconds(delay);
246 }
247 
250  FakeData data) {
251  grpc_core::MutexLock lock(&mu_);
252  if (tx_queue_.empty()) {
253  // This is the first transaction in the queue. Compute its deliver time.
254  deliver_time_ = absl::Now() + GetRandomDelay();
255  }
256  tx_queue_.emplace(target, tx_code, std::move(data));
257 }
258 
260  : send_endpoint_(absl::make_unique<FakeEndpoint>(this)),
261  recv_endpoint_(absl::make_unique<FakeEndpoint>(this)) {
262  send_endpoint_->other_end = recv_endpoint_.get();
263  recv_endpoint_->other_end = send_endpoint_.get();
264 }
265 
266 std::pair<std::unique_ptr<Binder>, std::unique_ptr<TransactionReceiver>>
268  auto tx_receiver = absl::make_unique<FakeTransactionReceiver>(
269  nullptr, std::move(transact_cb));
270  std::unique_ptr<Binder> sender = tx_receiver->GetSender();
271  return std::make_pair(std::move(sender), std::move(tx_receiver));
272 }
273 
274 } // namespace end2end_testing
275 } // namespace grpc_binder
xds_interop_client.str
str
Definition: xds_interop_client.py:487
grpc_binder::end2end_testing::FakeReadableParcel::data_size_
int32_t data_size_
Definition: fake_binder.h:131
grpc_binder::end2end_testing::PersistentFakeTransactionReceiver::tunnel_
std::unique_ptr< FakeBinderTunnel > tunnel_
Definition: fake_binder.h:193
GPR_INFO
#define GPR_INFO
Definition: include/grpc/impl/codegen/log.h:56
now
static double now(void)
Definition: test/core/fling/client.cc:130
grpc_binder::end2end_testing::FakeEndpoint::owner
void * owner
Definition: fake_binder.h:148
log.h
grpc_binder::end2end_testing::FakeEndpoint::tunnel
FakeBinderTunnel * tunnel
Definition: fake_binder.h:144
absl::Time
Definition: third_party/abseil-cpp/absl/time/time.h:642
grpc_binder::end2end_testing::FakeWritableParcel::WriteString
absl::Status WriteString(absl::string_view s) override
Definition: fake_binder.cc:47
grpc_binder::end2end_testing::FakeWritableParcel::WriteInt64
absl::Status WriteInt64(int64_t data) override
Definition: fake_binder.cc:35
grpc_binder::end2end_testing::FakeWritableParcel::GetDataSize
int32_t GetDataSize() const override
Definition: fake_binder.cc:27
grpc_binder::end2end_testing::FakeReadableParcel::ReadString
absl::Status ReadString(std::string *str) override
Definition: fake_binder.cc:91
grpc_core::MutexLock
Definition: src/core/lib/gprpp/sync.h:88
grpc_binder::end2end_testing::TransactionProcessor::GetRandomDelay
absl::Duration GetRandomDelay()
Definition: fake_binder.cc:242
absl::Nanoseconds
constexpr Duration Nanoseconds(T n)
Definition: third_party/abseil-cpp/absl/time/time.h:407
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
grpc_binder
Definition: connection_id_generator.cc:45
grpc_binder::end2end_testing::FakeEndpoint
Definition: fake_binder.h:140
grpc_binder::end2end_testing::FakeTransactionReceiver::GetRawBinder
void * GetRawBinder() override
Definition: fake_binder.cc:134
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_binder::end2end_testing::FakeBinder::Transact
absl::Status Transact(BinderTransportTxCode tx_code) override
Definition: fake_binder.cc:114
absl::OkStatus
Status OkStatus()
Definition: third_party/abseil-cpp/absl/status/status.h:882
grpc_binder::end2end_testing::TransactionProcessor::Flush
void Flush()
Definition: fake_binder.cc:192
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
absl::SleepFor
void SleepFor(absl::Duration duration)
Definition: abseil-cpp/absl/time/clock.h:70
grpc_binder::end2end_testing::TransactionProcessor::EnQueueTransaction
void EnQueueTransaction(FakeEndpoint *target, BinderTransportTxCode tx_code, FakeData data)
Definition: fake_binder.cc:248
tx_code
int tx_code
Definition: fake_binder_test.cc:241
grpc_binder::end2end_testing::FakeWritableParcel::WriteBinder
absl::Status WriteBinder(HasRawBinder *binder) override
Definition: fake_binder.cc:41
grpc_binder::BinderTransportTxCode
BinderTransportTxCode
Definition: binder_constants.h:31
grpc_binder::end2end_testing::FakeReadableParcel::ReadBinder
absl::Status ReadBinder(std::unique_ptr< Binder > *data) override
Definition: fake_binder.cc:80
grpc_binder::end2end_testing::FakeBinderTunnel::send_endpoint_
std::unique_ptr< FakeEndpoint > send_endpoint_
Definition: fake_binder.h:297
grpc_binder::end2end_testing::TransactionProcessor::WaitForNextTransaction
void WaitForNextTransaction() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_)
Definition: fake_binder.cc:181
grpc_core::RefCountedPtr
Definition: ref_counted_ptr.h:35
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
grpc_core::Mutex::Lock
void Lock() ABSL_EXCLUSIVE_LOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:69
int64_t
signed __int64 int64_t
Definition: stdint-msvc2008.h:89
grpc_binder::end2end_testing::TransactionProcessor::NewPersistentTxReceiver
PersistentFakeTransactionReceiver & NewPersistentTxReceiver(grpc_core::RefCountedPtr< WireReader > wire_reader_ref, TransactionReceiver::OnTransactCb cb, std::unique_ptr< FakeBinderTunnel > tunnel)
Definition: fake_binder.h:247
grpc_core::ExecCtx::Flush
bool Flush()
Definition: exec_ctx.cc:69
gpr_log
GPRAPI void gpr_log(const char *file, int line, gpr_log_severity severity, const char *format,...) GPR_PRINT_FORMAT_CHECK(4
grpc_binder::end2end_testing::FakeReadableParcel::data_
const FakeData data_
Definition: fake_binder.h:129
bm_diff.diff
diff
Definition: bm_diff.py:274
arg
Definition: cmdline.cc:40
absl::Duration
Definition: third_party/abseil-cpp/absl/time/time.h:159
grpc_core::Thread::Join
void Join()
Definition: thd.h:141
grpc_binder::end2end_testing::FakeTransactionReceiver::persistent_tx_receiver_
PersistentFakeTransactionReceiver * persistent_tx_receiver_
Definition: fake_binder.h:171
grpc_binder::end2end_testing::TransactionProcessor::bit_gen_
absl::BitGen bit_gen_
Definition: fake_binder.h:265
data
char data[kBufferLength]
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1006
buffer
char buffer[1024]
Definition: libuv/docs/code/idle-compute/main.c:8
absl::holds_alternative
constexpr bool holds_alternative(const variant< Types... > &v) noexcept
Definition: abseil-cpp/absl/types/variant.h:264
grpc_binder::end2end_testing::TransactionProcessor
Definition: fake_binder.h:230
grpc_core::ExecCtx
Definition: exec_ctx.h:97
grpc_binder::end2end_testing::TransactionProcessor::tx_thread_
grpc_core::Thread tx_thread_
Definition: fake_binder.h:266
grpc_core::Thread::Start
void Start()
Definition: thd.h:125
grpc_binder::end2end_testing::NewBinderPair
std::pair< std::unique_ptr< Binder >, std::unique_ptr< TransactionReceiver > > NewBinderPair(TransactionReceiver::OnTransactCb transact_cb)
Definition: fake_binder.cc:267
absl::Now
ABSL_NAMESPACE_BEGIN Time Now()
Definition: abseil-cpp/absl/time/clock.cc:39
grpc_core::Mutex::Unlock
void Unlock() ABSL_UNLOCK_FUNCTION()
Definition: src/core/lib/gprpp/sync.h:70
grpc_binder::end2end_testing::FakeWritableParcel::data_
FakeData data_
Definition: fake_binder.h:95
grpc_binder::end2end_testing::TransactionProcessor::Terminate
void Terminate()
Definition: fake_binder.cc:172
grpc_binder::end2end_testing::FakeReadableParcel::ReadInt64
absl::Status ReadInt64(int64_t *data) override
Definition: fake_binder.cc:71
grpc_binder::end2end_testing::TransactionProcessor::ProcessLoop
void ProcessLoop()
Definition: fake_binder.cc:216
grpc_binder::end2end_testing::FakeBinderTunnel::FakeBinderTunnel
FakeBinderTunnel()
Definition: fake_binder.cc:259
grpc_binder::end2end_testing::FakeReadableParcel::ReadInt32
absl::Status ReadInt32(int32_t *data) override
Definition: fake_binder.cc:62
grpc_binder::TransactionReceiver::OnTransactCb
std::function< absl::Status(transaction_code_t, ReadableParcel *, int uid)> OnTransactCb
Definition: binder.h:80
grpc_binder::end2end_testing::FakeReadableParcel::ReadByteArray
absl::Status ReadByteArray(std::string *data) override
Definition: fake_binder.cc:100
grpc_binder::end2end_testing::TransactionProcessor::terminated_
std::atomic< bool > terminated_
Definition: fake_binder.h:267
exec_ctx
grpc_core::ExecCtx exec_ctx
Definition: end2end_binder_transport_test.cc:75
absl::Status
Definition: third_party/abseil-cpp/absl/status/status.h:424
grpc_binder::end2end_testing::FakeTransactionReceiver::FakeTransactionReceiver
FakeTransactionReceiver(grpc_core::RefCountedPtr< WireReader > wire_reader_ref, TransactionReceiver::OnTransactCb cb)
Definition: fake_binder.cc:120
grpc_binder::end2end_testing::FakeBinderTunnel::EnQueueTransaction
void EnQueueTransaction(FakeEndpoint *target, BinderTransportTxCode tx_code, FakeData data)
Definition: fake_binder.h:287
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc_binder::end2end_testing::FakeBinder::endpoint_
FakeEndpoint * endpoint_
Definition: fake_binder.h:222
arg
struct arg arg
grpc_binder::end2end_testing::FakeEndpoint::other_end
FakeEndpoint * other_end
Definition: fake_binder.h:143
grpc_binder::end2end_testing::TransactionProcessor::delay_nsec_
int64_t delay_nsec_
Definition: fake_binder.h:264
grpc_binder::end2end_testing::TransactionProcessor::TransactionProcessor
TransactionProcessor(absl::Duration delay=absl::ZeroDuration())
Definition: fake_binder.cc:154
grpc_binder::end2end_testing::PersistentFakeTransactionReceiver
Definition: fake_binder.h:178
grpc_binder::HasRawBinder::GetRawBinder
virtual void * GetRawBinder()=0
grpc_binder::end2end_testing::FakeData
std::vector< absl::variant< int32_t, int64_t, void *, std::string, std::vector< int8_t > >> FakeData
Definition: fake_binder.h:76
grpc_binder::end2end_testing::FakeBinder::ConstructTxReceiver
std::unique_ptr< TransactionReceiver > ConstructTxReceiver(grpc_core::RefCountedPtr< WireReader > wire_reader_ref, TransactionReceiver::OnTransactCb transact_cb) const override
Definition: fake_binder.cc:128
grpc_binder::end2end_testing::FakeWritableParcel::WriteInt32
absl::Status WriteInt32(int32_t data) override
Definition: fake_binder.cc:29
grpc_binder::end2end_testing::FakeReadableParcel::data_position_
size_t data_position_
Definition: fake_binder.h:130
absl
Definition: abseil-cpp/absl/algorithm/algorithm.h:31
grpc_binder::end2end_testing::PersistentFakeTransactionReceiver::PersistentFakeTransactionReceiver
PersistentFakeTransactionReceiver(grpc_core::RefCountedPtr< WireReader > wire_reader_ref, TransactionReceiver::OnTransactCb cb, std::unique_ptr< FakeBinderTunnel > tunnel)
Definition: fake_binder.cc:143
grpc_binder::HasRawBinder
Definition: binder.h:33
int8_t
signed char int8_t
Definition: stdint-msvc2008.h:75
fake_binder.h
grpc_binder::end2end_testing::FakeWritableParcel::WriteByteArray
absl::Status WriteByteArray(const int8_t *buffer, int32_t length) override
Definition: fake_binder.cc:53
grpc_binder::end2end_testing::FakeBinderTunnel::recv_endpoint_
std::unique_ptr< FakeEndpoint > recv_endpoint_
Definition: fake_binder.h:298
length
std::size_t length
Definition: abseil-cpp/absl/time/internal/test_util.cc:57
int32_t
signed int int32_t
Definition: stdint-msvc2008.h:77
grpc_binder::end2end_testing::FakeWritableParcel::data_size_
int32_t data_size_
Definition: fake_binder.h:96
grpc_binder::end2end_testing::TransactionProcessor::mu_
grpc_core::Mutex mu_
Definition: fake_binder.h:260
setup.target
target
Definition: third_party/bloaty/third_party/protobuf/python/setup.py:179
grpc_binder::end2end_testing::FakeBinder::input_
std::unique_ptr< FakeWritableParcel > input_
Definition: fake_binder.h:223
grpc_binder::end2end_testing::g_transaction_processor
TransactionProcessor * g_transaction_processor
Definition: fake_binder.cc:25
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
grpc_core::ExecCtx::Get
static ExecCtx * Get()
Definition: exec_ctx.h:205
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
grpc_binder::end2end_testing::TransactionProcessor::SetDelay
void SetDelay(absl::Duration delay)
Definition: fake_binder.cc:168
absl::ToInt64Nanoseconds
int64_t ToInt64Nanoseconds(Duration d)
Definition: abseil-cpp/absl/time/duration.cc:544
grpc_binder::end2end_testing::FakeTransactionReceiver::GetSender
std::unique_ptr< Binder > GetSender() const
Definition: fake_binder.cc:138
grpc_binder::end2end_testing::FakeReadableParcel::GetDataSize
int32_t GetDataSize() const override
Definition: fake_binder.cc:60


grpc
Author(s):
autogenerated on Fri May 16 2025 02:58:22