generate_cpp_unittest.cpp revision 433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687
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
199d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley#include <base/stringprintf.h>
20a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <gtest/gtest.h>
21a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
222cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin#include "aidl.h"
23a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include "aidl_language.h"
24a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include "ast_cpp.h"
25a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include "code_writer.h"
26ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley#include "generate_cpp.h"
279d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley#include "os.h"
284a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley#include "tests/fake_io_delegate.h"
2980ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin#include "tests/test_util.h"
30e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wiley#include "type_cpp.h"
31a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
324a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing android::aidl::test::FakeIoDelegate;
339d6e0b29add607669e440085f1fc60cd434dc987Christopher Wileyusing android::base::StringPrintf;
34a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::string;
35a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::unique_ptr;
36a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
37a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android {
38a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace aidl {
39f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileynamespace cpp {
40a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace {
41a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
42b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst string kComplexTypeInterfaceAIDL =
43b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(package android.os;
44389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinimport foo.IFooType;
45b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlininterface IComplexTypeInterface {
46bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley  int[] Send(in int[] goes_in, inout double[] goes_in_and_out, out boolean[] goes_out);
470dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  oneway void Piff(int times);
48389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  IFooType TakesABinder(IFooType f);
4956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley  List<String> StringListMethod(in java.util.List<String> input, out List<String> output);
507ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin  List<IBinder> BinderListMethod(in java.util.List<IBinder> input, out List<IBinder> output);
51b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin})";
52b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
53b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientHeaderOutput[] =
54b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
55b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
56b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
57b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
58b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
59b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <utils/Errors.h>
60b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
61b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
62b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
63b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
64b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
65b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
66b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BpComplexTypeInterface : public android::BpInterface<IComplexTypeInterface> {
67b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
68b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinexplicit BpComplexTypeInterface(const android::sp<android::IBinder>& impl);
69b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual ~BpComplexTypeInterface() = default;
70433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status 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;
71433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status Piff(int32_t times) override;
72433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status TakesABinder(const android::sp<::foo::IFooType>& f, android::sp<::foo::IFooType>* _aidl_return) override;
73433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status StringListMethod(const std::vector<android::String16>& input, std::vector<android::String16>* output, std::vector<android::String16>* _aidl_return) override;
74433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status 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;
75b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BpComplexTypeInterface
76b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
77b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
78b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
79b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
80b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
81b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_)";
82b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
83b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientSourceOutput[] =
84b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BpComplexTypeInterface.h>
85b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
86b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
87b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
88b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
89b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
90b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
91b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinBpComplexTypeInterface::BpComplexTypeInterface(const android::sp<android::IBinder>& impl)
921db03482145137749602c830a593494498f5be55Christopher Wiley    : BpInterface<IComplexTypeInterface>(impl){
93b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
94b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
95433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status 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) {
96b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel data;
97b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel reply;
98b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
99433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status;
1008993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
1018993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif (((status) != (android::OK))) {
102433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
1038993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
104bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.writeInt32Vector(goes_in);
105bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
106433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
107bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
108bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.writeDoubleVector(*goes_in_and_out);
1090eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
110433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
1110eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
112b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::SEND, data, &reply);
1130eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
114433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
1150eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
116433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileystatus = _aidl_status.readFromParcel(reply);
117433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (((status) != (android::OK))) {
118433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
119433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley}
120433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (!_aidl_status.isOk()) {
121433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyreturn _aidl_status;
1222aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
123bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply.readInt32Vector(_aidl_return);
1240eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
125433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
1260eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
127bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply.readDoubleVector(goes_in_and_out);
128bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
129433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
130bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
131bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply.readBoolVector(goes_out);
1320eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
133433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
1340eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
135433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyerror:
136433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley_aidl_status.setFromStatusT(status);
137433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyreturn _aidl_status;
138b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
139b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
140433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status BpComplexTypeInterface::Piff(int32_t times) {
1410dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::Parcel data;
1421227d6135418a6a876666adcf4f8d9b498f17647Christopher Wileyandroid::Parcel reply;
1430dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t status;
144433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status;
1458993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
1468993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif (((status) != (android::OK))) {
147433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
1488993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
1490dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.writeInt32(times);
1500eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
151433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
1520eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
1530dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::PIFF, data, &reply, android::IBinder::FLAG_ONEWAY);
1540eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
155433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
1560eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
157433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyerror:
158433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley_aidl_status.setFromStatusT(status);
159433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyreturn _aidl_status;
1600dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
1610dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin
162433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status BpComplexTypeInterface::TakesABinder(const android::sp<::foo::IFooType>& f, android::sp<::foo::IFooType>* _aidl_return) {
163389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::Parcel data;
164389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::Parcel reply;
165389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::status_t status;
166433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status;
167389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = data.writeInterfaceToken(getInterfaceDescriptor());
168389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
169433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
170389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
171389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = data.writeStrongBinder(IFooType::asBinder(f));
172389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
173433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
174389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
175389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = remote()->transact(IComplexTypeInterface::TAKESABINDER, data, &reply);
176389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
177433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
178389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
179433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileystatus = _aidl_status.readFromParcel(reply);
180433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (((status) != (android::OK))) {
181433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
182433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley}
183433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (!_aidl_status.isOk()) {
184433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyreturn _aidl_status;
185389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
186389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = reply.readStrongBinder(_aidl_return);
187389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
188433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
189389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
190433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyerror:
191433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley_aidl_status.setFromStatusT(status);
192433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyreturn _aidl_status;
193389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
194389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
195433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status BpComplexTypeInterface::StringListMethod(const std::vector<android::String16>& input, std::vector<android::String16>* output, std::vector<android::String16>* _aidl_return) {
19656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::Parcel data;
19756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::Parcel reply;
19856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::status_t status;
199433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status;
20056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
20156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
202433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
20356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
20456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = data.writeString16Vector(input);
20556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
206433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
20756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
20856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = remote()->transact(IComplexTypeInterface::STRINGLISTMETHOD, data, &reply);
20956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
210433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
21156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
212433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileystatus = _aidl_status.readFromParcel(reply);
213433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (((status) != (android::OK))) {
214433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
215433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley}
216433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (!_aidl_status.isOk()) {
217433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyreturn _aidl_status;
21856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
21956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply.readString16Vector(_aidl_return);
22056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
221433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
22256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
22356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply.readString16Vector(output);
22456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
225433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
22656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
227433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyerror:
228433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley_aidl_status.setFromStatusT(status);
229433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyreturn _aidl_status;
23056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
23156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley
232433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status 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) {
2337ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinandroid::Parcel data;
2347ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinandroid::Parcel reply;
2357ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinandroid::status_t status;
236433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status;
2377ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = data.writeInterfaceToken(getInterfaceDescriptor());
2387ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
239433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
2407ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2417ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = data.writeStrongBinderVector(input);
2427ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
243433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
2447ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2457ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = remote()->transact(IComplexTypeInterface::BINDERLISTMETHOD, data, &reply);
2467ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
247433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
2487ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
249433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileystatus = _aidl_status.readFromParcel(reply);
250433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (((status) != (android::OK))) {
251433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
252433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley}
253433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (!_aidl_status.isOk()) {
254433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyreturn _aidl_status;
2557ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2567ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = reply.readStrongBinderVector(_aidl_return);
2577ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
258433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
2597ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2607ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = reply.readStrongBinderVector(output);
2617ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
262433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileygoto error;
2637ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
264433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyerror:
265433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley_aidl_status.setFromStatusT(status);
266433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyreturn _aidl_status;
2677ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
2687ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin
269b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
270b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
271b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
272b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
273b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
274b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerHeaderOutput[] =
275b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
276b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
277b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
278b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
279b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
280b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
281b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
282b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
283b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
284b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
285b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BnComplexTypeInterface : public android::BnInterface<IComplexTypeInterface> {
286b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
287b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
288b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BnComplexTypeInterface
289b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
290b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
291b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
292b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
293b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
294b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_)";
295b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
296b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerSourceOutput[] =
297b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BnComplexTypeInterface.h>
298b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
299b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
300b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
301b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
302b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
303b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
304b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BnComplexTypeInterface::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
305b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
306b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinswitch (code) {
307b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlincase Call::SEND:
308b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
309bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<int32_t> in_goes_in;
310bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<double> in_goes_in_and_out;
311bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<bool> out_goes_out;
312bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<int32_t> _aidl_return;
313864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
3148993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = android::BAD_TYPE;
3158993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileybreak;
3168993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
317bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.readInt32Vector(&in_goes_in);
3180eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3190eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3200eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
321bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.readDoubleVector(&in_goes_in_and_out);
322bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
323bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileybreak;
324bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
325433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status(Send(in_goes_in, &in_goes_in_and_out, &out_goes_out, &_aidl_return));
326433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileystatus = _aidl_status.writeToParcel(reply);
3270eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3280eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3290eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
330433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (!_aidl_status.isOk()) {
3312aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileybreak;
3322aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
333bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply->writeInt32Vector(_aidl_return);
334bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
335bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileybreak;
336bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
337bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply->writeDoubleVector(in_goes_in_and_out);
3380eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3390eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3400eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
341bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply->writeBoolVector(out_goes_out);
3420eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3430eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3440eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
345b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
346b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
3470dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlincase Call::PIFF:
3480dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin{
3490dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinint32_t in_times;
350864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
3518993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = android::BAD_TYPE;
3528993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileybreak;
3538993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
3540dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.readInt32(&in_times);
3550eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3560eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3570eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
358433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status(Piff(in_times));
3590dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
3600dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinbreak;
361389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlincase Call::TAKESABINDER:
362389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin{
363389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::sp<::foo::IFooType> in_f;
364389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::sp<::foo::IFooType> _aidl_return;
365864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
366389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = android::BAD_TYPE;
367389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
368389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
369389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = data.readStrongBinder(&in_f);
370389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
371389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
372389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
373433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status(TakesABinder(in_f, &_aidl_return));
374433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileystatus = _aidl_status.writeToParcel(reply);
375389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
376389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
377389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
378433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (!_aidl_status.isOk()) {
379389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
380389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
381389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = reply->writeStrongBinder(IFooType::asBinder(_aidl_return));
382389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
383389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
384389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
385389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
386389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
38756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileycase Call::STRINGLISTMETHOD:
38856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley{
38956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystd::vector<android::String16> in_input;
39056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystd::vector<android::String16> out_output;
39156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystd::vector<android::String16> _aidl_return;
392864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
39356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = android::BAD_TYPE;
39456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
39556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
39656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = data.readString16Vector(&in_input);
39756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
39856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
39956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
400433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status(StringListMethod(in_input, &out_output, &_aidl_return));
401433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileystatus = _aidl_status.writeToParcel(reply);
40256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
40356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
40456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
405433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (!_aidl_status.isOk()) {
40656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
40756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
40856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply->writeString16Vector(_aidl_return);
40956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
41056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
41156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
41256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply->writeString16Vector(out_output);
41356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
41456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
41556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
41656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
41756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
4187ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlincase Call::BINDERLISTMETHOD:
4197ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin{
4207ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstd::vector<android::sp<::android::IBinder>> in_input;
4217ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstd::vector<android::sp<::android::IBinder>> out_output;
4227ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstd::vector<android::sp<::android::IBinder>> _aidl_return;
423864bc0936d95410b06a3709e1559c884258bc52cChristopher Wileyif (!(data.checkInterface(this))) {
4247ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = android::BAD_TYPE;
4257ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4267ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4277ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = data.readStrongBinderVector(&in_input);
4287ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
4297ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4307ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
431433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyandroid::binder::Status _aidl_status(BinderListMethod(in_input, &out_output, &_aidl_return));
432433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileystatus = _aidl_status.writeToParcel(reply);
4337ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
4347ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4357ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
436433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (!_aidl_status.isOk()) {
4377ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4387ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4397ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = reply->writeStrongBinderVector(_aidl_return);
4407ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
4417ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4427ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4437ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinstatus = reply->writeStrongBinderVector(out_output);
4447ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinif (((status) != (android::OK))) {
4457ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
4467ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4477ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin}
4487ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlinbreak;
449b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlindefault:
450b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
451b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = android::BBinder::onTransact(code, data, reply, flags);
452b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
453b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
454b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
455433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyif (status == android::UNEXPECTED_NULL) {
456433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileystatus = android::binder::Status::fromExceptionCode(android::binder::Status::EX_NULL_POINTER).writeToParcel(reply);
457433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley}
458b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
459b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
460b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
461b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
462b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
463b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
464b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
465b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
466b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceHeaderOutput[] =
467b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
468b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
469b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
470b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
471b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
472433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wiley#include <binder/Status.h>
473b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <cstdint>
474389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include <foo/IFooType.h>
47556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley#include <utils/String16.h>
476389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include <utils/StrongPointer.h>
477b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <vector>
478b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
479b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
480b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
481b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
482b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
483b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass IComplexTypeInterface : public android::IInterface {
484b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
485b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinDECLARE_META_INTERFACE(ComplexTypeInterface);
486433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyvirtual android::binder::Status 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;
487433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyvirtual android::binder::Status Piff(int32_t times) = 0;
488433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyvirtual android::binder::Status TakesABinder(const android::sp<::foo::IFooType>& f, android::sp<::foo::IFooType>* _aidl_return) = 0;
489433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyvirtual android::binder::Status StringListMethod(const std::vector<android::String16>& input, std::vector<android::String16>* output, std::vector<android::String16>* _aidl_return) = 0;
490433c8bbdfa1ee6db10b7f08d3c50eafd49ad2687Christopher Wileyvirtual android::binder::Status 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;
491b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinenum Call {
492b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  SEND = android::IBinder::FIRST_CALL_TRANSACTION + 0,
4930dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  PIFF = android::IBinder::FIRST_CALL_TRANSACTION + 1,
494389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  TAKESABINDER = android::IBinder::FIRST_CALL_TRANSACTION + 2,
49556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley  STRINGLISTMETHOD = android::IBinder::FIRST_CALL_TRANSACTION + 3,
4967ecd69f2cc3c31cf569840e9c2d53ed352328d18Casey Dahlin  BINDERLISTMETHOD = android::IBinder::FIRST_CALL_TRANSACTION + 4,
497b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
498b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class IComplexTypeInterface
499b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
500b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
501b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
502b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
503b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
504b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_)";
505b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
506b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceSourceOutput[] =
507b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/IComplexTypeInterface.h>
508b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/BpComplexTypeInterface.h>
509b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
510b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
511b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
512b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
513b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
514b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinIMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface");
515b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
516b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
517b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
518b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
519b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
520b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
521a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace
522a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
523b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ASTTest : public ::testing::Test {
5240c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected:
525389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  ASTTest(string file_path, string file_contents)
526389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin      : file_path_(file_path),
5275679952c38925a54b75b087068887002e57f3174Christopher Wiley        file_contents_(file_contents) {
5285679952c38925a54b75b087068887002e57f3174Christopher Wiley    types_.Init();
5295679952c38925a54b75b087068887002e57f3174Christopher Wiley  }
530b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
53190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> Parse() {
532389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    io_delegate_.SetFileContents(file_path_, file_contents_);
53390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
53490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    unique_ptr<AidlInterface> ret;
53590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    std::vector<std::unique_ptr<AidlImport>> imports;
536632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley    AidlError err = ::android::aidl::internals::load_and_validate_aidl(
53790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no preprocessed files
538389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        {"."},
539389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        file_path_,
540389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        io_delegate_,
541389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        &types_,
54290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &ret,
54390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &imports);
544a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
545632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley    if (err != AidlError::OK)
5462cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin      return nullptr;
547a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5482cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    return ret;
54990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
550a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5510c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  void Compare(Document* doc, const char* expected) {
5520c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    string output;
5530c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    unique_ptr<CodeWriter> cw = GetStringWriter(&output);
554a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5550c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    doc->Write(cw.get());
556a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
55780ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    if (expected == output) {
55880ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin      return; // Success
55980ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    }
56080ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin
56180ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    test::PrintDiff(expected, output);
56280ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    FAIL() << "Document contents did not match expected contents";
5630c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  }
564389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
565389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  const string file_path_;
566389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  const string file_contents_;
567389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  FakeIoDelegate io_delegate_;
568389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  TypeNamespace types_;
5690c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};
570a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
571b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ComplexTypeInterfaceASTTest : public ASTTest {
572389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin public:
573389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  ComplexTypeInterfaceASTTest()
574389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin      : ASTTest("android/os/IComplexTypeInterface.aidl",
575389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin                kComplexTypeInterfaceAIDL) {
576389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    io_delegate_.SetFileContents("foo/IFooType.aidl",
577389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin                                 "package foo; interface IFooType {}");
578389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  }
579b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
580b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
581b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
58290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5830c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
584389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildClientHeader(types_, *interface);
585b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
5860c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}
5870c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
588b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
58990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
59036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  ASSERT_NE(interface, nullptr);
591389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildClientSource(types_, *interface);
592b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
59336570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
59436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
595b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
59690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
597fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  ASSERT_NE(interface, nullptr);
598389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildServerHeader(types_, *interface);
599b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
600fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}
601fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
602b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
60390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
604ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  ASSERT_NE(interface, nullptr);
605389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildServerSource(types_, *interface);
606b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
607ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
608ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
609b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
61090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
6110c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
612389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types_, *interface);
613b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
614a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}
615a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
616b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
61790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
6181dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  ASSERT_NE(interface, nullptr);
619389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceSource(types_, *interface);
620b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
6211dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}
6221dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
6239d6e0b29add607669e440085f1fc60cd434dc987Christopher Wileynamespace test_io_handling {
6249d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6259d6e0b29add607669e440085f1fc60cd434dc987Christopher Wileyconst char kInputPath[] = "a/IFoo.aidl";
6269d6e0b29add607669e440085f1fc60cd434dc987Christopher Wileyconst char kOutputPath[] = "output.cpp";
6279d6e0b29add607669e440085f1fc60cd434dc987Christopher Wileyconst char kHeaderDir[] = "headers";
6289d6e0b29add607669e440085f1fc60cd434dc987Christopher Wileyconst char kInterfaceHeaderRelPath[] = "a/IFoo.h";
6299d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6309d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley}  // namespace test_io_handling
6319d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6329d6e0b29add607669e440085f1fc60cd434dc987Christopher Wileyclass IoErrorHandlingTest : public ASTTest {
6339d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley public:
6349d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  IoErrorHandlingTest ()
6359d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley      : ASTTest(test_io_handling::kInputPath,
6369d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley                "package a; interface IFoo {}"),
6379d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley        options_(GetOptions()) {}
6389d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6399d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  const unique_ptr<CppOptions> options_;
6409d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6419d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley private:
6429d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  static unique_ptr<CppOptions> GetOptions() {
6439d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley    using namespace test_io_handling;
6449d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6459d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley    const int argc = 4;
6469d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley    const char* cmdline[argc] = {
6479d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley      "aidl-cpp", kInputPath, kHeaderDir, kOutputPath
6489d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley    };
6499d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley    return CppOptions::Parse(argc, cmdline);
6509d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  }
6519d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley};
6529d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6539d6e0b29add607669e440085f1fc60cd434dc987Christopher WileyTEST_F(IoErrorHandlingTest, GenerateCorrectlyAbsentErrors) {
6549d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  // Confirm that this is working correctly without I/O problems.
6559d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  const unique_ptr<AidlInterface> interface = Parse();
6569d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  ASSERT_NE(interface, nullptr);
6579d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  ASSERT_TRUE(GenerateCpp(*options_, types_, *interface, io_delegate_));
6589d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley}
6599d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6609d6e0b29add607669e440085f1fc60cd434dc987Christopher WileyTEST_F(IoErrorHandlingTest, HandlesBadHeaderWrite) {
6619d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  using namespace test_io_handling;
6629d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  const unique_ptr<AidlInterface> interface = Parse();
6639d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  ASSERT_NE(interface, nullptr);
6649d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6659d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  // Simulate issues closing the interface header.
6669d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  const string header_path =
6679d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley      StringPrintf("%s%c%s", kHeaderDir, OS_PATH_SEPARATOR,
6689d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley                   kInterfaceHeaderRelPath);
6699d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  io_delegate_.AddBrokenFilePath(header_path);
6709d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  ASSERT_FALSE(GenerateCpp(*options_, types_, *interface, io_delegate_));
6719d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  // We should never attempt to write the C++ file if we fail writing headers.
6729d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  ASSERT_FALSE(io_delegate_.GetWrittenContents(kOutputPath, nullptr));
6739d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  // We should remove partial results.
6749d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  ASSERT_TRUE(io_delegate_.PathWasRemoved(header_path));
6759d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley}
6769d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6779d6e0b29add607669e440085f1fc60cd434dc987Christopher WileyTEST_F(IoErrorHandlingTest, HandlesBadCppWrite) {
6789d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  using test_io_handling::kOutputPath;
6799d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  const unique_ptr<AidlInterface> interface = Parse();
6809d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  ASSERT_NE(interface, nullptr);
6819d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
6829d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  // Simulate issues closing the cpp file.
6839d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  io_delegate_.AddBrokenFilePath(kOutputPath);
6849d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  ASSERT_FALSE(GenerateCpp(*options_, types_, *interface, io_delegate_));
6859d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  // We should remove partial results.
6869d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley  ASSERT_TRUE(io_delegate_.PathWasRemoved(kOutputPath));
6879d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley}
6889d6e0b29add607669e440085f1fc60cd434dc987Christopher Wiley
689f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace cpp
690a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace aidl
691a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
692