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