generate_cpp_unittest.cpp revision b0966619850093e117104dc34d8a6ae4c56ea3ff
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"
27e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wiley#include "type_cpp.h"
28a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
294a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing android::aidl::test::FakeIoDelegate;
30a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::string;
31a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::unique_ptr;
32a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
33a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android {
34a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace aidl {
35f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileynamespace cpp {
36a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace {
37a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
38b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst string kPrimitiveInterfaceAIDL =
39054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(
40054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wileypackage android.os;
41054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley
42054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wileyinterface IPingResponder {
43ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin  int Ping(String token);
44a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin})";
45a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
46b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveClientSourceOutput[] =
47054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/BpPingResponder.h>
4836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley#include <binder/Parcel.h>
4936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
5036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileynamespace android {
5136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
52b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
5336570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
5436570f4779a413ebef9302d1563fd92917ec2e42Christopher WileyBpPingResponder::BpPingResponder(const android::sp<android::IBinder>& impl)
5536570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley    : BpInterface<IPingResponder>(impl){
5636570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
5736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
58ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::status_t BpPingResponder::Ping(android::String16 token, int32_t* _aidl_return) {
5936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyandroid::Parcel data;
6036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyandroid::Parcel reply;
6136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyandroid::status_t status;
62ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinstatus = data.writeString16(token);
6336570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyif (status != android::OK) { return status; }
6436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = remote()->transact(IPingResponder::PING, data, &reply);
6536570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyif (status != android::OK) { return status; }
6636570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = reply.readInt32(_aidl_return);
6736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyif (status != android::OK) { return status; }
6836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyreturn status;
6936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
7036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
71b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
7236570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
7336570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}  // namespace android
7436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley)";
7536570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
76b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveServerHeaderOutput[] =
77054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_
78054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_
79fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
80fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley#include <binder/IInterface.h>
81054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/IPingResponder.h>
82fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
83fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileynamespace android {
84fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
85b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
86fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
87fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileyclass BnPingResponder : public android::BnInterface<IPingResponder> {
88fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileypublic:
89fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileyandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
90fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley};  // class BnPingResponder
91fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
92b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
93fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
94fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}  // namespace android
95fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
96054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_)";
97fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
98b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveServerSourceOutput[] =
99054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/BnPingResponder.h>
100ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley#include <binder/Parcel.h>
101ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
102ad3392747003a30928da6cd206e41f66398c2062Christopher Wileynamespace android {
103ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
104b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
105ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
106ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyandroid::status_t BnPingResponder::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
10705f4f890cad7b2a510e8e1f80fa5884db1bd8383Christopher Wileyandroid::status_t status;
108ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyswitch (code) {
109ad3392747003a30928da6cd206e41f66398c2062Christopher Wileycase Call::PING:
110ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
111ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::String16 in_token;
112ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyint32_t _aidl_return;
113ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinstatus = data.readString16(&in_token);
114ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyif (status != android::OK) { break; }
115ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = Ping(in_token, &_aidl_return);
116ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyif (status != android::OK) { break; }
11736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = reply->writeInt32(_aidl_return);
11836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyif (status != android::OK) { break; }
119ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
120ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
121ad3392747003a30928da6cd206e41f66398c2062Christopher Wileydefault:
122ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
123ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = android::BBinder::onTransact(code, data, reply, flags);
124ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
125ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
126ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
127ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyreturn status;
128ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
129ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
130b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
131ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
132ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}  // namespace android
133ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley)";
134ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
135b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveClientHeaderOutput[] =
136054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_
137054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_
138a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
139a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IBinder.h>
140a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IInterface.h>
141a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <utils/Errors.h>
142054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/IPingResponder.h>
143a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
144a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android {
145a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
146b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
1470c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1483bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wileyclass BpPingResponder : public android::BpInterface<IPingResponder> {
149a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinpublic:
150b23149dbc77744864b78edeb9f9cbb2f94f8c06dChristopher Wileyexplicit BpPingResponder(const android::sp<android::IBinder>& impl);
151f094d58e623418bffa53fa82e0ef159daee8801bChristopher Wileyvirtual ~BpPingResponder() = default;
152ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::status_t Ping(android::String16 token, int32_t* _aidl_return) override;
153a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin};  // class BpPingResponder
154a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
155b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
1560c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
157a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
158a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
159054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_)";
160a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
161b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveInterfaceHeaderOutput[] =
162054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_
163054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_
1643bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley
1653bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley#include <binder/IBinder.h>
1660c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley#include <binder/IInterface.h>
167ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin#include <cstdint>
168ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin#include <utils/String16.h>
1690c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1700c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace android {
1710c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
172b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
1730c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1743bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wileyclass IPingResponder : public android::IInterface {
1750c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileypublic:
1760c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyDECLARE_META_INTERFACE(PingResponder);
177ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinvirtual android::status_t Ping(android::String16 token, int32_t* _aidl_return) = 0;
1780c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyenum Call {
1790c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  PING = android::IBinder::FIRST_CALL_TRANSACTION + 0,
1803bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley};
1810c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};  // class IPingResponder
1820c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
183b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
1840c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1850c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}  // namespace android
1863bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley
187054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_)";
1880c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
189b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveInterfaceSourceOutput[] =
190054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/IPingResponder.h>
191054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/BpPingResponder.h>
1921dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
1931dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace android {
1941dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
195b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
1961dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
197054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyIMPLEMENT_META_INTERFACE(PingResponder, "android.os.IPingResponder");
1981dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
199b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
2001dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
2011dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}  // namespace android
2021dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley)";
2031dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
204b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst string kComplexTypeInterfaceAIDL =
205b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(package android.os;
206b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlininterface IComplexTypeInterface {
207b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  int Send(in int[] token, out boolean[] item);
208b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin})";
209b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
210b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientHeaderOutput[] =
211b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
212b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
213b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
214b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
215b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
216b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <utils/Errors.h>
217b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
218b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
219b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
220b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
221b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
222b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
223b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BpComplexTypeInterface : public android::BpInterface<IComplexTypeInterface> {
224b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
225b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinexplicit BpComplexTypeInterface(const android::sp<android::IBinder>& impl);
226b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual ~BpComplexTypeInterface() = default;
227b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) override;
228b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BpComplexTypeInterface
229b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
230b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
231b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
232b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
233b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
234b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_)";
235b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
236b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientSourceOutput[] =
237b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BpComplexTypeInterface.h>
238b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
239b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
240b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
241b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
242b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
243b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
244b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinBpComplexTypeInterface::BpComplexTypeInterface(const android::sp<android::IBinder>& impl)
245b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin    : BpInterface<IPingResponder>(impl){
246b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
247b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
248b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BpComplexTypeInterface::Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) {
249b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel data;
250b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel reply;
251b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
252b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = data.writeInt32Vector(token);
253b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { return status; }
254b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::SEND, data, &reply);
255b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { return status; }
256b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply.readInt32(_aidl_return);
257b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { return status; }
258b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply.readBoolVector(item);
259b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { return status; }
260b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
261b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
262b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
263b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
264b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
265b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
266b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
267b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
268b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerHeaderOutput[] =
269b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
270b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
271b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
272b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
273b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
274b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
275b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
276b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
277b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
278b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
279b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BnComplexTypeInterface : public android::BnInterface<IComplexTypeInterface> {
280b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
281b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
282b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BnComplexTypeInterface
283b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
284b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
285b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
286b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
287b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
288b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_)";
289b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
290b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerSourceOutput[] =
291b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BnComplexTypeInterface.h>
292b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
293b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
294b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
295b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
296b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
297b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
298b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BnComplexTypeInterface::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
299b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
300b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinswitch (code) {
301b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlincase Call::SEND:
302b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
303b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstd::vector<int32_t> in_token;
304b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstd::vector<bool> out_item;
305b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinint32_t _aidl_return;
306b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = data.readInt32Vector(&in_token);
307b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { break; }
308b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = Send(in_token, &out_item, &_aidl_return);
309b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { break; }
310b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply->writeInt32(_aidl_return);
311b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { break; }
312b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply->writeBoolVector(out_item);
313b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinif (status != android::OK) { break; }
314b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
315b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
316b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlindefault:
317b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
318b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = android::BBinder::onTransact(code, data, reply, flags);
319b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
320b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
321b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
322b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
323b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
324b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
325b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
326b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
327b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
328b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
329b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
330b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceHeaderOutput[] =
331b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
332b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
333b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
334b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
335b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
336b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <cstdint>
337b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <vector>
338b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
339b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
340b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
341b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
342b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
343b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass IComplexTypeInterface : public android::IInterface {
344b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
345b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinDECLARE_META_INTERFACE(ComplexTypeInterface);
346b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual android::status_t Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) = 0;
347b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinenum Call {
348b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  SEND = android::IBinder::FIRST_CALL_TRANSACTION + 0,
349b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
350b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class IComplexTypeInterface
351b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
352b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
353b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
354b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
355b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
356b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_)";
357b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
358b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceSourceOutput[] =
359b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/IComplexTypeInterface.h>
360b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/BpComplexTypeInterface.h>
361b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
362b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
363b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
364b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
365b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
366b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinIMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface");
367b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
368b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
369b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
370b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
371b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
372b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
373a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace
374a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
375b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ASTTest : public ::testing::Test {
3760c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected:
377b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  virtual const string& FilePath() = 0;
378b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  virtual const string& FileContents() = 0;
379b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
38090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> Parse() {
38190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    FakeIoDelegate io_delegate;
382b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin    io_delegate.SetFileContents(FilePath(), FileContents());
38390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
38490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    cpp::TypeNamespace types;
38590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    unique_ptr<AidlInterface> ret;
38690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    std::vector<std::unique_ptr<AidlImport>> imports;
38790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    int err = ::android::aidl::internals::load_and_validate_aidl(
38890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no preprocessed files
38990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no import paths
390b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin        FilePath(),
39190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        io_delegate,
39290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &types,
39390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &ret,
39490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &imports);
395a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
3962cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    if (err)
3972cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin      return nullptr;
398a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
3992cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    return ret;
40090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
401a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4020c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  void Compare(Document* doc, const char* expected) {
4030c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    string output;
4040c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    unique_ptr<CodeWriter> cw = GetStringWriter(&output);
405a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4060c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    doc->Write(cw.get());
407a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
4080c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    EXPECT_EQ(expected, output);
4090c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  }
4100c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};
411a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
412b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass PrimitiveInterfaceASTTest : public ASTTest {
413b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin protected:
414b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string fp_ = "android/os/IPingResponder.aidl";
415b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FilePath() override { return fp_; }
416b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FileContents() override { return kPrimitiveInterfaceAIDL; }
417b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
418b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
419b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesClientHeader) {
420b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
421b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
422b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
423b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface);
424b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveClientHeaderOutput);
425b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
426b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
427b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesClientSource) {
428b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
429b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
430b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
431b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildClientSource(types, *interface);
432b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveClientSourceOutput);
433b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
434b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
435b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesServerHeader) {
436b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
437b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
438b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
439b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildServerHeader(types, *interface);
440b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveServerHeaderOutput);
441b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
442b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
443b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesServerSource) {
444b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
445b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
446b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
447b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildServerSource(types, *interface);
448b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveServerSourceOutput);
449b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
450b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
451b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesInterfaceHeader) {
452b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
453b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
454b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
455b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface);
456b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveInterfaceHeaderOutput);
457b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
458b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
459b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesInterfaceSource) {
460b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
461b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
462b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
463b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface);
464b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveInterfaceSourceOutput);
465b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
466b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
467b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ComplexTypeInterfaceASTTest : public ASTTest {
468b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin protected:
469b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string fp_ = "android/os/IComplexTypeInterface.aidl";
470b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FilePath() override { return fp_; }
471b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FileContents() override { return kComplexTypeInterfaceAIDL; }
472b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
473b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
474b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
47590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
4760c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
4770c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
4780c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface);
479b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
4800c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}
4810c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
482b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
48390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
48436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  ASSERT_NE(interface, nullptr);
48536570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  TypeNamespace types;
48636570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  unique_ptr<Document> doc = internals::BuildClientSource(types, *interface);
487b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
48836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
48936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
490b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
49190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
492fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  ASSERT_NE(interface, nullptr);
493fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  TypeNamespace types;
494fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  unique_ptr<Document> doc = internals::BuildServerHeader(types, *interface);
495b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
496fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}
497fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
498b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
49990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
500ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  ASSERT_NE(interface, nullptr);
501ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  TypeNamespace types;
502ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  unique_ptr<Document> doc = internals::BuildServerSource(types, *interface);
503b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
504ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
505ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
506b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
50790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5080c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
5090c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
5100c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface);
511b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
512a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}
513a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
514b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
51590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5161dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  ASSERT_NE(interface, nullptr);
5171dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  TypeNamespace types;
5181dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface);
519b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
5201dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}
5211dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
522f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace cpp
523a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace aidl
524a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
525