generate_cpp_unittest.cpp revision 56c9bf3c4fb731d5557427667f13f963fa5ef0f7
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
19a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <gtest/gtest.h>
20a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
212cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin#include "aidl.h"
22a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include "aidl_language.h"
23a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include "ast_cpp.h"
24a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include "code_writer.h"
25ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley#include "generate_cpp.h"
264a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley#include "tests/fake_io_delegate.h"
2780ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin#include "tests/test_util.h"
28e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wiley#include "type_cpp.h"
29a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
304a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing android::aidl::test::FakeIoDelegate;
31a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::string;
32a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::unique_ptr;
33a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
34a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android {
35a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace aidl {
36f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileynamespace cpp {
37a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace {
38a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
39b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst string kComplexTypeInterfaceAIDL =
40b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(package android.os;
41389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinimport foo.IFooType;
42b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlininterface IComplexTypeInterface {
43bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley  int[] Send(in int[] goes_in, inout double[] goes_in_and_out, out boolean[] goes_out);
440dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  oneway void Piff(int times);
45389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  IFooType TakesABinder(IFooType f);
4656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley  List<String> StringListMethod(in java.util.List<String> input, out List<String> output);
47b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin})";
48b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
49b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientHeaderOutput[] =
50b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
51b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
52b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
53b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
54b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
55b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <utils/Errors.h>
56b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
57b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
58b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
59b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
60b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
61b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
62b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BpComplexTypeInterface : public android::BpInterface<IComplexTypeInterface> {
63b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
64b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinexplicit BpComplexTypeInterface(const android::sp<android::IBinder>& impl);
65b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual ~BpComplexTypeInterface() = default;
66bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyandroid::status_t 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;
670dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t Piff(int32_t times) override;
68389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::status_t TakesABinder(const android::sp<::foo::IFooType>& f, android::sp<::foo::IFooType>* _aidl_return) override;
6956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::status_t StringListMethod(const std::vector<android::String16>& input, std::vector<android::String16>* output, std::vector<android::String16>* _aidl_return) override;
70b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BpComplexTypeInterface
71b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
72b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
73b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
74b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
75b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
76b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_)";
77b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
78b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientSourceOutput[] =
79b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BpComplexTypeInterface.h>
80b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
81b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
82b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
83b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
84b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
85b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
86b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinBpComplexTypeInterface::BpComplexTypeInterface(const android::sp<android::IBinder>& impl)
871db03482145137749602c830a593494498f5be55Christopher Wiley    : BpInterface<IComplexTypeInterface>(impl){
88b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
89b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
90bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyandroid::status_t 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) {
91b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel data;
92b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel reply;
93b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
948993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
958993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif (((status) != (android::OK))) {
968993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyreturn status;
978993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
98bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.writeInt32Vector(goes_in);
99bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
100bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyreturn status;
101bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
102bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.writeDoubleVector(*goes_in_and_out);
1030eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1040eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1050eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
106b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::SEND, data, &reply);
1070eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1080eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1090eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
1102aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (reply.readExceptionCode()) {
1112aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = android::FAILED_TRANSACTION;
1122aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyreturn status;
1132aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
114bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply.readInt32Vector(_aidl_return);
1150eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1160eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1170eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
118bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply.readDoubleVector(goes_in_and_out);
119bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
120bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyreturn status;
121bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
122bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply.readBoolVector(goes_out);
1230eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1240eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1250eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
126b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
127b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
128b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
1290dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t BpComplexTypeInterface::Piff(int32_t times) {
1300dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::Parcel data;
1311227d6135418a6a876666adcf4f8d9b498f17647Christopher Wileyandroid::Parcel reply;
1320dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t status;
1338993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
1348993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif (((status) != (android::OK))) {
1358993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyreturn status;
1368993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
1370dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.writeInt32(times);
1380eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1390eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1400eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
1410dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::PIFF, data, &reply, android::IBinder::FLAG_ONEWAY);
1420eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1430eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
1440eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
1450dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinreturn status;
1460dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
1470dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin
148389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::status_t BpComplexTypeInterface::TakesABinder(const android::sp<::foo::IFooType>& f, android::sp<::foo::IFooType>* _aidl_return) {
149389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::Parcel data;
150389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::Parcel reply;
151389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::status_t status;
152389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = data.writeInterfaceToken(getInterfaceDescriptor());
153389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
154389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
155389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
156389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = data.writeStrongBinder(IFooType::asBinder(f));
157389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
158389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
159389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
160389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = remote()->transact(IComplexTypeInterface::TAKESABINDER, data, &reply);
161389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
162389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
163389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
164389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (reply.readExceptionCode()) {
165389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = android::FAILED_TRANSACTION;
166389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
167389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
168389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = reply.readStrongBinder(_aidl_return);
169389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
170389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
171389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
172389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinreturn status;
173389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
174389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
17556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::status_t BpComplexTypeInterface::StringListMethod(const std::vector<android::String16>& input, std::vector<android::String16>* output, std::vector<android::String16>* _aidl_return) {
17656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::Parcel data;
17756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::Parcel reply;
17856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyandroid::status_t status;
17956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
18056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
18156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
18256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
18356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = data.writeString16Vector(input);
18456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
18556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
18656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
18756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = remote()->transact(IComplexTypeInterface::STRINGLISTMETHOD, data, &reply);
18856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
18956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
19056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
19156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (reply.readExceptionCode()) {
19256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = android::FAILED_TRANSACTION;
19356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
19456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
19556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply.readString16Vector(_aidl_return);
19656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
19756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
19856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
19956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply.readString16Vector(output);
20056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
20156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
20256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
20356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyreturn status;
20456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
20556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley
206b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
207b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
208b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
209b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
210b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
211b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerHeaderOutput[] =
212b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
213b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
214b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
215b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
216b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
217b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
218b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
219b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
220b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
221b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
222b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BnComplexTypeInterface : public android::BnInterface<IComplexTypeInterface> {
223b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
224b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
225b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BnComplexTypeInterface
226b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
227b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
228b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
229b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
230b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
231b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_)";
232b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
233b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerSourceOutput[] =
234b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BnComplexTypeInterface.h>
235b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
236b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
237b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
238b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
239b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
240b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
241b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BnComplexTypeInterface::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
242b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
243b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinswitch (code) {
244b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlincase Call::SEND:
245b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
246bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<int32_t> in_goes_in;
247bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<double> in_goes_in_and_out;
248bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<bool> out_goes_out;
249bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystd::vector<int32_t> _aidl_return;
2508993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif ((!data.checkInterface(this))) {
2518993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = android::BAD_TYPE;
2528993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileybreak;
2538993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
254bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.readInt32Vector(&in_goes_in);
2550eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2560eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
2570eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
258bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = data.readDoubleVector(&in_goes_in_and_out);
259bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
260bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileybreak;
261bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
262bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = Send(in_goes_in, &in_goes_in_and_out, &out_goes_out, &_aidl_return);
2630eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2640eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
2650eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
2662aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = reply->writeNoException();
2672aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (((status) != (android::OK))) {
2682aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileybreak;
2692aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
270bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply->writeInt32Vector(_aidl_return);
271bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyif (((status) != (android::OK))) {
272bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileybreak;
273bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wiley}
274bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply->writeDoubleVector(in_goes_in_and_out);
2750eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2760eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
2770eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
278bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileystatus = reply->writeBoolVector(out_goes_out);
2790eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2800eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
2810eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
282b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
283b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
2840dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlincase Call::PIFF:
2850dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin{
2860dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinint32_t in_times;
2878993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif ((!data.checkInterface(this))) {
2888993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = android::BAD_TYPE;
2898993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileybreak;
2908993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
2910dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.readInt32(&in_times);
2920eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2930eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
2940eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
2950dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = Piff(in_times);
2960eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2970eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
2980eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
2992aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = reply->writeNoException();
3002aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (((status) != (android::OK))) {
3012aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileybreak;
3022aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
3030dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
3040dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinbreak;
305389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlincase Call::TAKESABINDER:
306389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin{
307389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::sp<::foo::IFooType> in_f;
308389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinandroid::sp<::foo::IFooType> _aidl_return;
309389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif ((!data.checkInterface(this))) {
310389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = android::BAD_TYPE;
311389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
312389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
313389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = data.readStrongBinder(&in_f);
314389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
315389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
316389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
317389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = TakesABinder(in_f, &_aidl_return);
318389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
319389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
320389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
321389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = reply->writeNoException();
322389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
323389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
324389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
325389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinstatus = reply->writeStrongBinder(IFooType::asBinder(_aidl_return));
326389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinif (((status) != (android::OK))) {
327389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
328389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
329389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin}
330389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinbreak;
33156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileycase Call::STRINGLISTMETHOD:
33256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley{
33356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystd::vector<android::String16> in_input;
33456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystd::vector<android::String16> out_output;
33556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystd::vector<android::String16> _aidl_return;
33656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif ((!data.checkInterface(this))) {
33756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = android::BAD_TYPE;
33856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
33956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
34056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = data.readString16Vector(&in_input);
34156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
34256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
34356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
34456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = StringListMethod(in_input, &out_output, &_aidl_return);
34556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
34656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
34756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
34856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply->writeNoException();
34956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
35056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
35156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
35256c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply->writeString16Vector(_aidl_return);
35356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
35456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
35556c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
35656c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileystatus = reply->writeString16Vector(out_output);
35756c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyif (((status) != (android::OK))) {
35856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
35956c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
36056c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley}
36156c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileybreak;
362b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlindefault:
363b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
364b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = android::BBinder::onTransact(code, data, reply, flags);
365b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
366b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
367b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
368b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
369b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
370b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
371b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
372b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
373b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
374b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
375b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
376b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceHeaderOutput[] =
377b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
378b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
379b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
380b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
381b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
382b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <cstdint>
383389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include <foo/IFooType.h>
38456c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley#include <utils/String16.h>
385389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin#include <utils/StrongPointer.h>
386b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <vector>
387b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
388b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
389b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
390b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
391b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
392b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass IComplexTypeInterface : public android::IInterface {
393b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
394b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinDECLARE_META_INTERFACE(ComplexTypeInterface);
395bb96782d158ee996f79c1b4d6f06e121dee24972Christopher Wileyvirtual android::status_t 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;
3960dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinvirtual android::status_t Piff(int32_t times) = 0;
397389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlinvirtual android::status_t TakesABinder(const android::sp<::foo::IFooType>& f, android::sp<::foo::IFooType>* _aidl_return) = 0;
39856c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wileyvirtual android::status_t StringListMethod(const std::vector<android::String16>& input, std::vector<android::String16>* output, std::vector<android::String16>* _aidl_return) = 0;
399b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinenum Call {
400b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  SEND = android::IBinder::FIRST_CALL_TRANSACTION + 0,
4010dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  PIFF = android::IBinder::FIRST_CALL_TRANSACTION + 1,
402389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  TAKESABINDER = android::IBinder::FIRST_CALL_TRANSACTION + 2,
40356c9bf3c4fb731d5557427667f13f963fa5ef0f7Christopher Wiley  STRINGLISTMETHOD = android::IBinder::FIRST_CALL_TRANSACTION + 3,
404b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
405b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class IComplexTypeInterface
406b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
407b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
408b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
409b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
410b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
411b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_)";
412b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
413b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceSourceOutput[] =
414b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/IComplexTypeInterface.h>
415b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/BpComplexTypeInterface.h>
416b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
417b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
418b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
419b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
420b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
421b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinIMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface");
422b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
423b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
424b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
425b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
426b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
427b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
428a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace
429a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
430b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ASTTest : public ::testing::Test {
4310c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected:
432389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  ASTTest(string file_path, string file_contents)
433389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin      : file_path_(file_path),
4345679952c38925a54b75b087068887002e57f3174Christopher Wiley        file_contents_(file_contents) {
4355679952c38925a54b75b087068887002e57f3174Christopher Wiley    types_.Init();
4365679952c38925a54b75b087068887002e57f3174Christopher Wiley  }
437b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
43890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> Parse() {
439389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    io_delegate_.SetFileContents(file_path_, file_contents_);
44090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
44190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    unique_ptr<AidlInterface> ret;
44290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    std::vector<std::unique_ptr<AidlImport>> imports;
44390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    int err = ::android::aidl::internals::load_and_validate_aidl(
44490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no preprocessed files
445389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        {"."},
446389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        file_path_,
447389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        io_delegate_,
448389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin        &types_,
44990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &ret,
45090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &imports);
451a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4522cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    if (err)
4532cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin      return nullptr;
454a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4552cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    return ret;
45690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
457a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4580c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  void Compare(Document* doc, const char* expected) {
4590c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    string output;
4600c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    unique_ptr<CodeWriter> cw = GetStringWriter(&output);
461a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4620c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    doc->Write(cw.get());
463a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
46480ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    if (expected == output) {
46580ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin      return; // Success
46680ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    }
46780ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin
46880ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    test::PrintDiff(expected, output);
46980ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    FAIL() << "Document contents did not match expected contents";
4700c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  }
471389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin
472389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  const string file_path_;
473389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  const string file_contents_;
474389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  FakeIoDelegate io_delegate_;
475389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  TypeNamespace types_;
4760c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};
477a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
478b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ComplexTypeInterfaceASTTest : public ASTTest {
479389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin public:
480389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  ComplexTypeInterfaceASTTest()
481389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin      : ASTTest("android/os/IComplexTypeInterface.aidl",
482389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin                kComplexTypeInterfaceAIDL) {
483389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin    io_delegate_.SetFileContents("foo/IFooType.aidl",
484389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin                                 "package foo; interface IFooType {}");
485389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  }
486b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
487b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
488b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
48990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
4900c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
491389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildClientHeader(types_, *interface);
492b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
4930c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}
4940c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
495b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
49690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
49736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  ASSERT_NE(interface, nullptr);
498389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildClientSource(types_, *interface);
499b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
50036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
50136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
502b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
50390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
504fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  ASSERT_NE(interface, nullptr);
505389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildServerHeader(types_, *interface);
506b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
507fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}
508fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
509b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
51090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
511ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  ASSERT_NE(interface, nullptr);
512389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildServerSource(types_, *interface);
513b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
514ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
515ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
516b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
51790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5180c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
519389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types_, *interface);
520b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
521a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}
522a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
523b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
52490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5251dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  ASSERT_NE(interface, nullptr);
526389781f56bb6b4363e9eb03acf915ba297f607d5Casey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceSource(types_, *interface);
527b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
5281dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}
5291dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
530f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace cpp
531a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace aidl
532a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
533