aidl_unittest.cpp revision cd63921a973b742ae1f1b0f7ae3e0ac910aa438c
190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley/*
290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley * Copyright (C) 2015, The Android Open Source Project
390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley *
490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley * Licensed under the Apache License, Version 2.0 (the "License");
590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley * you may not use this file except in compliance with the License.
690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley * You may obtain a copy of the License at
790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley *
890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley *     http://www.apache.org/licenses/LICENSE-2.0
990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley *
1090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley * Unless required by applicable law or agreed to in writing, software
1190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley * distributed under the License is distributed on an "AS IS" BASIS,
1290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley * See the License for the specific language governing permissions and
1490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley * limitations under the License.
1590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley */
1690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
1790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include <string>
1890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include <memory>
1990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include <vector>
2090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
2190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include <gtest/gtest.h>
2290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
2390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include "aidl.h"
2490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include "aidl_language.h"
2590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include "tests/fake_io_delegate.h"
2690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include "type_cpp.h"
2790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include "type_java.h"
2890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley#include "type_namespace.h"
2990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
3090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wileyusing android::aidl::test::FakeIoDelegate;
3190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wileyusing std::string;
3290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wileyusing std::unique_ptr;
33ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wileyusing android::aidl::internals::parse_preprocessed_file;
3490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
3590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wileynamespace android {
3690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wileynamespace aidl {
3790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
3890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wileyclass AidlTest : public ::testing::Test {
3990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley protected:
405679952c38925a54b75b087068887002e57f3174Christopher Wiley  void SetUp() override {
415679952c38925a54b75b087068887002e57f3174Christopher Wiley    java_types_.Init();
425679952c38925a54b75b087068887002e57f3174Christopher Wiley    cpp_types_.Init();
435679952c38925a54b75b087068887002e57f3174Christopher Wiley  }
445679952c38925a54b75b087068887002e57f3174Christopher Wiley
4590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  unique_ptr<AidlInterface> Parse(const string& path,
4690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley                                  const string& contents,
4790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley                                  TypeNamespace* types) {
480522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley    io_delegate_.SetFileContents(path, contents);
4990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    unique_ptr<AidlInterface> ret;
5090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    std::vector<std::unique_ptr<AidlImport>> imports;
5190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    ::android::aidl::internals::load_and_validate_aidl(
5241544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley        preprocessed_files_,
530522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley        import_paths_,
5490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        path,
550522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley        io_delegate_,
5690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        types,
5790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &ret,
5890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley        &imports);
5990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley    return ret;
6090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  }
610522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley
620522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley  FakeIoDelegate io_delegate_;
6341544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  vector<string> preprocessed_files_;
640522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley  vector<string> import_paths_;
655679952c38925a54b75b087068887002e57f3174Christopher Wiley  java::JavaTypeNamespace java_types_;
665679952c38925a54b75b087068887002e57f3174Christopher Wiley  cpp::TypeNamespace cpp_types_;
6790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley};
6890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
6990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher WileyTEST_F(AidlTest, JavaAcceptsMissingPackage) {
705679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_NE(nullptr, Parse("IFoo.aidl", "interface IFoo { }", &java_types_));
7190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}
7290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
730522cd58a55ebe894092aef9d42fd4337371de2dChristopher WileyTEST_F(AidlTest, RejectsArraysOfBinders) {
740522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley  import_paths_.push_back("");
750522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley  io_delegate_.SetFileContents("bar/IBar.aidl",
760522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley                               "package bar; interface IBar {}");
770522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley  string path = "foo/IFoo.aidl";
780522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley  string contents = "package foo;\n"
790522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley                    "import bar.IBar;\n"
800522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley                    "interface IFoo { void f(in IBar[] input); }";
815679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_EQ(nullptr, Parse(path, contents, &java_types_));
825679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_EQ(nullptr, Parse(path, contents, &cpp_types_));
830522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley}
840522cd58a55ebe894092aef9d42fd4337371de2dChristopher Wiley
8590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher WileyTEST_F(AidlTest, CppRejectsMissingPackage) {
865679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_EQ(nullptr, Parse("IFoo.aidl", "interface IFoo { }", &cpp_types_));
8790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  EXPECT_NE(nullptr,
885679952c38925a54b75b087068887002e57f3174Christopher Wiley            Parse("a/IFoo.aidl", "package a; interface IFoo { }", &cpp_types_));
8990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}
9090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
9190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher WileyTEST_F(AidlTest, RejectsOnewayOutParameters) {
9290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  string oneway_interface =
9390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley      "package a; oneway interface IFoo { void f(out int bar); }";
9490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  string oneway_method =
9590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley      "package a; interface IBar { oneway void f(out int bar); }";
965679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_interface, &cpp_types_));
975679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_interface, &java_types_));
985679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_EQ(nullptr, Parse("a/IBar.aidl", oneway_method, &cpp_types_));
995679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_EQ(nullptr, Parse("a/IBar.aidl", oneway_method, &java_types_));
10090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}
10190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
10290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher WileyTEST_F(AidlTest, RejectsOnewayNonVoidReturn) {
10390be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  string oneway_method = "package a; interface IFoo { oneway int f(); }";
1045679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, &cpp_types_));
1055679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, &java_types_));
10690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}
10790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley
10857dbe24bcb8f4509a876e8445c78d9504d7e616aCasey DahlinTEST_F(AidlTest, RejectsNullablePrimitive) {
10957dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin  string oneway_method = "package a; interface IFoo { @nullable int f(); }";
11057dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, &cpp_types_));
11157dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin  EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, &java_types_));
11257dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin}
11357dbe24bcb8f4509a876e8445c78d9504d7e616aCasey Dahlin
11490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher WileyTEST_F(AidlTest, AcceptsOneway) {
11590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  string oneway_method = "package a; interface IFoo { oneway void f(int a); }";
11690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  string oneway_interface =
11790be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley      "package a; oneway interface IBar { void f(int a); }";
1185679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, &cpp_types_));
1195679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, &java_types_));
1205679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_NE(nullptr, Parse("a/IBar.aidl", oneway_interface, &cpp_types_));
1215679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_NE(nullptr, Parse("a/IBar.aidl", oneway_interface, &java_types_));
12290be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}
123ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
124ef1409302aa97b1807e55c63588ac0a428f41a06Christopher WileyTEST_F(AidlTest, ParsesPreprocessedFile) {
125ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  string simple_content = "parcelable a.Foo;\ninterface b.IBar;";
126ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  io_delegate_.SetFileContents("path", simple_content);
127ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_FALSE(java_types_.HasType("a.Foo"));
128ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &java_types_));
129ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("Foo"));
130ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("a.Foo"));
131ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("b.IBar"));
132ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}
133ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
134ef1409302aa97b1807e55c63588ac0a428f41a06Christopher WileyTEST_F(AidlTest, ParsesPreprocessedFileWithWhitespace) {
135ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  string simple_content = "parcelable    a.Foo;\n  interface b.IBar  ;\t";
136ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  io_delegate_.SetFileContents("path", simple_content);
137ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_FALSE(java_types_.HasType("a.Foo"));
138ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &java_types_));
139ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("Foo"));
140ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("a.Foo"));
141ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("b.IBar"));
142ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}
143ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
14441544376dc44bfb01309e76557be92e23dbf8d22Christopher WileyTEST_F(AidlTest, PreferImportToPreprocessed) {
14541544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  io_delegate_.SetFileContents("preprocessed", "interface another.IBar;");
14641544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  io_delegate_.SetFileContents("one/IBar.aidl", "package one; "
14741544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley                                                "interface IBar {}");
14841544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  preprocessed_files_.push_back("preprocessed");
14941544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  import_paths_.push_back("");
15041544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  auto parse_result = Parse(
15141544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley      "p/IFoo.aidl", "package p; import one.IBar; interface IFoo {}",
15241544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley      &java_types_);
15341544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  EXPECT_NE(nullptr, parse_result);
15441544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  // We expect to know about both kinds of IBar
15541544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  EXPECT_TRUE(java_types_.HasType("one.IBar"));
15641544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  EXPECT_TRUE(java_types_.HasType("another.IBar"));
15741544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  // But if we request just "IBar" we should get our imported one.
15841544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  const java::Type* type = java_types_.Find("IBar");
15941544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  ASSERT_TRUE(type);
16041544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  EXPECT_EQ("one.IBar", type->QualifiedName());
16141544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley}
16241544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley
163c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey DahlinTEST_F(AidlTest, WritePreprocessedFile) {
164c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  io_delegate_.SetFileContents("p/Outer.aidl",
165c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin                               "package p; parcelable Outer.Inner;");
166c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  io_delegate_.SetFileContents("one/IBar.aidl", "package one; import p.Outer;"
167c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin                                                "interface IBar {}");
168c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
169c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  JavaOptions options;
170c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  options.output_file_name_ = "preprocessed";
171c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  options.files_to_preprocess_.resize(2);
172c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  options.files_to_preprocess_[0] = "p/Outer.aidl";
173c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  options.files_to_preprocess_[1] = "one/IBar.aidl";
174c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  EXPECT_TRUE(::android::aidl::preprocess_aidl(options, io_delegate_));
175c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
176c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  string output;
177c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  EXPECT_TRUE(io_delegate_.GetWrittenContents("preprocessed", &output));
178c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  EXPECT_EQ("parcelable p.Outer.Inner;\ninterface one.IBar;\n", output);
179c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin}
180c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
18163bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher WileyTEST_F(AidlTest, RequireOuterClass) {
18263bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  io_delegate_.SetFileContents("p/Outer.aidl",
18363bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley                               "package p; parcelable Outer.Inner;");
18463bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  import_paths_.push_back("");
18563bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  auto parse_result = Parse(
18663bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      "p/IFoo.aidl",
18763bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      "package p; import p.Outer; interface IFoo { void f(in Inner c); }",
18863bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      &java_types_);
18963bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  EXPECT_EQ(nullptr, parse_result);
19063bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley}
19163bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley
19263bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher WileyTEST_F(AidlTest, ParseCompoundParcelableFromPreprocess) {
19363bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  io_delegate_.SetFileContents("preprocessed",
19463bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley                               "parcelable p.Outer.Inner;");
19563bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  preprocessed_files_.push_back("preprocessed");
19663bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  auto parse_result = Parse(
19763bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      "p/IFoo.aidl",
19863bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      "package p; interface IFoo { void f(in Inner c); }",
19963bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      &java_types_);
20063bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  // TODO(wiley): This should actually return nullptr because we require
20163bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  //              the outer class name.  However, for legacy reasons,
20263bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  //              this behavior must be maintained.  b/17415692
20363bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  EXPECT_NE(nullptr, parse_result);
20463bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley}
20563bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley
206632801d891bd269badc780ab5f0f08e56e6df10aChristopher WileyTEST_F(AidlTest, FailOnParcelable) {
207632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  JavaOptions options;
208632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  options.input_file_name_ = "p/IFoo.aidl";
209632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  io_delegate_.SetFileContents(options.input_file_name_,
210632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley                               "package p; parcelable IFoo;");
211632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  // By default, we shouldn't fail on parcelable.
212632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  EXPECT_EQ(0, ::android::aidl::compile_aidl_to_java(options, io_delegate_));
213632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  options.fail_on_parcelable_ = true;
214632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  EXPECT_NE(0, ::android::aidl::compile_aidl_to_java(options, io_delegate_));
215632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley}
216632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley
2179078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher WileyTEST_F(AidlTest, UnderstandsNativeParcelables) {
2189078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  io_delegate_.SetFileContents(
2199078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley      "p/Bar.aidl",
220cd63921a973b742ae1f1b0f7ae3e0ac910aa438cCasey Dahlin      "package p; parcelable Bar cpp_header \"baz/header\";");
2219078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  import_paths_.push_back("");
2229078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  const string input_path = "p/IFoo.aidl";
2239078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  const string input = "package p; import p.Bar; interface IFoo { }";
2249078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley
2259078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  // C++ understands C++ specific stuff
2269078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  auto cpp_parse_result = Parse(input_path, input, &cpp_types_);
2279078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_NE(nullptr, cpp_parse_result);
2289078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  auto cpp_type = cpp_types_.Find("Bar");
2299078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  ASSERT_NE(nullptr, cpp_type);
230a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin  EXPECT_EQ("::p::Bar", cpp_type->CppType());
2319078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  set<string> headers;
232a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin  cpp_type->GetHeaders(&headers);
2339078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_EQ(1u, headers.size());
2349078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_EQ(1u, headers.count("baz/header"));
2359078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley
2369078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  // Java ignores C++ specific stuff
2379078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  auto java_parse_result = Parse(input_path, input, &java_types_);
2389078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_NE(nullptr, java_parse_result);
2399078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  auto java_type = java_types_.Find("Bar");
2409078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  ASSERT_NE(nullptr, java_type);
2419078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_EQ("p.Bar", java_type->InstantiableName());
2429078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley}
2439078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley
24490be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}  // namespace aidl
24590be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}  // namespace android
246