blob: 32e9362431d55de0e9a1066b6541af1098084267 [file] [log] [blame]
Casey Dahlina834dd42015-09-23 11:52:15 -07001/*
2 * Copyright (C) 2015, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <string>
18
Elliott Hughes0a620672015-12-04 13:53:18 -080019#include <android-base/stringprintf.h>
Casey Dahlina834dd42015-09-23 11:52:15 -070020#include <gtest/gtest.h>
21
Casey Dahlin2cc93162015-10-02 16:14:17 -070022#include "aidl.h"
Casey Dahlina834dd42015-09-23 11:52:15 -070023#include "aidl_language.h"
24#include "ast_cpp.h"
25#include "code_writer.h"
Christopher Wileyad339272015-10-05 19:11:58 -070026#include "generate_cpp.h"
Christopher Wiley9d6e0b22015-11-13 12:18:16 -080027#include "os.h"
Christopher Wiley4a2884b2015-10-07 11:27:45 -070028#include "tests/fake_io_delegate.h"
Casey Dahlin80ada3d2015-10-20 20:33:56 -070029#include "tests/test_util.h"
Christopher Wileye3550c62015-09-29 13:26:10 -070030#include "type_cpp.h"
Casey Dahlina834dd42015-09-23 11:52:15 -070031
Casey Dahlinb8d9e882015-11-24 10:57:23 -080032using ::android::aidl::test::FakeIoDelegate;
33using ::android::base::StringPrintf;
Casey Dahlina834dd42015-09-23 11:52:15 -070034using std::string;
35using std::unique_ptr;
36
37namespace android {
38namespace aidl {
Christopher Wileyf944e792015-09-29 10:00:46 -070039namespace cpp {
Casey Dahlina834dd42015-09-23 11:52:15 -070040namespace {
41
Casey Dahlinb0966612015-10-19 16:35:26 -070042const string kComplexTypeInterfaceAIDL =
43R"(package android.os;
Casey Dahlin389781f2015-10-22 13:13:21 -070044import foo.IFooType;
Casey Dahlinb0966612015-10-19 16:35:26 -070045interface IComplexTypeInterface {
Casey Dahlind40e2fe2015-11-24 14:06:52 -080046 const int MY_CONSTANT = 3;
Casey Dahlincb5317d2015-12-03 15:43:33 -080047 int[] Send(in @nullable int[] goes_in, inout double[] goes_in_and_out, out boolean[] goes_out);
Casey Dahlin0dd08af2015-10-20 18:45:50 -070048 oneway void Piff(int times);
Casey Dahlin389781f2015-10-22 13:13:21 -070049 IFooType TakesABinder(IFooType f);
Casey Dahlinef88bce2016-04-15 11:55:30 -070050 @nullable IFooType NullableBinder();
Christopher Wiley56c9bf32015-10-30 10:41:12 -070051 List<String> StringListMethod(in java.util.List<String> input, out List<String> output);
Casey Dahlin7ecd69f2015-11-03 13:52:38 -080052 List<IBinder> BinderListMethod(in java.util.List<IBinder> input, out List<IBinder> output);
Casey Dahlina4ba4b62015-11-02 15:43:30 -080053 FileDescriptor TakesAFileDescriptor(in FileDescriptor f);
54 FileDescriptor[] TakesAFileDescriptorArray(in FileDescriptor[] f);
Casey Dahlinb0966612015-10-19 16:35:26 -070055})";
56
57const char kExpectedComplexTypeClientHeaderOutput[] =
58R"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
59#define AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
60
61#include <binder/IBinder.h>
62#include <binder/IInterface.h>
63#include <utils/Errors.h>
64#include <android/os/IComplexTypeInterface.h>
65
66namespace android {
67
68namespace os {
69
Casey Dahlinb8d9e882015-11-24 10:57:23 -080070class BpComplexTypeInterface : public ::android::BpInterface<IComplexTypeInterface> {
Casey Dahlinb0966612015-10-19 16:35:26 -070071public:
Casey Dahlinb8d9e882015-11-24 10:57:23 -080072explicit BpComplexTypeInterface(const ::android::sp<::android::IBinder>& _aidl_impl);
Casey Dahlinb0966612015-10-19 16:35:26 -070073virtual ~BpComplexTypeInterface() = default;
Casey Dahlin57dbe242015-12-04 11:44:02 -080074::android::binder::Status Send(const ::std::unique_ptr<::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;
Casey Dahlinb8d9e882015-11-24 10:57:23 -080075::android::binder::Status Piff(int32_t times) override;
76::android::binder::Status TakesABinder(const ::android::sp<::foo::IFooType>& f, ::android::sp<::foo::IFooType>* _aidl_return) override;
Casey Dahlinef88bce2016-04-15 11:55:30 -070077::android::binder::Status NullableBinder(::android::sp<::foo::IFooType>* _aidl_return) override;
Casey Dahlinb8d9e882015-11-24 10:57:23 -080078::android::binder::Status StringListMethod(const ::std::vector<::android::String16>& input, ::std::vector<::android::String16>* output, ::std::vector<::android::String16>* _aidl_return) override;
79::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) override;
Christopher Wiley7cb9c252016-04-11 11:07:33 -070080::android::binder::Status TakesAFileDescriptor(const ::android::base::unique_fd& f, ::android::base::unique_fd* _aidl_return) override;
81::android::binder::Status TakesAFileDescriptorArray(const ::std::vector<::android::base::unique_fd>& f, ::std::vector<::android::base::unique_fd>* _aidl_return) override;
Casey Dahlinb0966612015-10-19 16:35:26 -070082}; // class BpComplexTypeInterface
83
84} // namespace os
85
86} // namespace android
87
Christopher Wiley11a9d792016-02-24 17:20:33 -080088#endif // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
89)";
Casey Dahlinb0966612015-10-19 16:35:26 -070090
91const char kExpectedComplexTypeClientSourceOutput[] =
92R"(#include <android/os/BpComplexTypeInterface.h>
93#include <binder/Parcel.h>
94
95namespace android {
96
97namespace os {
98
Casey Dahlinb8d9e882015-11-24 10:57:23 -080099BpComplexTypeInterface::BpComplexTypeInterface(const ::android::sp<::android::IBinder>& _aidl_impl)
100 : BpInterface<IComplexTypeInterface>(_aidl_impl){
Casey Dahlinb0966612015-10-19 16:35:26 -0700101}
102
Casey Dahlin57dbe242015-12-04 11:44:02 -0800103::android::binder::Status BpComplexTypeInterface::Send(const ::std::unique_ptr<::std::vector<int32_t>>& goes_in, ::std::vector<double>* goes_in_and_out, ::std::vector<bool>* goes_out, ::std::vector<int32_t>* _aidl_return) {
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800104::android::Parcel _aidl_data;
105::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800106::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800107::android::binder::Status _aidl_status;
108_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
109if (((_aidl_ret_status) != (::android::OK))) {
110goto _aidl_error;
Christopher Wiley8993cb52015-10-21 09:53:24 -0700111}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800112_aidl_ret_status = _aidl_data.writeInt32Vector(goes_in);
113if (((_aidl_ret_status) != (::android::OK))) {
114goto _aidl_error;
Christopher Wileybb967822015-10-27 14:04:53 -0700115}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800116_aidl_ret_status = _aidl_data.writeDoubleVector(*goes_in_and_out);
117if (((_aidl_ret_status) != (::android::OK))) {
118goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700119}
Christopher Wiley74b7bf12016-08-19 11:06:32 -0700120_aidl_ret_status = _aidl_data.writeVectorSize(*goes_out);
121if (((_aidl_ret_status) != (::android::OK))) {
122goto _aidl_error;
123}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800124_aidl_ret_status = remote()->transact(IComplexTypeInterface::SEND, _aidl_data, &_aidl_reply);
125if (((_aidl_ret_status) != (::android::OK))) {
126goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700127}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800128_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
129if (((_aidl_ret_status) != (::android::OK))) {
130goto _aidl_error;
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800131}
132if (!_aidl_status.isOk()) {
133return _aidl_status;
Christopher Wiley2aaeda82015-10-19 15:16:49 -0700134}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800135_aidl_ret_status = _aidl_reply.readInt32Vector(_aidl_return);
136if (((_aidl_ret_status) != (::android::OK))) {
137goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700138}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800139_aidl_ret_status = _aidl_reply.readDoubleVector(goes_in_and_out);
140if (((_aidl_ret_status) != (::android::OK))) {
141goto _aidl_error;
Christopher Wileybb967822015-10-27 14:04:53 -0700142}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800143_aidl_ret_status = _aidl_reply.readBoolVector(goes_out);
144if (((_aidl_ret_status) != (::android::OK))) {
145goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700146}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800147_aidl_error:
148_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800149return _aidl_status;
Casey Dahlinb0966612015-10-19 16:35:26 -0700150}
151
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800152::android::binder::Status BpComplexTypeInterface::Piff(int32_t times) {
153::android::Parcel _aidl_data;
154::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800155::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800156::android::binder::Status _aidl_status;
157_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
158if (((_aidl_ret_status) != (::android::OK))) {
159goto _aidl_error;
Christopher Wiley8993cb52015-10-21 09:53:24 -0700160}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800161_aidl_ret_status = _aidl_data.writeInt32(times);
162if (((_aidl_ret_status) != (::android::OK))) {
163goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700164}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800165_aidl_ret_status = remote()->transact(IComplexTypeInterface::PIFF, _aidl_data, &_aidl_reply, ::android::IBinder::FLAG_ONEWAY);
166if (((_aidl_ret_status) != (::android::OK))) {
167goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700168}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800169_aidl_error:
170_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800171return _aidl_status;
Casey Dahlin0dd08af2015-10-20 18:45:50 -0700172}
173
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800174::android::binder::Status BpComplexTypeInterface::TakesABinder(const ::android::sp<::foo::IFooType>& f, ::android::sp<::foo::IFooType>* _aidl_return) {
175::android::Parcel _aidl_data;
176::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800177::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800178::android::binder::Status _aidl_status;
179_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
180if (((_aidl_ret_status) != (::android::OK))) {
181goto _aidl_error;
Casey Dahlin389781f2015-10-22 13:13:21 -0700182}
Casey Dahlin2dbab062016-01-05 17:41:08 -0800183_aidl_ret_status = _aidl_data.writeStrongBinder(::foo::IFooType::asBinder(f));
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800184if (((_aidl_ret_status) != (::android::OK))) {
185goto _aidl_error;
Casey Dahlin389781f2015-10-22 13:13:21 -0700186}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800187_aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESABINDER, _aidl_data, &_aidl_reply);
188if (((_aidl_ret_status) != (::android::OK))) {
189goto _aidl_error;
Casey Dahlin389781f2015-10-22 13:13:21 -0700190}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800191_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
192if (((_aidl_ret_status) != (::android::OK))) {
193goto _aidl_error;
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800194}
195if (!_aidl_status.isOk()) {
196return _aidl_status;
Casey Dahlin389781f2015-10-22 13:13:21 -0700197}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800198_aidl_ret_status = _aidl_reply.readStrongBinder(_aidl_return);
199if (((_aidl_ret_status) != (::android::OK))) {
200goto _aidl_error;
Casey Dahlin389781f2015-10-22 13:13:21 -0700201}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800202_aidl_error:
203_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800204return _aidl_status;
Casey Dahlin389781f2015-10-22 13:13:21 -0700205}
206
Casey Dahlinef88bce2016-04-15 11:55:30 -0700207::android::binder::Status BpComplexTypeInterface::NullableBinder(::android::sp<::foo::IFooType>* _aidl_return) {
208::android::Parcel _aidl_data;
209::android::Parcel _aidl_reply;
210::android::status_t _aidl_ret_status = ::android::OK;
211::android::binder::Status _aidl_status;
212_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
213if (((_aidl_ret_status) != (::android::OK))) {
214goto _aidl_error;
215}
216_aidl_ret_status = remote()->transact(IComplexTypeInterface::NULLABLEBINDER, _aidl_data, &_aidl_reply);
217if (((_aidl_ret_status) != (::android::OK))) {
218goto _aidl_error;
219}
220_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
221if (((_aidl_ret_status) != (::android::OK))) {
222goto _aidl_error;
223}
224if (!_aidl_status.isOk()) {
225return _aidl_status;
226}
227_aidl_ret_status = _aidl_reply.readNullableStrongBinder(_aidl_return);
228if (((_aidl_ret_status) != (::android::OK))) {
229goto _aidl_error;
230}
231_aidl_error:
232_aidl_status.setFromStatusT(_aidl_ret_status);
233return _aidl_status;
234}
235
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800236::android::binder::Status BpComplexTypeInterface::StringListMethod(const ::std::vector<::android::String16>& input, ::std::vector<::android::String16>* output, ::std::vector<::android::String16>* _aidl_return) {
237::android::Parcel _aidl_data;
238::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800239::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800240::android::binder::Status _aidl_status;
241_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
242if (((_aidl_ret_status) != (::android::OK))) {
243goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700244}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800245_aidl_ret_status = _aidl_data.writeString16Vector(input);
246if (((_aidl_ret_status) != (::android::OK))) {
247goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700248}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800249_aidl_ret_status = remote()->transact(IComplexTypeInterface::STRINGLISTMETHOD, _aidl_data, &_aidl_reply);
250if (((_aidl_ret_status) != (::android::OK))) {
251goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700252}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800253_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
254if (((_aidl_ret_status) != (::android::OK))) {
255goto _aidl_error;
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800256}
257if (!_aidl_status.isOk()) {
258return _aidl_status;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700259}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800260_aidl_ret_status = _aidl_reply.readString16Vector(_aidl_return);
261if (((_aidl_ret_status) != (::android::OK))) {
262goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700263}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800264_aidl_ret_status = _aidl_reply.readString16Vector(output);
265if (((_aidl_ret_status) != (::android::OK))) {
266goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700267}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800268_aidl_error:
269_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800270return _aidl_status;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700271}
272
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800273::android::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) {
274::android::Parcel _aidl_data;
275::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800276::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800277::android::binder::Status _aidl_status;
278_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
279if (((_aidl_ret_status) != (::android::OK))) {
280goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800281}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800282_aidl_ret_status = _aidl_data.writeStrongBinderVector(input);
283if (((_aidl_ret_status) != (::android::OK))) {
284goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800285}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800286_aidl_ret_status = remote()->transact(IComplexTypeInterface::BINDERLISTMETHOD, _aidl_data, &_aidl_reply);
287if (((_aidl_ret_status) != (::android::OK))) {
288goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800289}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800290_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
291if (((_aidl_ret_status) != (::android::OK))) {
292goto _aidl_error;
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800293}
294if (!_aidl_status.isOk()) {
295return _aidl_status;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800296}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800297_aidl_ret_status = _aidl_reply.readStrongBinderVector(_aidl_return);
298if (((_aidl_ret_status) != (::android::OK))) {
299goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800300}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800301_aidl_ret_status = _aidl_reply.readStrongBinderVector(output);
302if (((_aidl_ret_status) != (::android::OK))) {
303goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800304}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800305_aidl_error:
306_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800307return _aidl_status;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800308}
309
Christopher Wiley7cb9c252016-04-11 11:07:33 -0700310::android::binder::Status BpComplexTypeInterface::TakesAFileDescriptor(const ::android::base::unique_fd& f, ::android::base::unique_fd* _aidl_return) {
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800311::android::Parcel _aidl_data;
312::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800313::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800314::android::binder::Status _aidl_status;
315_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
316if (((_aidl_ret_status) != (::android::OK))) {
317goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800318}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800319_aidl_ret_status = _aidl_data.writeUniqueFileDescriptor(f);
320if (((_aidl_ret_status) != (::android::OK))) {
321goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800322}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800323_aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESAFILEDESCRIPTOR, _aidl_data, &_aidl_reply);
324if (((_aidl_ret_status) != (::android::OK))) {
325goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800326}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800327_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
328if (((_aidl_ret_status) != (::android::OK))) {
329goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800330}
331if (!_aidl_status.isOk()) {
332return _aidl_status;
333}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800334_aidl_ret_status = _aidl_reply.readUniqueFileDescriptor(_aidl_return);
335if (((_aidl_ret_status) != (::android::OK))) {
336goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800337}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800338_aidl_error:
339_aidl_status.setFromStatusT(_aidl_ret_status);
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800340return _aidl_status;
341}
342
Christopher Wiley7cb9c252016-04-11 11:07:33 -0700343::android::binder::Status BpComplexTypeInterface::TakesAFileDescriptorArray(const ::std::vector<::android::base::unique_fd>& f, ::std::vector<::android::base::unique_fd>* _aidl_return) {
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800344::android::Parcel _aidl_data;
345::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800346::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800347::android::binder::Status _aidl_status;
348_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
349if (((_aidl_ret_status) != (::android::OK))) {
350goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800351}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800352_aidl_ret_status = _aidl_data.writeUniqueFileDescriptorVector(f);
353if (((_aidl_ret_status) != (::android::OK))) {
354goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800355}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800356_aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESAFILEDESCRIPTORARRAY, _aidl_data, &_aidl_reply);
357if (((_aidl_ret_status) != (::android::OK))) {
358goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800359}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800360_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
361if (((_aidl_ret_status) != (::android::OK))) {
362goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800363}
364if (!_aidl_status.isOk()) {
365return _aidl_status;
366}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800367_aidl_ret_status = _aidl_reply.readUniqueFileDescriptorVector(_aidl_return);
368if (((_aidl_ret_status) != (::android::OK))) {
369goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800370}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800371_aidl_error:
372_aidl_status.setFromStatusT(_aidl_ret_status);
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800373return _aidl_status;
374}
375
Casey Dahlinb0966612015-10-19 16:35:26 -0700376} // namespace os
377
378} // namespace android
379)";
380
Martijn Coenenb06c8292018-02-21 21:06:23 +0100381const char kExpectedComplexTypeClientWithTraceSourceOutput[] =
382R"(#include <android/os/BpComplexTypeInterface.h>
383#include <binder/Parcel.h>
384
385namespace android {
386
387namespace os {
388
389BpComplexTypeInterface::BpComplexTypeInterface(const ::android::sp<::android::IBinder>& _aidl_impl)
390 : BpInterface<IComplexTypeInterface>(_aidl_impl){
391}
392
393::android::binder::Status BpComplexTypeInterface::Send(const ::std::unique_ptr<::std::vector<int32_t>>& goes_in, ::std::vector<double>* goes_in_and_out, ::std::vector<bool>* goes_out, ::std::vector<int32_t>* _aidl_return) {
394::android::Parcel _aidl_data;
395::android::Parcel _aidl_reply;
396::android::status_t _aidl_ret_status = ::android::OK;
397::android::binder::Status _aidl_status;
398ScopedTrace _aidl_trace(ATRACE_TAG_AIDL, "IComplexTypeInterface::Send::cppClient");
399_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
400if (((_aidl_ret_status) != (::android::OK))) {
401goto _aidl_error;
402}
403_aidl_ret_status = _aidl_data.writeInt32Vector(goes_in);
404if (((_aidl_ret_status) != (::android::OK))) {
405goto _aidl_error;
406}
407_aidl_ret_status = _aidl_data.writeDoubleVector(*goes_in_and_out);
408if (((_aidl_ret_status) != (::android::OK))) {
409goto _aidl_error;
410}
411_aidl_ret_status = _aidl_data.writeVectorSize(*goes_out);
412if (((_aidl_ret_status) != (::android::OK))) {
413goto _aidl_error;
414}
415_aidl_ret_status = remote()->transact(IComplexTypeInterface::SEND, _aidl_data, &_aidl_reply);
416if (((_aidl_ret_status) != (::android::OK))) {
417goto _aidl_error;
418}
419_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
420if (((_aidl_ret_status) != (::android::OK))) {
421goto _aidl_error;
422}
423if (!_aidl_status.isOk()) {
424return _aidl_status;
425}
426_aidl_ret_status = _aidl_reply.readInt32Vector(_aidl_return);
427if (((_aidl_ret_status) != (::android::OK))) {
428goto _aidl_error;
429}
430_aidl_ret_status = _aidl_reply.readDoubleVector(goes_in_and_out);
431if (((_aidl_ret_status) != (::android::OK))) {
432goto _aidl_error;
433}
434_aidl_ret_status = _aidl_reply.readBoolVector(goes_out);
435if (((_aidl_ret_status) != (::android::OK))) {
436goto _aidl_error;
437}
438_aidl_error:
439_aidl_status.setFromStatusT(_aidl_ret_status);
440return _aidl_status;
441}
442
443::android::binder::Status BpComplexTypeInterface::Piff(int32_t times) {
444::android::Parcel _aidl_data;
445::android::Parcel _aidl_reply;
446::android::status_t _aidl_ret_status = ::android::OK;
447::android::binder::Status _aidl_status;
448ScopedTrace _aidl_trace(ATRACE_TAG_AIDL, "IComplexTypeInterface::Piff::cppClient");
449_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
450if (((_aidl_ret_status) != (::android::OK))) {
451goto _aidl_error;
452}
453_aidl_ret_status = _aidl_data.writeInt32(times);
454if (((_aidl_ret_status) != (::android::OK))) {
455goto _aidl_error;
456}
457_aidl_ret_status = remote()->transact(IComplexTypeInterface::PIFF, _aidl_data, &_aidl_reply, ::android::IBinder::FLAG_ONEWAY);
458if (((_aidl_ret_status) != (::android::OK))) {
459goto _aidl_error;
460}
461_aidl_error:
462_aidl_status.setFromStatusT(_aidl_ret_status);
463return _aidl_status;
464}
465
466::android::binder::Status BpComplexTypeInterface::TakesABinder(const ::android::sp<::foo::IFooType>& f, ::android::sp<::foo::IFooType>* _aidl_return) {
467::android::Parcel _aidl_data;
468::android::Parcel _aidl_reply;
469::android::status_t _aidl_ret_status = ::android::OK;
470::android::binder::Status _aidl_status;
471ScopedTrace _aidl_trace(ATRACE_TAG_AIDL, "IComplexTypeInterface::TakesABinder::cppClient");
472_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
473if (((_aidl_ret_status) != (::android::OK))) {
474goto _aidl_error;
475}
476_aidl_ret_status = _aidl_data.writeStrongBinder(::foo::IFooType::asBinder(f));
477if (((_aidl_ret_status) != (::android::OK))) {
478goto _aidl_error;
479}
480_aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESABINDER, _aidl_data, &_aidl_reply);
481if (((_aidl_ret_status) != (::android::OK))) {
482goto _aidl_error;
483}
484_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
485if (((_aidl_ret_status) != (::android::OK))) {
486goto _aidl_error;
487}
488if (!_aidl_status.isOk()) {
489return _aidl_status;
490}
491_aidl_ret_status = _aidl_reply.readStrongBinder(_aidl_return);
492if (((_aidl_ret_status) != (::android::OK))) {
493goto _aidl_error;
494}
495_aidl_error:
496_aidl_status.setFromStatusT(_aidl_ret_status);
497return _aidl_status;
498}
499
500::android::binder::Status BpComplexTypeInterface::NullableBinder(::android::sp<::foo::IFooType>* _aidl_return) {
501::android::Parcel _aidl_data;
502::android::Parcel _aidl_reply;
503::android::status_t _aidl_ret_status = ::android::OK;
504::android::binder::Status _aidl_status;
505ScopedTrace _aidl_trace(ATRACE_TAG_AIDL, "IComplexTypeInterface::NullableBinder::cppClient");
506_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
507if (((_aidl_ret_status) != (::android::OK))) {
508goto _aidl_error;
509}
510_aidl_ret_status = remote()->transact(IComplexTypeInterface::NULLABLEBINDER, _aidl_data, &_aidl_reply);
511if (((_aidl_ret_status) != (::android::OK))) {
512goto _aidl_error;
513}
514_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
515if (((_aidl_ret_status) != (::android::OK))) {
516goto _aidl_error;
517}
518if (!_aidl_status.isOk()) {
519return _aidl_status;
520}
521_aidl_ret_status = _aidl_reply.readNullableStrongBinder(_aidl_return);
522if (((_aidl_ret_status) != (::android::OK))) {
523goto _aidl_error;
524}
525_aidl_error:
526_aidl_status.setFromStatusT(_aidl_ret_status);
527return _aidl_status;
528}
529
530::android::binder::Status BpComplexTypeInterface::StringListMethod(const ::std::vector<::android::String16>& input, ::std::vector<::android::String16>* output, ::std::vector<::android::String16>* _aidl_return) {
531::android::Parcel _aidl_data;
532::android::Parcel _aidl_reply;
533::android::status_t _aidl_ret_status = ::android::OK;
534::android::binder::Status _aidl_status;
535ScopedTrace _aidl_trace(ATRACE_TAG_AIDL, "IComplexTypeInterface::StringListMethod::cppClient");
536_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
537if (((_aidl_ret_status) != (::android::OK))) {
538goto _aidl_error;
539}
540_aidl_ret_status = _aidl_data.writeString16Vector(input);
541if (((_aidl_ret_status) != (::android::OK))) {
542goto _aidl_error;
543}
544_aidl_ret_status = remote()->transact(IComplexTypeInterface::STRINGLISTMETHOD, _aidl_data, &_aidl_reply);
545if (((_aidl_ret_status) != (::android::OK))) {
546goto _aidl_error;
547}
548_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
549if (((_aidl_ret_status) != (::android::OK))) {
550goto _aidl_error;
551}
552if (!_aidl_status.isOk()) {
553return _aidl_status;
554}
555_aidl_ret_status = _aidl_reply.readString16Vector(_aidl_return);
556if (((_aidl_ret_status) != (::android::OK))) {
557goto _aidl_error;
558}
559_aidl_ret_status = _aidl_reply.readString16Vector(output);
560if (((_aidl_ret_status) != (::android::OK))) {
561goto _aidl_error;
562}
563_aidl_error:
564_aidl_status.setFromStatusT(_aidl_ret_status);
565return _aidl_status;
566}
567
568::android::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) {
569::android::Parcel _aidl_data;
570::android::Parcel _aidl_reply;
571::android::status_t _aidl_ret_status = ::android::OK;
572::android::binder::Status _aidl_status;
573ScopedTrace _aidl_trace(ATRACE_TAG_AIDL, "IComplexTypeInterface::BinderListMethod::cppClient");
574_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
575if (((_aidl_ret_status) != (::android::OK))) {
576goto _aidl_error;
577}
578_aidl_ret_status = _aidl_data.writeStrongBinderVector(input);
579if (((_aidl_ret_status) != (::android::OK))) {
580goto _aidl_error;
581}
582_aidl_ret_status = remote()->transact(IComplexTypeInterface::BINDERLISTMETHOD, _aidl_data, &_aidl_reply);
583if (((_aidl_ret_status) != (::android::OK))) {
584goto _aidl_error;
585}
586_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
587if (((_aidl_ret_status) != (::android::OK))) {
588goto _aidl_error;
589}
590if (!_aidl_status.isOk()) {
591return _aidl_status;
592}
593_aidl_ret_status = _aidl_reply.readStrongBinderVector(_aidl_return);
594if (((_aidl_ret_status) != (::android::OK))) {
595goto _aidl_error;
596}
597_aidl_ret_status = _aidl_reply.readStrongBinderVector(output);
598if (((_aidl_ret_status) != (::android::OK))) {
599goto _aidl_error;
600}
601_aidl_error:
602_aidl_status.setFromStatusT(_aidl_ret_status);
603return _aidl_status;
604}
605
606::android::binder::Status BpComplexTypeInterface::TakesAFileDescriptor(const ::android::base::unique_fd& f, ::android::base::unique_fd* _aidl_return) {
607::android::Parcel _aidl_data;
608::android::Parcel _aidl_reply;
609::android::status_t _aidl_ret_status = ::android::OK;
610::android::binder::Status _aidl_status;
611ScopedTrace _aidl_trace(ATRACE_TAG_AIDL, "IComplexTypeInterface::TakesAFileDescriptor::cppClient");
612_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
613if (((_aidl_ret_status) != (::android::OK))) {
614goto _aidl_error;
615}
616_aidl_ret_status = _aidl_data.writeUniqueFileDescriptor(f);
617if (((_aidl_ret_status) != (::android::OK))) {
618goto _aidl_error;
619}
620_aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESAFILEDESCRIPTOR, _aidl_data, &_aidl_reply);
621if (((_aidl_ret_status) != (::android::OK))) {
622goto _aidl_error;
623}
624_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
625if (((_aidl_ret_status) != (::android::OK))) {
626goto _aidl_error;
627}
628if (!_aidl_status.isOk()) {
629return _aidl_status;
630}
631_aidl_ret_status = _aidl_reply.readUniqueFileDescriptor(_aidl_return);
632if (((_aidl_ret_status) != (::android::OK))) {
633goto _aidl_error;
634}
635_aidl_error:
636_aidl_status.setFromStatusT(_aidl_ret_status);
637return _aidl_status;
638}
639
640::android::binder::Status BpComplexTypeInterface::TakesAFileDescriptorArray(const ::std::vector<::android::base::unique_fd>& f, ::std::vector<::android::base::unique_fd>* _aidl_return) {
641::android::Parcel _aidl_data;
642::android::Parcel _aidl_reply;
643::android::status_t _aidl_ret_status = ::android::OK;
644::android::binder::Status _aidl_status;
645ScopedTrace _aidl_trace(ATRACE_TAG_AIDL, "IComplexTypeInterface::TakesAFileDescriptorArray::cppClient");
646_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
647if (((_aidl_ret_status) != (::android::OK))) {
648goto _aidl_error;
649}
650_aidl_ret_status = _aidl_data.writeUniqueFileDescriptorVector(f);
651if (((_aidl_ret_status) != (::android::OK))) {
652goto _aidl_error;
653}
654_aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESAFILEDESCRIPTORARRAY, _aidl_data, &_aidl_reply);
655if (((_aidl_ret_status) != (::android::OK))) {
656goto _aidl_error;
657}
658_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
659if (((_aidl_ret_status) != (::android::OK))) {
660goto _aidl_error;
661}
662if (!_aidl_status.isOk()) {
663return _aidl_status;
664}
665_aidl_ret_status = _aidl_reply.readUniqueFileDescriptorVector(_aidl_return);
666if (((_aidl_ret_status) != (::android::OK))) {
667goto _aidl_error;
668}
669_aidl_error:
670_aidl_status.setFromStatusT(_aidl_ret_status);
671return _aidl_status;
672}
673
674} // namespace os
675
676} // namespace android
677)";
678
Casey Dahlinb0966612015-10-19 16:35:26 -0700679const char kExpectedComplexTypeServerHeaderOutput[] =
680R"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
681#define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
682
683#include <binder/IInterface.h>
684#include <android/os/IComplexTypeInterface.h>
685
686namespace android {
687
688namespace os {
689
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800690class BnComplexTypeInterface : public ::android::BnInterface<IComplexTypeInterface> {
Casey Dahlinb0966612015-10-19 16:35:26 -0700691public:
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800692::android::status_t onTransact(uint32_t _aidl_code, const ::android::Parcel& _aidl_data, ::android::Parcel* _aidl_reply, uint32_t _aidl_flags = 0) override;
Casey Dahlinb0966612015-10-19 16:35:26 -0700693}; // class BnComplexTypeInterface
694
695} // namespace os
696
697} // namespace android
698
Christopher Wiley11a9d792016-02-24 17:20:33 -0800699#endif // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
700)";
Casey Dahlinb0966612015-10-19 16:35:26 -0700701
702const char kExpectedComplexTypeServerSourceOutput[] =
703R"(#include <android/os/BnComplexTypeInterface.h>
704#include <binder/Parcel.h>
705
706namespace android {
707
708namespace os {
709
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800710::android::status_t BnComplexTypeInterface::onTransact(uint32_t _aidl_code, const ::android::Parcel& _aidl_data, ::android::Parcel* _aidl_reply, uint32_t _aidl_flags) {
Christopher Wiley10957122015-12-04 14:35:38 -0800711::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800712switch (_aidl_code) {
Casey Dahlinb0966612015-10-19 16:35:26 -0700713case Call::SEND:
714{
Casey Dahlin57dbe242015-12-04 11:44:02 -0800715::std::unique_ptr<::std::vector<int32_t>> in_goes_in;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800716::std::vector<double> in_goes_in_and_out;
717::std::vector<bool> out_goes_out;
718::std::vector<int32_t> _aidl_return;
719if (!(_aidl_data.checkInterface(this))) {
720_aidl_ret_status = ::android::BAD_TYPE;
Christopher Wiley8993cb52015-10-21 09:53:24 -0700721break;
722}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800723_aidl_ret_status = _aidl_data.readInt32Vector(&in_goes_in);
724if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700725break;
726}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800727_aidl_ret_status = _aidl_data.readDoubleVector(&in_goes_in_and_out);
728if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wileybb967822015-10-27 14:04:53 -0700729break;
730}
Christopher Wiley74b7bf12016-08-19 11:06:32 -0700731_aidl_ret_status = _aidl_data.resizeOutVector(&out_goes_out);
732if (((_aidl_ret_status) != (::android::OK))) {
733break;
734}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800735::android::binder::Status _aidl_status(Send(in_goes_in, &in_goes_in_and_out, &out_goes_out, &_aidl_return));
736_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
737if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700738break;
739}
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800740if (!_aidl_status.isOk()) {
Christopher Wiley2aaeda82015-10-19 15:16:49 -0700741break;
742}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800743_aidl_ret_status = _aidl_reply->writeInt32Vector(_aidl_return);
744if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700745break;
746}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800747_aidl_ret_status = _aidl_reply->writeDoubleVector(in_goes_in_and_out);
748if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wileybb967822015-10-27 14:04:53 -0700749break;
750}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800751_aidl_ret_status = _aidl_reply->writeBoolVector(out_goes_out);
752if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700753break;
754}
Casey Dahlinb0966612015-10-19 16:35:26 -0700755}
756break;
Casey Dahlin0dd08af2015-10-20 18:45:50 -0700757case Call::PIFF:
758{
759int32_t in_times;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800760if (!(_aidl_data.checkInterface(this))) {
761_aidl_ret_status = ::android::BAD_TYPE;
Christopher Wiley8993cb52015-10-21 09:53:24 -0700762break;
763}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800764_aidl_ret_status = _aidl_data.readInt32(&in_times);
765if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700766break;
767}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800768::android::binder::Status _aidl_status(Piff(in_times));
Casey Dahlin0dd08af2015-10-20 18:45:50 -0700769}
770break;
Casey Dahlin389781f2015-10-22 13:13:21 -0700771case Call::TAKESABINDER:
772{
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800773::android::sp<::foo::IFooType> in_f;
774::android::sp<::foo::IFooType> _aidl_return;
775if (!(_aidl_data.checkInterface(this))) {
776_aidl_ret_status = ::android::BAD_TYPE;
Casey Dahlin389781f2015-10-22 13:13:21 -0700777break;
778}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800779_aidl_ret_status = _aidl_data.readStrongBinder(&in_f);
780if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin389781f2015-10-22 13:13:21 -0700781break;
782}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800783::android::binder::Status _aidl_status(TakesABinder(in_f, &_aidl_return));
784_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
785if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin389781f2015-10-22 13:13:21 -0700786break;
787}
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800788if (!_aidl_status.isOk()) {
Casey Dahlin389781f2015-10-22 13:13:21 -0700789break;
790}
Casey Dahlin2dbab062016-01-05 17:41:08 -0800791_aidl_ret_status = _aidl_reply->writeStrongBinder(::foo::IFooType::asBinder(_aidl_return));
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800792if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin389781f2015-10-22 13:13:21 -0700793break;
794}
795}
796break;
Casey Dahlinef88bce2016-04-15 11:55:30 -0700797case Call::NULLABLEBINDER:
798{
799::android::sp<::foo::IFooType> _aidl_return;
800if (!(_aidl_data.checkInterface(this))) {
801_aidl_ret_status = ::android::BAD_TYPE;
802break;
803}
804::android::binder::Status _aidl_status(NullableBinder(&_aidl_return));
805_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
806if (((_aidl_ret_status) != (::android::OK))) {
807break;
808}
809if (!_aidl_status.isOk()) {
810break;
811}
812_aidl_ret_status = _aidl_reply->writeStrongBinder(::foo::IFooType::asBinder(_aidl_return));
813if (((_aidl_ret_status) != (::android::OK))) {
814break;
815}
816}
817break;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700818case Call::STRINGLISTMETHOD:
819{
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800820::std::vector<::android::String16> in_input;
821::std::vector<::android::String16> out_output;
822::std::vector<::android::String16> _aidl_return;
823if (!(_aidl_data.checkInterface(this))) {
824_aidl_ret_status = ::android::BAD_TYPE;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700825break;
826}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800827_aidl_ret_status = _aidl_data.readString16Vector(&in_input);
828if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700829break;
830}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800831::android::binder::Status _aidl_status(StringListMethod(in_input, &out_output, &_aidl_return));
832_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
833if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700834break;
835}
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800836if (!_aidl_status.isOk()) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700837break;
838}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800839_aidl_ret_status = _aidl_reply->writeString16Vector(_aidl_return);
840if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700841break;
842}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800843_aidl_ret_status = _aidl_reply->writeString16Vector(out_output);
844if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700845break;
846}
847}
848break;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800849case Call::BINDERLISTMETHOD:
850{
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800851::std::vector<::android::sp<::android::IBinder>> in_input;
852::std::vector<::android::sp<::android::IBinder>> out_output;
853::std::vector<::android::sp<::android::IBinder>> _aidl_return;
854if (!(_aidl_data.checkInterface(this))) {
855_aidl_ret_status = ::android::BAD_TYPE;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800856break;
857}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800858_aidl_ret_status = _aidl_data.readStrongBinderVector(&in_input);
859if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800860break;
861}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800862::android::binder::Status _aidl_status(BinderListMethod(in_input, &out_output, &_aidl_return));
863_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
864if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800865break;
866}
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800867if (!_aidl_status.isOk()) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800868break;
869}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800870_aidl_ret_status = _aidl_reply->writeStrongBinderVector(_aidl_return);
871if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800872break;
873}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800874_aidl_ret_status = _aidl_reply->writeStrongBinderVector(out_output);
875if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800876break;
877}
878}
879break;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800880case Call::TAKESAFILEDESCRIPTOR:
881{
Christopher Wiley7cb9c252016-04-11 11:07:33 -0700882::android::base::unique_fd in_f;
883::android::base::unique_fd _aidl_return;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800884if (!(_aidl_data.checkInterface(this))) {
885_aidl_ret_status = ::android::BAD_TYPE;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800886break;
887}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800888_aidl_ret_status = _aidl_data.readUniqueFileDescriptor(&in_f);
889if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800890break;
891}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800892::android::binder::Status _aidl_status(TakesAFileDescriptor(in_f, &_aidl_return));
893_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
894if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800895break;
896}
897if (!_aidl_status.isOk()) {
898break;
899}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800900_aidl_ret_status = _aidl_reply->writeUniqueFileDescriptor(_aidl_return);
901if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800902break;
903}
904}
905break;
906case Call::TAKESAFILEDESCRIPTORARRAY:
907{
Christopher Wiley7cb9c252016-04-11 11:07:33 -0700908::std::vector<::android::base::unique_fd> in_f;
909::std::vector<::android::base::unique_fd> _aidl_return;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800910if (!(_aidl_data.checkInterface(this))) {
911_aidl_ret_status = ::android::BAD_TYPE;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800912break;
913}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800914_aidl_ret_status = _aidl_data.readUniqueFileDescriptorVector(&in_f);
915if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800916break;
917}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800918::android::binder::Status _aidl_status(TakesAFileDescriptorArray(in_f, &_aidl_return));
919_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
920if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800921break;
922}
923if (!_aidl_status.isOk()) {
924break;
925}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800926_aidl_ret_status = _aidl_reply->writeUniqueFileDescriptorVector(_aidl_return);
927if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800928break;
929}
930}
931break;
Casey Dahlinb0966612015-10-19 16:35:26 -0700932default:
933{
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800934_aidl_ret_status = ::android::BBinder::onTransact(_aidl_code, _aidl_data, _aidl_reply, _aidl_flags);
Casey Dahlinb0966612015-10-19 16:35:26 -0700935}
936break;
937}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800938if (_aidl_ret_status == ::android::UNEXPECTED_NULL) {
939_aidl_ret_status = ::android::binder::Status::fromExceptionCode(::android::binder::Status::EX_NULL_POINTER).writeToParcel(_aidl_reply);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800940}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800941return _aidl_ret_status;
Casey Dahlinb0966612015-10-19 16:35:26 -0700942}
943
944} // namespace os
945
946} // namespace android
947)";
948
Martijn Coenenb06c8292018-02-21 21:06:23 +0100949const char kExpectedComplexTypeServerWithTraceSourceOutput[] =
950R"(#include <android/os/BnComplexTypeInterface.h>
951#include <binder/Parcel.h>
952
953namespace android {
954
955namespace os {
956
957::android::status_t BnComplexTypeInterface::onTransact(uint32_t _aidl_code, const ::android::Parcel& _aidl_data, ::android::Parcel* _aidl_reply, uint32_t _aidl_flags) {
958::android::status_t _aidl_ret_status = ::android::OK;
959switch (_aidl_code) {
960case Call::SEND:
961{
962::std::unique_ptr<::std::vector<int32_t>> in_goes_in;
963::std::vector<double> in_goes_in_and_out;
964::std::vector<bool> out_goes_out;
965::std::vector<int32_t> _aidl_return;
966if (!(_aidl_data.checkInterface(this))) {
967_aidl_ret_status = ::android::BAD_TYPE;
968break;
969}
970_aidl_ret_status = _aidl_data.readInt32Vector(&in_goes_in);
971if (((_aidl_ret_status) != (::android::OK))) {
972break;
973}
974_aidl_ret_status = _aidl_data.readDoubleVector(&in_goes_in_and_out);
975if (((_aidl_ret_status) != (::android::OK))) {
976break;
977}
978_aidl_ret_status = _aidl_data.resizeOutVector(&out_goes_out);
979if (((_aidl_ret_status) != (::android::OK))) {
980break;
981}
982atrace_begin(ATRACE_TAG_AIDL, "IComplexTypeInterface::Send::cppServer");
983::android::binder::Status _aidl_status(Send(in_goes_in, &in_goes_in_and_out, &out_goes_out, &_aidl_return));
984atrace_end(ATRACE_TAG_AIDL);
985_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
986if (((_aidl_ret_status) != (::android::OK))) {
987break;
988}
989if (!_aidl_status.isOk()) {
990break;
991}
992_aidl_ret_status = _aidl_reply->writeInt32Vector(_aidl_return);
993if (((_aidl_ret_status) != (::android::OK))) {
994break;
995}
996_aidl_ret_status = _aidl_reply->writeDoubleVector(in_goes_in_and_out);
997if (((_aidl_ret_status) != (::android::OK))) {
998break;
999}
1000_aidl_ret_status = _aidl_reply->writeBoolVector(out_goes_out);
1001if (((_aidl_ret_status) != (::android::OK))) {
1002break;
1003}
1004}
1005break;
1006case Call::PIFF:
1007{
1008int32_t in_times;
1009if (!(_aidl_data.checkInterface(this))) {
1010_aidl_ret_status = ::android::BAD_TYPE;
1011break;
1012}
1013_aidl_ret_status = _aidl_data.readInt32(&in_times);
1014if (((_aidl_ret_status) != (::android::OK))) {
1015break;
1016}
1017atrace_begin(ATRACE_TAG_AIDL, "IComplexTypeInterface::Piff::cppServer");
1018::android::binder::Status _aidl_status(Piff(in_times));
1019atrace_end(ATRACE_TAG_AIDL);
1020}
1021break;
1022case Call::TAKESABINDER:
1023{
1024::android::sp<::foo::IFooType> in_f;
1025::android::sp<::foo::IFooType> _aidl_return;
1026if (!(_aidl_data.checkInterface(this))) {
1027_aidl_ret_status = ::android::BAD_TYPE;
1028break;
1029}
1030_aidl_ret_status = _aidl_data.readStrongBinder(&in_f);
1031if (((_aidl_ret_status) != (::android::OK))) {
1032break;
1033}
1034atrace_begin(ATRACE_TAG_AIDL, "IComplexTypeInterface::TakesABinder::cppServer");
1035::android::binder::Status _aidl_status(TakesABinder(in_f, &_aidl_return));
1036atrace_end(ATRACE_TAG_AIDL);
1037_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
1038if (((_aidl_ret_status) != (::android::OK))) {
1039break;
1040}
1041if (!_aidl_status.isOk()) {
1042break;
1043}
1044_aidl_ret_status = _aidl_reply->writeStrongBinder(::foo::IFooType::asBinder(_aidl_return));
1045if (((_aidl_ret_status) != (::android::OK))) {
1046break;
1047}
1048}
1049break;
1050case Call::NULLABLEBINDER:
1051{
1052::android::sp<::foo::IFooType> _aidl_return;
1053if (!(_aidl_data.checkInterface(this))) {
1054_aidl_ret_status = ::android::BAD_TYPE;
1055break;
1056}
1057atrace_begin(ATRACE_TAG_AIDL, "IComplexTypeInterface::NullableBinder::cppServer");
1058::android::binder::Status _aidl_status(NullableBinder(&_aidl_return));
1059atrace_end(ATRACE_TAG_AIDL);
1060_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
1061if (((_aidl_ret_status) != (::android::OK))) {
1062break;
1063}
1064if (!_aidl_status.isOk()) {
1065break;
1066}
1067_aidl_ret_status = _aidl_reply->writeStrongBinder(::foo::IFooType::asBinder(_aidl_return));
1068if (((_aidl_ret_status) != (::android::OK))) {
1069break;
1070}
1071}
1072break;
1073case Call::STRINGLISTMETHOD:
1074{
1075::std::vector<::android::String16> in_input;
1076::std::vector<::android::String16> out_output;
1077::std::vector<::android::String16> _aidl_return;
1078if (!(_aidl_data.checkInterface(this))) {
1079_aidl_ret_status = ::android::BAD_TYPE;
1080break;
1081}
1082_aidl_ret_status = _aidl_data.readString16Vector(&in_input);
1083if (((_aidl_ret_status) != (::android::OK))) {
1084break;
1085}
1086atrace_begin(ATRACE_TAG_AIDL, "IComplexTypeInterface::StringListMethod::cppServer");
1087::android::binder::Status _aidl_status(StringListMethod(in_input, &out_output, &_aidl_return));
1088atrace_end(ATRACE_TAG_AIDL);
1089_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
1090if (((_aidl_ret_status) != (::android::OK))) {
1091break;
1092}
1093if (!_aidl_status.isOk()) {
1094break;
1095}
1096_aidl_ret_status = _aidl_reply->writeString16Vector(_aidl_return);
1097if (((_aidl_ret_status) != (::android::OK))) {
1098break;
1099}
1100_aidl_ret_status = _aidl_reply->writeString16Vector(out_output);
1101if (((_aidl_ret_status) != (::android::OK))) {
1102break;
1103}
1104}
1105break;
1106case Call::BINDERLISTMETHOD:
1107{
1108::std::vector<::android::sp<::android::IBinder>> in_input;
1109::std::vector<::android::sp<::android::IBinder>> out_output;
1110::std::vector<::android::sp<::android::IBinder>> _aidl_return;
1111if (!(_aidl_data.checkInterface(this))) {
1112_aidl_ret_status = ::android::BAD_TYPE;
1113break;
1114}
1115_aidl_ret_status = _aidl_data.readStrongBinderVector(&in_input);
1116if (((_aidl_ret_status) != (::android::OK))) {
1117break;
1118}
1119atrace_begin(ATRACE_TAG_AIDL, "IComplexTypeInterface::BinderListMethod::cppServer");
1120::android::binder::Status _aidl_status(BinderListMethod(in_input, &out_output, &_aidl_return));
1121atrace_end(ATRACE_TAG_AIDL);
1122_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
1123if (((_aidl_ret_status) != (::android::OK))) {
1124break;
1125}
1126if (!_aidl_status.isOk()) {
1127break;
1128}
1129_aidl_ret_status = _aidl_reply->writeStrongBinderVector(_aidl_return);
1130if (((_aidl_ret_status) != (::android::OK))) {
1131break;
1132}
1133_aidl_ret_status = _aidl_reply->writeStrongBinderVector(out_output);
1134if (((_aidl_ret_status) != (::android::OK))) {
1135break;
1136}
1137}
1138break;
1139case Call::TAKESAFILEDESCRIPTOR:
1140{
1141::android::base::unique_fd in_f;
1142::android::base::unique_fd _aidl_return;
1143if (!(_aidl_data.checkInterface(this))) {
1144_aidl_ret_status = ::android::BAD_TYPE;
1145break;
1146}
1147_aidl_ret_status = _aidl_data.readUniqueFileDescriptor(&in_f);
1148if (((_aidl_ret_status) != (::android::OK))) {
1149break;
1150}
1151atrace_begin(ATRACE_TAG_AIDL, "IComplexTypeInterface::TakesAFileDescriptor::cppServer");
1152::android::binder::Status _aidl_status(TakesAFileDescriptor(in_f, &_aidl_return));
1153atrace_end(ATRACE_TAG_AIDL);
1154_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
1155if (((_aidl_ret_status) != (::android::OK))) {
1156break;
1157}
1158if (!_aidl_status.isOk()) {
1159break;
1160}
1161_aidl_ret_status = _aidl_reply->writeUniqueFileDescriptor(_aidl_return);
1162if (((_aidl_ret_status) != (::android::OK))) {
1163break;
1164}
1165}
1166break;
1167case Call::TAKESAFILEDESCRIPTORARRAY:
1168{
1169::std::vector<::android::base::unique_fd> in_f;
1170::std::vector<::android::base::unique_fd> _aidl_return;
1171if (!(_aidl_data.checkInterface(this))) {
1172_aidl_ret_status = ::android::BAD_TYPE;
1173break;
1174}
1175_aidl_ret_status = _aidl_data.readUniqueFileDescriptorVector(&in_f);
1176if (((_aidl_ret_status) != (::android::OK))) {
1177break;
1178}
1179atrace_begin(ATRACE_TAG_AIDL, "IComplexTypeInterface::TakesAFileDescriptorArray::cppServer");
1180::android::binder::Status _aidl_status(TakesAFileDescriptorArray(in_f, &_aidl_return));
1181atrace_end(ATRACE_TAG_AIDL);
1182_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
1183if (((_aidl_ret_status) != (::android::OK))) {
1184break;
1185}
1186if (!_aidl_status.isOk()) {
1187break;
1188}
1189_aidl_ret_status = _aidl_reply->writeUniqueFileDescriptorVector(_aidl_return);
1190if (((_aidl_ret_status) != (::android::OK))) {
1191break;
1192}
1193}
1194break;
1195default:
1196{
1197_aidl_ret_status = ::android::BBinder::onTransact(_aidl_code, _aidl_data, _aidl_reply, _aidl_flags);
1198}
1199break;
1200}
1201if (_aidl_ret_status == ::android::UNEXPECTED_NULL) {
1202_aidl_ret_status = ::android::binder::Status::fromExceptionCode(::android::binder::Status::EX_NULL_POINTER).writeToParcel(_aidl_reply);
1203}
1204return _aidl_ret_status;
1205}
1206
1207} // namespace os
1208
1209} // namespace android
1210)";
1211
Casey Dahlinb0966612015-10-19 16:35:26 -07001212const char kExpectedComplexTypeInterfaceHeaderOutput[] =
1213R"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
1214#define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
1215
Christopher Wiley7cb9c252016-04-11 11:07:33 -07001216#include <android-base/unique_fd.h>
Casey Dahlinb0966612015-10-19 16:35:26 -07001217#include <binder/IBinder.h>
1218#include <binder/IInterface.h>
Christopher Wiley433c8bb2015-11-12 14:20:46 -08001219#include <binder/Status.h>
Casey Dahlinb0966612015-10-19 16:35:26 -07001220#include <cstdint>
Casey Dahlin389781f2015-10-22 13:13:21 -07001221#include <foo/IFooType.h>
Christopher Wiley041c8d72016-08-18 13:52:51 -07001222#include <memory>
Christopher Wiley56c9bf32015-10-30 10:41:12 -07001223#include <utils/String16.h>
Casey Dahlin389781f2015-10-22 13:13:21 -07001224#include <utils/StrongPointer.h>
Casey Dahlinb0966612015-10-19 16:35:26 -07001225#include <vector>
1226
1227namespace android {
1228
1229namespace os {
1230
Casey Dahlinb8d9e882015-11-24 10:57:23 -08001231class IComplexTypeInterface : public ::android::IInterface {
Casey Dahlinb0966612015-10-19 16:35:26 -07001232public:
Christopher Wiley11a9d792016-02-24 17:20:33 -08001233DECLARE_META_INTERFACE(ComplexTypeInterface)
Christopher Wileyfd7dc032016-02-02 17:58:39 -08001234enum : int32_t {
1235 MY_CONSTANT = 3,
1236};
Casey Dahlin57dbe242015-12-04 11:44:02 -08001237virtual ::android::binder::Status Send(const ::std::unique_ptr<::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;
Casey Dahlinb8d9e882015-11-24 10:57:23 -08001238virtual ::android::binder::Status Piff(int32_t times) = 0;
1239virtual ::android::binder::Status TakesABinder(const ::android::sp<::foo::IFooType>& f, ::android::sp<::foo::IFooType>* _aidl_return) = 0;
Casey Dahlinef88bce2016-04-15 11:55:30 -07001240virtual ::android::binder::Status NullableBinder(::android::sp<::foo::IFooType>* _aidl_return) = 0;
Casey Dahlinb8d9e882015-11-24 10:57:23 -08001241virtual ::android::binder::Status StringListMethod(const ::std::vector<::android::String16>& input, ::std::vector<::android::String16>* output, ::std::vector<::android::String16>* _aidl_return) = 0;
1242virtual ::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;
Christopher Wiley7cb9c252016-04-11 11:07:33 -07001243virtual ::android::binder::Status TakesAFileDescriptor(const ::android::base::unique_fd& f, ::android::base::unique_fd* _aidl_return) = 0;
1244virtual ::android::binder::Status TakesAFileDescriptorArray(const ::std::vector<::android::base::unique_fd>& f, ::std::vector<::android::base::unique_fd>* _aidl_return) = 0;
Casey Dahlinb0966612015-10-19 16:35:26 -07001245enum Call {
Casey Dahlinb8d9e882015-11-24 10:57:23 -08001246 SEND = ::android::IBinder::FIRST_CALL_TRANSACTION + 0,
1247 PIFF = ::android::IBinder::FIRST_CALL_TRANSACTION + 1,
1248 TAKESABINDER = ::android::IBinder::FIRST_CALL_TRANSACTION + 2,
Casey Dahlinef88bce2016-04-15 11:55:30 -07001249 NULLABLEBINDER = ::android::IBinder::FIRST_CALL_TRANSACTION + 3,
1250 STRINGLISTMETHOD = ::android::IBinder::FIRST_CALL_TRANSACTION + 4,
1251 BINDERLISTMETHOD = ::android::IBinder::FIRST_CALL_TRANSACTION + 5,
1252 TAKESAFILEDESCRIPTOR = ::android::IBinder::FIRST_CALL_TRANSACTION + 6,
1253 TAKESAFILEDESCRIPTORARRAY = ::android::IBinder::FIRST_CALL_TRANSACTION + 7,
Casey Dahlinb0966612015-10-19 16:35:26 -07001254};
1255}; // class IComplexTypeInterface
1256
1257} // namespace os
1258
1259} // namespace android
1260
Christopher Wiley11a9d792016-02-24 17:20:33 -08001261#endif // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
1262)";
Casey Dahlinb0966612015-10-19 16:35:26 -07001263
1264const char kExpectedComplexTypeInterfaceSourceOutput[] =
1265R"(#include <android/os/IComplexTypeInterface.h>
1266#include <android/os/BpComplexTypeInterface.h>
1267
1268namespace android {
1269
1270namespace os {
1271
Christopher Wiley11a9d792016-02-24 17:20:33 -08001272IMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface")
Casey Dahlinb0966612015-10-19 16:35:26 -07001273
1274} // namespace os
1275
1276} // namespace android
1277)";
1278
Casey Dahlina834dd42015-09-23 11:52:15 -07001279} // namespace
1280
Casey Dahlinb0966612015-10-19 16:35:26 -07001281class ASTTest : public ::testing::Test {
Christopher Wiley0c732db2015-09-29 14:36:44 -07001282 protected:
Casey Dahlin389781f2015-10-22 13:13:21 -07001283 ASTTest(string file_path, string file_contents)
1284 : file_path_(file_path),
Christopher Wiley56799522015-10-31 10:17:04 -07001285 file_contents_(file_contents) {
1286 types_.Init();
1287 }
Casey Dahlinb0966612015-10-19 16:35:26 -07001288
Christopher Wiley90be4e32015-10-20 14:55:25 -07001289 unique_ptr<AidlInterface> Parse() {
Casey Dahlin389781f2015-10-22 13:13:21 -07001290 io_delegate_.SetFileContents(file_path_, file_contents_);
Casey Dahlina834dd42015-09-23 11:52:15 -07001291
Christopher Wiley90be4e32015-10-20 14:55:25 -07001292 unique_ptr<AidlInterface> ret;
1293 std::vector<std::unique_ptr<AidlImport>> imports;
Christopher Wiley632801d2015-11-05 14:15:49 -08001294 AidlError err = ::android::aidl::internals::load_and_validate_aidl(
Christopher Wiley90be4e32015-10-20 14:55:25 -07001295 {}, // no preprocessed files
Casey Dahlin389781f2015-10-22 13:13:21 -07001296 {"."},
1297 file_path_,
Martijn Coenenb06c8292018-02-21 21:06:23 +01001298 false, // generate_traces
Casey Dahlin389781f2015-10-22 13:13:21 -07001299 io_delegate_,
1300 &types_,
Christopher Wiley90be4e32015-10-20 14:55:25 -07001301 &ret,
1302 &imports);
Christopher Wiley4a2884b2015-10-07 11:27:45 -07001303
Christopher Wiley632801d2015-11-05 14:15:49 -08001304 if (err != AidlError::OK)
Casey Dahlin2cc93162015-10-02 16:14:17 -07001305 return nullptr;
Casey Dahlina834dd42015-09-23 11:52:15 -07001306
Casey Dahlin2cc93162015-10-02 16:14:17 -07001307 return ret;
Christopher Wiley90be4e32015-10-20 14:55:25 -07001308 }
Casey Dahlina834dd42015-09-23 11:52:15 -07001309
Christopher Wiley0c732db2015-09-29 14:36:44 -07001310 void Compare(Document* doc, const char* expected) {
1311 string output;
1312 unique_ptr<CodeWriter> cw = GetStringWriter(&output);
1313
1314 doc->Write(cw.get());
1315
Casey Dahlin80ada3d2015-10-20 20:33:56 -07001316 if (expected == output) {
1317 return; // Success
1318 }
1319
1320 test::PrintDiff(expected, output);
1321 FAIL() << "Document contents did not match expected contents";
Christopher Wiley0c732db2015-09-29 14:36:44 -07001322 }
Casey Dahlin389781f2015-10-22 13:13:21 -07001323
1324 const string file_path_;
1325 const string file_contents_;
1326 FakeIoDelegate io_delegate_;
1327 TypeNamespace types_;
Christopher Wiley0c732db2015-09-29 14:36:44 -07001328};
1329
Casey Dahlinb0966612015-10-19 16:35:26 -07001330class ComplexTypeInterfaceASTTest : public ASTTest {
Casey Dahlin389781f2015-10-22 13:13:21 -07001331 public:
1332 ComplexTypeInterfaceASTTest()
1333 : ASTTest("android/os/IComplexTypeInterface.aidl",
1334 kComplexTypeInterfaceAIDL) {
1335 io_delegate_.SetFileContents("foo/IFooType.aidl",
1336 "package foo; interface IFooType {}");
1337 }
Casey Dahlinb0966612015-10-19 16:35:26 -07001338};
1339
1340TEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
1341 unique_ptr<AidlInterface> interface = Parse();
1342 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -07001343 unique_ptr<Document> doc = internals::BuildClientHeader(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -07001344 Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
1345}
1346
1347TEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
1348 unique_ptr<AidlInterface> interface = Parse();
1349 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -07001350 unique_ptr<Document> doc = internals::BuildClientSource(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -07001351 Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
1352}
1353
Martijn Coenenb06c8292018-02-21 21:06:23 +01001354TEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSourceWithTrace) {
1355 unique_ptr<AidlInterface> interface = Parse();
1356 ASSERT_NE(interface, nullptr);
1357 interface->SetGenerateTraces(true);
1358 unique_ptr<Document> doc = internals::BuildClientSource(types_, *interface);
1359 Compare(doc.get(), kExpectedComplexTypeClientWithTraceSourceOutput);
1360}
1361
Casey Dahlinb0966612015-10-19 16:35:26 -07001362TEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
1363 unique_ptr<AidlInterface> interface = Parse();
1364 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -07001365 unique_ptr<Document> doc = internals::BuildServerHeader(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -07001366 Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
1367}
1368
1369TEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
1370 unique_ptr<AidlInterface> interface = Parse();
1371 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -07001372 unique_ptr<Document> doc = internals::BuildServerSource(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -07001373 Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
1374}
1375
Martijn Coenenb06c8292018-02-21 21:06:23 +01001376TEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSourceWithTrace) {
1377 unique_ptr<AidlInterface> interface = Parse();
1378 ASSERT_NE(interface, nullptr);
1379 interface->SetGenerateTraces(true);
1380 unique_ptr<Document> doc = internals::BuildServerSource(types_, *interface);
1381 Compare(doc.get(), kExpectedComplexTypeServerWithTraceSourceOutput);
1382}
1383
Casey Dahlinb0966612015-10-19 16:35:26 -07001384TEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
1385 unique_ptr<AidlInterface> interface = Parse();
1386 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -07001387 unique_ptr<Document> doc = internals::BuildInterfaceHeader(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -07001388 Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
1389}
1390
1391TEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
1392 unique_ptr<AidlInterface> interface = Parse();
1393 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -07001394 unique_ptr<Document> doc = internals::BuildInterfaceSource(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -07001395 Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
Christopher Wiley1dd458d2015-09-30 11:05:52 -07001396}
1397
Christopher Wiley9d6e0b22015-11-13 12:18:16 -08001398namespace test_io_handling {
1399
1400const char kInputPath[] = "a/IFoo.aidl";
1401const char kOutputPath[] = "output.cpp";
1402const char kHeaderDir[] = "headers";
1403const char kInterfaceHeaderRelPath[] = "a/IFoo.h";
1404
1405} // namespace test_io_handling
1406
1407class IoErrorHandlingTest : public ASTTest {
1408 public:
1409 IoErrorHandlingTest ()
1410 : ASTTest(test_io_handling::kInputPath,
1411 "package a; interface IFoo {}"),
1412 options_(GetOptions()) {}
1413
1414 const unique_ptr<CppOptions> options_;
1415
1416 private:
1417 static unique_ptr<CppOptions> GetOptions() {
1418 using namespace test_io_handling;
1419
1420 const int argc = 4;
1421 const char* cmdline[argc] = {
1422 "aidl-cpp", kInputPath, kHeaderDir, kOutputPath
1423 };
1424 return CppOptions::Parse(argc, cmdline);
1425 }
1426};
1427
1428TEST_F(IoErrorHandlingTest, GenerateCorrectlyAbsentErrors) {
1429 // Confirm that this is working correctly without I/O problems.
1430 const unique_ptr<AidlInterface> interface = Parse();
1431 ASSERT_NE(interface, nullptr);
1432 ASSERT_TRUE(GenerateCpp(*options_, types_, *interface, io_delegate_));
1433}
1434
1435TEST_F(IoErrorHandlingTest, HandlesBadHeaderWrite) {
1436 using namespace test_io_handling;
1437 const unique_ptr<AidlInterface> interface = Parse();
1438 ASSERT_NE(interface, nullptr);
1439
1440 // Simulate issues closing the interface header.
1441 const string header_path =
1442 StringPrintf("%s%c%s", kHeaderDir, OS_PATH_SEPARATOR,
1443 kInterfaceHeaderRelPath);
1444 io_delegate_.AddBrokenFilePath(header_path);
1445 ASSERT_FALSE(GenerateCpp(*options_, types_, *interface, io_delegate_));
1446 // We should never attempt to write the C++ file if we fail writing headers.
1447 ASSERT_FALSE(io_delegate_.GetWrittenContents(kOutputPath, nullptr));
1448 // We should remove partial results.
1449 ASSERT_TRUE(io_delegate_.PathWasRemoved(header_path));
1450}
1451
1452TEST_F(IoErrorHandlingTest, HandlesBadCppWrite) {
1453 using test_io_handling::kOutputPath;
1454 const unique_ptr<AidlInterface> interface = Parse();
1455 ASSERT_NE(interface, nullptr);
1456
1457 // Simulate issues closing the cpp file.
1458 io_delegate_.AddBrokenFilePath(kOutputPath);
1459 ASSERT_FALSE(GenerateCpp(*options_, types_, *interface, io_delegate_));
1460 // We should remove partial results.
1461 ASSERT_TRUE(io_delegate_.PathWasRemoved(kOutputPath));
1462}
1463
Christopher Wileyf944e792015-09-29 10:00:46 -07001464} // namespace cpp
Casey Dahlina834dd42015-09-23 11:52:15 -07001465} // namespace aidl
1466} // namespace android