Skip to content

Commit 4a4c332

Browse files
Jim Shargoandroid-build-merge-worker-robot
authored andcommitted
Merge "binder: Add std::vector<bool> specialization to SafeInterface" into main am: b7c7d8a am: 5b491d7
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/3307796 Change-Id: Ieb42ab8cf7beadca65f7b8c42f14ba18fc65ede6 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
2 parents c23f12c + 5b491d7 commit 4a4c332

3 files changed

Lines changed: 47 additions & 2 deletions

File tree

libs/binder/include/binder/SafeInterface.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,14 @@ class LIBBINDER_EXPORTED ParcelHandler {
152152
return callParcel("writeParcelableVector",
153153
[&]() { return parcel->writeParcelableVector(v); });
154154
}
155+
156+
status_t read(const Parcel& parcel, std::vector<bool>* v) const {
157+
return callParcel("readBoolVector", [&]() { return parcel.readBoolVector(v); });
158+
}
159+
status_t write(Parcel* parcel, const std::vector<bool>& v) const {
160+
return callParcel("writeBoolVector", [&]() { return parcel->writeBoolVector(v); });
161+
}
162+
155163
status_t read(const Parcel& parcel, float* f) const {
156164
return callParcel("readFloat", [&]() { return parcel.readFloat(f); });
157165
}

libs/binder/tests/Android.bp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,9 @@ cc_test {
731731
"liblog",
732732
"libutils",
733733
],
734+
static_libs: [
735+
"libgmock",
736+
],
734737
test_suites: [
735738
"general-tests",
736739
"vts",

libs/binder/tests/binderSafeInterfaceTest.cpp

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
#include <sys/eventfd.h>
4141
#include <sys/prctl.h>
4242

43+
#include <gmock/gmock.h>
44+
4345
using namespace std::chrono_literals; // NOLINT - google-build-using-namespace
4446
using android::binder::unique_fd;
4547

@@ -222,6 +224,7 @@ class ISafeInterfaceTest : public IInterface {
222224
SetDeathToken = IBinder::FIRST_CALL_TRANSACTION,
223225
ReturnsNoMemory,
224226
LogicalNot,
227+
LogicalNotVector,
225228
ModifyEnum,
226229
IncrementFlattenable,
227230
IncrementLightFlattenable,
@@ -249,6 +252,7 @@ class ISafeInterfaceTest : public IInterface {
249252

250253
// These are ordered according to their corresponding methods in SafeInterface::ParcelHandler
251254
virtual status_t logicalNot(bool a, bool* notA) const = 0;
255+
virtual status_t logicalNot(const std::vector<bool>& a, std::vector<bool>* notA) const = 0;
252256
virtual status_t modifyEnum(TestEnum a, TestEnum* b) const = 0;
253257
virtual status_t increment(const TestFlattenable& a, TestFlattenable* aPlusOne) const = 0;
254258
virtual status_t increment(const TestLightFlattenable& a,
@@ -288,7 +292,14 @@ class BpSafeInterfaceTest : public SafeBpInterface<ISafeInterfaceTest> {
288292
}
289293
status_t logicalNot(bool a, bool* notA) const override {
290294
ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__);
291-
return callRemote<decltype(&ISafeInterfaceTest::logicalNot)>(Tag::LogicalNot, a, notA);
295+
using Signature = status_t (ISafeInterfaceTest::*)(bool, bool*) const;
296+
return callRemote<Signature>(Tag::LogicalNot, a, notA);
297+
}
298+
status_t logicalNot(const std::vector<bool>& a, std::vector<bool>* notA) const override {
299+
ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__);
300+
using Signature = status_t (ISafeInterfaceTest::*)(const std::vector<bool>&,
301+
std::vector<bool>*) const;
302+
return callRemote<Signature>(Tag::LogicalNotVector, a, notA);
292303
}
293304
status_t modifyEnum(TestEnum a, TestEnum* b) const override {
294305
ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__);
@@ -406,6 +417,14 @@ class BnSafeInterfaceTest : public SafeBnInterface<ISafeInterfaceTest> {
406417
*notA = !a;
407418
return NO_ERROR;
408419
}
420+
status_t logicalNot(const std::vector<bool>& a, std::vector<bool>* notA) const override {
421+
ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__);
422+
notA->clear();
423+
for (bool value : a) {
424+
notA->push_back(!value);
425+
}
426+
return NO_ERROR;
427+
}
409428
status_t modifyEnum(TestEnum a, TestEnum* b) const override {
410429
ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__);
411430
*b = (a == TestEnum::INITIAL) ? TestEnum::FINAL : TestEnum::INVALID;
@@ -513,7 +532,13 @@ class BnSafeInterfaceTest : public SafeBnInterface<ISafeInterfaceTest> {
513532
return callLocal(data, reply, &ISafeInterfaceTest::returnsNoMemory);
514533
}
515534
case ISafeInterfaceTest::Tag::LogicalNot: {
516-
return callLocal(data, reply, &ISafeInterfaceTest::logicalNot);
535+
using Signature = status_t (ISafeInterfaceTest::*)(bool a, bool* notA) const;
536+
return callLocal<Signature>(data, reply, &ISafeInterfaceTest::logicalNot);
537+
}
538+
case ISafeInterfaceTest::Tag::LogicalNotVector: {
539+
using Signature = status_t (ISafeInterfaceTest::*)(const std::vector<bool>& a,
540+
std::vector<bool>* notA) const;
541+
return callLocal<Signature>(data, reply, &ISafeInterfaceTest::logicalNot);
517542
}
518543
case ISafeInterfaceTest::Tag::ModifyEnum: {
519544
return callLocal(data, reply, &ISafeInterfaceTest::modifyEnum);
@@ -639,6 +664,15 @@ TEST_F(SafeInterfaceTest, TestLogicalNot) {
639664
ASSERT_EQ(!b, notB);
640665
}
641666

667+
TEST_F(SafeInterfaceTest, TestLogicalNotVector) {
668+
const std::vector<bool> a = {true, false, true};
669+
std::vector<bool> notA;
670+
status_t result = mSafeInterfaceTest->logicalNot(a, &notA);
671+
ASSERT_EQ(NO_ERROR, result);
672+
std::vector<bool> expected = {false, true, false};
673+
ASSERT_THAT(notA, testing::ContainerEq(expected));
674+
}
675+
642676
TEST_F(SafeInterfaceTest, TestModifyEnum) {
643677
const TestEnum a = TestEnum::INITIAL;
644678
TestEnum b = TestEnum::INVALID;

0 commit comments

Comments
 (0)