Add interface methods for testing vec<handle>.

Test: hidl_test
Bug: 32160974
Change-Id: I7eda1650fcf8d58778b2aad97a5bd62afc95bc36
diff --git a/tests/bar/1.0/default/Android.bp b/tests/bar/1.0/default/Android.bp
index 0d47001..c2c2309 100644
--- a/tests/bar/1.0/default/Android.bp
+++ b/tests/bar/1.0/default/Android.bp
@@ -10,6 +10,7 @@
 
     shared_libs: [
         "libbase",
+        "libcutils",
         "libhidl",
         "libhwbinder",
         "liblog",
diff --git a/tests/bar/1.0/default/Bar.cpp b/tests/bar/1.0/default/Bar.cpp
index 34ec087..b960524 100644
--- a/tests/bar/1.0/default/Bar.cpp
+++ b/tests/bar/1.0/default/Bar.cpp
@@ -130,6 +130,18 @@
     return Void();
 }
 
+Return<void> Bar::createMyHandle(createMyHandle_cb _hidl_cb) {
+    return mFoo->createMyHandle(_hidl_cb);
+}
+
+Return<void> Bar::createHandles(uint32_t size, createHandles_cb _hidl_cb) {
+    return mFoo->createHandles(size, _hidl_cb);
+}
+
+Return<void> Bar::closeHandles() {
+    return mFoo->closeHandles();
+}
+
 // Methods from ::android::hardware::tests::bar::V1_0::IBar follow.
 Return<void> Bar::thisIsNew()  {
     ALOGI("SERVER(Bar) thisIsNew");
diff --git a/tests/bar/1.0/default/Bar.h b/tests/bar/1.0/default/Bar.h
index d2c2635..6fea563 100644
--- a/tests/bar/1.0/default/Bar.h
+++ b/tests/bar/1.0/default/Bar.h
@@ -48,6 +48,9 @@
     virtual Return<void> transpose2(const hidl_array<hidl_string, 5 /* 5 */, 3 /* 3 */>& in, transpose2_cb _hidl_cb)  override;
     virtual Return<void> sendVec(const hidl_vec<uint8_t>& data, sendVec_cb _hidl_cb)  override;
     virtual Return<void> sendVecVec(sendVecVec_cb _hidl_cb)  override;
+    virtual Return<void> createMyHandle(createMyHandle_cb _hidl_cb)  override;
+    virtual Return<void> createHandles(uint32_t size, createHandles_cb _hidl_cb)  override;
+    virtual Return<void> closeHandles()  override;
 
     Return<void> haveAVectorOfInterfaces(
             const hidl_vec<sp<ISimple> > &in,
diff --git a/tests/foo/1.0/IFoo.hal b/tests/foo/1.0/IFoo.hal
index 2afaec1..c06fc05 100644
--- a/tests/foo/1.0/IFoo.hal
+++ b/tests/foo/1.0/IFoo.hal
@@ -80,6 +80,11 @@
         FloatArray myFloatArray;
     };
 
+    struct MyHandle {
+        handle h;
+        int32_t guard;
+    };
+
     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);
@@ -112,4 +117,7 @@
 
     haveAVectorOfGenericInterfaces(vec<interface> in)
         generates (vec<interface> out);
+    createMyHandle() generates (MyHandle h);
+    createHandles(uint32_t size) generates (vec<handle> handles);
+    closeHandles();
 };
diff --git a/tests/foo/1.0/default/Android.bp b/tests/foo/1.0/default/Android.bp
index 185e5ea..f2ee521 100644
--- a/tests/foo/1.0/default/Android.bp
+++ b/tests/foo/1.0/default/Android.bp
@@ -10,6 +10,7 @@
 
     shared_libs: [
         "libbase",
+        "libcutils",
         "libhidl",
         "libfootest",
         "libhwbinder",
diff --git a/tests/foo/1.0/default/Foo.cpp b/tests/foo/1.0/default/Foo.cpp
index f855f21..cf4f975 100644
--- a/tests/foo/1.0/default/Foo.cpp
+++ b/tests/foo/1.0/default/Foo.cpp
@@ -291,7 +291,40 @@
         const hidl_vec<sp<android::hardware::IBinder> > &in,
         haveAVectorOfGenericInterfaces_cb _hidl_cb) {
     _hidl_cb(in);
+    return Void();
+}
 
+Return<void> Foo::createMyHandle(createMyHandle_cb _hidl_cb) {
+    native_handle_t* nh = native_handle_create(0, 10);
+    int data[] = {2,3,5,7,11,13,17,19,21,23};
+    CHECK(sizeof(data) == 10 * sizeof(int));
+    memcpy(nh->data, data, sizeof(data));
+    mHandles.push_back(nh);
+
+    MyHandle h;
+    h.guard = 666;
+    h.h = nh;
+    _hidl_cb(h);
+    return Void();
+}
+
+Return<void> Foo::createHandles(uint32_t size, createHandles_cb _hidl_cb) {
+    hidl_vec<const native_handle_t*> handles;
+    handles.resize(size);
+    for(uint32_t i = 0; i < size; ++i) {
+        createMyHandle([&](const MyHandle& h) {
+            handles[i] = h.h;
+        });
+    }
+    _hidl_cb(handles);
+    return Void();
+}
+
+Return<void> Foo::closeHandles() {
+    for(native_handle_t* h : mHandles) {
+        native_handle_delete(h);
+    }
+    mHandles.clear();
     return Void();
 }
 
diff --git a/tests/foo/1.0/default/Foo.h b/tests/foo/1.0/default/Foo.h
index b3785d2..e61291d 100644
--- a/tests/foo/1.0/default/Foo.h
+++ b/tests/foo/1.0/default/Foo.h
@@ -5,6 +5,7 @@
 #include <hidl/Status.h>
 
 #include <hidl/MQDescriptor.h>
+#include <vector>
 namespace android {
 namespace hardware {
 namespace tests {
@@ -44,6 +45,9 @@
     virtual Return<void> transpose2(const hidl_array<hidl_string, 5 /* 5 */, 3 /* 3 */>& in, transpose2_cb _hidl_cb)  override;
     virtual Return<void> sendVec(const hidl_vec<uint8_t>& data, sendVec_cb _hidl_cb)  override;
     virtual Return<void> sendVecVec(sendVecVec_cb _hidl_cb)  override;
+    virtual Return<void> createMyHandle(createMyHandle_cb _hidl_cb)  override;
+    virtual Return<void> createHandles(uint32_t size, createHandles_cb _hidl_cb)  override;
+    virtual Return<void> closeHandles()  override;
 
     Return<void> haveAVectorOfInterfaces(
             const hidl_vec<sp<ISimple> > &in,
@@ -52,6 +56,8 @@
     Return<void> haveAVectorOfGenericInterfaces(
             const hidl_vec<sp<android::hardware::IBinder> > &in,
             haveAVectorOfGenericInterfaces_cb _hidl_cb) override;
+private:
+    std::vector<::native_handle_t *> mHandles;
 };
 
 extern "C" IFoo* HIDL_FETCH_IFoo(const char* name);