generate_cpp_unittest.cpp revision ad3392747003a30928da6cd206e41f66398c2062
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
38a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinconst char kTrivialInterfaceAIDL[] =
39a834dd4650b3196893440ee49c7ff6b303b45a92Casey DahlinR"(interface IPingResponder {
40a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin  int Ping(int token);
41a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin})";
42a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
43ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyconst char kExpectedTrivialServerSourceOutput[] =
44ad3392747003a30928da6cd206e41f66398c2062Christopher WileyR"(#include <BnPingResponder.h>
45ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley#include <binder/Parcel.h>
46ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
47ad3392747003a30928da6cd206e41f66398c2062Christopher Wileynamespace android {
48ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
49ad3392747003a30928da6cd206e41f66398c2062Christopher Wileynamespace generated {
50ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
51ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyandroid::status_t BnPingResponder::onTransact(uint32_t code, const android::Parcel& data, android::Parcel* reply, uint32_t flags) {
52ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyswitch (code) {
53ad3392747003a30928da6cd206e41f66398c2062Christopher Wileycase Call::PING:
54ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
55ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyint32_t in_token;
56ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyint32_t _aidl_return;
57ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyandroid::status_t status;
58ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = data.readInt32(&in_token);
59ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyif (status != android::OK) { break; }
60ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = Ping(in_token, &_aidl_return);
61ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyif (status != android::OK) { break; }
62ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
63ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
64ad3392747003a30928da6cd206e41f66398c2062Christopher Wileydefault:
65ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley{
66ad3392747003a30928da6cd206e41f66398c2062Christopher Wileystatus = android::BBinder::onTransact(code, data, reply, flags);
67ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
68ad3392747003a30928da6cd206e41f66398c2062Christopher Wileybreak;
69ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
70ad3392747003a30928da6cd206e41f66398c2062Christopher Wileyreturn status;
71ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
72ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
73ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}  // namespace generated
74ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
75ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}  // namespace android
76ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley)";
77ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
78a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinconst char kExpectedTrivialClientHeaderOutput[] =
79a834dd4650b3196893440ee49c7ff6b303b45a92Casey DahlinR"(#ifndef BpPingResponder_H
80a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#define BpPingResponder_H
81a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
82a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IBinder.h>
83a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IInterface.h>
84a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <utils/Errors.h>
85a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <IPingResponder.h>
86a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
87a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android {
88a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
890c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace generated {
900c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
91a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinclass BpPingResponder : public public android::BpInterface<IPingResponder> {
92a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinpublic:
93a834dd4650b3196893440ee49c7ff6b303b45a92Casey DahlinBpPingResponder();
94a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin~BpPingResponder();
950c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyandroid::status_t Ping(int32_t token, int32_t* _aidl_return) override;
96a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin};  // class BpPingResponder
97a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
980c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}  // namespace generated
990c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
100a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
101a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
102a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#endif  // BpPingResponder_H)";
103a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1040c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyconst char kExpectedTrivialInterfaceHeaderOutput[] =
1050c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyR"(#include <binder/IBinder.h>
1060c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley#include <binder/IInterface.h>
1070c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1080c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace android {
1090c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1100c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace generated {
1110c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1120c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyclass IPingResponder : public public android::IInterface {
1130c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileypublic:
1140c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyDECLARE_META_INTERFACE(PingResponder);
1150c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyvirtual android::status_t Ping(int32_t token, int32_t* _aidl_return) = 0;
1160c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyenum Call {
1170c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  PING = android::IBinder::FIRST_CALL_TRANSACTION + 0,
1180c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}
1190c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};  // class IPingResponder
1200c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1210c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}  // namespace generated
1220c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1230c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}  // namespace android
1240c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley)";
1250c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
1261dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileyconst char kExpectedTrivialInterfaceSourceOutput[] =
1271dd458d3e3647823acb9554f8ae17631d597a1ecChristopher WileyR"(#include <IPingResponder.h>
1281dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley#include <BpPingResponder.h>
1291dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
1301dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace android {
1311dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
1321dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace generated {
1331dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
1341dd458d3e3647823acb9554f8ae17631d597a1ecChristopher WileyIMPLEMENT_META_INTERFACE(PingResponder, "IPingResponder");
1351dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
1361dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}  // namespace generated
1371dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
1381dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}  // namespace android
1391dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley)";
1401dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
141a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace
142a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1430c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyclass TrivialInterfaceASTTest : public ::testing::Test {
1440c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected:
1451ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* Parse() {
146a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1474a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  FakeIoDelegate io_delegate;
1484a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  io_delegate.SetFileContents("IPingResponder.aidl", kTrivialInterfaceAIDL);
1494a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley
1504a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  cpp::TypeNamespace types;
1511ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* ret = nullptr;
1520edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin  std::vector<std::unique_ptr<AidlImport>> imports;
1534a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  int err = ::android::aidl::internals::load_and_validate_aidl(
1544a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley      {},  // no preprocessed files
1554a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley      {},  // no import paths
1564a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley      "IPingResponder.aidl",
1574a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley      io_delegate,
1584a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley      &types,
1594a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley      &ret,
1604a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley      &imports);
161a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1622cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    if (err)
1632cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin      return nullptr;
164a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1652cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin    return ret;
1660c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley   }
167a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1680c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  void Compare(Document* doc, const char* expected) {
1690c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    string output;
1700c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    unique_ptr<CodeWriter> cw = GetStringWriter(&output);
171a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1720c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    doc->Write(cw.get());
173a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1740c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley    EXPECT_EQ(expected, output);
1750c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  }
1760c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley};
177a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1780c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesClientHeader) {
1791ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* interface = Parse();
1800c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
1810c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
1820c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface);
1830c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  Compare(doc.get(), kExpectedTrivialClientHeaderOutput);
1840c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}
1850c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley
186ad3392747003a30928da6cd206e41f66398c2062Christopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesServerSource) {
187ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  AidlInterface* interface = Parse();
188ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  ASSERT_NE(interface, nullptr);
189ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  TypeNamespace types;
190ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  unique_ptr<Document> doc = internals::BuildServerSource(types, *interface);
191ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley  Compare(doc.get(), kExpectedTrivialServerSourceOutput);
192ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley}
193ad3392747003a30928da6cd206e41f66398c2062Christopher Wiley
1940c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesInterfaceHeader) {
1951ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* interface = Parse();
1960c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  ASSERT_NE(interface, nullptr);
1970c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  TypeNamespace types;
1980c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface);
1990c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley  Compare(doc.get(), kExpectedTrivialInterfaceHeaderOutput);
200a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}
201a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
2021dd458d3e3647823acb9554f8ae17631d597a1ecChristopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesInterfaceSource) {
2031ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* interface = Parse();
2041dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  ASSERT_NE(interface, nullptr);
2051dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  TypeNamespace types;
2061dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface);
2071dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley  Compare(doc.get(), kExpectedTrivialInterfaceSourceOutput);
2081dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley}
2091dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley
210f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley}  // namespace cpp
211a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace aidl
212a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}  // namespace android
213