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