generate_cpp_unittest.cpp revision 80ada3d405cbf76797e007d5fc265d17315aa05c
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);
6436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyif (status != android::OK) { return status; }
6536570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = remote()->transact(IPingResponder::PING, data, &reply);
6636570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyif (status != android::OK) { return status; }
6736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = reply.readInt32(_aidl_return);
6836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyif (status != android::OK) { return status; }
6936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyreturn status;
7036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
7136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
72b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
7336570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
7436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}  // namespace android
7536570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley)";
7636570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
77b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveServerHeaderOutput[] =
78054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_
79054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_
80fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
81fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley#include <binder/IInterface.h>
82054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/IPingResponder.h>
83fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
84fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileynamespace android {
85fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
86b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
87fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
88fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileyclass BnPingResponder : public android::BnInterface<IPingResponder> {
89fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileypublic:
90fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileyandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
91fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley};  // class BnPingResponder
92fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
93b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
94fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
95fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}  // namespace android
96fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
97054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_)";
98fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
99b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveServerSourceOutput[] =
100054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/BnPingResponder.h>
101ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley#include <binder/Parcel.h>
102ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
103ad3392747003a30928da6cd206e41f66398c2062Christopher Wileynamespace android {
104ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
105b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
106ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
107ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyandroid::status_t BnPingResponder::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
10805f4f890cad7b2a510e8e1f80fa5884db1bd8383Christopher Wileyandroid::status_t status;
109ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyswitch (code) {
110ad3392747003a30928da6cd206e41f66398c2062Christopher Wileycase Call::PING:
111ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
112ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::String16 in_token;
113ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyint32_t _aidl_return;
114ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinstatus = data.readString16(&in_token);
115ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyif (status != android::OK) { break; }
116ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = Ping(in_token, &_aidl_return);
117ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyif (status != android::OK) { break; }
11836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = reply->writeInt32(_aidl_return);
11936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyif (status != android::OK) { break; }
120ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
121ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
122ad3392747003a30928da6cd206e41f66398c2062Christopher Wileydefault:
123ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
124ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = android::BBinder::onTransact(code, data, reply, flags);
125ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
126ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
127ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
128ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyreturn status;
129ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
130ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
131b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
132ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
133ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}  // namespace android
134ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley)";
135ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
136b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveClientHeaderOutput[] =
137054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_
138054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_
139a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
140a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IBinder.h>
141a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IInterface.h>
142a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <utils/Errors.h>
143054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/IPingResponder.h>
144a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
145a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android {
146a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
147b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
1480c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1493bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wileyclass BpPingResponder : public android::BpInterface<IPingResponder> {
150a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinpublic:
151b23149dbc77744864b78edeb9f9cbb2f94f8c06dChristopher Wileyexplicit BpPingResponder(const android::sp<android::IBinder>& impl);
152f094d58e623418bffa53fa82e0ef159daee8801bChristopher Wileyvirtual ~BpPingResponder() = default;
153ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::status_t Ping(android::String16 token, int32_t* _aidl_return) override;
154a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin};  // class BpPingResponder
155a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
156b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
1570c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
158a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
159a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
160054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_)";
161a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
162b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveInterfaceHeaderOutput[] =
163054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_
164054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_
1653bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley
1663bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley#include <binder/IBinder.h>
1670c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley#include <binder/IInterface.h>
168ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin#include <cstdint>
169ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin#include <utils/String16.h>
1700c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1710c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace android {
1720c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
173b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
1740c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1753bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wileyclass IPingResponder : public android::IInterface {
1760c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileypublic:
1770c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyDECLARE_META_INTERFACE(PingResponder);
178ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinvirtual android::status_t Ping(android::String16 token, int32_t* _aidl_return) = 0;
1790c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyenum Call {
1800c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  PING = android::IBinder::FIRST_CALL_TRANSACTION + 0,
1813bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley};
1820c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};  // class IPingResponder
1830c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
184b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
1850c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1860c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}  // namespace android
1873bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley
188054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_)";
1890c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
190b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveInterfaceSourceOutput[] =
191054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/IPingResponder.h>
192054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/BpPingResponder.h>
1931dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
1941dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace android {
1951dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
196b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
1971dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
198054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyIMPLEMENT_META_INTERFACE(PingResponder, "android.os.IPingResponder");
1991dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
200b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
2011dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
2021dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}  // namespace android
2031dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley)";
2041dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
205b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst string kComplexTypeInterfaceAIDL =
206b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(package android.os;
207b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlininterface IComplexTypeInterface {
208b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  int Send(in int[] token, out boolean[] item);
2090dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  oneway void Piff(int times);
210b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin})";
211b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
212b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientHeaderOutput[] =
213b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
214b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
215b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
216b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
217b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
218b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <utils/Errors.h>
219b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
220b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
221b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
222b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
223b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
224b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
225b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BpComplexTypeInterface : public android::BpInterface<IComplexTypeInterface> {
226b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
227b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinexplicit BpComplexTypeInterface(const android::sp<android::IBinder>& impl);
228b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual ~BpComplexTypeInterface() = default;
229b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) override;
2300dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t Piff(int32_t times) override;
231b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BpComplexTypeInterface
232b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
233b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
234b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
235b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
236b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
237b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_)";
238b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
239b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientSourceOutput[] =
240b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BpComplexTypeInterface.h>
241b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
242b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
243b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
244b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
245b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
246b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
247b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinBpComplexTypeInterface::BpComplexTypeInterface(const android::sp<android::IBinder>& impl)
248b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin    : BpInterface<IPingResponder>(impl){
249b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
250b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
251b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BpComplexTypeInterface::Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) {
252b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel data;
253b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel reply;
254b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
255b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = data.writeInt32Vector(token);
256b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { return status; }
257b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::SEND, data, &reply);
258b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { return status; }
259b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply.readInt32(_aidl_return);
260b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { return status; }
261b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply.readBoolVector(item);
262b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { return status; }
263b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
264b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
265b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
2660dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t BpComplexTypeInterface::Piff(int32_t times) {
2670dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::Parcel data;
2680dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t status;
2690dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.writeInt32(times);
2700dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinif (status != android::OK) { return status; }
2710dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::PIFF, data, &reply, android::IBinder::FLAG_ONEWAY);
2720dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinif (status != android::OK) { return status; }
2730dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinreturn status;
2740dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
2750dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin
276b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
277b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
278b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
279b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
280b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
281b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerHeaderOutput[] =
282b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
283b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
284b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
285b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
286b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
287b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
288b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
289b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
290b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
291b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
292b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BnComplexTypeInterface : public android::BnInterface<IComplexTypeInterface> {
293b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
294b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
295b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BnComplexTypeInterface
296b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
297b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
298b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
299b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
300b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
301b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_)";
302b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
303b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerSourceOutput[] =
304b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BnComplexTypeInterface.h>
305b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
306b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
307b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
308b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
309b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
310b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
311b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BnComplexTypeInterface::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
312b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
313b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinswitch (code) {
314b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlincase Call::SEND:
315b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
316b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstd::vector<int32_t> in_token;
317b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstd::vector<bool> out_item;
318b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinint32_t _aidl_return;
319b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = data.readInt32Vector(&in_token);
320b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { break; }
321b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = Send(in_token, &out_item, &_aidl_return);
322b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { break; }
323b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply->writeInt32(_aidl_return);
324b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { break; }
325b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply->writeBoolVector(out_item);
326b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { break; }
327b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
328b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
3290dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlincase Call::PIFF:
3300dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin{
3310dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinint32_t in_times;
3320dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.readInt32(&in_times);
3330dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinif (status != android::OK) { break; }
3340dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = Piff(in_times);
3350dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinif (status != android::OK) { break; }
3360dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
3370dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinbreak;
338b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlindefault:
339b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
340b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = android::BBinder::onTransact(code, data, reply, flags);
341b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
342b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
343b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
344b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
345b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
346b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
347b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
348b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
349b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
350b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
351b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
352b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceHeaderOutput[] =
353b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
354b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
355b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
356b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
357b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
358b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <cstdint>
359b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <vector>
360b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
361b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
362b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
363b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
364b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
365b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass IComplexTypeInterface : public android::IInterface {
366b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
367b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinDECLARE_META_INTERFACE(ComplexTypeInterface);
368b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual android::status_t Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) = 0;
3690dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinvirtual android::status_t Piff(int32_t times) = 0;
370b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinenum Call {
371b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  SEND = android::IBinder::FIRST_CALL_TRANSACTION + 0,
3720dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  PIFF = android::IBinder::FIRST_CALL_TRANSACTION + 1,
373b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
374b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class IComplexTypeInterface
375b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
376b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
377b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
378b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
379b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
380b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_)";
381b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
382b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceSourceOutput[] =
383b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/IComplexTypeInterface.h>
384b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/BpComplexTypeInterface.h>
385b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
386b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
387b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
388b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
389b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
390b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinIMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface");
391b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
392b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
393b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
394b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
395b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
396b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
397a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace
398a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
399b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ASTTest : public ::testing::Test {
4000c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected:
401b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  virtual const string& FilePath() = 0;
402b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  virtual const string& FileContents() = 0;
403b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
40490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> Parse() {
40590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    FakeIoDelegate io_delegate;
406b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin    io_delegate.SetFileContents(FilePath(), FileContents());
40790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
40890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    cpp::TypeNamespace types;
40990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    unique_ptr<AidlInterface> ret;
41090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    std::vector<std::unique_ptr<AidlImport>> imports;
41190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    int err = ::android::aidl::internals::load_and_validate_aidl(
41290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no preprocessed files
41390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no import paths
414b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin        FilePath(),
41590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        io_delegate,
41690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &types,
41790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &ret,
41890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &imports);
419a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4202cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    if (err)
4212cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin      return nullptr;
422a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4232cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    return ret;
42490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
425a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4260c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  void Compare(Document* doc, const char* expected) {
4270c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    string output;
4280c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    unique_ptr<CodeWriter> cw = GetStringWriter(&output);
429a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4300c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    doc->Write(cw.get());
431a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
43280ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    if (expected == output) {
43380ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin      return; // Success
43480ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    }
43580ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin
43680ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    test::PrintDiff(expected, output);
43780ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    FAIL() << "Document contents did not match expected contents";
4380c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  }
4390c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};
440a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
441b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass PrimitiveInterfaceASTTest : public ASTTest {
442b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin protected:
443b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string fp_ = "android/os/IPingResponder.aidl";
444b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FilePath() override { return fp_; }
445b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FileContents() override { return kPrimitiveInterfaceAIDL; }
446b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
447b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
448b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesClientHeader) {
449b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
450b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
451b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
452b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface);
453b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveClientHeaderOutput);
454b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
455b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
456b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesClientSource) {
457b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
458b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
459b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
460b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildClientSource(types, *interface);
461b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveClientSourceOutput);
462b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
463b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
464b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesServerHeader) {
465b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
466b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
467b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
468b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildServerHeader(types, *interface);
469b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveServerHeaderOutput);
470b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
471b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
472b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesServerSource) {
473b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
474b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
475b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
476b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildServerSource(types, *interface);
477b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveServerSourceOutput);
478b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
479b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
480b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesInterfaceHeader) {
481b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
482b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
483b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
484b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface);
485b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveInterfaceHeaderOutput);
486b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
487b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
488b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesInterfaceSource) {
489b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
490b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
491b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
492b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface);
493b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveInterfaceSourceOutput);
494b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
495b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
496b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ComplexTypeInterfaceASTTest : public ASTTest {
497b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin protected:
498b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string fp_ = "android/os/IComplexTypeInterface.aidl";
499b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FilePath() override { return fp_; }
500b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FileContents() override { return kComplexTypeInterfaceAIDL; }
501b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
502b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
503b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
50490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5050c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
5060c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
5070c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface);
508b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
5090c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}
5100c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
511b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
51290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
51336570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  ASSERT_NE(interface, nullptr);
51436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  TypeNamespace types;
51536570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  unique_ptr<Document> doc = internals::BuildClientSource(types, *interface);
516b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
51736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
51836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
519b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
52090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
521fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  ASSERT_NE(interface, nullptr);
522fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  TypeNamespace types;
523fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  unique_ptr<Document> doc = internals::BuildServerHeader(types, *interface);
524b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
525fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}
526fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
527b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
52890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
529ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  ASSERT_NE(interface, nullptr);
530ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  TypeNamespace types;
531ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  unique_ptr<Document> doc = internals::BuildServerSource(types, *interface);
532b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
533ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
534ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
535b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
53690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5370c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
5380c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
5390c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface);
540b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
541a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}
542a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
543b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
54490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5451dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  ASSERT_NE(interface, nullptr);
5461dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  TypeNamespace types;
5471dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface);
548b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
5491dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}
5501dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
551f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace cpp
552a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace aidl
553a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
554