generate_cpp_unittest.cpp revision 8993cb5f297f9e329470d75f02a7b3e3a4bc64a5
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;
638993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
648993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif (((status) != (android::OK))) {
658993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyreturn status;
668993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
67ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinstatus = data.writeString16(token);
680eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
690eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
700eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
7136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = remote()->transact(IPingResponder::PING, data, &reply);
720eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
730eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
740eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
752aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (reply.readExceptionCode()) {
762aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = android::FAILED_TRANSACTION;
772aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyreturn status;
782aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
7936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = reply.readInt32(_aidl_return);
800eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
810eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
820eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
8336570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileyreturn status;
8436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
8536570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
86b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
8736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
8836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}  // namespace android
8936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley)";
9036570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
91b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveServerHeaderOutput[] =
92054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_
93054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_
94fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
95fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley#include <binder/IInterface.h>
96054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/IPingResponder.h>
97fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
98fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileynamespace android {
99fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
100b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
101fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
102fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileyclass BnPingResponder : public android::BnInterface<IPingResponder> {
103fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileypublic:
104fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wileyandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
105fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley};  // class BnPingResponder
106fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
107b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
108fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
109fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}  // namespace android
110fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
111054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_BN_PING_RESPONDER_H_)";
112fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
113b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveServerSourceOutput[] =
114054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/BnPingResponder.h>
115ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley#include <binder/Parcel.h>
116ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
117ad3392747003a30928da6cd206e41f66398c2062Christopher Wileynamespace android {
118ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
119b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
120ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
121ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyandroid::status_t BnPingResponder::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
12205f4f890cad7b2a510e8e1f80fa5884db1bd8383Christopher Wileyandroid::status_t status;
123ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyswitch (code) {
124ad3392747003a30928da6cd206e41f66398c2062Christopher Wileycase Call::PING:
125ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
126ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::String16 in_token;
127ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyint32_t _aidl_return;
1288993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif ((!data.checkInterface(this))) {
1298993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = android::BAD_TYPE;
1308993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileybreak;
1318993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
132ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinstatus = data.readString16(&in_token);
1330eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1340eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
1350eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
136ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = Ping(in_token, &_aidl_return);
1370eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1380eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
1390eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
1402aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = reply->writeNoException();
1412aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (((status) != (android::OK))) {
1422aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileybreak;
1432aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
14436570f4779a413ebef9302d1563fd92917ec2e42Christopher Wileystatus = reply->writeInt32(_aidl_return);
1450eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
1460eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
1470eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
148ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
149ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
150ad3392747003a30928da6cd206e41f66398c2062Christopher Wileydefault:
151ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
152ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = android::BBinder::onTransact(code, data, reply, flags);
153ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
154ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
155ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
156ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyreturn status;
157ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
158ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
159b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
160ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
161ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}  // namespace android
162ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley)";
163ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
164b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveClientHeaderOutput[] =
165054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_
166054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_
167a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
168a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IBinder.h>
169a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IInterface.h>
170a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <utils/Errors.h>
171054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/IPingResponder.h>
172a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
173a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android {
174a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
175b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
1760c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1773bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wileyclass BpPingResponder : public android::BpInterface<IPingResponder> {
178a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinpublic:
179b23149dbc77744864b78edeb9f9cbb2f94f8c06dChristopher Wileyexplicit BpPingResponder(const android::sp<android::IBinder>& impl);
180f094d58e623418bffa53fa82e0ef159daee8801bChristopher Wileyvirtual ~BpPingResponder() = default;
181ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinandroid::status_t Ping(android::String16 token, int32_t* _aidl_return) override;
182a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin};  // class BpPingResponder
183a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
184b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
1850c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
186a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
187a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
188054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_BP_PING_RESPONDER_H_)";
189a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
190b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveInterfaceHeaderOutput[] =
191054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_
192054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#define AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_
1933bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley
1943bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley#include <binder/IBinder.h>
1950c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley#include <binder/IInterface.h>
196ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin#include <cstdint>
197ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlin#include <utils/String16.h>
1980c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1990c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace android {
2000c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
201b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
2020c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
2033bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wileyclass IPingResponder : public android::IInterface {
2040c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileypublic:
2050c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyDECLARE_META_INTERFACE(PingResponder);
206ce776cfc9560ee541464a23fb64ecd74e442b96fCasey Dahlinvirtual android::status_t Ping(android::String16 token, int32_t* _aidl_return) = 0;
2070c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyenum Call {
2080c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  PING = android::IBinder::FIRST_CALL_TRANSACTION + 0,
2093bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley};
2100c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};  // class IPingResponder
2110c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
212b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
2130c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
2140c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}  // namespace android
2153bb6bc1d481459cc9ec93b764d245040b78e6507Christopher Wiley
216054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#endif  // AIDL_GENERATED_ANDROID_OS_I_PING_RESPONDER_H_)";
2170c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
218b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedPrimitiveInterfaceSourceOutput[] =
219054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyR"(#include <android/os/IPingResponder.h>
220054afbd3037addb4f2e245ecbc36f31d3040f877Christopher Wiley#include <android/os/BpPingResponder.h>
2211dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
2221dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace android {
2231dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
224b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wileynamespace os {
2251dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
226054afbd3037addb4f2e245ecbc36f31d3040f877Christopher WileyIMPLEMENT_META_INTERFACE(PingResponder, "android.os.IPingResponder");
2271dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
228b656a3b1954bbe4b548a3c11274c833bbca35935Christopher Wiley}  // namespace os
2291dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
2301dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}  // namespace android
2311dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley)";
2321dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
233b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst string kComplexTypeInterfaceAIDL =
234b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(package android.os;
235b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlininterface IComplexTypeInterface {
236b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  int Send(in int[] token, out boolean[] item);
2370dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  oneway void Piff(int times);
238b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin})";
239b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
240b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientHeaderOutput[] =
241b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
242b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_
243b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
244b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
245b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
246b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <utils/Errors.h>
247b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
248b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
249b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
250b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
251b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
252b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
253b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BpComplexTypeInterface : public android::BpInterface<IComplexTypeInterface> {
254b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
255b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinexplicit BpComplexTypeInterface(const android::sp<android::IBinder>& impl);
256b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual ~BpComplexTypeInterface() = default;
257b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) override;
2580dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t Piff(int32_t times) override;
259b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BpComplexTypeInterface
260b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
261b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
262b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
263b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
264b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
265b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BP_COMPLEX_TYPE_INTERFACE_H_)";
266b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
267b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeClientSourceOutput[] =
268b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BpComplexTypeInterface.h>
269b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
270b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
271b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
272b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
273b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
274b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
275b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinBpComplexTypeInterface::BpComplexTypeInterface(const android::sp<android::IBinder>& impl)
276b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin    : BpInterface<IPingResponder>(impl){
277b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
278b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
279b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BpComplexTypeInterface::Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) {
280b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel data;
281b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::Parcel reply;
282b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
2838993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
2848993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif (((status) != (android::OK))) {
2858993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyreturn status;
2868993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
287b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = data.writeInt32Vector(token);
2880eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2890eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
2900eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
291b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::SEND, data, &reply);
2920eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
2930eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
2940eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
2952aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (reply.readExceptionCode()) {
2962aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = android::FAILED_TRANSACTION;
2972aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyreturn status;
2982aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
299b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply.readInt32(_aidl_return);
3000eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3010eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
3020eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
303b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply.readBoolVector(item);
3040eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3050eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
3060eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
307b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
308b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
309b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
3100dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t BpComplexTypeInterface::Piff(int32_t times) {
3110dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::Parcel data;
3120dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinandroid::status_t status;
3138993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = data.writeInterfaceToken(getInterfaceDescriptor());
3148993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif (((status) != (android::OK))) {
3158993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyreturn status;
3168993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
3170dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.writeInt32(times);
3180eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3190eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
3200eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
3210dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = remote()->transact(IComplexTypeInterface::PIFF, data, &reply, android::IBinder::FLAG_ONEWAY);
3220eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3230eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyreturn status;
3240eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
3252aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (reply.readExceptionCode()) {
3262aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = android::FAILED_TRANSACTION;
3272aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyreturn status;
3282aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
3290dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinreturn status;
3300dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
3310dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin
332b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
333b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
334b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
335b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
336b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
337b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerHeaderOutput[] =
338b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
339b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_
340b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
341b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
342b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/IComplexTypeInterface.h>
343b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
344b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
345b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
346b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
347b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
348b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass BnComplexTypeInterface : public android::BnInterface<IComplexTypeInterface> {
349b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
350b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags = 0) override;
351b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class BnComplexTypeInterface
352b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
353b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
354b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
355b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
356b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
357b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_BN_COMPLEX_TYPE_INTERFACE_H_)";
358b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
359b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeServerSourceOutput[] =
360b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/BnComplexTypeInterface.h>
361b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/Parcel.h>
362b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
363b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
364b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
365b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
366b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
367b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t BnComplexTypeInterface::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
368b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinandroid::status_t status;
369b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinswitch (code) {
370b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlincase Call::SEND:
371b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
372b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstd::vector<int32_t> in_token;
373b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstd::vector<bool> out_item;
374b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinint32_t _aidl_return;
3758993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif ((!data.checkInterface(this))) {
3768993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = android::BAD_TYPE;
3778993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileybreak;
3788993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
379b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = data.readInt32Vector(&in_token);
3800eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3810eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3820eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
383b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = Send(in_token, &out_item, &_aidl_return);
3840eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3850eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3860eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
3872aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = reply->writeNoException();
3882aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (((status) != (android::OK))) {
3892aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileybreak;
3902aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
391b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply->writeInt32(_aidl_return);
3920eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3930eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3940eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
395b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = reply->writeBoolVector(out_item);
3960eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
3970eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
3980eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
399b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
400b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
4010dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlincase Call::PIFF:
4020dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin{
4030dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinint32_t in_times;
4048993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileyif ((!data.checkInterface(this))) {
4058993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileystatus = android::BAD_TYPE;
4068993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wileybreak;
4078993cb5f297f9e329470d75f02a7b3e3a4bc64a5Christopher Wiley}
4080dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = data.readInt32(&in_times);
4090eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
4100eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
4110eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
4120dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinstatus = Piff(in_times);
4130eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileyif (((status) != (android::OK))) {
4140eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wileybreak;
4150eb903eff2376941ad7e947bd5d3a32e15d89f69Christopher Wiley}
4162aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileystatus = reply->writeNoException();
4172aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileyif (((status) != (android::OK))) {
4182aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wileybreak;
4192aaeda8b140de83f2cb2d51405ea27ccf1eefc13Christopher Wiley}
4200dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin}
4210dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinbreak;
422b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlindefault:
423b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin{
424b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinstatus = android::BBinder::onTransact(code, data, reply, flags);
425b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
426b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinbreak;
427b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
428b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinreturn status;
429b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
430b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
431b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
432b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
433b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
434b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
435b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
436b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceHeaderOutput[] =
437b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#ifndef AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
438b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#define AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_
439b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
440b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IBinder.h>
441b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <binder/IInterface.h>
442b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <cstdint>
443b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <vector>
444b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
445b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
446b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
447b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
448b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
449b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass IComplexTypeInterface : public android::IInterface {
450b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinpublic:
451b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinDECLARE_META_INTERFACE(ComplexTypeInterface);
452b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinvirtual android::status_t Send(const std::vector<int32_t>& token, std::vector<bool>* item, int32_t* _aidl_return) = 0;
4530dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlinvirtual android::status_t Piff(int32_t times) = 0;
454b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinenum Call {
455b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  SEND = android::IBinder::FIRST_CALL_TRANSACTION + 0,
4560dd08af9e6145fb746e96e7ecc5e4c2096de3a6eCasey Dahlin  PIFF = android::IBinder::FIRST_CALL_TRANSACTION + 1,
457b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
458b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};  // class IComplexTypeInterface
459b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
460b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
461b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
462b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
463b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
464b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#endif  // AIDL_GENERATED_ANDROID_OS_I_COMPLEX_TYPE_INTERFACE_H_)";
465b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
466b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinconst char kExpectedComplexTypeInterfaceSourceOutput[] =
467b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinR"(#include <android/os/IComplexTypeInterface.h>
468b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin#include <android/os/BpComplexTypeInterface.h>
469b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
470b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace android {
471b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
472b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinnamespace os {
473b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
474b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinIMPLEMENT_META_INTERFACE(ComplexTypeInterface, "android.os.IComplexTypeInterface");
475b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
476b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace os
477b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
478b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}  // namespace android
479b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin)";
480b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
481a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace
482a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
483b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ASTTest : public ::testing::Test {
4840c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected:
485b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  virtual const string& FilePath() = 0;
486b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  virtual const string& FileContents() = 0;
487b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
48890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> Parse() {
48990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    FakeIoDelegate io_delegate;
490b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin    io_delegate.SetFileContents(FilePath(), FileContents());
49190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
49290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    cpp::TypeNamespace types;
49390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    unique_ptr<AidlInterface> ret;
49490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    std::vector<std::unique_ptr<AidlImport>> imports;
49590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    int err = ::android::aidl::internals::load_and_validate_aidl(
49690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no preprocessed files
49790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        {},  // no import paths
498b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin        FilePath(),
49990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        io_delegate,
50090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &types,
50190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &ret,
50290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &imports);
503a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5042cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    if (err)
5052cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin      return nullptr;
506a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5072cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    return ret;
50890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
509a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5100c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  void Compare(Document* doc, const char* expected) {
5110c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    string output;
5120c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    unique_ptr<CodeWriter> cw = GetStringWriter(&output);
513a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
5140c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    doc->Write(cw.get());
515a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
51680ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    if (expected == output) {
51780ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin      return; // Success
51880ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    }
51980ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin
52080ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    test::PrintDiff(expected, output);
52180ada3d405cbf76797e007d5fc265d17315aa05cCasey Dahlin    FAIL() << "Document contents did not match expected contents";
5220c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  }
5230c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};
524a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
525b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass PrimitiveInterfaceASTTest : public ASTTest {
526b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin protected:
527b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string fp_ = "android/os/IPingResponder.aidl";
528b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FilePath() override { return fp_; }
529b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FileContents() override { return kPrimitiveInterfaceAIDL; }
530b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
531b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
532b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesClientHeader) {
533b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
534b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
535b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
536b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface);
537b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveClientHeaderOutput);
538b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
539b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
540b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesClientSource) {
541b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
542b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
543b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
544b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildClientSource(types, *interface);
545b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveClientSourceOutput);
546b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
547b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
548b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesServerHeader) {
549b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
550b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
551b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
552b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildServerHeader(types, *interface);
553b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveServerHeaderOutput);
554b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
555b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
556b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesServerSource) {
557b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
558b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
559b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
560b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildServerSource(types, *interface);
561b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveServerSourceOutput);
562b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
563b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
564b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesInterfaceHeader) {
565b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
566b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
567b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
568b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface);
569b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveInterfaceHeaderOutput);
570b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
571b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
572b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(PrimitiveInterfaceASTTest, GeneratesInterfaceSource) {
573b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<AidlInterface> interface = Parse();
574b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  ASSERT_NE(interface, nullptr);
575b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  TypeNamespace types;
576b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface);
577b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedPrimitiveInterfaceSourceOutput);
578b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin}
579b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
580b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlinclass ComplexTypeInterfaceASTTest : public ASTTest {
581b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin protected:
582b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string fp_ = "android/os/IComplexTypeInterface.aidl";
583b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FilePath() override { return fp_; }
584b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  const string& FileContents() override { return kComplexTypeInterfaceAIDL; }
585b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin};
586b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin
587b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientHeader) {
58890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
5890c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
5900c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
5910c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface);
592b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientHeaderOutput);
5930c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}
5940c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
595b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesClientSource) {
59690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
59736570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  ASSERT_NE(interface, nullptr);
59836570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  TypeNamespace types;
59936570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley  unique_ptr<Document> doc = internals::BuildClientSource(types, *interface);
600b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeClientSourceOutput);
60136570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley}
60236570f4779a413ebef9302d1563fd92917ec2e42Christopher Wiley
603b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerHeader) {
60490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
605fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  ASSERT_NE(interface, nullptr);
606fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  TypeNamespace types;
607fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley  unique_ptr<Document> doc = internals::BuildServerHeader(types, *interface);
608b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerHeaderOutput);
609fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley}
610fd51d60f486f1ad514e6f24744ebffab7a3d89bdChristopher Wiley
611b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesServerSource) {
61290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
613ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  ASSERT_NE(interface, nullptr);
614ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  TypeNamespace types;
615ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  unique_ptr<Document> doc = internals::BuildServerSource(types, *interface);
616b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeServerSourceOutput);
617ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
618ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
619b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceHeader) {
62090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
6210c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
6220c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
6230c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface);
624b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceHeaderOutput);
625a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}
626a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
627b0966619850093e117104dc34d8a6ae4c56ea3ffCasey DahlinTEST_F(ComplexTypeInterfaceASTTest, GeneratesInterfaceSource) {
62890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> interface = Parse();
6291dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  ASSERT_NE(interface, nullptr);
6301dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  TypeNamespace types;
6311dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface);
632b0966619850093e117104dc34d8a6ae4c56ea3ffCasey Dahlin  Compare(doc.get(), kExpectedComplexTypeInterfaceSourceOutput);
6331dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}
6341dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
635f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace cpp
636a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace aidl
637a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
638