fake_binder.h
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 // A collection of fake objects that offers in-memory simulation of data
16 // transmission from one binder to another.
17 //
18 // Once the implementation of Binder is changed from BinderAndroid to
19 // FakeBinder, we'll be able to test and fuzz our end-to-end binder transport in
20 // a non-Android environment.
21 //
22 // The following diagram shows the high-level overview of how the in-memory
23 // simulation works (FakeReceiver means FakeTransactionReceiver).
24 //
25 // thread boundary
26 // |
27 // |
28 // ---------------- ---------------- | receive
29 // | FakeBinder | | FakeReceiver | <--|----------------
30 // ---------------- ---------------- | |
31 // | ^ | ------------------------
32 // | endpoint owner | | | TransactionProcessor |
33 // | | | ------------------------
34 // v | | ^
35 // ---------------- ---------------- | |
36 // | FakeEndpoint | --------> | FakeEndpoint | ---|----------------
37 // ---------------- other_end ---------------- | enqueue
38 // | ^ ^ | |
39 // | | recv_endpoint | | |
40 // | | | |
41 // | | send_endpoint | |
42 // v | | v
43 // -------------------------------------------
44 // | FakeBinderTunnel |
45 // -------------------------------------------
46 
47 #ifndef GRPC_TEST_CORE_TRANSPORT_BINDER_END2END_FAKE_BINDER_H
48 #define GRPC_TEST_CORE_TRANSPORT_BINDER_END2END_FAKE_BINDER_H
49 
50 #include <atomic>
51 #include <forward_list>
52 #include <memory>
53 #include <queue>
54 #include <string>
55 #include <thread>
56 #include <tuple>
57 #include <utility>
58 #include <vector>
59 
60 #include "absl/memory/memory.h"
61 #include "absl/random/random.h"
62 #include "absl/strings/str_format.h"
63 #include "absl/strings/string_view.h"
64 #include "absl/time/time.h"
65 #include "absl/types/variant.h"
66 
70 #include "src/core/lib/gprpp/thd.h"
71 
72 namespace grpc_binder {
73 namespace end2end_testing {
74 
75 using FakeData = std::vector<
77 
78 // A fake writable parcel.
79 //
80 // It simulates the functionalities of a real writable parcel and stores all
81 // written data in memory. The data can then be transferred by calling
82 // MoveData().
83 class FakeWritableParcel final : public WritableParcel {
84  public:
85  int32_t GetDataSize() const override;
88  absl::Status WriteBinder(HasRawBinder* binder) override;
91 
93 
94  private:
97 };
98 
99 // A fake readable parcel.
100 //
101 // It takes in the data transferred from a FakeWritableParcel and provides
102 // methods to retrieve those data in the receiving end.
103 class FakeReadableParcel final : public ReadableParcel {
104  public:
106  for (auto& d : data_) {
107  if (absl::holds_alternative<int32_t>(d)) {
108  data_size_ += sizeof(int32_t);
109  } else if (absl::holds_alternative<int64_t>(d)) {
110  data_size_ += sizeof(int64_t);
111  } else if (absl::holds_alternative<void*>(d)) {
112  data_size_ += sizeof(void*);
113  } else if (absl::holds_alternative<std::string>(d)) {
114  data_size_ += absl::get<std::string>(d).size();
115  } else {
116  data_size_ += absl::get<std::vector<int8_t>>(d).size();
117  }
118  }
119  }
120 
121  int32_t GetDataSize() const override;
122  absl::Status ReadInt32(int32_t* data) override;
123  absl::Status ReadInt64(int64_t* data) override;
124  absl::Status ReadBinder(std::unique_ptr<Binder>* data) override;
127 
128  private:
130  size_t data_position_ = 0;
132 };
133 
134 class FakeBinder;
135 class FakeBinderTunnel;
136 
137 // FakeEndpoint is a simple struct that holds the pointer to the other end, a
138 // pointer to the tunnel and a pointer to its owner. This tells the owner where
139 // the data should be sent.
140 struct FakeEndpoint {
142 
145  // The owner is either a FakeBinder (the sending part) or a
146  // FakeTransactionReceiver (the receiving part). Both parts hold an endpoint
147  // with |owner| pointing back to them and |other_end| pointing to each other.
148  void* owner;
149 };
150 
152 
153 // A fake transaction receiver.
154 //
155 // This is the receiving part of a pair of binders. When constructed, a binder
156 // tunnle is created, and the sending part can be retrieved by calling
157 // GetSender().
158 //
159 // It also provides a Receive() function to simulate the on-transaction
160 // callback of a real Android binder.
162  public:
165 
166  void* GetRawBinder() override;
167 
168  std::unique_ptr<Binder> GetSender() const;
169 
170  private:
172 };
173 
174 // A "persistent" version of the FakeTransactionReceiver. That is, its lifetime
175 // is managed by the processor and it outlives the wire reader and
176 // grpc_binder_transport, so we can safely dereference a pointer to it in
177 // ProcessLoop().
179  public:
181  grpc_core::RefCountedPtr<WireReader> wire_reader_ref,
183  std::unique_ptr<FakeBinderTunnel> tunnel);
184 
186  return callback_(static_cast<transaction_code_t>(tx_code), parcel,
187  /*uid=*/0);
188  }
189 
190  private:
193  std::unique_ptr<FakeBinderTunnel> tunnel_;
194 
196 };
197 
198 // The sending part of a binders pair. It provides a FakeWritableParcel to the
199 // user, and when Transact() is called, it transfers the written data to the
200 // other end of the tunnel by following the information in its endpoint.
201 class FakeBinder final : public Binder {
202  public:
203  explicit FakeBinder(FakeEndpoint* endpoint) : endpoint_(endpoint) {}
204 
205  void Initialize() override {}
207  input_ = absl::make_unique<FakeWritableParcel>();
208  return absl::OkStatus();
209  }
210 
212 
213  WritableParcel* GetWritableParcel() const override { return input_.get(); }
214 
215  std::unique_ptr<TransactionReceiver> ConstructTxReceiver(
216  grpc_core::RefCountedPtr<WireReader> wire_reader_ref,
217  TransactionReceiver::OnTransactCb transact_cb) const override;
218 
219  void* GetRawBinder() override { return endpoint_->other_end; }
220 
221  private:
223  std::unique_ptr<FakeWritableParcel> input_;
224 };
225 
226 // A transaction processor.
227 //
228 // Once constructed, it'll create a another thread that deliver in-coming
229 // transactions to their destinations.
231  public:
234 
235  void SetDelay(absl::Duration delay);
236 
237  void Terminate();
238  void ProcessLoop();
239  void Flush();
240 
241  // Issue a transaction with |target| pointing to the target endpoint. The
242  // transactions will be delivered in the same order they're issued, possibly
243  // with random delay to simulate real-world situation.
245  FakeData data);
246 
248  grpc_core::RefCountedPtr<WireReader> wire_reader_ref,
250  std::unique_ptr<FakeBinderTunnel> tunnel) {
252  storage_.emplace_front(wire_reader_ref, cb, std::move(tunnel));
253  return storage_.front();
254  }
255 
256  private:
259 
262  tx_queue_ ABSL_GUARDED_BY(mu_);
263  absl::Time deliver_time_ ABSL_GUARDED_BY(mu_);
267  std::atomic<bool> terminated_;
268 
270  // Use forward_list to avoid invalid pointers resulted by reallocation in
271  // containers such as std::vector.
274 };
275 
276 // The global (shared) processor. Test suite should be responsible of
277 // creating/deleting it.
279 
280 // A binder tunnel.
281 //
282 // It is a simple helper that creates and links two endpoints.
284  public:
286 
288  FakeData data) {
290  std::move(data));
291  }
292 
293  FakeEndpoint* GetSendEndpoint() const { return send_endpoint_.get(); }
294  FakeEndpoint* GetRecvEndpoint() const { return recv_endpoint_.get(); }
295 
296  private:
297  std::unique_ptr<FakeEndpoint> send_endpoint_;
298  std::unique_ptr<FakeEndpoint> recv_endpoint_;
299 };
300 
301 // A helper function for constructing a pair of connected binders.
302 std::pair<std::unique_ptr<Binder>, std::unique_ptr<TransactionReceiver>>
304 
305 } // namespace end2end_testing
306 } // namespace grpc_binder
307 
308 #endif // GRPC_TEST_CORE_TRANSPORT_BINDER_END2END_FAKE_BINDER_H
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
grpc_binder::end2end_testing::TransactionProcessor::~TransactionProcessor
~TransactionProcessor()
Definition: fake_binder.h:233
grpc_binder::end2end_testing::FakeEndpoint::owner
void * owner
Definition: fake_binder.h:148
grpc_binder::end2end_testing::FakeEndpoint::tunnel
FakeBinderTunnel * tunnel
Definition: fake_binder.h:144
grpc_binder::end2end_testing::FakeEndpoint::FakeEndpoint
FakeEndpoint(FakeBinderTunnel *tunnel)
Definition: fake_binder.h:141
absl::ZeroDuration
constexpr Duration ZeroDuration()
Definition: third_party/abseil-cpp/absl/time/time.h:308
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::TransactionProcessor::ABSL_GUARDED_BY
std::queue< std::tuple< FakeEndpoint *, BinderTransportTxCode, FakeData > > tx_queue_ ABSL_GUARDED_BY(mu_)
binder.h
grpc_binder::end2end_testing::FakeWritableParcel::GetDataSize
int32_t GetDataSize() const override
Definition: fake_binder.cc:27
grpc_core
Definition: call_metric_recorder.h:31
grpc_binder::end2end_testing::TransactionProcessor::tx_receiver_mu_
grpc_core::Mutex tx_receiver_mu_
Definition: fake_binder.h:269
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::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
grpc_binder::end2end_testing::PersistentFakeTransactionReceiver::wire_reader_ref_
grpc_core::RefCountedPtr< WireReader > wire_reader_ref_
Definition: fake_binder.h:191
transaction_code_t
uint32_t transaction_code_t
Definition: binder_constants.h:24
absl::OkStatus
Status OkStatus()
Definition: third_party/abseil-cpp/absl/status/status.h:882
grpc_binder::end2end_testing::FakeWritableParcel::MoveData
FakeData MoveData()
Definition: fake_binder.h:92
grpc_binder::end2end_testing::TransactionProcessor::Flush
void Flush()
Definition: fake_binder.cc:192
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
wire_reader.h
grpc_binder::end2end_testing::FakeReadableParcel::ReadBinder
absl::Status ReadBinder(std::unique_ptr< Binder > *data) override
Definition: fake_binder.cc:80
grpc_binder::end2end_testing::FakeBinder::GetRawBinder
void * GetRawBinder() override
Definition: fake_binder.h:219
grpc_binder::end2end_testing::FakeBinderTunnel::send_endpoint_
std::unique_ptr< FakeEndpoint > send_endpoint_
Definition: fake_binder.h:297
grpc_binder::end2end_testing::FakeTransactionReceiver
Definition: fake_binder.h:161
grpc_binder::end2end_testing::TransactionProcessor::WaitForNextTransaction
void WaitForNextTransaction() ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_)
Definition: fake_binder.cc:181
absl::BitGen
random_internal::NonsecureURBGBase< random_internal::randen_engine< uint64_t > > BitGen
Definition: abseil-cpp/absl/random/random.h:121
grpc_binder::TransactionReceiver
Definition: binder.h:77
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
queue
Definition: sync_test.cc:39
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_binder::end2end_testing::FakeBinderTunnel
Definition: fake_binder.h:283
ABSL_EXCLUSIVE_LOCKS_REQUIRED
#define ABSL_EXCLUSIVE_LOCKS_REQUIRED(...)
Definition: abseil-cpp/absl/base/thread_annotations.h:145
grpc_binder::end2end_testing::FakeReadableParcel::data_
const FakeData data_
Definition: fake_binder.h:129
absl::Duration
Definition: third_party/abseil-cpp/absl/time/time.h:159
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
grpc_binder::end2end_testing::FakeBinder::PrepareTransaction
absl::Status PrepareTransaction() override
Definition: fake_binder.h:206
buffer
char buffer[1024]
Definition: libuv/docs/code/idle-compute/main.c:8
grpc_binder::WritableParcel
Definition: binder.h:44
grpc_binder::end2end_testing::TransactionProcessor
Definition: fake_binder.h:230
grpc_binder::end2end_testing::TransactionProcessor::tx_thread_
grpc_core::Thread tx_thread_
Definition: fake_binder.h:266
storage_
char storage_[128/3+1+1]
Definition: abseil-cpp/absl/strings/internal/str_format/arg.cc:178
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
grpc_binder::end2end_testing::FakeBinder::FakeBinder
FakeBinder(FakeEndpoint *endpoint)
Definition: fake_binder.h:203
grpc_binder::end2end_testing::FakeBinder::Initialize
void Initialize() override
Definition: fake_binder.h:205
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::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
grpc_binder::end2end_testing::PersistentFakeTransactionReceiver::Receive
absl::Status Receive(BinderTransportTxCode tx_code, ReadableParcel *parcel)
Definition: fake_binder.h:185
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
google::protobuf.internal::Mutex
WrappedMutex Mutex
Definition: bloaty/third_party/protobuf/src/google/protobuf/stubs/mutex.h:113
std
Definition: grpcpp/impl/codegen/async_unary_call.h:407
grpc_binder::end2end_testing::FakeBinder::endpoint_
FakeEndpoint * endpoint_
Definition: fake_binder.h:222
thd.h
grpc_binder::end2end_testing::FakeBinder::GetWritableParcel
WritableParcel * GetWritableParcel() const override
Definition: fake_binder.h:213
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::FakeBinderTunnel::GetSendEndpoint
FakeEndpoint * GetSendEndpoint() const
Definition: fake_binder.h:293
grpc_binder::end2end_testing::PersistentFakeTransactionReceiver
Definition: fake_binder.h:178
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::FakeReadableParcel
Definition: fake_binder.h:103
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
grpc_binder::end2end_testing::FakeWritableParcel::WriteByteArray
absl::Status WriteByteArray(const int8_t *buffer, int32_t length) override
Definition: fake_binder.cc:53
grpc_binder::ReadableParcel
Definition: binder.h:66
grpc_binder::Binder
Definition: binder.h:87
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
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
grpc_binder::end2end_testing::PersistentFakeTransactionReceiver::callback_
TransactionReceiver::OnTransactCb callback_
Definition: fake_binder.h:192
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::FakeBinder
Definition: fake_binder.h:201
absl::variant
Definition: abseil-cpp/absl/types/internal/variant.h:46
grpc_binder::end2end_testing::TransactionProcessor::mu_
grpc_core::Mutex mu_
Definition: fake_binder.h:260
grpc_binder::end2end_testing::FakeBinderTunnel::GetRecvEndpoint
FakeEndpoint * GetRecvEndpoint() const
Definition: fake_binder.h:294
setup.target
target
Definition: third_party/bloaty/third_party/protobuf/python/setup.py:179
grpc_binder::end2end_testing::FakeReadableParcel::FakeReadableParcel
FakeReadableParcel(FakeData data)
Definition: fake_binder.h:105
grpc_binder::end2end_testing::FakeWritableParcel
Definition: fake_binder.h:83
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
sync.h
cb
OPENSSL_EXPORT pem_password_cb * cb
Definition: pem.h:351
grpc_binder::end2end_testing::TransactionProcessor::SetDelay
void SetDelay(absl::Duration delay)
Definition: fake_binder.cc:168
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