blob: 2053b875ac233f42ffd957eb053a0fe8f4be2906 [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);
Christopher Wiley56c9bf32015-10-30 10:41:12 -070050 List<String> StringListMethod(in java.util.List<String> input, out List<String> output);
Casey Dahlin7ecd69f2015-11-03 13:52:38 -080051 List<IBinder> BinderListMethod(in java.util.List<IBinder> input, out List<IBinder> output);
Casey Dahlina4ba4b62015-11-02 15:43:30 -080052 FileDescriptor TakesAFileDescriptor(in FileDescriptor f);
53 FileDescriptor[] TakesAFileDescriptorArray(in FileDescriptor[] f);
Casey Dahlinb0966612015-10-19 16:35:26 -070054})";
55
56const char kExpectedComplexTypeClientHeaderOutput[] =
57R"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
58#define AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
59
60#include <binder/IBinder.h>
61#include <binder/IInterface.h>
62#include <utils/Errors.h>
63#include <android/os/IComplexTypeInterface.h>
64
65namespace android {
66
67namespace os {
68
Casey Dahlinb8d9e882015-11-24 10:57:23 -080069class BpComplexTypeInterface : public ::android::BpInterface<IComplexTypeInterface> {
Casey Dahlinb0966612015-10-19 16:35:26 -070070public:
Casey Dahlinb8d9e882015-11-24 10:57:23 -080071explicit BpComplexTypeInterface(const ::android::sp<::android::IBinder>& _aidl_impl);
Casey Dahlinb0966612015-10-19 16:35:26 -070072virtual ~BpComplexTypeInterface() = default;
Casey Dahlin57dbe242015-12-04 11:44:02 -080073::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 -080074::android::binder::Status Piff(int32_t times) override;
75::android::binder::Status TakesABinder(const ::android::sp<::foo::IFooType>& f, ::android::sp<::foo::IFooType>* _aidl_return) override;
76::android::binder::Status StringListMethod(const ::std::vector<::android::String16>& input, ::std::vector<::android::String16>* output, ::std::vector<::android::String16>* _aidl_return) override;
77::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;
78::android::binder::Status TakesAFileDescriptor(const ::ScopedFd& f, ::ScopedFd* _aidl_return) override;
79::android::binder::Status TakesAFileDescriptorArray(const ::std::vector<::ScopedFd>& f, ::std::vector<::ScopedFd>* _aidl_return) override;
Casey Dahlinb0966612015-10-19 16:35:26 -070080}; // class BpComplexTypeInterface
81
82} // namespace os
83
84} // namespace android
85
Christopher Wiley11a9d792016-02-24 17:20:33 -080086#endif // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
87)";
Casey Dahlinb0966612015-10-19 16:35:26 -070088
89const char kExpectedComplexTypeClientSourceOutput[] =
90R"(#include <android/os/BpComplexTypeInterface.h>
91#include <binder/Parcel.h>
92
93namespace android {
94
95namespace os {
96
Casey Dahlinb8d9e882015-11-24 10:57:23 -080097BpComplexTypeInterface::BpComplexTypeInterface(const ::android::sp<::android::IBinder>& _aidl_impl)
98 : BpInterface<IComplexTypeInterface>(_aidl_impl){
Casey Dahlinb0966612015-10-19 16:35:26 -070099}
100
Casey Dahlin57dbe242015-12-04 11:44:02 -0800101::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 -0800102::android::Parcel _aidl_data;
103::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800104::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800105::android::binder::Status _aidl_status;
106_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
107if (((_aidl_ret_status) != (::android::OK))) {
108goto _aidl_error;
Christopher Wiley8993cb52015-10-21 09:53:24 -0700109}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800110_aidl_ret_status = _aidl_data.writeInt32Vector(goes_in);
111if (((_aidl_ret_status) != (::android::OK))) {
112goto _aidl_error;
Christopher Wileybb967822015-10-27 14:04:53 -0700113}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800114_aidl_ret_status = _aidl_data.writeDoubleVector(*goes_in_and_out);
115if (((_aidl_ret_status) != (::android::OK))) {
116goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700117}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800118_aidl_ret_status = remote()->transact(IComplexTypeInterface::SEND, _aidl_data, &_aidl_reply);
119if (((_aidl_ret_status) != (::android::OK))) {
120goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700121}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800122_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
123if (((_aidl_ret_status) != (::android::OK))) {
124goto _aidl_error;
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800125}
126if (!_aidl_status.isOk()) {
127return _aidl_status;
Christopher Wiley2aaeda82015-10-19 15:16:49 -0700128}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800129_aidl_ret_status = _aidl_reply.readInt32Vector(_aidl_return);
130if (((_aidl_ret_status) != (::android::OK))) {
131goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700132}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800133_aidl_ret_status = _aidl_reply.readDoubleVector(goes_in_and_out);
134if (((_aidl_ret_status) != (::android::OK))) {
135goto _aidl_error;
Christopher Wileybb967822015-10-27 14:04:53 -0700136}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800137_aidl_ret_status = _aidl_reply.readBoolVector(goes_out);
138if (((_aidl_ret_status) != (::android::OK))) {
139goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700140}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800141_aidl_error:
142_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800143return _aidl_status;
Casey Dahlinb0966612015-10-19 16:35:26 -0700144}
145
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800146::android::binder::Status BpComplexTypeInterface::Piff(int32_t times) {
147::android::Parcel _aidl_data;
148::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800149::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800150::android::binder::Status _aidl_status;
151_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
152if (((_aidl_ret_status) != (::android::OK))) {
153goto _aidl_error;
Christopher Wiley8993cb52015-10-21 09:53:24 -0700154}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800155_aidl_ret_status = _aidl_data.writeInt32(times);
156if (((_aidl_ret_status) != (::android::OK))) {
157goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700158}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800159_aidl_ret_status = remote()->transact(IComplexTypeInterface::PIFF, _aidl_data, &_aidl_reply, ::android::IBinder::FLAG_ONEWAY);
160if (((_aidl_ret_status) != (::android::OK))) {
161goto _aidl_error;
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700162}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800163_aidl_error:
164_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800165return _aidl_status;
Casey Dahlin0dd08af2015-10-20 18:45:50 -0700166}
167
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800168::android::binder::Status BpComplexTypeInterface::TakesABinder(const ::android::sp<::foo::IFooType>& f, ::android::sp<::foo::IFooType>* _aidl_return) {
169::android::Parcel _aidl_data;
170::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800171::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800172::android::binder::Status _aidl_status;
173_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
174if (((_aidl_ret_status) != (::android::OK))) {
175goto _aidl_error;
Casey Dahlin389781f2015-10-22 13:13:21 -0700176}
Casey Dahlin2dbab062016-01-05 17:41:08 -0800177_aidl_ret_status = _aidl_data.writeStrongBinder(::foo::IFooType::asBinder(f));
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800178if (((_aidl_ret_status) != (::android::OK))) {
179goto _aidl_error;
Casey Dahlin389781f2015-10-22 13:13:21 -0700180}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800181_aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESABINDER, _aidl_data, &_aidl_reply);
182if (((_aidl_ret_status) != (::android::OK))) {
183goto _aidl_error;
Casey Dahlin389781f2015-10-22 13:13:21 -0700184}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800185_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
186if (((_aidl_ret_status) != (::android::OK))) {
187goto _aidl_error;
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800188}
189if (!_aidl_status.isOk()) {
190return _aidl_status;
Casey Dahlin389781f2015-10-22 13:13:21 -0700191}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800192_aidl_ret_status = _aidl_reply.readStrongBinder(_aidl_return);
193if (((_aidl_ret_status) != (::android::OK))) {
194goto _aidl_error;
Casey Dahlin389781f2015-10-22 13:13:21 -0700195}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800196_aidl_error:
197_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800198return _aidl_status;
Casey Dahlin389781f2015-10-22 13:13:21 -0700199}
200
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800201::android::binder::Status BpComplexTypeInterface::StringListMethod(const ::std::vector<::android::String16>& input, ::std::vector<::android::String16>* output, ::std::vector<::android::String16>* _aidl_return) {
202::android::Parcel _aidl_data;
203::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800204::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800205::android::binder::Status _aidl_status;
206_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
207if (((_aidl_ret_status) != (::android::OK))) {
208goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700209}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800210_aidl_ret_status = _aidl_data.writeString16Vector(input);
211if (((_aidl_ret_status) != (::android::OK))) {
212goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700213}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800214_aidl_ret_status = remote()->transact(IComplexTypeInterface::STRINGLISTMETHOD, _aidl_data, &_aidl_reply);
215if (((_aidl_ret_status) != (::android::OK))) {
216goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700217}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800218_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
219if (((_aidl_ret_status) != (::android::OK))) {
220goto _aidl_error;
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800221}
222if (!_aidl_status.isOk()) {
223return _aidl_status;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700224}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800225_aidl_ret_status = _aidl_reply.readString16Vector(_aidl_return);
226if (((_aidl_ret_status) != (::android::OK))) {
227goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700228}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800229_aidl_ret_status = _aidl_reply.readString16Vector(output);
230if (((_aidl_ret_status) != (::android::OK))) {
231goto _aidl_error;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700232}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800233_aidl_error:
234_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800235return _aidl_status;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700236}
237
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800238::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) {
239::android::Parcel _aidl_data;
240::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800241::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800242::android::binder::Status _aidl_status;
243_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
244if (((_aidl_ret_status) != (::android::OK))) {
245goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800246}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800247_aidl_ret_status = _aidl_data.writeStrongBinderVector(input);
248if (((_aidl_ret_status) != (::android::OK))) {
249goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800250}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800251_aidl_ret_status = remote()->transact(IComplexTypeInterface::BINDERLISTMETHOD, _aidl_data, &_aidl_reply);
252if (((_aidl_ret_status) != (::android::OK))) {
253goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800254}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800255_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
256if (((_aidl_ret_status) != (::android::OK))) {
257goto _aidl_error;
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800258}
259if (!_aidl_status.isOk()) {
260return _aidl_status;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800261}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800262_aidl_ret_status = _aidl_reply.readStrongBinderVector(_aidl_return);
263if (((_aidl_ret_status) != (::android::OK))) {
264goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800265}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800266_aidl_ret_status = _aidl_reply.readStrongBinderVector(output);
267if (((_aidl_ret_status) != (::android::OK))) {
268goto _aidl_error;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800269}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800270_aidl_error:
271_aidl_status.setFromStatusT(_aidl_ret_status);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800272return _aidl_status;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800273}
274
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800275::android::binder::Status BpComplexTypeInterface::TakesAFileDescriptor(const ::ScopedFd& f, ::ScopedFd* _aidl_return) {
276::android::Parcel _aidl_data;
277::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800278::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800279::android::binder::Status _aidl_status;
280_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
281if (((_aidl_ret_status) != (::android::OK))) {
282goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800283}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800284_aidl_ret_status = _aidl_data.writeUniqueFileDescriptor(f);
285if (((_aidl_ret_status) != (::android::OK))) {
286goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800287}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800288_aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESAFILEDESCRIPTOR, _aidl_data, &_aidl_reply);
289if (((_aidl_ret_status) != (::android::OK))) {
290goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800291}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800292_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
293if (((_aidl_ret_status) != (::android::OK))) {
294goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800295}
296if (!_aidl_status.isOk()) {
297return _aidl_status;
298}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800299_aidl_ret_status = _aidl_reply.readUniqueFileDescriptor(_aidl_return);
300if (((_aidl_ret_status) != (::android::OK))) {
301goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800302}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800303_aidl_error:
304_aidl_status.setFromStatusT(_aidl_ret_status);
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800305return _aidl_status;
306}
307
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800308::android::binder::Status BpComplexTypeInterface::TakesAFileDescriptorArray(const ::std::vector<::ScopedFd>& f, ::std::vector<::ScopedFd>* _aidl_return) {
309::android::Parcel _aidl_data;
310::android::Parcel _aidl_reply;
Christopher Wiley10957122015-12-04 14:35:38 -0800311::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800312::android::binder::Status _aidl_status;
313_aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
314if (((_aidl_ret_status) != (::android::OK))) {
315goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800316}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800317_aidl_ret_status = _aidl_data.writeUniqueFileDescriptorVector(f);
318if (((_aidl_ret_status) != (::android::OK))) {
319goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800320}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800321_aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESAFILEDESCRIPTORARRAY, _aidl_data, &_aidl_reply);
322if (((_aidl_ret_status) != (::android::OK))) {
323goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800324}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800325_aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
326if (((_aidl_ret_status) != (::android::OK))) {
327goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800328}
329if (!_aidl_status.isOk()) {
330return _aidl_status;
331}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800332_aidl_ret_status = _aidl_reply.readUniqueFileDescriptorVector(_aidl_return);
333if (((_aidl_ret_status) != (::android::OK))) {
334goto _aidl_error;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800335}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800336_aidl_error:
337_aidl_status.setFromStatusT(_aidl_ret_status);
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800338return _aidl_status;
339}
340
Casey Dahlinb0966612015-10-19 16:35:26 -0700341} // namespace os
342
343} // namespace android
344)";
345
346const char kExpectedComplexTypeServerHeaderOutput[] =
347R"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
348#define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
349
350#include <binder/IInterface.h>
351#include <android/os/IComplexTypeInterface.h>
352
353namespace android {
354
355namespace os {
356
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800357class BnComplexTypeInterface : public ::android::BnInterface<IComplexTypeInterface> {
Casey Dahlinb0966612015-10-19 16:35:26 -0700358public:
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800359::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 -0700360}; // class BnComplexTypeInterface
361
362} // namespace os
363
364} // namespace android
365
Christopher Wiley11a9d792016-02-24 17:20:33 -0800366#endif // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
367)";
Casey Dahlinb0966612015-10-19 16:35:26 -0700368
369const char kExpectedComplexTypeServerSourceOutput[] =
370R"(#include <android/os/BnComplexTypeInterface.h>
371#include <binder/Parcel.h>
372
373namespace android {
374
375namespace os {
376
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800377::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 -0800378::android::status_t _aidl_ret_status = ::android::OK;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800379switch (_aidl_code) {
Casey Dahlinb0966612015-10-19 16:35:26 -0700380case Call::SEND:
381{
Casey Dahlin57dbe242015-12-04 11:44:02 -0800382::std::unique_ptr<::std::vector<int32_t>> in_goes_in;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800383::std::vector<double> in_goes_in_and_out;
384::std::vector<bool> out_goes_out;
385::std::vector<int32_t> _aidl_return;
386if (!(_aidl_data.checkInterface(this))) {
387_aidl_ret_status = ::android::BAD_TYPE;
Christopher Wiley8993cb52015-10-21 09:53:24 -0700388break;
389}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800390_aidl_ret_status = _aidl_data.readInt32Vector(&in_goes_in);
391if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700392break;
393}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800394_aidl_ret_status = _aidl_data.readDoubleVector(&in_goes_in_and_out);
395if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wileybb967822015-10-27 14:04:53 -0700396break;
397}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800398::android::binder::Status _aidl_status(Send(in_goes_in, &in_goes_in_and_out, &out_goes_out, &_aidl_return));
399_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
400if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700401break;
402}
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800403if (!_aidl_status.isOk()) {
Christopher Wiley2aaeda82015-10-19 15:16:49 -0700404break;
405}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800406_aidl_ret_status = _aidl_reply->writeInt32Vector(_aidl_return);
407if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700408break;
409}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800410_aidl_ret_status = _aidl_reply->writeDoubleVector(in_goes_in_and_out);
411if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wileybb967822015-10-27 14:04:53 -0700412break;
413}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800414_aidl_ret_status = _aidl_reply->writeBoolVector(out_goes_out);
415if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700416break;
417}
Casey Dahlinb0966612015-10-19 16:35:26 -0700418}
419break;
Casey Dahlin0dd08af2015-10-20 18:45:50 -0700420case Call::PIFF:
421{
422int32_t in_times;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800423if (!(_aidl_data.checkInterface(this))) {
424_aidl_ret_status = ::android::BAD_TYPE;
Christopher Wiley8993cb52015-10-21 09:53:24 -0700425break;
426}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800427_aidl_ret_status = _aidl_data.readInt32(&in_times);
428if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley0eb903e2015-10-20 17:07:08 -0700429break;
430}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800431::android::binder::Status _aidl_status(Piff(in_times));
Casey Dahlin0dd08af2015-10-20 18:45:50 -0700432}
433break;
Casey Dahlin389781f2015-10-22 13:13:21 -0700434case Call::TAKESABINDER:
435{
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800436::android::sp<::foo::IFooType> in_f;
437::android::sp<::foo::IFooType> _aidl_return;
438if (!(_aidl_data.checkInterface(this))) {
439_aidl_ret_status = ::android::BAD_TYPE;
Casey Dahlin389781f2015-10-22 13:13:21 -0700440break;
441}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800442_aidl_ret_status = _aidl_data.readStrongBinder(&in_f);
443if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin389781f2015-10-22 13:13:21 -0700444break;
445}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800446::android::binder::Status _aidl_status(TakesABinder(in_f, &_aidl_return));
447_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
448if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin389781f2015-10-22 13:13:21 -0700449break;
450}
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800451if (!_aidl_status.isOk()) {
Casey Dahlin389781f2015-10-22 13:13:21 -0700452break;
453}
Casey Dahlin2dbab062016-01-05 17:41:08 -0800454_aidl_ret_status = _aidl_reply->writeStrongBinder(::foo::IFooType::asBinder(_aidl_return));
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800455if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin389781f2015-10-22 13:13:21 -0700456break;
457}
458}
459break;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700460case Call::STRINGLISTMETHOD:
461{
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800462::std::vector<::android::String16> in_input;
463::std::vector<::android::String16> out_output;
464::std::vector<::android::String16> _aidl_return;
465if (!(_aidl_data.checkInterface(this))) {
466_aidl_ret_status = ::android::BAD_TYPE;
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700467break;
468}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800469_aidl_ret_status = _aidl_data.readString16Vector(&in_input);
470if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700471break;
472}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800473::android::binder::Status _aidl_status(StringListMethod(in_input, &out_output, &_aidl_return));
474_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
475if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700476break;
477}
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800478if (!_aidl_status.isOk()) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700479break;
480}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800481_aidl_ret_status = _aidl_reply->writeString16Vector(_aidl_return);
482if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700483break;
484}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800485_aidl_ret_status = _aidl_reply->writeString16Vector(out_output);
486if (((_aidl_ret_status) != (::android::OK))) {
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700487break;
488}
489}
490break;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800491case Call::BINDERLISTMETHOD:
492{
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800493::std::vector<::android::sp<::android::IBinder>> in_input;
494::std::vector<::android::sp<::android::IBinder>> out_output;
495::std::vector<::android::sp<::android::IBinder>> _aidl_return;
496if (!(_aidl_data.checkInterface(this))) {
497_aidl_ret_status = ::android::BAD_TYPE;
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800498break;
499}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800500_aidl_ret_status = _aidl_data.readStrongBinderVector(&in_input);
501if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800502break;
503}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800504::android::binder::Status _aidl_status(BinderListMethod(in_input, &out_output, &_aidl_return));
505_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
506if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800507break;
508}
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800509if (!_aidl_status.isOk()) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800510break;
511}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800512_aidl_ret_status = _aidl_reply->writeStrongBinderVector(_aidl_return);
513if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800514break;
515}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800516_aidl_ret_status = _aidl_reply->writeStrongBinderVector(out_output);
517if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlin7ecd69f2015-11-03 13:52:38 -0800518break;
519}
520}
521break;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800522case Call::TAKESAFILEDESCRIPTOR:
523{
524::ScopedFd in_f;
525::ScopedFd _aidl_return;
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800526if (!(_aidl_data.checkInterface(this))) {
527_aidl_ret_status = ::android::BAD_TYPE;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800528break;
529}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800530_aidl_ret_status = _aidl_data.readUniqueFileDescriptor(&in_f);
531if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800532break;
533}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800534::android::binder::Status _aidl_status(TakesAFileDescriptor(in_f, &_aidl_return));
535_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
536if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800537break;
538}
539if (!_aidl_status.isOk()) {
540break;
541}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800542_aidl_ret_status = _aidl_reply->writeUniqueFileDescriptor(_aidl_return);
543if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800544break;
545}
546}
547break;
548case Call::TAKESAFILEDESCRIPTORARRAY:
549{
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800550::std::vector<::ScopedFd> in_f;
551::std::vector<::ScopedFd> _aidl_return;
552if (!(_aidl_data.checkInterface(this))) {
553_aidl_ret_status = ::android::BAD_TYPE;
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800554break;
555}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800556_aidl_ret_status = _aidl_data.readUniqueFileDescriptorVector(&in_f);
557if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800558break;
559}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800560::android::binder::Status _aidl_status(TakesAFileDescriptorArray(in_f, &_aidl_return));
561_aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
562if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800563break;
564}
565if (!_aidl_status.isOk()) {
566break;
567}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800568_aidl_ret_status = _aidl_reply->writeUniqueFileDescriptorVector(_aidl_return);
569if (((_aidl_ret_status) != (::android::OK))) {
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800570break;
571}
572}
573break;
Casey Dahlinb0966612015-10-19 16:35:26 -0700574default:
575{
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800576_aidl_ret_status = ::android::BBinder::onTransact(_aidl_code, _aidl_data, _aidl_reply, _aidl_flags);
Casey Dahlinb0966612015-10-19 16:35:26 -0700577}
578break;
579}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800580if (_aidl_ret_status == ::android::UNEXPECTED_NULL) {
581_aidl_ret_status = ::android::binder::Status::fromExceptionCode(::android::binder::Status::EX_NULL_POINTER).writeToParcel(_aidl_reply);
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800582}
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800583return _aidl_ret_status;
Casey Dahlinb0966612015-10-19 16:35:26 -0700584}
585
586} // namespace os
587
588} // namespace android
589)";
590
591const char kExpectedComplexTypeInterfaceHeaderOutput[] =
592R"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
593#define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
594
595#include <binder/IBinder.h>
596#include <binder/IInterface.h>
Christopher Wiley433c8bb2015-11-12 14:20:46 -0800597#include <binder/Status.h>
Casey Dahlinb0966612015-10-19 16:35:26 -0700598#include <cstdint>
Casey Dahlin389781f2015-10-22 13:13:21 -0700599#include <foo/IFooType.h>
Casey Dahlina4ba4b62015-11-02 15:43:30 -0800600#include <nativehelper/ScopedFd.h>
Christopher Wiley56c9bf32015-10-30 10:41:12 -0700601#include <utils/String16.h>
Casey Dahlin389781f2015-10-22 13:13:21 -0700602#include <utils/StrongPointer.h>
Casey Dahlinb0966612015-10-19 16:35:26 -0700603#include <vector>
604
605namespace android {
606
607namespace os {
608
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800609class IComplexTypeInterface : public ::android::IInterface {
Casey Dahlinb0966612015-10-19 16:35:26 -0700610public:
Christopher Wiley11a9d792016-02-24 17:20:33 -0800611DECLARE_META_INTERFACE(ComplexTypeInterface)
Christopher Wileyfd7dc032016-02-02 17:58:39 -0800612enum : int32_t {
613 MY_CONSTANT = 3,
614};
Casey Dahlin57dbe242015-12-04 11:44:02 -0800615virtual ::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 -0800616virtual ::android::binder::Status Piff(int32_t times) = 0;
617virtual ::android::binder::Status TakesABinder(const ::android::sp<::foo::IFooType>& f, ::android::sp<::foo::IFooType>* _aidl_return) = 0;
618virtual ::android::binder::Status StringListMethod(const ::std::vector<::android::String16>& input, ::std::vector<::android::String16>* output, ::std::vector<::android::String16>* _aidl_return) = 0;
619virtual ::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;
620virtual ::android::binder::Status TakesAFileDescriptor(const ::ScopedFd& f, ::ScopedFd* _aidl_return) = 0;
621virtual ::android::binder::Status TakesAFileDescriptorArray(const ::std::vector<::ScopedFd>& f, ::std::vector<::ScopedFd>* _aidl_return) = 0;
Casey Dahlinb0966612015-10-19 16:35:26 -0700622enum Call {
Casey Dahlinb8d9e882015-11-24 10:57:23 -0800623 SEND = ::android::IBinder::FIRST_CALL_TRANSACTION + 0,
624 PIFF = ::android::IBinder::FIRST_CALL_TRANSACTION + 1,
625 TAKESABINDER = ::android::IBinder::FIRST_CALL_TRANSACTION + 2,
626 STRINGLISTMETHOD = ::android::IBinder::FIRST_CALL_TRANSACTION + 3,
627 BINDERLISTMETHOD = ::android::IBinder::FIRST_CALL_TRANSACTION + 4,
628 TAKESAFILEDESCRIPTOR = ::android::IBinder::FIRST_CALL_TRANSACTION + 5,
629 TAKESAFILEDESCRIPTORARRAY = ::android::IBinder::FIRST_CALL_TRANSACTION + 6,
Casey Dahlinb0966612015-10-19 16:35:26 -0700630};
631}; // class IComplexTypeInterface
632
633} // namespace os
634
635} // namespace android
636
Christopher Wiley11a9d792016-02-24 17:20:33 -0800637#endif // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
638)";
Casey Dahlinb0966612015-10-19 16:35:26 -0700639
640const char kExpectedComplexTypeInterfaceSourceOutput[] =
641R"(#include <android/os/IComplexTypeInterface.h>
642#include <android/os/BpComplexTypeInterface.h>
643
644namespace android {
645
646namespace os {
647
Christopher Wiley11a9d792016-02-24 17:20:33 -0800648IMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface")
Casey Dahlinb0966612015-10-19 16:35:26 -0700649
650} // namespace os
651
652} // namespace android
653)";
654
Casey Dahlina834dd42015-09-23 11:52:15 -0700655} // namespace
656
Casey Dahlinb0966612015-10-19 16:35:26 -0700657class ASTTest : public ::testing::Test {
Christopher Wiley0c732db2015-09-29 14:36:44 -0700658 protected:
Casey Dahlin389781f2015-10-22 13:13:21 -0700659 ASTTest(string file_path, string file_contents)
660 : file_path_(file_path),
Christopher Wiley56799522015-10-31 10:17:04 -0700661 file_contents_(file_contents) {
662 types_.Init();
663 }
Casey Dahlinb0966612015-10-19 16:35:26 -0700664
Christopher Wiley90be4e32015-10-20 14:55:25 -0700665 unique_ptr<AidlInterface> Parse() {
Casey Dahlin389781f2015-10-22 13:13:21 -0700666 io_delegate_.SetFileContents(file_path_, file_contents_);
Casey Dahlina834dd42015-09-23 11:52:15 -0700667
Christopher Wiley90be4e32015-10-20 14:55:25 -0700668 unique_ptr<AidlInterface> ret;
669 std::vector<std::unique_ptr<AidlImport>> imports;
Christopher Wiley632801d2015-11-05 14:15:49 -0800670 AidlError err = ::android::aidl::internals::load_and_validate_aidl(
Christopher Wiley90be4e32015-10-20 14:55:25 -0700671 {}, // no preprocessed files
Casey Dahlin389781f2015-10-22 13:13:21 -0700672 {"."},
673 file_path_,
674 io_delegate_,
675 &types_,
Christopher Wiley90be4e32015-10-20 14:55:25 -0700676 &ret,
677 &imports);
Christopher Wiley4a2884b2015-10-07 11:27:45 -0700678
Christopher Wiley632801d2015-11-05 14:15:49 -0800679 if (err != AidlError::OK)
Casey Dahlin2cc93162015-10-02 16:14:17 -0700680 return nullptr;
Casey Dahlina834dd42015-09-23 11:52:15 -0700681
Casey Dahlin2cc93162015-10-02 16:14:17 -0700682 return ret;
Christopher Wiley90be4e32015-10-20 14:55:25 -0700683 }
Casey Dahlina834dd42015-09-23 11:52:15 -0700684
Christopher Wiley0c732db2015-09-29 14:36:44 -0700685 void Compare(Document* doc, const char* expected) {
686 string output;
687 unique_ptr<CodeWriter> cw = GetStringWriter(&output);
688
689 doc->Write(cw.get());
690
Casey Dahlin80ada3d2015-10-20 20:33:56 -0700691 if (expected == output) {
692 return; // Success
693 }
694
695 test::PrintDiff(expected, output);
696 FAIL() << "Document contents did not match expected contents";
Christopher Wiley0c732db2015-09-29 14:36:44 -0700697 }
Casey Dahlin389781f2015-10-22 13:13:21 -0700698
699 const string file_path_;
700 const string file_contents_;
701 FakeIoDelegate io_delegate_;
702 TypeNamespace types_;
Christopher Wiley0c732db2015-09-29 14:36:44 -0700703};
704
Casey Dahlinb0966612015-10-19 16:35:26 -0700705class ComplexTypeInterfaceASTTest : public ASTTest {
Casey Dahlin389781f2015-10-22 13:13:21 -0700706 public:
707 ComplexTypeInterfaceASTTest()
708 : ASTTest("android/os/IComplexTypeInterface.aidl",
709 kComplexTypeInterfaceAIDL) {
710 io_delegate_.SetFileContents("foo/IFooType.aidl",
711 "package foo; interface IFooType {}");
712 }
Casey Dahlinb0966612015-10-19 16:35:26 -0700713};
714
715TEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
716 unique_ptr<AidlInterface> interface = Parse();
717 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -0700718 unique_ptr<Document> doc = internals::BuildClientHeader(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -0700719 Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
720}
721
722TEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
723 unique_ptr<AidlInterface> interface = Parse();
724 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -0700725 unique_ptr<Document> doc = internals::BuildClientSource(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -0700726 Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
727}
728
729TEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
730 unique_ptr<AidlInterface> interface = Parse();
731 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -0700732 unique_ptr<Document> doc = internals::BuildServerHeader(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -0700733 Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
734}
735
736TEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
737 unique_ptr<AidlInterface> interface = Parse();
738 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -0700739 unique_ptr<Document> doc = internals::BuildServerSource(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -0700740 Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
741}
742
743TEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
744 unique_ptr<AidlInterface> interface = Parse();
745 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -0700746 unique_ptr<Document> doc = internals::BuildInterfaceHeader(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -0700747 Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
748}
749
750TEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
751 unique_ptr<AidlInterface> interface = Parse();
752 ASSERT_NE(interface, nullptr);
Casey Dahlin389781f2015-10-22 13:13:21 -0700753 unique_ptr<Document> doc = internals::BuildInterfaceSource(types_, *interface);
Casey Dahlinb0966612015-10-19 16:35:26 -0700754 Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
Christopher Wiley1dd458d2015-09-30 11:05:52 -0700755}
756
Christopher Wiley9d6e0b22015-11-13 12:18:16 -0800757namespace test_io_handling {
758
759const char kInputPath[] = "a/IFoo.aidl";
760const char kOutputPath[] = "output.cpp";
761const char kHeaderDir[] = "headers";
762const char kInterfaceHeaderRelPath[] = "a/IFoo.h";
763
764} // namespace test_io_handling
765
766class IoErrorHandlingTest : public ASTTest {
767 public:
768 IoErrorHandlingTest ()
769 : ASTTest(test_io_handling::kInputPath,
770 "package a; interface IFoo {}"),
771 options_(GetOptions()) {}
772
773 const unique_ptr<CppOptions> options_;
774
775 private:
776 static unique_ptr<CppOptions> GetOptions() {
777 using namespace test_io_handling;
778
779 const int argc = 4;
780 const char* cmdline[argc] = {
781 "aidl-cpp", kInputPath, kHeaderDir, kOutputPath
782 };
783 return CppOptions::Parse(argc, cmdline);
784 }
785};
786
787TEST_F(IoErrorHandlingTest, GenerateCorrectlyAbsentErrors) {
788 // Confirm that this is working correctly without I/O problems.
789 const unique_ptr<AidlInterface> interface = Parse();
790 ASSERT_NE(interface, nullptr);
791 ASSERT_TRUE(GenerateCpp(*options_, types_, *interface, io_delegate_));
792}
793
794TEST_F(IoErrorHandlingTest, HandlesBadHeaderWrite) {
795 using namespace test_io_handling;
796 const unique_ptr<AidlInterface> interface = Parse();
797 ASSERT_NE(interface, nullptr);
798
799 // Simulate issues closing the interface header.
800 const string header_path =
801 StringPrintf("%s%c%s", kHeaderDir, OS_PATH_SEPARATOR,
802 kInterfaceHeaderRelPath);
803 io_delegate_.AddBrokenFilePath(header_path);
804 ASSERT_FALSE(GenerateCpp(*options_, types_, *interface, io_delegate_));
805 // We should never attempt to write the C++ file if we fail writing headers.
806 ASSERT_FALSE(io_delegate_.GetWrittenContents(kOutputPath, nullptr));
807 // We should remove partial results.
808 ASSERT_TRUE(io_delegate_.PathWasRemoved(header_path));
809}
810
811TEST_F(IoErrorHandlingTest, HandlesBadCppWrite) {
812 using test_io_handling::kOutputPath;
813 const unique_ptr<AidlInterface> interface = Parse();
814 ASSERT_NE(interface, nullptr);
815
816 // Simulate issues closing the cpp file.
817 io_delegate_.AddBrokenFilePath(kOutputPath);
818 ASSERT_FALSE(GenerateCpp(*options_, types_, *interface, io_delegate_));
819 // We should remove partial results.
820 ASSERT_TRUE(io_delegate_.PathWasRemoved(kOutputPath));
821}
822
Christopher Wileyf944e792015-09-29 10:00:46 -0700823} // namespace cpp
Casey Dahlina834dd42015-09-23 11:52:15 -0700824} // namespace aidl
825} // namespace android