generate_cpp_unittest.cpp revision 2cc93169679e222dda71c73814f28a9fb0832166
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" 25e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wiley#include "type_cpp.h" 26a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 27a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::string; 28a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::unique_ptr; 29a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 30a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android { 31a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace aidl { 322cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin 332cc93169679e222dda71c73814f28a9fb0832166Casey Dahlinusing namespace internals; 342cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin 35f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileynamespace cpp { 36a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 37a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace internals { 381dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileyunique_ptr<Document> BuildInterfaceSource(const TypeNamespace& types, 391dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley const interface_type& parsed_doc); 40e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wileyunique_ptr<Document> BuildClientHeader(const TypeNamespace& types, 41e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wiley const interface_type& parsed_doc); 420c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyunique_ptr<Document> BuildInterfaceHeader(const TypeNamespace& types, 430c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley const interface_type& parsed_doc); 44a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} 45a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 46a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace { 47a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 48a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinconst char kTrivialInterfaceAIDL[] = 49a834dd4650b3196893440ee49c7ff6b303b45a92Casey DahlinR"(interface IPingResponder { 50a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin int Ping(int token); 51a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin})"; 52a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 53a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinconst char kExpectedTrivialClientHeaderOutput[] = 54a834dd4650b3196893440ee49c7ff6b303b45a92Casey DahlinR"(#ifndef BpPingResponder_H 55a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#define BpPingResponder_H 56a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 57a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IBinder.h> 58a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IInterface.h> 59a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <utils/Errors.h> 60a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <IPingResponder.h> 61a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 62a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android { 63a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 640c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace generated { 650c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 66a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinclass BpPingResponder : public public android::BpInterface<IPingResponder> { 67a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinpublic: 68a834dd4650b3196893440ee49c7ff6b303b45a92Casey DahlinBpPingResponder(); 69a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin~BpPingResponder(); 700c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyandroid::status_t Ping(int32_t token, int32_t* _aidl_return) override; 71a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}; // class BpPingResponder 72a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 730c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} // namespace generated 740c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 75a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} // namespace android 76a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 77a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#endif // BpPingResponder_H)"; 78a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 790c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyconst char kExpectedTrivialInterfaceHeaderOutput[] = 800c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyR"(#include <binder/IBinder.h> 810c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley#include <binder/IInterface.h> 820c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 830c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace android { 840c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 850c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace generated { 860c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 870c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyclass IPingResponder : public public android::IInterface { 880c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileypublic: 890c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyDECLARE_META_INTERFACE(PingResponder); 900c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyvirtual android::status_t Ping(int32_t token, int32_t* _aidl_return) = 0; 910c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyenum Call { 920c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley PING = android::IBinder::FIRST_CALL_TRANSACTION + 0, 930c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} 940c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}; // class IPingResponder 950c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 960c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} // namespace generated 970c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 980c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} // namespace android 990c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley)"; 1000c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 1011dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileyconst char kExpectedTrivialInterfaceSourceOutput[] = 1021dd458d3e3647823acb9554f8ae17631d597a1ecChristopher WileyR"(#include <IPingResponder.h> 1031dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley#include <BpPingResponder.h> 1041dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1051dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace android { 1061dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1071dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace generated { 1081dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1091dd458d3e3647823acb9554f8ae17631d597a1ecChristopher WileyIMPLEMENT_META_INTERFACE(PingResponder, "IPingResponder"); 1101dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1111dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley} // namespace generated 1121dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1131dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley} // namespace android 1141dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley)"; 1151dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 116a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} // namespace 117a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1180c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyclass TrivialInterfaceASTTest : public ::testing::Test { 1190c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected: 1200c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley interface_type* Parse() { 1210c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley Parser p{"BpExampleInterface.h"}; 1220c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley p.SetFileContents(kTrivialInterfaceAIDL); 123a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1242cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin interface_type* ret = nullptr; 125a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1262cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin int err = load_aidl_for_test("IPingResponder.aidl", 1272cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin kTrivialInterfaceAIDL, 1282cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin new cpp::TypeNamespace(), 1292cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin &ret); 1302cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin if (err) 1312cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin return nullptr; 132a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1332cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin return ret; 1340c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley } 135a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1360c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley void Compare(Document* doc, const char* expected) { 1370c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley string output; 1380c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley unique_ptr<CodeWriter> cw = GetStringWriter(&output); 139a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1400c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley doc->Write(cw.get()); 141a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1420c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley EXPECT_EQ(expected, output); 1430c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley } 1440c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}; 145a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1460c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesClientHeader) { 1470c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley interface_type* interface = Parse(); 1480c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley ASSERT_NE(interface, nullptr); 1490c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley TypeNamespace types; 1500c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface); 1510c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley Compare(doc.get(), kExpectedTrivialClientHeaderOutput); 1520c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} 1530c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 1540c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesInterfaceHeader) { 1550c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley interface_type* interface = Parse(); 1560c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley ASSERT_NE(interface, nullptr); 1570c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley TypeNamespace types; 1580c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface); 1590c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley Compare(doc.get(), kExpectedTrivialInterfaceHeaderOutput); 160a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} 161a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1621dd458d3e3647823acb9554f8ae17631d597a1ecChristopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesInterfaceSource) { 1631dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley interface_type* interface = Parse(); 1641dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley ASSERT_NE(interface, nullptr); 1651dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley TypeNamespace types; 1661dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface); 1671dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley Compare(doc.get(), kExpectedTrivialInterfaceSourceOutput); 1681dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley} 1691dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 170f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley} // namespace cpp 171a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} // namespace aidl 172a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} // namespace android 173