Test for vec<union> vec<struct w/ union>.
Bug: 31973802
Test: hidl_test
Change-Id: I4367f1f525caa8d1edb95b7bfdac78f21b234576
diff --git a/tests/bar/1.0/default/Bar.cpp b/tests/bar/1.0/default/Bar.cpp
index 6a8a360..4614428 100644
--- a/tests/bar/1.0/default/Bar.cpp
+++ b/tests/bar/1.0/default/Bar.cpp
@@ -19,6 +19,11 @@
}
// Methods from ::android::hardware::tests::foo::V1_0::IFoo follow.
+Return<void> Bar::convertToBoolIfSmall(Discriminator d, const hidl_vec<Union>& u,
+ convertToBoolIfSmall_cb _hidl_cb) {
+ return mFoo->convertToBoolIfSmall(d, u, _hidl_cb);
+}
+
Return<void> Bar::doThis(float param) {
return mFoo->doThis(param);
}
diff --git a/tests/bar/1.0/default/Bar.h b/tests/bar/1.0/default/Bar.h
index b276823..acb976f 100644
--- a/tests/bar/1.0/default/Bar.h
+++ b/tests/bar/1.0/default/Bar.h
@@ -31,6 +31,8 @@
Bar();
// Methods from ::android::hardware::tests::foo::V1_0::IFoo follow.
+ virtual Return<void> convertToBoolIfSmall(Discriminator d, const hidl_vec<Union>& u,
+ convertToBoolIfSmall_cb _hidl_cb) override;
virtual Return<void> doThis(float param) override;
virtual Return<int32_t> doThatAndReturnSomething(int64_t param) override;
virtual Return<double> doQuiteABit(int32_t a, int64_t b, float c, double d) override;
diff --git a/tests/foo/1.0/IFoo.hal b/tests/foo/1.0/IFoo.hal
index c1ce7b0..4a930a2 100644
--- a/tests/foo/1.0/IFoo.hal
+++ b/tests/foo/1.0/IFoo.hal
@@ -122,6 +122,19 @@
bitfield<BitField> bf;
};
+ enum Discriminator : uint8_t {
+ BOOL,
+ INT,
+ };
+ union Union {
+ bool boolValue;
+ int64_t intValue;
+ };
+ struct ContainsUnion {
+ Discriminator discriminator;
+ Union value;
+ };
+
typedef int32_t[5][6][7] multidimArrayOne;
typedef multidimArrayOne[8][9][10] multidimArrayTwo;
typedef multidimArrayTwo[2][3][4] multidimArrayThree;
@@ -144,6 +157,16 @@
InnerTestEnumTypedef foo;
};
+ /**
+ * If d is INT, converts all values to bools which are small enough (0 or 1).
+ * If d is BOOL, should leave all values as BOOLs.
+ *
+ * @param d discriminator for all values in u
+ * @param u values to be expanded
+ * @return c must have same length as u unless there is an error in which case it will be empty.
+ */
+ convertToBoolIfSmall(Discriminator d, vec<Union> u) generates (vec<ContainsUnion> c);
+
doThis(float param);
doThatAndReturnSomething(int64_t param) generates (int32_t result);
doQuiteABit(int32_t a, int64_t b, float c, double d) generates (double something);
diff --git a/tests/foo/1.0/default/Foo.cpp b/tests/foo/1.0/default/Foo.cpp
index a860ce7..a31ab9f 100644
--- a/tests/foo/1.0/default/Foo.cpp
+++ b/tests/foo/1.0/default/Foo.cpp
@@ -15,6 +15,30 @@
namespace implementation {
// Methods from ::android::hardware::tests::foo::V1_0::IFoo follow.
+Return<void> Foo::convertToBoolIfSmall(Discriminator d, const hidl_vec<Union>& u,
+ convertToBoolIfSmall_cb _hidl_cb) {
+ hidl_vec<ContainsUnion> res(u.size());
+ for (size_t i = 0; i < u.size(); i++) {
+ ContainsUnion& outValue = res[i];
+
+ if (d == Discriminator::BOOL) {
+ outValue.discriminator = Discriminator::BOOL;
+ outValue.value.boolValue = u[i].boolValue;
+ } else {
+ uint64_t value = u[i].intValue;
+ if (value == 0 || value == 1) {
+ outValue.discriminator = Discriminator::BOOL;
+ outValue.value.boolValue = static_cast<bool>(value);
+ } else {
+ outValue.discriminator = Discriminator::INT;
+ outValue.value.intValue = value;
+ }
+ }
+ }
+ _hidl_cb(res);
+ return Void();
+}
+
Return<void> Foo::doThis(float param) {
LOG(INFO) << "SERVER(Foo) doThis(" << param << ")";
diff --git a/tests/foo/1.0/default/Foo.h b/tests/foo/1.0/default/Foo.h
index 4558a73..7dd672b 100644
--- a/tests/foo/1.0/default/Foo.h
+++ b/tests/foo/1.0/default/Foo.h
@@ -22,9 +22,14 @@
using ::android::hardware::hidl_vec;
using ::android::hardware::hidl_string;
using ::android::sp;
+using ContainsUnion = ::android::hardware::tests::foo::V1_0::IFoo::ContainsUnion;
+using Discriminator = ::android::hardware::tests::foo::V1_0::IFoo::Discriminator;
+using Union = ::android::hardware::tests::foo::V1_0::IFoo::Union;
struct Foo : public IFoo {
// Methods from ::android::hardware::tests::foo::V1_0::IFoo follow.
+ virtual Return<void> convertToBoolIfSmall(Discriminator d, const hidl_vec<Union>& u,
+ convertToBoolIfSmall_cb _hidl_cb) override;
virtual Return<void> doThis(float param) override;
virtual Return<int32_t> doThatAndReturnSomething(int64_t param) override;
virtual Return<double> doQuiteABit(int32_t a, int64_t b, float c, double d) override;