Home | History | Annotate | Download | only in aidl
      1 /*
      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 
     19 #include <android-base/stringprintf.h>
     20 #include <gtest/gtest.h>
     21 
     22 #include "aidl.h"
     23 #include "aidl_language.h"
     24 #include "ast_cpp.h"
     25 #include "code_writer.h"
     26 #include "generate_cpp.h"
     27 #include "os.h"
     28 #include "tests/fake_io_delegate.h"
     29 #include "tests/test_util.h"
     30 #include "type_cpp.h"
     31 
     32 using ::android::aidl::test::FakeIoDelegate;
     33 using ::android::base::StringPrintf;
     34 using std::string;
     35 using std::unique_ptr;
     36 
     37 namespace android {
     38 namespace aidl {
     39 namespace cpp {
     40 namespace {
     41 
     42 const string kComplexTypeInterfaceAIDL =
     43 R"(package android.os;
     44 import foo.IFooType;
     45 interface IComplexTypeInterface {
     46   const int MY_CONSTANT = 3;
     47   int[] Send(in @nullable int[] goes_in, inout double[] goes_in_and_out, out boolean[] goes_out);
     48   oneway void Piff(int times);
     49   IFooType TakesABinder(IFooType f);
     50   @nullable IFooType NullableBinder();
     51   List<String> StringListMethod(in java.util.List<String> input, out List<String> output);
     52   List<IBinder> BinderListMethod(in java.util.List<IBinder> input, out List<IBinder> output);
     53   FileDescriptor TakesAFileDescriptor(in FileDescriptor f);
     54   FileDescriptor[] TakesAFileDescriptorArray(in FileDescriptor[] f);
     55 })";
     56 
     57 const char kExpectedComplexTypeClientHeaderOutput[] =
     58 R"(#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 
     66 namespace android {
     67 
     68 namespace os {
     69 
     70 class BpComplexTypeInterface : public ::android::BpInterface<IComplexTypeInterface> {
     71 public:
     72 explicit BpComplexTypeInterface(const ::android::sp<::android::IBinder>& _aidl_impl);
     73 virtual ~BpComplexTypeInterface() = default;
     74 ::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;
     75 ::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;
     77 ::android::binder::Status NullableBinder(::android::sp<::foo::IFooType>* _aidl_return) override;
     78 ::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;
     80 ::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;
     82 };  // class BpComplexTypeInterface
     83 
     84 }  // namespace os
     85 
     86 }  // namespace android
     87 
     88 #endif  // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
     89 )";
     90 
     91 const char kExpectedComplexTypeClientSourceOutput[] =
     92 R"(#include <android/os/BpComplexTypeInterface.h>
     93 #include <binder/Parcel.h>
     94 
     95 namespace android {
     96 
     97 namespace os {
     98 
     99 BpComplexTypeInterface::BpComplexTypeInterface(const ::android::sp<::android::IBinder>& _aidl_impl)
    100     : BpInterface<IComplexTypeInterface>(_aidl_impl){
    101 }
    102 
    103 ::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) {
    104 ::android::Parcel _aidl_data;
    105 ::android::Parcel _aidl_reply;
    106 ::android::status_t _aidl_ret_status = ::android::OK;
    107 ::android::binder::Status _aidl_status;
    108 _aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
    109 if (((_aidl_ret_status) != (::android::OK))) {
    110 goto _aidl_error;
    111 }
    112 _aidl_ret_status = _aidl_data.writeInt32Vector(goes_in);
    113 if (((_aidl_ret_status) != (::android::OK))) {
    114 goto _aidl_error;
    115 }
    116 _aidl_ret_status = _aidl_data.writeDoubleVector(*goes_in_and_out);
    117 if (((_aidl_ret_status) != (::android::OK))) {
    118 goto _aidl_error;
    119 }
    120 _aidl_ret_status = _aidl_data.writeVectorSize(*goes_out);
    121 if (((_aidl_ret_status) != (::android::OK))) {
    122 goto _aidl_error;
    123 }
    124 _aidl_ret_status = remote()->transact(IComplexTypeInterface::SEND, _aidl_data, &_aidl_reply);
    125 if (((_aidl_ret_status) != (::android::OK))) {
    126 goto _aidl_error;
    127 }
    128 _aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
    129 if (((_aidl_ret_status) != (::android::OK))) {
    130 goto _aidl_error;
    131 }
    132 if (!_aidl_status.isOk()) {
    133 return _aidl_status;
    134 }
    135 _aidl_ret_status = _aidl_reply.readInt32Vector(_aidl_return);
    136 if (((_aidl_ret_status) != (::android::OK))) {
    137 goto _aidl_error;
    138 }
    139 _aidl_ret_status = _aidl_reply.readDoubleVector(goes_in_and_out);
    140 if (((_aidl_ret_status) != (::android::OK))) {
    141 goto _aidl_error;
    142 }
    143 _aidl_ret_status = _aidl_reply.readBoolVector(goes_out);
    144 if (((_aidl_ret_status) != (::android::OK))) {
    145 goto _aidl_error;
    146 }
    147 _aidl_error:
    148 _aidl_status.setFromStatusT(_aidl_ret_status);
    149 return _aidl_status;
    150 }
    151 
    152 ::android::binder::Status BpComplexTypeInterface::Piff(int32_t times) {
    153 ::android::Parcel _aidl_data;
    154 ::android::Parcel _aidl_reply;
    155 ::android::status_t _aidl_ret_status = ::android::OK;
    156 ::android::binder::Status _aidl_status;
    157 _aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
    158 if (((_aidl_ret_status) != (::android::OK))) {
    159 goto _aidl_error;
    160 }
    161 _aidl_ret_status = _aidl_data.writeInt32(times);
    162 if (((_aidl_ret_status) != (::android::OK))) {
    163 goto _aidl_error;
    164 }
    165 _aidl_ret_status = remote()->transact(IComplexTypeInterface::PIFF, _aidl_data, &_aidl_reply, ::android::IBinder::FLAG_ONEWAY);
    166 if (((_aidl_ret_status) != (::android::OK))) {
    167 goto _aidl_error;
    168 }
    169 _aidl_error:
    170 _aidl_status.setFromStatusT(_aidl_ret_status);
    171 return _aidl_status;
    172 }
    173 
    174 ::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;
    177 ::android::status_t _aidl_ret_status = ::android::OK;
    178 ::android::binder::Status _aidl_status;
    179 _aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
    180 if (((_aidl_ret_status) != (::android::OK))) {
    181 goto _aidl_error;
    182 }
    183 _aidl_ret_status = _aidl_data.writeStrongBinder(::foo::IFooType::asBinder(f));
    184 if (((_aidl_ret_status) != (::android::OK))) {
    185 goto _aidl_error;
    186 }
    187 _aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESABINDER, _aidl_data, &_aidl_reply);
    188 if (((_aidl_ret_status) != (::android::OK))) {
    189 goto _aidl_error;
    190 }
    191 _aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
    192 if (((_aidl_ret_status) != (::android::OK))) {
    193 goto _aidl_error;
    194 }
    195 if (!_aidl_status.isOk()) {
    196 return _aidl_status;
    197 }
    198 _aidl_ret_status = _aidl_reply.readStrongBinder(_aidl_return);
    199 if (((_aidl_ret_status) != (::android::OK))) {
    200 goto _aidl_error;
    201 }
    202 _aidl_error:
    203 _aidl_status.setFromStatusT(_aidl_ret_status);
    204 return _aidl_status;
    205 }
    206 
    207 ::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());
    213 if (((_aidl_ret_status) != (::android::OK))) {
    214 goto _aidl_error;
    215 }
    216 _aidl_ret_status = remote()->transact(IComplexTypeInterface::NULLABLEBINDER, _aidl_data, &_aidl_reply);
    217 if (((_aidl_ret_status) != (::android::OK))) {
    218 goto _aidl_error;
    219 }
    220 _aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
    221 if (((_aidl_ret_status) != (::android::OK))) {
    222 goto _aidl_error;
    223 }
    224 if (!_aidl_status.isOk()) {
    225 return _aidl_status;
    226 }
    227 _aidl_ret_status = _aidl_reply.readNullableStrongBinder(_aidl_return);
    228 if (((_aidl_ret_status) != (::android::OK))) {
    229 goto _aidl_error;
    230 }
    231 _aidl_error:
    232 _aidl_status.setFromStatusT(_aidl_ret_status);
    233 return _aidl_status;
    234 }
    235 
    236 ::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;
    239 ::android::status_t _aidl_ret_status = ::android::OK;
    240 ::android::binder::Status _aidl_status;
    241 _aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
    242 if (((_aidl_ret_status) != (::android::OK))) {
    243 goto _aidl_error;
    244 }
    245 _aidl_ret_status = _aidl_data.writeString16Vector(input);
    246 if (((_aidl_ret_status) != (::android::OK))) {
    247 goto _aidl_error;
    248 }
    249 _aidl_ret_status = remote()->transact(IComplexTypeInterface::STRINGLISTMETHOD, _aidl_data, &_aidl_reply);
    250 if (((_aidl_ret_status) != (::android::OK))) {
    251 goto _aidl_error;
    252 }
    253 _aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
    254 if (((_aidl_ret_status) != (::android::OK))) {
    255 goto _aidl_error;
    256 }
    257 if (!_aidl_status.isOk()) {
    258 return _aidl_status;
    259 }
    260 _aidl_ret_status = _aidl_reply.readString16Vector(_aidl_return);
    261 if (((_aidl_ret_status) != (::android::OK))) {
    262 goto _aidl_error;
    263 }
    264 _aidl_ret_status = _aidl_reply.readString16Vector(output);
    265 if (((_aidl_ret_status) != (::android::OK))) {
    266 goto _aidl_error;
    267 }
    268 _aidl_error:
    269 _aidl_status.setFromStatusT(_aidl_ret_status);
    270 return _aidl_status;
    271 }
    272 
    273 ::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;
    276 ::android::status_t _aidl_ret_status = ::android::OK;
    277 ::android::binder::Status _aidl_status;
    278 _aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
    279 if (((_aidl_ret_status) != (::android::OK))) {
    280 goto _aidl_error;
    281 }
    282 _aidl_ret_status = _aidl_data.writeStrongBinderVector(input);
    283 if (((_aidl_ret_status) != (::android::OK))) {
    284 goto _aidl_error;
    285 }
    286 _aidl_ret_status = remote()->transact(IComplexTypeInterface::BINDERLISTMETHOD, _aidl_data, &_aidl_reply);
    287 if (((_aidl_ret_status) != (::android::OK))) {
    288 goto _aidl_error;
    289 }
    290 _aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
    291 if (((_aidl_ret_status) != (::android::OK))) {
    292 goto _aidl_error;
    293 }
    294 if (!_aidl_status.isOk()) {
    295 return _aidl_status;
    296 }
    297 _aidl_ret_status = _aidl_reply.readStrongBinderVector(_aidl_return);
    298 if (((_aidl_ret_status) != (::android::OK))) {
    299 goto _aidl_error;
    300 }
    301 _aidl_ret_status = _aidl_reply.readStrongBinderVector(output);
    302 if (((_aidl_ret_status) != (::android::OK))) {
    303 goto _aidl_error;
    304 }
    305 _aidl_error:
    306 _aidl_status.setFromStatusT(_aidl_ret_status);
    307 return _aidl_status;
    308 }
    309 
    310 ::android::binder::Status BpComplexTypeInterface::TakesAFileDescriptor(const ::android::base::unique_fd& f, ::android::base::unique_fd* _aidl_return) {
    311 ::android::Parcel _aidl_data;
    312 ::android::Parcel _aidl_reply;
    313 ::android::status_t _aidl_ret_status = ::android::OK;
    314 ::android::binder::Status _aidl_status;
    315 _aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
    316 if (((_aidl_ret_status) != (::android::OK))) {
    317 goto _aidl_error;
    318 }
    319 _aidl_ret_status = _aidl_data.writeUniqueFileDescriptor(f);
    320 if (((_aidl_ret_status) != (::android::OK))) {
    321 goto _aidl_error;
    322 }
    323 _aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESAFILEDESCRIPTOR, _aidl_data, &_aidl_reply);
    324 if (((_aidl_ret_status) != (::android::OK))) {
    325 goto _aidl_error;
    326 }
    327 _aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
    328 if (((_aidl_ret_status) != (::android::OK))) {
    329 goto _aidl_error;
    330 }
    331 if (!_aidl_status.isOk()) {
    332 return _aidl_status;
    333 }
    334 _aidl_ret_status = _aidl_reply.readUniqueFileDescriptor(_aidl_return);
    335 if (((_aidl_ret_status) != (::android::OK))) {
    336 goto _aidl_error;
    337 }
    338 _aidl_error:
    339 _aidl_status.setFromStatusT(_aidl_ret_status);
    340 return _aidl_status;
    341 }
    342 
    343 ::android::binder::Status BpComplexTypeInterface::TakesAFileDescriptorArray(const ::std::vector<::android::base::unique_fd>& f, ::std::vector<::android::base::unique_fd>* _aidl_return) {
    344 ::android::Parcel _aidl_data;
    345 ::android::Parcel _aidl_reply;
    346 ::android::status_t _aidl_ret_status = ::android::OK;
    347 ::android::binder::Status _aidl_status;
    348 _aidl_ret_status = _aidl_data.writeInterfaceToken(getInterfaceDescriptor());
    349 if (((_aidl_ret_status) != (::android::OK))) {
    350 goto _aidl_error;
    351 }
    352 _aidl_ret_status = _aidl_data.writeUniqueFileDescriptorVector(f);
    353 if (((_aidl_ret_status) != (::android::OK))) {
    354 goto _aidl_error;
    355 }
    356 _aidl_ret_status = remote()->transact(IComplexTypeInterface::TAKESAFILEDESCRIPTORARRAY, _aidl_data, &_aidl_reply);
    357 if (((_aidl_ret_status) != (::android::OK))) {
    358 goto _aidl_error;
    359 }
    360 _aidl_ret_status = _aidl_status.readFromParcel(_aidl_reply);
    361 if (((_aidl_ret_status) != (::android::OK))) {
    362 goto _aidl_error;
    363 }
    364 if (!_aidl_status.isOk()) {
    365 return _aidl_status;
    366 }
    367 _aidl_ret_status = _aidl_reply.readUniqueFileDescriptorVector(_aidl_return);
    368 if (((_aidl_ret_status) != (::android::OK))) {
    369 goto _aidl_error;
    370 }
    371 _aidl_error:
    372 _aidl_status.setFromStatusT(_aidl_ret_status);
    373 return _aidl_status;
    374 }
    375 
    376 }  // namespace os
    377 
    378 }  // namespace android
    379 )";
    380 
    381 const char kExpectedComplexTypeServerHeaderOutput[] =
    382 R"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
    383 #define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
    384 
    385 #include <binder/IInterface.h>
    386 #include <android/os/IComplexTypeInterface.h>
    387 
    388 namespace android {
    389 
    390 namespace os {
    391 
    392 class BnComplexTypeInterface : public ::android::BnInterface<IComplexTypeInterface> {
    393 public:
    394 ::android::status_t onTransact(uint32_t _aidl_code, const ::android::Parcel& _aidl_data, ::android::Parcel* _aidl_reply, uint32_t _aidl_flags = 0) override;
    395 };  // class BnComplexTypeInterface
    396 
    397 }  // namespace os
    398 
    399 }  // namespace android
    400 
    401 #endif  // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
    402 )";
    403 
    404 const char kExpectedComplexTypeServerSourceOutput[] =
    405 R"(#include <android/os/BnComplexTypeInterface.h>
    406 #include <binder/Parcel.h>
    407 
    408 namespace android {
    409 
    410 namespace os {
    411 
    412 ::android::status_t BnComplexTypeInterface::onTransact(uint32_t _aidl_code, const ::android::Parcel& _aidl_data, ::android::Parcel* _aidl_reply, uint32_t _aidl_flags) {
    413 ::android::status_t _aidl_ret_status = ::android::OK;
    414 switch (_aidl_code) {
    415 case Call::SEND:
    416 {
    417 ::std::unique_ptr<::std::vector<int32_t>> in_goes_in;
    418 ::std::vector<double> in_goes_in_and_out;
    419 ::std::vector<bool> out_goes_out;
    420 ::std::vector<int32_t> _aidl_return;
    421 if (!(_aidl_data.checkInterface(this))) {
    422 _aidl_ret_status = ::android::BAD_TYPE;
    423 break;
    424 }
    425 _aidl_ret_status = _aidl_data.readInt32Vector(&in_goes_in);
    426 if (((_aidl_ret_status) != (::android::OK))) {
    427 break;
    428 }
    429 _aidl_ret_status = _aidl_data.readDoubleVector(&in_goes_in_and_out);
    430 if (((_aidl_ret_status) != (::android::OK))) {
    431 break;
    432 }
    433 _aidl_ret_status = _aidl_data.resizeOutVector(&out_goes_out);
    434 if (((_aidl_ret_status) != (::android::OK))) {
    435 break;
    436 }
    437 ::android::binder::Status _aidl_status(Send(in_goes_in, &in_goes_in_and_out, &out_goes_out, &_aidl_return));
    438 _aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
    439 if (((_aidl_ret_status) != (::android::OK))) {
    440 break;
    441 }
    442 if (!_aidl_status.isOk()) {
    443 break;
    444 }
    445 _aidl_ret_status = _aidl_reply->writeInt32Vector(_aidl_return);
    446 if (((_aidl_ret_status) != (::android::OK))) {
    447 break;
    448 }
    449 _aidl_ret_status = _aidl_reply->writeDoubleVector(in_goes_in_and_out);
    450 if (((_aidl_ret_status) != (::android::OK))) {
    451 break;
    452 }
    453 _aidl_ret_status = _aidl_reply->writeBoolVector(out_goes_out);
    454 if (((_aidl_ret_status) != (::android::OK))) {
    455 break;
    456 }
    457 }
    458 break;
    459 case Call::PIFF:
    460 {
    461 int32_t in_times;
    462 if (!(_aidl_data.checkInterface(this))) {
    463 _aidl_ret_status = ::android::BAD_TYPE;
    464 break;
    465 }
    466 _aidl_ret_status = _aidl_data.readInt32(&in_times);
    467 if (((_aidl_ret_status) != (::android::OK))) {
    468 break;
    469 }
    470 ::android::binder::Status _aidl_status(Piff(in_times));
    471 }
    472 break;
    473 case Call::TAKESABINDER:
    474 {
    475 ::android::sp<::foo::IFooType> in_f;
    476 ::android::sp<::foo::IFooType> _aidl_return;
    477 if (!(_aidl_data.checkInterface(this))) {
    478 _aidl_ret_status = ::android::BAD_TYPE;
    479 break;
    480 }
    481 _aidl_ret_status = _aidl_data.readStrongBinder(&in_f);
    482 if (((_aidl_ret_status) != (::android::OK))) {
    483 break;
    484 }
    485 ::android::binder::Status _aidl_status(TakesABinder(in_f, &_aidl_return));
    486 _aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
    487 if (((_aidl_ret_status) != (::android::OK))) {
    488 break;
    489 }
    490 if (!_aidl_status.isOk()) {
    491 break;
    492 }
    493 _aidl_ret_status = _aidl_reply->writeStrongBinder(::foo::IFooType::asBinder(_aidl_return));
    494 if (((_aidl_ret_status) != (::android::OK))) {
    495 break;
    496 }
    497 }
    498 break;
    499 case Call::NULLABLEBINDER:
    500 {
    501 ::android::sp<::foo::IFooType> _aidl_return;
    502 if (!(_aidl_data.checkInterface(this))) {
    503 _aidl_ret_status = ::android::BAD_TYPE;
    504 break;
    505 }
    506 ::android::binder::Status _aidl_status(NullableBinder(&_aidl_return));
    507 _aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
    508 if (((_aidl_ret_status) != (::android::OK))) {
    509 break;
    510 }
    511 if (!_aidl_status.isOk()) {
    512 break;
    513 }
    514 _aidl_ret_status = _aidl_reply->writeStrongBinder(::foo::IFooType::asBinder(_aidl_return));
    515 if (((_aidl_ret_status) != (::android::OK))) {
    516 break;
    517 }
    518 }
    519 break;
    520 case Call::STRINGLISTMETHOD:
    521 {
    522 ::std::vector<::android::String16> in_input;
    523 ::std::vector<::android::String16> out_output;
    524 ::std::vector<::android::String16> _aidl_return;
    525 if (!(_aidl_data.checkInterface(this))) {
    526 _aidl_ret_status = ::android::BAD_TYPE;
    527 break;
    528 }
    529 _aidl_ret_status = _aidl_data.readString16Vector(&in_input);
    530 if (((_aidl_ret_status) != (::android::OK))) {
    531 break;
    532 }
    533 ::android::binder::Status _aidl_status(StringListMethod(in_input, &out_output, &_aidl_return));
    534 _aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
    535 if (((_aidl_ret_status) != (::android::OK))) {
    536 break;
    537 }
    538 if (!_aidl_status.isOk()) {
    539 break;
    540 }
    541 _aidl_ret_status = _aidl_reply->writeString16Vector(_aidl_return);
    542 if (((_aidl_ret_status) != (::android::OK))) {
    543 break;
    544 }
    545 _aidl_ret_status = _aidl_reply->writeString16Vector(out_output);
    546 if (((_aidl_ret_status) != (::android::OK))) {
    547 break;
    548 }
    549 }
    550 break;
    551 case Call::BINDERLISTMETHOD:
    552 {
    553 ::std::vector<::android::sp<::android::IBinder>> in_input;
    554 ::std::vector<::android::sp<::android::IBinder>> out_output;
    555 ::std::vector<::android::sp<::android::IBinder>> _aidl_return;
    556 if (!(_aidl_data.checkInterface(this))) {
    557 _aidl_ret_status = ::android::BAD_TYPE;
    558 break;
    559 }
    560 _aidl_ret_status = _aidl_data.readStrongBinderVector(&in_input);
    561 if (((_aidl_ret_status) != (::android::OK))) {
    562 break;
    563 }
    564 ::android::binder::Status _aidl_status(BinderListMethod(in_input, &out_output, &_aidl_return));
    565 _aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
    566 if (((_aidl_ret_status) != (::android::OK))) {
    567 break;
    568 }
    569 if (!_aidl_status.isOk()) {
    570 break;
    571 }
    572 _aidl_ret_status = _aidl_reply->writeStrongBinderVector(_aidl_return);
    573 if (((_aidl_ret_status) != (::android::OK))) {
    574 break;
    575 }
    576 _aidl_ret_status = _aidl_reply->writeStrongBinderVector(out_output);
    577 if (((_aidl_ret_status) != (::android::OK))) {
    578 break;
    579 }
    580 }
    581 break;
    582 case Call::TAKESAFILEDESCRIPTOR:
    583 {
    584 ::android::base::unique_fd in_f;
    585 ::android::base::unique_fd _aidl_return;
    586 if (!(_aidl_data.checkInterface(this))) {
    587 _aidl_ret_status = ::android::BAD_TYPE;
    588 break;
    589 }
    590 _aidl_ret_status = _aidl_data.readUniqueFileDescriptor(&in_f);
    591 if (((_aidl_ret_status) != (::android::OK))) {
    592 break;
    593 }
    594 ::android::binder::Status _aidl_status(TakesAFileDescriptor(in_f, &_aidl_return));
    595 _aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
    596 if (((_aidl_ret_status) != (::android::OK))) {
    597 break;
    598 }
    599 if (!_aidl_status.isOk()) {
    600 break;
    601 }
    602 _aidl_ret_status = _aidl_reply->writeUniqueFileDescriptor(_aidl_return);
    603 if (((_aidl_ret_status) != (::android::OK))) {
    604 break;
    605 }
    606 }
    607 break;
    608 case Call::TAKESAFILEDESCRIPTORARRAY:
    609 {
    610 ::std::vector<::android::base::unique_fd> in_f;
    611 ::std::vector<::android::base::unique_fd> _aidl_return;
    612 if (!(_aidl_data.checkInterface(this))) {
    613 _aidl_ret_status = ::android::BAD_TYPE;
    614 break;
    615 }
    616 _aidl_ret_status = _aidl_data.readUniqueFileDescriptorVector(&in_f);
    617 if (((_aidl_ret_status) != (::android::OK))) {
    618 break;
    619 }
    620 ::android::binder::Status _aidl_status(TakesAFileDescriptorArray(in_f, &_aidl_return));
    621 _aidl_ret_status = _aidl_status.writeToParcel(_aidl_reply);
    622 if (((_aidl_ret_status) != (::android::OK))) {
    623 break;
    624 }
    625 if (!_aidl_status.isOk()) {
    626 break;
    627 }
    628 _aidl_ret_status = _aidl_reply->writeUniqueFileDescriptorVector(_aidl_return);
    629 if (((_aidl_ret_status) != (::android::OK))) {
    630 break;
    631 }
    632 }
    633 break;
    634 default:
    635 {
    636 _aidl_ret_status = ::android::BBinder::onTransact(_aidl_code, _aidl_data, _aidl_reply, _aidl_flags);
    637 }
    638 break;
    639 }
    640 if (_aidl_ret_status == ::android::UNEXPECTED_NULL) {
    641 _aidl_ret_status = ::android::binder::Status::fromExceptionCode(::android::binder::Status::EX_NULL_POINTER).writeToParcel(_aidl_reply);
    642 }
    643 return _aidl_ret_status;
    644 }
    645 
    646 }  // namespace os
    647 
    648 }  // namespace android
    649 )";
    650 
    651 const char kExpectedComplexTypeInterfaceHeaderOutput[] =
    652 R"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
    653 #define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
    654 
    655 #include <android-base/unique_fd.h>
    656 #include <binder/IBinder.h>
    657 #include <binder/IInterface.h>
    658 #include <binder/Status.h>
    659 #include <cstdint>
    660 #include <foo/IFooType.h>
    661 #include <memory>
    662 #include <utils/String16.h>
    663 #include <utils/StrongPointer.h>
    664 #include <vector>
    665 
    666 namespace android {
    667 
    668 namespace os {
    669 
    670 class IComplexTypeInterface : public ::android::IInterface {
    671 public:
    672 DECLARE_META_INTERFACE(ComplexTypeInterface)
    673 enum  : int32_t {
    674   MY_CONSTANT = 3,
    675 };
    676 virtual ::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;
    677 virtual ::android::binder::Status Piff(int32_t times) = 0;
    678 virtual ::android::binder::Status TakesABinder(const ::android::sp<::foo::IFooType>& f, ::android::sp<::foo::IFooType>* _aidl_return) = 0;
    679 virtual ::android::binder::Status NullableBinder(::android::sp<::foo::IFooType>* _aidl_return) = 0;
    680 virtual ::android::binder::Status StringListMethod(const ::std::vector<::android::String16>& input, ::std::vector<::android::String16>* output, ::std::vector<::android::String16>* _aidl_return) = 0;
    681 virtual ::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;
    682 virtual ::android::binder::Status TakesAFileDescriptor(const ::android::base::unique_fd& f, ::android::base::unique_fd* _aidl_return) = 0;
    683 virtual ::android::binder::Status TakesAFileDescriptorArray(const ::std::vector<::android::base::unique_fd>& f, ::std::vector<::android::base::unique_fd>* _aidl_return) = 0;
    684 enum Call {
    685   SEND = ::android::IBinder::FIRST_CALL_TRANSACTION + 0,
    686   PIFF = ::android::IBinder::FIRST_CALL_TRANSACTION + 1,
    687   TAKESABINDER = ::android::IBinder::FIRST_CALL_TRANSACTION + 2,
    688   NULLABLEBINDER = ::android::IBinder::FIRST_CALL_TRANSACTION + 3,
    689   STRINGLISTMETHOD = ::android::IBinder::FIRST_CALL_TRANSACTION + 4,
    690   BINDERLISTMETHOD = ::android::IBinder::FIRST_CALL_TRANSACTION + 5,
    691   TAKESAFILEDESCRIPTOR = ::android::IBinder::FIRST_CALL_TRANSACTION + 6,
    692   TAKESAFILEDESCRIPTORARRAY = ::android::IBinder::FIRST_CALL_TRANSACTION + 7,
    693 };
    694 };  // class IComplexTypeInterface
    695 
    696 }  // namespace os
    697 
    698 }  // namespace android
    699 
    700 #endif  // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
    701 )";
    702 
    703 const char kExpectedComplexTypeInterfaceSourceOutput[] =
    704 R"(#include <android/os/IComplexTypeInterface.h>
    705 #include <android/os/BpComplexTypeInterface.h>
    706 
    707 namespace android {
    708 
    709 namespace os {
    710 
    711 IMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface")
    712 
    713 }  // namespace os
    714 
    715 }  // namespace android
    716 )";
    717 
    718 }  // namespace
    719 
    720 class ASTTest : public ::testing::Test {
    721  protected:
    722   ASTTest(string file_path, string file_contents)
    723       : file_path_(file_path),
    724         file_contents_(file_contents) {
    725     types_.Init();
    726   }
    727 
    728   unique_ptr<AidlInterface> Parse() {
    729     io_delegate_.SetFileContents(file_path_, file_contents_);
    730 
    731     unique_ptr<AidlInterface> ret;
    732     std::vector<std::unique_ptr<AidlImport>> imports;
    733     AidlError err = ::android::aidl::internals::load_and_validate_aidl(
    734         {},  // no preprocessed files
    735         {"."},
    736         file_path_,
    737         io_delegate_,
    738         &types_,
    739         &ret,
    740         &imports);
    741 
    742     if (err != AidlError::OK)
    743       return nullptr;
    744 
    745     return ret;
    746   }
    747 
    748   void Compare(Document* doc, const char* expected) {
    749     string output;
    750     unique_ptr<CodeWriter> cw = GetStringWriter(&output);
    751 
    752     doc->Write(cw.get());
    753 
    754     if (expected == output) {
    755       return; // Success
    756     }
    757 
    758     test::PrintDiff(expected, output);
    759     FAIL() << "Document contents did not match expected contents";
    760   }
    761 
    762   const string file_path_;
    763   const string file_contents_;
    764   FakeIoDelegate io_delegate_;
    765   TypeNamespace types_;
    766 };
    767 
    768 class ComplexTypeInterfaceASTTest : public ASTTest {
    769  public:
    770   ComplexTypeInterfaceASTTest()
    771       : ASTTest("android/os/IComplexTypeInterface.aidl",
    772                 kComplexTypeInterfaceAIDL) {
    773     io_delegate_.SetFileContents("foo/IFooType.aidl",
    774                                  "package foo; interface IFooType {}");
    775   }
    776 };
    777 
    778 TEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
    779   unique_ptr<AidlInterface> interface = Parse();
    780   ASSERT_NE(interface, nullptr);
    781   unique_ptr<Document> doc = internals::BuildClientHeader(types_, *interface);
    782   Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
    783 }
    784 
    785 TEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
    786   unique_ptr<AidlInterface> interface = Parse();
    787   ASSERT_NE(interface, nullptr);
    788   unique_ptr<Document> doc = internals::BuildClientSource(types_, *interface);
    789   Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
    790 }
    791 
    792 TEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
    793   unique_ptr<AidlInterface> interface = Parse();
    794   ASSERT_NE(interface, nullptr);
    795   unique_ptr<Document> doc = internals::BuildServerHeader(types_, *interface);
    796   Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
    797 }
    798 
    799 TEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
    800   unique_ptr<AidlInterface> interface = Parse();
    801   ASSERT_NE(interface, nullptr);
    802   unique_ptr<Document> doc = internals::BuildServerSource(types_, *interface);
    803   Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
    804 }
    805 
    806 TEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
    807   unique_ptr<AidlInterface> interface = Parse();
    808   ASSERT_NE(interface, nullptr);
    809   unique_ptr<Document> doc = internals::BuildInterfaceHeader(types_, *interface);
    810   Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
    811 }
    812 
    813 TEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
    814   unique_ptr<AidlInterface> interface = Parse();
    815   ASSERT_NE(interface, nullptr);
    816   unique_ptr<Document> doc = internals::BuildInterfaceSource(types_, *interface);
    817   Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
    818 }
    819 
    820 namespace test_io_handling {
    821 
    822 const char kInputPath[] = "a/IFoo.aidl";
    823 const char kOutputPath[] = "output.cpp";
    824 const char kHeaderDir[] = "headers";
    825 const char kInterfaceHeaderRelPath[] = "a/IFoo.h";
    826 
    827 }  // namespace test_io_handling
    828 
    829 class IoErrorHandlingTest : public ASTTest {
    830  public:
    831   IoErrorHandlingTest ()
    832       : ASTTest(test_io_handling::kInputPath,
    833                 "package a; interface IFoo {}"),
    834         options_(GetOptions()) {}
    835 
    836   const unique_ptr<CppOptions> options_;
    837 
    838  private:
    839   static unique_ptr<CppOptions> GetOptions() {
    840     using namespace test_io_handling;
    841 
    842     const int argc = 4;
    843     const char* cmdline[argc] = {
    844       "aidl-cpp", kInputPath, kHeaderDir, kOutputPath
    845     };
    846     return CppOptions::Parse(argc, cmdline);
    847   }
    848 };
    849 
    850 TEST_F(IoErrorHandlingTest, GenerateCorrectlyAbsentErrors) {
    851   // Confirm that this is working correctly without I/O problems.
    852   const unique_ptr<AidlInterface> interface = Parse();
    853   ASSERT_NE(interface, nullptr);
    854   ASSERT_TRUE(GenerateCpp(*options_, types_, *interface, io_delegate_));
    855 }
    856 
    857 TEST_F(IoErrorHandlingTest, HandlesBadHeaderWrite) {
    858   using namespace test_io_handling;
    859   const unique_ptr<AidlInterface> interface = Parse();
    860   ASSERT_NE(interface, nullptr);
    861 
    862   // Simulate issues closing the interface header.
    863   const string header_path =
    864       StringPrintf("%s%c%s", kHeaderDir, OS_PATH_SEPARATOR,
    865                    kInterfaceHeaderRelPath);
    866   io_delegate_.AddBrokenFilePath(header_path);
    867   ASSERT_FALSE(GenerateCpp(*options_, types_, *interface, io_delegate_));
    868   // We should never attempt to write the C++ file if we fail writing headers.
    869   ASSERT_FALSE(io_delegate_.GetWrittenContents(kOutputPath, nullptr));
    870   // We should remove partial results.
    871   ASSERT_TRUE(io_delegate_.PathWasRemoved(header_path));
    872 }
    873 
    874 TEST_F(IoErrorHandlingTest, HandlesBadCppWrite) {
    875   using test_io_handling::kOutputPath;
    876   const unique_ptr<AidlInterface> interface = Parse();
    877   ASSERT_NE(interface, nullptr);
    878 
    879   // Simulate issues closing the cpp file.
    880   io_delegate_.AddBrokenFilePath(kOutputPath);
    881   ASSERT_FALSE(GenerateCpp(*options_, types_, *interface, io_delegate_));
    882   // We should remove partial results.
    883   ASSERT_TRUE(io_delegate_.PathWasRemoved(kOutputPath));
    884 }
    885 
    886 }  // namespace cpp
    887 }  // namespace aidl
    888 }  // namespace android
    889