generate_cpp_unittest.cpp revision 1ae2bc56d20fe0e19262f2721abc338662fa6e30
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,
371ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin                                          const AidlInterface& parsed_doc);
38e3550c6679939d2bf5f35c540cd83198ab156fb7Christopher Wileyunique_ptr<Document> BuildClientHeader(const TypeNamespace& types,
391ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin                                       const AidlInterface& parsed_doc);
400c732dbae2e6b33cde9a266ea091e1459742f1f1Christopher Wileyunique_ptr<Document> BuildInterfaceHeader(const TypeNamespace& types,
411ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin                                          const AidlInterface& 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:
1181ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* Parse() {
119a834dd4650b3196893440ee49c7ff6b303b45a92Casey Dahlin
1204a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  FakeIoDelegate io_delegate;
1214a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  io_delegate.SetFileContents("IPingResponder.aidl", kTrivialInterfaceAIDL);
1224a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley
1234a2884b0e9414ed9dfee4e141e8bd462c07b442bChristopher Wiley  cpp::TypeNamespace types;
1241ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* 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) {
1521ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* 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) {
1601ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* 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) {
1681ae2bc56d20fe0e19262f2721abc338662fa6e30Casey Dahlin  AidlInterface* 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