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