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