generate_cpp_unittest.cpp revision 0edf34239909bbc16e884ea2517e5f3398185d0f
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" 254a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley#include "tests/fake_io_delegate.h" 26e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wiley#include "type_cpp.h" 27a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 284a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wileyusing android::aidl::test::FakeIoDelegate; 29a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::string; 30a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinusing std::unique_ptr; 31a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 32a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android { 33a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace aidl { 34f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wileynamespace cpp { 35a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace internals { 361dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileyunique_ptr<Document> BuildInterfaceSource(const TypeNamespace& types, 371dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley const interface_type& parsed_doc); 38e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wileyunique_ptr<Document> BuildClientHeader(const TypeNamespace& types, 39e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wiley const interface_type& parsed_doc); 400c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyunique_ptr<Document> BuildInterfaceHeader(const TypeNamespace& types, 410c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley const interface_type& parsed_doc); 42a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} 43a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 44a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace { 45a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 46a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinconst char kTrivialInterfaceAIDL[] = 47a834dd4650b3196893440ee49c7ff6b303b45a92Casey DahlinR"(interface IPingResponder { 48a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin int Ping(int token); 49a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin})"; 50a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 51a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinconst char kExpectedTrivialClientHeaderOutput[] = 52a834dd4650b3196893440ee49c7ff6b303b45a92Casey DahlinR"(#ifndef BpPingResponder_H 53a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#define BpPingResponder_H 54a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 55a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IBinder.h> 56a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <binder/IInterface.h> 57a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <utils/Errors.h> 58a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#include <IPingResponder.h> 59a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 60a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinnamespace android { 61a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 620c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace generated { 630c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 64a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinclass BpPingResponder : public public android::BpInterface<IPingResponder> { 65a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlinpublic: 66a834dd4650b3196893440ee49c7ff6b303b45a92Casey DahlinBpPingResponder(); 67a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin~BpPingResponder(); 680c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyandroid::status_t Ping(int32_t token, int32_t* _aidl_return) override; 69a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin}; // class BpPingResponder 70a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 710c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} // namespace generated 720c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 73a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} // namespace android 74a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 75a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin#endif // BpPingResponder_H)"; 76a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 770c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyconst char kExpectedTrivialInterfaceHeaderOutput[] = 780c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyR"(#include <binder/IBinder.h> 790c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley#include <binder/IInterface.h> 800c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 810c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace android { 820c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 830c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileynamespace generated { 840c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 850c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyclass IPingResponder : public public android::IInterface { 860c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileypublic: 870c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyDECLARE_META_INTERFACE(PingResponder); 880c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyvirtual android::status_t Ping(int32_t token, int32_t* _aidl_return) = 0; 890c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyenum Call { 900c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley PING = android::IBinder::FIRST_CALL_TRANSACTION + 0, 910c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} 920c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}; // class IPingResponder 930c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 940c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} // namespace generated 950c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 960c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} // namespace android 970c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley)"; 980c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 991dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileyconst char kExpectedTrivialInterfaceSourceOutput[] = 1001dd458d3e3647823acb9554f8ae17631d597a1ecChristopher WileyR"(#include <IPingResponder.h> 1011dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley#include <BpPingResponder.h> 1021dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1031dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace android { 1041dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1051dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wileynamespace generated { 1061dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1071dd458d3e3647823acb9554f8ae17631d597a1ecChristopher WileyIMPLEMENT_META_INTERFACE(PingResponder, "IPingResponder"); 1081dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1091dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley} // namespace generated 1101dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 1111dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley} // namespace android 1121dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley)"; 1131dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 114a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} // namespace 115a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1160c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyclass TrivialInterfaceASTTest : public ::testing::Test { 1170c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley protected: 1180c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley interface_type* Parse() { 119a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1204a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley FakeIoDelegate io_delegate; 1214a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley io_delegate.SetFileContents("IPingResponder.aidl", kTrivialInterfaceAIDL); 1224a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley 1234a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley cpp::TypeNamespace types; 1244a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley interface_type* ret = nullptr; 1250edf34239909bbc16e884ea2517e5f3398185d0fCasey Dahlin std::vector<std::unique_ptr<AidlImport>> imports; 1264a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley int err = ::android::aidl::internals::load_and_validate_aidl( 1274a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley {}, // no preprocessed files 1284a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley {}, // no import paths 1294a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley "IPingResponder.aidl", 1304a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley io_delegate, 1314a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley &types, 1324a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley &ret, 1334a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley &imports); 134a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1352cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin if (err) 1362cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin return nullptr; 137a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1382cc93169679e222dda71c73814f28a9fb0832166Casey Dahlin return ret; 1390c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley } 140a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1410c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley void Compare(Document* doc, const char* expected) { 1420c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley string output; 1430c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley unique_ptr<CodeWriter> cw = GetStringWriter(&output); 144a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1450c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley doc->Write(cw.get()); 146a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1470c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley EXPECT_EQ(expected, output); 1480c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley } 1490c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley}; 150a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1510c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesClientHeader) { 1520c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley interface_type* interface = Parse(); 1530c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley ASSERT_NE(interface, nullptr); 1540c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley TypeNamespace types; 1550c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley unique_ptr<Document> doc = internals::BuildClientHeader(types, *interface); 1560c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley Compare(doc.get(), kExpectedTrivialClientHeaderOutput); 1570c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley} 1580c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley 1590c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesInterfaceHeader) { 1600c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley interface_type* interface = Parse(); 1610c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley ASSERT_NE(interface, nullptr); 1620c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley TypeNamespace types; 1630c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley unique_ptr<Document> doc = internals::BuildInterfaceHeader(types, *interface); 1640c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wiley Compare(doc.get(), kExpectedTrivialInterfaceHeaderOutput); 165a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} 166a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin 1671dd458d3e3647823acb9554f8ae17631d597a1ecChristopher WileyTEST_F(TrivialInterfaceASTTest, GeneratesInterfaceSource) { 1681dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley interface_type* interface = Parse(); 1691dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley ASSERT_NE(interface, nullptr); 1701dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley TypeNamespace types; 1711dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley unique_ptr<Document> doc = internals::BuildInterfaceSource(types, *interface); 1721dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley Compare(doc.get(), kExpectedTrivialInterfaceSourceOutput); 1731dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley} 1741dd458d3e3647823acb9554f8ae17631d597a1ecChristopher Wiley 175f944e79bdaf92fffe9ea78314d3636e7e4de8c51Christopher Wiley} // namespace cpp 176a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} // namespace aidl 177a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin} // namespace android 178