generate_cpp_unittest.cpp revision 864bc0936d95410b06a3709e1559c884258bc52c
1a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin/*
2a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin * Copyright (C) 2015, The Android Open Source Project
3a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin *
4a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin * Licensed under the Apache License, Version 2.0 (the "License");
5a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin * you may not use this file except in compliance with the License.
6a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin * You may obtain a copy of the License at
7a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin *
8a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin *     http://www.apache.org/licenses/LICENSE-2.0
9a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin *
10a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin * Unless required by applicable law or agreed to in writing, software
11a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin * distributed under the License is distributed on an "AS IS" BASIS,
12a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin * See the License for the specific language governing permissions and
14a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin * limitations under the License.
15a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin */
16a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
17a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <string>
18a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
19a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <gtest/gtest.h>
20a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
212cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin#include "aidl.h"
22a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include "aidl_language.h"
23a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include "ast_cpp.h"
24a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include "code_writer.h"
25ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley#include "generate_cpp.h"
264a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley#include "tests/fake_io_delegate.h"
2780ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin#include "tests/test_util.h"
28e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wiley#include "type_cpp.h"
29a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
304a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing android::aidl::test::FakeIoDelegate;
31a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::string;
32a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::unique_ptr;
33a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
34a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android {
35a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace aidl {
36f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileynamespace cpp {
37a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace {
38a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
39b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst string kComplexTypeInterfaceAIDL =
40b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(package android.os;
41389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinimport foo.IFooType;
42b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlininterface IComplexTypeInterface {
43bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley  int[] Send(in int[] goes_in, inout double[] goes_in_and_out, out boolean[] goes_out);
440dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  oneway void Piff(int times);
45389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  IFooType TakesABinder(IFooType f);
4656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley  List<String> StringListMethod(in java.util.List<String> input, out List<String> output);
477ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin  List<IBinder> BinderListMethod(in java.util.List<IBinder> input, out List<IBinder> output);
48b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin})";
49b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
50b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientHeaderOutput[] =
51b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
52b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
53b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
54b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
55b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
56b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <utils/Errors.h>
57b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
58b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
59b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
60b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
61b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
62b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
63b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BpComplexTypeInterface : public android::BpInterface<IComplexTypeInterface> {
64b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
65b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinexplicit BpComplexTypeInterface(const android::sp<android::IBinder>& impl);
66b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual ~BpComplexTypeInterface() = default;
67bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyandroid::status_t Send(const std::vector<int32_t>& goes_in, std::vector<double>* goes_in_and_out, std::vector<bool>* goes_out, std::vector<int32_t>* _aidl_return) override;
680dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t Piff(int32_t times) override;
69389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::status_t TakesABinder(const android::sp<::foo::IFooType>& f, android::sp<::foo::IFooType>* _aidl_return) override;
7056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::status_t StringListMethod(const std::vector<android::String16>& input, std::vector<android::String16>* output, std::vector<android::String16>* _aidl_return) override;
717ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinandroid::status_t BinderListMethod(const std::vector<android::sp<::android::IBinder>>& input, std::vector<android::sp<::android::IBinder>>* output, std::vector<android::sp<::android::IBinder>>* _aidl_return) override;
72b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BpComplexTypeInterface
73b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
74b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
75b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
76b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
77b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
78b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_)";
79b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
80b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientSourceOutput[] =
81b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BpComplexTypeInterface.h>
82b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
83b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
84b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
85b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
86b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
87b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
88b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinBpComplexTypeInterface::BpComplexTypeInterface(const android::sp<android::IBinder>& impl)
891db03482145137749602c830a593494498f5be55Christopher Wiley    : BpInterface<IComplexTypeInterface>(impl){
90b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
91b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
92bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyandroid::status_t BpComplexTypeInterface::Send(const std::vector<int32_t>& goes_in, std::vector<double>* goes_in_and_out, std::vector<bool>* goes_out, std::vector<int32_t>* _aidl_return) {
93b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel data;
94b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel reply;
95b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
968993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
978993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif (((status) != (android::OK))) {
988993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyreturn status;
998993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
100bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.writeInt32Vector(goes_in);
101bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
102bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyreturn status;
103bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
104bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.writeDoubleVector(*goes_in_and_out);
1050eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1060eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1070eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
108b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::SEND, data, &reply);
1090eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1100eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1110eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
1122aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (reply.readExceptionCode()) {
1132aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = android::FAILED_TRANSACTION;
1142aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyreturn status;
1152aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
116bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply.readInt32Vector(_aidl_return);
1170eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1180eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1190eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
120bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply.readDoubleVector(goes_in_and_out);
121bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
122bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyreturn status;
123bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
124bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply.readBoolVector(goes_out);
1250eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1260eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1270eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
128b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
129b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
130b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
1310dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t BpComplexTypeInterface::Piff(int32_t times) {
1320dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::Parcel data;
1331227d6135418a6a876666adcf4f8d9b498f17647Christopher Wileyandroid::Parcel reply;
1340dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t status;
1358993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
1368993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif (((status) != (android::OK))) {
1378993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyreturn status;
1388993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
1390dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.writeInt32(times);
1400eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1410eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1420eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
1430dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::PIFF, data, &reply, android::IBinder::FLAG_ONEWAY);
1440eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1450eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1460eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
1470dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinreturn status;
1480dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
1490dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin
150389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::status_t BpComplexTypeInterface::TakesABinder(const android::sp<::foo::IFooType>& f, android::sp<::foo::IFooType>* _aidl_return) {
151389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::Parcel data;
152389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::Parcel reply;
153389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::status_t status;
154389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = data.writeInterfaceToken(getInterfaceDescriptor());
155389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
156389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
157389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
158389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = data.writeStrongBinder(IFooType::asBinder(f));
159389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
160389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
161389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
162389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = remote()->transact(IComplexTypeInterface::TAKESABINDER, data, &reply);
163389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
164389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
165389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
166389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (reply.readExceptionCode()) {
167389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = android::FAILED_TRANSACTION;
168389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
169389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
170389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = reply.readStrongBinder(_aidl_return);
171389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
172389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
173389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
174389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
175389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
176389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
17756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::status_t BpComplexTypeInterface::StringListMethod(const std::vector<android::String16>& input, std::vector<android::String16>* output, std::vector<android::String16>* _aidl_return) {
17856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::Parcel data;
17956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::Parcel reply;
18056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::status_t status;
18156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
18256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
18356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
18456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
18556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = data.writeString16Vector(input);
18656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
18756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
18856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
18956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = remote()->transact(IComplexTypeInterface::STRINGLISTMETHOD, data, &reply);
19056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
19156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
19256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
19356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (reply.readExceptionCode()) {
19456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = android::FAILED_TRANSACTION;
19556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
19656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
19756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply.readString16Vector(_aidl_return);
19856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
19956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
20056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
20156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply.readString16Vector(output);
20256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
20356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
20456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
20556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
20656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
20756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley
2087ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinandroid::status_t BpComplexTypeInterface::BinderListMethod(const std::vector<android::sp<::android::IBinder>>& input, std::vector<android::sp<::android::IBinder>>* output, std::vector<android::sp<::android::IBinder>>* _aidl_return) {
2097ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinandroid::Parcel data;
2107ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinandroid::Parcel reply;
2117ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinandroid::status_t status;
2127ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = data.writeInterfaceToken(getInterfaceDescriptor());
2137ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
2147ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinreturn status;
2157ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2167ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = data.writeStrongBinderVector(input);
2177ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
2187ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinreturn status;
2197ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2207ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = remote()->transact(IComplexTypeInterface::BINDERLISTMETHOD, data, &reply);
2217ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
2227ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinreturn status;
2237ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2247ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (reply.readExceptionCode()) {
2257ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = android::FAILED_TRANSACTION;
2267ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinreturn status;
2277ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2287ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = reply.readStrongBinderVector(_aidl_return);
2297ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
2307ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinreturn status;
2317ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2327ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = reply.readStrongBinderVector(output);
2337ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
2347ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinreturn status;
2357ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2367ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinreturn status;
2377ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2387ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin
239b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
240b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
241b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
242b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
243b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
244b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerHeaderOutput[] =
245b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
246b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
247b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
248b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
249b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
250b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
251b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
252b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
253b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
254b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
255b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BnComplexTypeInterface : public android::BnInterface<IComplexTypeInterface> {
256b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
257b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
258b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BnComplexTypeInterface
259b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
260b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
261b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
262b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
263b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
264b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_)";
265b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
266b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerSourceOutput[] =
267b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BnComplexTypeInterface.h>
268b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
269b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
270b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
271b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
272b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
273b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
274b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BnComplexTypeInterface::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
275b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
276b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinswitch (code) {
277b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlincase Call::SEND:
278b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
279bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<int32_t> in_goes_in;
280bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<double> in_goes_in_and_out;
281bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<bool> out_goes_out;
282bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<int32_t> _aidl_return;
283864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
2848993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = android::BAD_TYPE;
2858993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileybreak;
2868993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
287bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.readInt32Vector(&in_goes_in);
2880eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2890eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
2900eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
291bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.readDoubleVector(&in_goes_in_and_out);
292bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
293bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileybreak;
294bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
295bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = Send(in_goes_in, &in_goes_in_and_out, &out_goes_out, &_aidl_return);
2960eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2970eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
2980eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
2992aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = reply->writeNoException();
3002aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (((status) != (android::OK))) {
3012aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileybreak;
3022aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
303bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply->writeInt32Vector(_aidl_return);
304bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
305bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileybreak;
306bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
307bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply->writeDoubleVector(in_goes_in_and_out);
3080eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3090eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3100eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
311bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply->writeBoolVector(out_goes_out);
3120eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3130eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3140eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
315b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
316b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
3170dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlincase Call::PIFF:
3180dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin{
3190dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinint32_t in_times;
320864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
3218993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = android::BAD_TYPE;
3228993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileybreak;
3238993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
3240dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.readInt32(&in_times);
3250eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3260eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3270eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
3280dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = Piff(in_times);
3290eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3300eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3310eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
3322aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = reply->writeNoException();
3332aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (((status) != (android::OK))) {
3342aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileybreak;
3352aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
3360dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
3370dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinbreak;
338389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlincase Call::TAKESABINDER:
339389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin{
340389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::sp<::foo::IFooType> in_f;
341389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::sp<::foo::IFooType> _aidl_return;
342864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
343389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = android::BAD_TYPE;
344389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
345389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
346389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = data.readStrongBinder(&in_f);
347389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
348389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
349389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
350389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = TakesABinder(in_f, &_aidl_return);
351389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
352389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
353389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
354389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = reply->writeNoException();
355389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
356389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
357389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
358389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = reply->writeStrongBinder(IFooType::asBinder(_aidl_return));
359389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
360389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
361389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
362389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
363389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
36456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileycase Call::STRINGLISTMETHOD:
36556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley{
36656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystd::vector<android::String16> in_input;
36756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystd::vector<android::String16> out_output;
36856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystd::vector<android::String16> _aidl_return;
369864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
37056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = android::BAD_TYPE;
37156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
37256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
37356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = data.readString16Vector(&in_input);
37456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
37556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
37656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
37756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = StringListMethod(in_input, &out_output, &_aidl_return);
37856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
37956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
38056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
38156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply->writeNoException();
38256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
38356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
38456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
38556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply->writeString16Vector(_aidl_return);
38656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
38756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
38856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
38956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply->writeString16Vector(out_output);
39056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
39156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
39256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
39356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
39456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
3957ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlincase Call::BINDERLISTMETHOD:
3967ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin{
3977ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstd::vector<android::sp<::android::IBinder>> in_input;
3987ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstd::vector<android::sp<::android::IBinder>> out_output;
3997ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstd::vector<android::sp<::android::IBinder>> _aidl_return;
400864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
4017ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = android::BAD_TYPE;
4027ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4037ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4047ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = data.readStrongBinderVector(&in_input);
4057ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
4067ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4077ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4087ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = BinderListMethod(in_input, &out_output, &_aidl_return);
4097ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
4107ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4117ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4127ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = reply->writeNoException();
4137ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
4147ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4157ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4167ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = reply->writeStrongBinderVector(_aidl_return);
4177ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
4187ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4197ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4207ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = reply->writeStrongBinderVector(out_output);
4217ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
4227ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4237ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4247ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4257ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
426b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlindefault:
427b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
428b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = android::BBinder::onTransact(code, data, reply, flags);
429b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
430b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
431b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
432b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
433b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
434b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
435b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
436b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
437b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
438b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
439b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
440b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceHeaderOutput[] =
441b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
442b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
443b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
444b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
445b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
446b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <cstdint>
447389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include <foo/IFooType.h>
44856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley#include <utils/String16.h>
449389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include <utils/StrongPointer.h>
450b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <vector>
451b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
452b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
453b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
454b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
455b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
456b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass IComplexTypeInterface : public android::IInterface {
457b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
458b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinDECLARE_META_INTERFACE(ComplexTypeInterface);
459bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyvirtual android::status_t Send(const std::vector<int32_t>& goes_in, std::vector<double>* goes_in_and_out, std::vector<bool>* goes_out, std::vector<int32_t>* _aidl_return) = 0;
4600dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinvirtual android::status_t Piff(int32_t times) = 0;
461389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinvirtual android::status_t TakesABinder(const android::sp<::foo::IFooType>& f, android::sp<::foo::IFooType>* _aidl_return) = 0;
46256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyvirtual android::status_t StringListMethod(const std::vector<android::String16>& input, std::vector<android::String16>* output, std::vector<android::String16>* _aidl_return) = 0;
4637ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinvirtual android::status_t BinderListMethod(const std::vector<android::sp<::android::IBinder>>& input, std::vector<android::sp<::android::IBinder>>* output, std::vector<android::sp<::android::IBinder>>* _aidl_return) = 0;
464b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinenum Call {
465b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  SEND = android::IBinder::FIRST_CALL_TRANSACTION + 0,
4660dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  PIFF = android::IBinder::FIRST_CALL_TRANSACTION + 1,
467389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  TAKESABINDER = android::IBinder::FIRST_CALL_TRANSACTION + 2,
46856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley  STRINGLISTMETHOD = android::IBinder::FIRST_CALL_TRANSACTION + 3,
4697ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin  BINDERLISTMETHOD = android::IBinder::FIRST_CALL_TRANSACTION + 4,
470b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
471b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class IComplexTypeInterface
472b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
473b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
474b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
475b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
476b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
477b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_)";
478b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
479b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceSourceOutput[] =
480b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/IComplexTypeInterface.h>
481b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/BpComplexTypeInterface.h>
482b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
483b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
484b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
485b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
486b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
487b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinIMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface");
488b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
489b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
490b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
491b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
492b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
493b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
494a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace
495a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
496b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ASTTest : public ::testing::Test {
4970c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected:
498389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  ASTTest(string file_path, string file_contents)
499389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin      : file_path_(file_path),
5005679952c38925a54b75b087068887002e57f3174Christopher Wiley        file_contents_(file_contents) {
5015679952c38925a54b75b087068887002e57f3174Christopher Wiley    types_.Init();
5025679952c38925a54b75b087068887002e57f3174Christopher Wiley  }
503b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
50490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> Parse() {
505389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    io_delegate_.SetFileContents(file_path_, file_contents_);
50690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
50790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    unique_ptr<AidlInterface> ret;
50890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    std::vector<std::unique_ptr<AidlImport>> imports;
509632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley    AidlError err = ::android::aidl::internals::load_and_validate_aidl(
51090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no preprocessed files
511389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        {"."},
512389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        file_path_,
513389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        io_delegate_,
514389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        &types_,
51590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &ret,
51690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &imports);
517a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
518632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley    if (err != AidlError::OK)
5192cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin      return nullptr;
520a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5212cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    return ret;
52290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
523a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5240c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  void Compare(Document* doc, const char* expected) {
5250c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    string output;
5260c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    unique_ptr<CodeWriter> cw = GetStringWriter(&output);
527a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5280c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    doc->Write(cw.get());
529a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
53080ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    if (expected == output) {
53180ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin      return; // Success
53280ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    }
53380ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin
53480ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    test::PrintDiff(expected, output);
53580ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    FAIL() << "Document contents did not match expected contents";
5360c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  }
537389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
538389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  const string file_path_;
539389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  const string file_contents_;
540389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  FakeIoDelegate io_delegate_;
541389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  TypeNamespace types_;
5420c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};
543a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
544b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ComplexTypeInterfaceASTTest : public ASTTest {
545389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin public:
546389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  ComplexTypeInterfaceASTTest()
547389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin      : ASTTest("android/os/IComplexTypeInterface.aidl",
548389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin                kComplexTypeInterfaceAIDL) {
549389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    io_delegate_.SetFileContents("foo/IFooType.aidl",
550389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin                                 "package foo; interface IFooType {}");
551389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  }
552b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
553b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
554b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
55590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5560c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
557389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildClientHeader(types_, *interface);
558b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
5590c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}
5600c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
561b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
56290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
56336570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  ASSERT_NE(interface, nullptr);
564389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildClientSource(types_, *interface);
565b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
56636570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
56736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
568b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
56990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
570fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  ASSERT_NE(interface, nullptr);
571389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildServerHeader(types_, *interface);
572b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
573fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}
574fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
575b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
57690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
577ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  ASSERT_NE(interface, nullptr);
578389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildServerSource(types_, *interface);
579b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
580ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
581ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
582b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
58390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5840c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
585389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types_, *interface);
586b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
587a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}
588a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
589b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
59090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5911dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  ASSERT_NE(interface, nullptr);
592389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceSource(types_, *interface);
593b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
5941dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}
5951dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
596f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace cpp
597a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace aidl
598a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
599