Support ParcelableHolder in C++

Make C++ backend support ParcelableHolder as well
Supplement the e2e test, and unittests
Test: atest aidl_integration_test aidl_unittests
Bug: 146611855

Change-Id: Id8c414d441b751390f7564ee11e0494259dd17f6
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index 231920d..f367826 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -1158,46 +1158,62 @@
   EXPECT_EQ(expected_stderr, GetCapturedStderr());
 }
 
-TEST_F(AidlTest, ExtensionTest) {
+TEST_P(AidlTest, ExtensionTest) {
+  CaptureStderr();
   string extendable_parcelable =
       "package a; parcelable Data {\n"
       "  ParcelableHolder extension;\n"
       "  ParcelableHolder extension2;\n"
       "}";
-  EXPECT_NE(nullptr,
-            Parse("a/Data.aidl", extendable_parcelable, typenames_, Options::Language::JAVA));
-  EXPECT_EQ(nullptr,
-            Parse("a/Data.aidl", extendable_parcelable, typenames_, Options::Language::CPP));
-  EXPECT_EQ(nullptr,
-            Parse("a/Data.aidl", extendable_parcelable, typenames_, Options::Language::NDK));
-  EXPECT_EQ(nullptr,
-            Parse("a/Data.aidl", extendable_parcelable, typenames_, Options::Language::RUST));
-
+  if (GetLanguage() == Options::Language::NDK || GetLanguage() == Options::Language::RUST) {
+    EXPECT_EQ(nullptr, Parse("a/Data.aidl", extendable_parcelable, typenames_, GetLanguage()));
+    EXPECT_EQ(
+        "ERROR: a/Data.aidl:2.1-19: The NDK and Rust backend does not support ParcelableHolder "
+        "yet.\n",
+        GetCapturedStderr());
+  } else {
+    EXPECT_NE(nullptr, Parse("a/Data.aidl", extendable_parcelable, typenames_, GetLanguage()));
+    EXPECT_EQ("", GetCapturedStderr());
+  }
+}
+TEST_P(AidlTest, ParcelableHolderAsReturnType) {
+  CaptureStderr();
   string parcelableholder_return_interface =
       "package a; interface IFoo {\n"
       "  ParcelableHolder foo();\n"
       "}";
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", parcelableholder_return_interface, typenames_,
-                           Options::Language::JAVA));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", parcelableholder_return_interface, typenames_,
-                           Options::Language::CPP));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", parcelableholder_return_interface, typenames_,
-                           Options::Language::NDK));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", parcelableholder_return_interface, typenames_,
-                           Options::Language::RUST));
+  EXPECT_EQ(nullptr,
+            Parse("a/IFoo.aidl", parcelableholder_return_interface, typenames_, GetLanguage()));
 
+  if (GetLanguage() == Options::Language::NDK || GetLanguage() == Options::Language::RUST) {
+    EXPECT_EQ(
+        "ERROR: a/IFoo.aidl:2.1-19: The NDK and Rust backend does not support ParcelableHolder "
+        "yet.\n",
+        GetCapturedStderr());
+    return;
+  }
+  EXPECT_EQ("ERROR: a/IFoo.aidl:2.19-23: ParcelableHolder cannot be a return type\n",
+            GetCapturedStderr());
+}
+
+TEST_P(AidlTest, ParcelableHolderAsArgumentType) {
+  CaptureStderr();
   string extendable_parcelable_arg_interface =
       "package a; interface IFoo {\n"
       "  void foo(in ParcelableHolder ph);\n"
       "}";
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", extendable_parcelable_arg_interface, typenames_,
-                           Options::Language::JAVA));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", extendable_parcelable_arg_interface, typenames_,
-                           Options::Language::CPP));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", extendable_parcelable_arg_interface, typenames_,
-                           Options::Language::NDK));
-  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", extendable_parcelable_arg_interface, typenames_,
-                           Options::Language::RUST));
+  EXPECT_EQ(nullptr,
+            Parse("a/IFoo.aidl", extendable_parcelable_arg_interface, typenames_, GetLanguage()));
+
+  if (GetLanguage() == Options::Language::NDK || GetLanguage() == Options::Language::RUST) {
+    EXPECT_EQ(
+        "ERROR: a/IFoo.aidl:2.14-31: The NDK and Rust backend does not support ParcelableHolder "
+        "yet.\n",
+        GetCapturedStderr());
+    return;
+  }
+  EXPECT_EQ("ERROR: a/IFoo.aidl:2.31-34: ParcelableHolder cannot be an argument type\n",
+            GetCapturedStderr());
 }
 
 TEST_F(AidlTest, ApiDump) {