generate_cpp_unittest.cpp revision 0eb903eff2376941ad7e947bd5d3a32e15d89f69
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 kPrimitiveInterfaceAIDL =
40054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(
41054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wileypackage android.os;
42054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley
43054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wileyinterface IPingResponder {
44ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin  int Ping(String token);
45a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin})";
46a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
47b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveClientSourceOutput[] =
48054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/BpPingResponder.h>
4936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley#include <binder/Parcel.h>
5036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
5136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileynamespace android {
5236570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
53b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
5436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
5536570f4779a413ebef9302d1563fd92917ec2e42Christopher WileyBpPingResponder::BpPingResponder(const android::sp<android::IBinder>& impl)
5636570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley    : BpInterface<IPingResponder>(impl){
5736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
5836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
59ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::status_t BpPingResponder::Ping(android::String16 token, int32_t* _aidl_return) {
6036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyandroid::Parcel data;
6136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyandroid::Parcel reply;
6236570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyandroid::status_t status;
63ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinstatus = data.writeString16(token);
640eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
650eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
660eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
6736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = remote()->transact(IPingResponder::PING, data, &reply);
680eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
690eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
700eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
7136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = reply.readInt32(_aidl_return);
720eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
730eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
740eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
7536570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyreturn status;
7636570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
7736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
78b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
7936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
8036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}  // namespace android
8136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley)";
8236570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
83b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveServerHeaderOutput[] =
84054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_
85054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_
86fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
87fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley#include <binder/IInterface.h>
88054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/IPingResponder.h>
89fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
90fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileynamespace android {
91fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
92b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
93fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
94fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileyclass BnPingResponder : public android::BnInterface<IPingResponder> {
95fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileypublic:
96fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileyandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
97fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley};  // class BnPingResponder
98fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
99b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
100fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
101fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}  // namespace android
102fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
103054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_)";
104fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
105b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveServerSourceOutput[] =
106054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/BnPingResponder.h>
107ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley#include <binder/Parcel.h>
108ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
109ad3392747003a30928da6cd206e41f66398c2062Christopher Wileynamespace android {
110ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
111b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
112ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
113ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyandroid::status_t BnPingResponder::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
11405f4f890cad7b2a510e8e1f80fa5884db1bd8383Christopher Wileyandroid::status_t status;
115ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyswitch (code) {
116ad3392747003a30928da6cd206e41f66398c2062Christopher Wileycase Call::PING:
117ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
118ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::String16 in_token;
119ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyint32_t _aidl_return;
120ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinstatus = data.readString16(&in_token);
1210eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1220eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
1230eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
124ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = Ping(in_token, &_aidl_return);
1250eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1260eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
1270eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
12836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = reply->writeInt32(_aidl_return);
1290eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1300eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
1310eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
132ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
133ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
134ad3392747003a30928da6cd206e41f66398c2062Christopher Wileydefault:
135ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
136ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = android::BBinder::onTransact(code, data, reply, flags);
137ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
138ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
139ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
140ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyreturn status;
141ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
142ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
143b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
144ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
145ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}  // namespace android
146ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley)";
147ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
148b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveClientHeaderOutput[] =
149054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_
150054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_
151a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
152a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IBinder.h>
153a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IInterface.h>
154a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <utils/Errors.h>
155054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/IPingResponder.h>
156a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
157a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android {
158a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
159b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
1600c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1613bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wileyclass BpPingResponder : public android::BpInterface<IPingResponder> {
162a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinpublic:
163b23149dbc77744864b78edeb9f9cbb2f94f8c06dChristopher Wileyexplicit BpPingResponder(const android::sp<android::IBinder>& impl);
164f094d58e623418bffa53fa82e0ef159daee8801bChristopher Wileyvirtual ~BpPingResponder() = default;
165ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::status_t Ping(android::String16 token, int32_t* _aidl_return) override;
166a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin};  // class BpPingResponder
167a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
168b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
1690c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
170a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
171a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
172054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_)";
173a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
174b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveInterfaceHeaderOutput[] =
175054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_
176054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_
1773bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley
1783bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley#include <binder/IBinder.h>
1790c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley#include <binder/IInterface.h>
180ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin#include <cstdint>
181ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin#include <utils/String16.h>
1820c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1830c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace android {
1840c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
185b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
1860c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1873bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wileyclass IPingResponder : public android::IInterface {
1880c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileypublic:
1890c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyDECLARE_META_INTERFACE(PingResponder);
190ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinvirtual android::status_t Ping(android::String16 token, int32_t* _aidl_return) = 0;
1910c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyenum Call {
1920c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  PING = android::IBinder::FIRST_CALL_TRANSACTION + 0,
1933bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley};
1940c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};  // class IPingResponder
1950c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
196b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
1970c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1980c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}  // namespace android
1993bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley
200054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_)";
2010c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
202b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveInterfaceSourceOutput[] =
203054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/IPingResponder.h>
204054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/BpPingResponder.h>
2051dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
2061dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace android {
2071dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
208b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
2091dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
210054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyIMPLEMENT_META_INTERFACE(PingResponder, "android.os.IPingResponder");
2111dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
212b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
2131dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
2141dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}  // namespace android
2151dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley)";
2161dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
217b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst string kComplexTypeInterfaceAIDL =
218b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(package android.os;
219b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlininterface IComplexTypeInterface {
220b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  int Send(in int[] token, out boolean[] item);
2210dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  oneway void Piff(int times);
222b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin})";
223b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
224b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientHeaderOutput[] =
225b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
226b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
227b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
228b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
229b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
230b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <utils/Errors.h>
231b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
232b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
233b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
234b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
235b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
236b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
237b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BpComplexTypeInterface : public android::BpInterface<IComplexTypeInterface> {
238b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
239b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinexplicit BpComplexTypeInterface(const android::sp<android::IBinder>& impl);
240b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual ~BpComplexTypeInterface() = default;
241b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) override;
2420dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t Piff(int32_t times) override;
243b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BpComplexTypeInterface
244b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
245b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
246b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
247b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
248b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
249b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_)";
250b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
251b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientSourceOutput[] =
252b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BpComplexTypeInterface.h>
253b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
254b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
255b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
256b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
257b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
258b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
259b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinBpComplexTypeInterface::BpComplexTypeInterface(const android::sp<android::IBinder>& impl)
260b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin    : BpInterface<IPingResponder>(impl){
261b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
262b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
263b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BpComplexTypeInterface::Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) {
264b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel data;
265b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel reply;
266b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
267b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = data.writeInt32Vector(token);
2680eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2690eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
2700eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
271b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::SEND, data, &reply);
2720eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2730eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
2740eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
275b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply.readInt32(_aidl_return);
2760eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2770eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
2780eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
279b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply.readBoolVector(item);
2800eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2810eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
2820eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
283b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
284b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
285b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
2860dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t BpComplexTypeInterface::Piff(int32_t times) {
2870dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::Parcel data;
2880dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t status;
2890dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.writeInt32(times);
2900eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2910eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
2920eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
2930dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::PIFF, data, &reply, android::IBinder::FLAG_ONEWAY);
2940eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2950eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
2960eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
2970dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinreturn status;
2980dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
2990dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin
300b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
301b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
302b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
303b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
304b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
305b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerHeaderOutput[] =
306b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
307b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
308b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
309b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
310b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
311b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
312b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
313b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
314b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
315b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
316b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BnComplexTypeInterface : public android::BnInterface<IComplexTypeInterface> {
317b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
318b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
319b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BnComplexTypeInterface
320b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
321b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
322b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
323b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
324b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
325b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_)";
326b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
327b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerSourceOutput[] =
328b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BnComplexTypeInterface.h>
329b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
330b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
331b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
332b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
333b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
334b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
335b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BnComplexTypeInterface::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
336b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
337b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinswitch (code) {
338b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlincase Call::SEND:
339b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
340b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstd::vector<int32_t> in_token;
341b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstd::vector<bool> out_item;
342b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinint32_t _aidl_return;
343b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = data.readInt32Vector(&in_token);
3440eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3450eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3460eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
347b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = Send(in_token, &out_item, &_aidl_return);
3480eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3490eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3500eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
351b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply->writeInt32(_aidl_return);
3520eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3530eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3540eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
355b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply->writeBoolVector(out_item);
3560eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3570eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3580eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
359b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
360b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
3610dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlincase Call::PIFF:
3620dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin{
3630dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinint32_t in_times;
3640dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.readInt32(&in_times);
3650eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3660eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3670eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
3680dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = Piff(in_times);
3690eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3700eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3710eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
3720dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
3730dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinbreak;
374b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlindefault:
375b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
376b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = android::BBinder::onTransact(code, data, reply, flags);
377b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
378b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
379b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
380b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
381b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
382b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
383b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
384b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
385b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
386b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
387b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
388b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceHeaderOutput[] =
389b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
390b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
391b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
392b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
393b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
394b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <cstdint>
395b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <vector>
396b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
397b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
398b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
399b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
400b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
401b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass IComplexTypeInterface : public android::IInterface {
402b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
403b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinDECLARE_META_INTERFACE(ComplexTypeInterface);
404b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual android::status_t Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) = 0;
4050dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinvirtual android::status_t Piff(int32_t times) = 0;
406b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinenum Call {
407b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  SEND = android::IBinder::FIRST_CALL_TRANSACTION + 0,
4080dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  PIFF = android::IBinder::FIRST_CALL_TRANSACTION + 1,
409b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
410b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class IComplexTypeInterface
411b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
412b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
413b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
414b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
415b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
416b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_)";
417b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
418b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceSourceOutput[] =
419b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/IComplexTypeInterface.h>
420b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/BpComplexTypeInterface.h>
421b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
422b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
423b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
424b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
425b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
426b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinIMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface");
427b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
428b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
429b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
430b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
431b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
432b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
433a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace
434a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
435b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ASTTest : public ::testing::Test {
4360c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected:
437b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  virtual const string& FilePath() = 0;
438b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  virtual const string& FileContents() = 0;
439b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
44090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> Parse() {
44190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    FakeIoDelegate io_delegate;
442b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin    io_delegate.SetFileContents(FilePath(), FileContents());
44390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
44490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    cpp::TypeNamespace types;
44590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    unique_ptr<AidlInterface> ret;
44690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    std::vector<std::unique_ptr<AidlImport>> imports;
44790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    int err = ::android::aidl::internals::load_and_validate_aidl(
44890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no preprocessed files
44990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no import paths
450b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin        FilePath(),
45190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        io_delegate,
45290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &types,
45390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &ret,
45490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &imports);
455a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4562cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    if (err)
4572cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin      return nullptr;
458a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4592cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    return ret;
46090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
461a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4620c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  void Compare(Document* doc, const char* expected) {
4630c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    string output;
4640c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    unique_ptr<CodeWriter> cw = GetStringWriter(&output);
465a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4660c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    doc->Write(cw.get());
467a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
46880ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    if (expected == output) {
46980ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin      return; // Success
47080ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    }
47180ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin
47280ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    test::PrintDiff(expected, output);
47380ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    FAIL() << "Document contents did not match expected contents";
4740c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  }
4750c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};
476a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
477b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass PrimitiveInterfaceASTTest : public ASTTest {
478b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin protected:
479b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string fp_ = "android/os/IPingResponder.aidl";
480b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FilePath() override { return fp_; }
481b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FileContents() override { return kPrimitiveInterfaceAIDL; }
482b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
483b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
484b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesClientHeader) {
485b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
486b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
487b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
488b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface);
489b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveClientHeaderOutput);
490b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
491b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
492b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesClientSource) {
493b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
494b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
495b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
496b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildClientSource(types, *interface);
497b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveClientSourceOutput);
498b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
499b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
500b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesServerHeader) {
501b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
502b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
503b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
504b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildServerHeader(types, *interface);
505b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveServerHeaderOutput);
506b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
507b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
508b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesServerSource) {
509b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
510b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
511b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
512b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildServerSource(types, *interface);
513b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveServerSourceOutput);
514b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
515b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
516b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesInterfaceHeader) {
517b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
518b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
519b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
520b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface);
521b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveInterfaceHeaderOutput);
522b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
523b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
524b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesInterfaceSource) {
525b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
526b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
527b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
528b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface);
529b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveInterfaceSourceOutput);
530b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
531b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
532b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ComplexTypeInterfaceASTTest : public ASTTest {
533b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin protected:
534b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string fp_ = "android/os/IComplexTypeInterface.aidl";
535b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FilePath() override { return fp_; }
536b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FileContents() override { return kComplexTypeInterfaceAIDL; }
537b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
538b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
539b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
54090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5410c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
5420c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
5430c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface);
544b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
5450c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}
5460c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
547b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
54890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
54936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  ASSERT_NE(interface, nullptr);
55036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  TypeNamespace types;
55136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  unique_ptr<Document> doc = internals::BuildClientSource(types, *interface);
552b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
55336570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
55436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
555b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
55690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
557fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  ASSERT_NE(interface, nullptr);
558fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  TypeNamespace types;
559fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  unique_ptr<Document> doc = internals::BuildServerHeader(types, *interface);
560b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
561fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}
562fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
563b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
56490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
565ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  ASSERT_NE(interface, nullptr);
566ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  TypeNamespace types;
567ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  unique_ptr<Document> doc = internals::BuildServerSource(types, *interface);
568b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
569ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
570ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
571b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
57290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5730c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
5740c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
5750c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface);
576b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
577a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}
578a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
579b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
58090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5811dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  ASSERT_NE(interface, nullptr);
5821dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  TypeNamespace types;
5831dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface);
584b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
5851dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}
5861dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
587f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace cpp
588a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace aidl
589a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
590