Merge "Add testcase for empty ParcelableHolder"
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ITest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ITest.aidl
index dad0716..7cd58e7 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ITest.aidl
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/aidl_api/libbinder_ndk_test_interface/current/test_package/ITest.aidl
@@ -81,6 +81,7 @@
   void RepeatExtendableParcelable(in test_package.ExtendableParcelable input, out test_package.ExtendableParcelable output);
   test_package.SimpleUnion RepeatSimpleUnion(in test_package.SimpleUnion u);
   IBinder getICompatTest();
+  void RepeatExtendableParcelableWithoutExtension(in test_package.ExtendableParcelable input, out test_package.ExtendableParcelable output);
   const int kZero = 0;
   const int kOne = 1;
   const int kOnes = -1;
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/itest_impl.h b/tests/tests/binder_ndk/libbinder_ndk_test/itest_impl.h
index 413e190..ae7e435 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/itest_impl.h
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/itest_impl.h
@@ -455,6 +455,7 @@
   ::ndk::ScopedAStatus RepeatExtendableParcelable(
       const ::aidl::test_package::ExtendableParcelable& in_input,
       ::aidl::test_package::ExtendableParcelable* out_output) {
+    RepeatExtendableParcelableWithoutExtension(in_input, out_output);
     std::unique_ptr<MyExt> ext = in_input.ext.getParcelable<MyExt>();
     MyExt ext2;
     ext2.a = ext->a;
@@ -463,6 +464,15 @@
     return ::ndk::ScopedAStatus(AStatus_newOk());
   }
 
+  ::ndk::ScopedAStatus RepeatExtendableParcelableWithoutExtension(
+      const ::aidl::test_package::ExtendableParcelable& in_input,
+      ::aidl::test_package::ExtendableParcelable* out_output) {
+    out_output->a = in_input.a;
+    out_output->b = in_input.b;
+    out_output->c = in_input.c;
+    return ::ndk::ScopedAStatus(AStatus_newOk());
+  }
+
   ::ndk::ScopedAStatus RepeatSimpleUnion(const SimpleUnion& in_u,
                                          SimpleUnion* _aidl_return) override {
     *_aidl_return = in_u;
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_native_aidl_client.cpp b/tests/tests/binder_ndk/libbinder_ndk_test/test_native_aidl_client.cpp
index 10d6b65..85e5599 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/test_native_aidl_client.cpp
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_native_aidl_client.cpp
@@ -958,7 +958,7 @@
 }
 TEST_P(NdkBinderTest_Aidl, ParcelableHolderCommunicationTest) {
   ExtendableParcelable ep;
-
+  ep.c = 42L;
   MyExt myext1;
   myext1.a = 42;
   myext1.b = "mystr";
@@ -967,11 +967,21 @@
   ExtendableParcelable ep2;
   EXPECT_OK(iface->RepeatExtendableParcelable(ep, &ep2));
   std::unique_ptr<MyExt> myext2 = ep2.ext.getParcelable<MyExt>();
+  EXPECT_EQ(42L, ep2.c);
   EXPECT_TRUE(myext2);
   EXPECT_EQ(42, myext2->a);
   EXPECT_EQ("mystr", myext2->b);
 }
 
+TEST_P(NdkBinderTest_Aidl, EmptyParcelableHolderCommunicationTest) {
+  ExtendableParcelable ep;
+  ExtendableParcelable ep2;
+  ep.c = 42L;
+  EXPECT_OK(iface->RepeatExtendableParcelableWithoutExtension(ep, &ep2));
+
+  EXPECT_EQ(42L, ep2.c);
+}
+
 std::shared_ptr<ITest> getProxyLocalService() {
   std::shared_ptr<MyTest> test = SharedRefBase::make<MyTest>();
   SpAIBinder binder = test->asBinder();
diff --git a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ITest.aidl b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ITest.aidl
index d5d112b..084c7d7 100644
--- a/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ITest.aidl
+++ b/tests/tests/binder_ndk/libbinder_ndk_test/test_package/ITest.aidl
@@ -130,4 +130,6 @@
     SimpleUnion RepeatSimpleUnion(in SimpleUnion u);
 
     IBinder getICompatTest();
+
+    void RepeatExtendableParcelableWithoutExtension(in ExtendableParcelable input, out ExtendableParcelable output);
 }
diff --git a/tests/tests/binder_ndk/src/android/binder/cts/JavaClientTest.java b/tests/tests/binder_ndk/src/android/binder/cts/JavaClientTest.java
index e56c3c0..79f231a 100644
--- a/tests/tests/binder_ndk/src/android/binder/cts/JavaClientTest.java
+++ b/tests/tests/binder_ndk/src/android/binder/cts/JavaClientTest.java
@@ -691,7 +691,7 @@
     @Test
     public void testParcelableHolder() throws RemoteException {
         ExtendableParcelable ep = new ExtendableParcelable();
-
+        ep.c = 42L;
         MyExt myext1 = new MyExt();
         myext1.a = 42;
         myext1.b = "mystr";
@@ -700,12 +700,22 @@
         ExtendableParcelable ep2 = new ExtendableParcelable();
         mInterface.RepeatExtendableParcelable(ep, ep2);
         MyExt myext2 = ep2.ext.getParcelable(MyExt.class);
+        assertEquals(42L, ep2.c);
         assertNotEquals(null, myext2);
         assertEquals(42, myext2.a);
         assertEquals("mystr", myext2.b);
     }
 
     @Test
+    public void testEmptyParcelableHolder() throws RemoteException {
+        ExtendableParcelable ep = new ExtendableParcelable();
+        ep.c = 42L;
+        ExtendableParcelable ep2 = new ExtendableParcelable();
+        mInterface.RepeatExtendableParcelableWithoutExtension(ep, ep2);
+        assertEquals(42L, ep2.c);
+    }
+
+    @Test
     public void testRepeatSimpleUnion() throws RemoteException {
         final int[] intArray = { 1, 2, 3 };
         SimpleUnion origin = SimpleUnion.b(intArray);
diff --git a/tests/tests/binder_ndk/src/android/binder/cts/TestImpl.java b/tests/tests/binder_ndk/src/android/binder/cts/TestImpl.java
index c65a99a..d16e8a7 100644
--- a/tests/tests/binder_ndk/src/android/binder/cts/TestImpl.java
+++ b/tests/tests/binder_ndk/src/android/binder/cts/TestImpl.java
@@ -398,6 +398,7 @@
 
   @Override
   public void RepeatExtendableParcelable(ExtendableParcelable in, ExtendableParcelable out) {
+    RepeatExtendableParcelableWithoutExtension(in, out);
     MyExt ext = in.ext.getParcelable(MyExt.class);
     MyExt ext2 = new MyExt();
     ext2.a = ext.a;
@@ -405,6 +406,13 @@
     out.ext.setParcelable(ext2);
   }
 
+  @Override
+  public void RepeatExtendableParcelableWithoutExtension(ExtendableParcelable in, ExtendableParcelable out) {
+    out.a = in.a;
+    out.b = in.b;
+    out.c = in.c;
+  }
+
   public SimpleUnion RepeatSimpleUnion(SimpleUnion in_u) {
     return in_u;
   }