Skip to content

Commit 7693c4a

Browse files
author
Jim Shargo
committed
binder: Add std::vector<bool> specialization to SafeInterface
Adding this to support migration and enhancement of IGraphicBufferProducers and IGraphicBufferConsumers. We'd ideally use AIDL, but we can't migrate until all the users of these raw binder classes are no longer using them. Bug: n/a Flag: EXEMPT new unused function Test: new test Change-Id: I11288f4823751343c7f5e158cfda88aad66ea5dc
1 parent d66c39a commit 7693c4a

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)