aidl_unittest.cpp revision a2f77c40fb6287895e2030055c0104eac0a1f73a
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
10890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher WileyTEST_F(AidlTest, AcceptsOneway) {
10990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  string oneway_method = "package a; interface IFoo { oneway void f(int a); }";
11090be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley  string oneway_interface =
11190be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley      "package a; oneway interface IBar { void f(int a); }";
1125679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, &cpp_types_));
1135679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, &java_types_));
1145679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_NE(nullptr, Parse("a/IBar.aidl", oneway_interface, &cpp_types_));
1155679952c38925a54b75b087068887002e57f3174Christopher Wiley  EXPECT_NE(nullptr, Parse("a/IBar.aidl", oneway_interface, &java_types_));
11690be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}
117ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
118ef1409302aa97b1807e55c63588ac0a428f41a06Christopher WileyTEST_F(AidlTest, ParsesPreprocessedFile) {
119ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  string simple_content = "parcelable a.Foo;\ninterface b.IBar;";
120ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  io_delegate_.SetFileContents("path", simple_content);
121ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_FALSE(java_types_.HasType("a.Foo"));
122ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &java_types_));
123ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("Foo"));
124ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("a.Foo"));
125ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("b.IBar"));
126ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}
127ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
128ef1409302aa97b1807e55c63588ac0a428f41a06Christopher WileyTEST_F(AidlTest, ParsesPreprocessedFileWithWhitespace) {
129ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  string simple_content = "parcelable    a.Foo;\n  interface b.IBar  ;\t";
130ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  io_delegate_.SetFileContents("path", simple_content);
131ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_FALSE(java_types_.HasType("a.Foo"));
132ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &java_types_));
133ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("Foo"));
134ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("a.Foo"));
135ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley  EXPECT_TRUE(java_types_.HasType("b.IBar"));
136ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley}
137ef1409302aa97b1807e55c63588ac0a428f41a06Christopher Wiley
13841544376dc44bfb01309e76557be92e23dbf8d22Christopher WileyTEST_F(AidlTest, PreferImportToPreprocessed) {
13941544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  io_delegate_.SetFileContents("preprocessed", "interface another.IBar;");
14041544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  io_delegate_.SetFileContents("one/IBar.aidl", "package one; "
14141544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley                                                "interface IBar {}");
14241544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  preprocessed_files_.push_back("preprocessed");
14341544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  import_paths_.push_back("");
14441544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  auto parse_result = Parse(
14541544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley      "p/IFoo.aidl", "package p; import one.IBar; interface IFoo {}",
14641544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley      &java_types_);
14741544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  EXPECT_NE(nullptr, parse_result);
14841544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  // We expect to know about both kinds of IBar
14941544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  EXPECT_TRUE(java_types_.HasType("one.IBar"));
15041544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  EXPECT_TRUE(java_types_.HasType("another.IBar"));
15141544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  // But if we request just "IBar" we should get our imported one.
15241544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  const java::Type* type = java_types_.Find("IBar");
15341544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  ASSERT_TRUE(type);
15441544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley  EXPECT_EQ("one.IBar", type->QualifiedName());
15541544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley}
15641544376dc44bfb01309e76557be92e23dbf8d22Christopher Wiley
157c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey DahlinTEST_F(AidlTest, WritePreprocessedFile) {
158c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  io_delegate_.SetFileContents("p/Outer.aidl",
159c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin                               "package p; parcelable Outer.Inner;");
160c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  io_delegate_.SetFileContents("one/IBar.aidl", "package one; import p.Outer;"
161c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin                                                "interface IBar {}");
162c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
163c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  JavaOptions options;
164c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  options.output_file_name_ = "preprocessed";
165c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  options.files_to_preprocess_.resize(2);
166c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  options.files_to_preprocess_[0] = "p/Outer.aidl";
167c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  options.files_to_preprocess_[1] = "one/IBar.aidl";
168c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  EXPECT_TRUE(::android::aidl::preprocess_aidl(options, io_delegate_));
169c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
170c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  string output;
171c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  EXPECT_TRUE(io_delegate_.GetWrittenContents("preprocessed", &output));
172c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin  EXPECT_EQ("parcelable p.Outer.Inner;\ninterface one.IBar;\n", output);
173c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin}
174c1f39b4ea30e7313eeb7f3d3fd5ec66ba00f2bb5Casey Dahlin
17563bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher WileyTEST_F(AidlTest, RequireOuterClass) {
17663bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  io_delegate_.SetFileContents("p/Outer.aidl",
17763bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley                               "package p; parcelable Outer.Inner;");
17863bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  import_paths_.push_back("");
17963bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  auto parse_result = Parse(
18063bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      "p/IFoo.aidl",
18163bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      "package p; import p.Outer; interface IFoo { void f(in Inner c); }",
18263bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      &java_types_);
18363bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  EXPECT_EQ(nullptr, parse_result);
18463bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley}
18563bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley
18663bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher WileyTEST_F(AidlTest, ParseCompoundParcelableFromPreprocess) {
18763bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  io_delegate_.SetFileContents("preprocessed",
18863bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley                               "parcelable p.Outer.Inner;");
18963bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  preprocessed_files_.push_back("preprocessed");
19063bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  auto parse_result = Parse(
19163bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      "p/IFoo.aidl",
19263bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      "package p; interface IFoo { void f(in Inner c); }",
19363bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley      &java_types_);
19463bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  // TODO(wiley): This should actually return nullptr because we require
19563bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  //              the outer class name.  However, for legacy reasons,
19663bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  //              this behavior must be maintained.  b/17415692
19763bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley  EXPECT_NE(nullptr, parse_result);
19863bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley}
19963bce2a1090a11d82a98d4463ddf0c82e1b8a6e6Christopher Wiley
200632801d891bd269badc780ab5f0f08e56e6df10aChristopher WileyTEST_F(AidlTest, FailOnParcelable) {
201632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  JavaOptions options;
202632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  options.input_file_name_ = "p/IFoo.aidl";
203632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  io_delegate_.SetFileContents(options.input_file_name_,
204632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley                               "package p; parcelable IFoo;");
205632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  // By default, we shouldn't fail on parcelable.
206632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  EXPECT_EQ(0, ::android::aidl::compile_aidl_to_java(options, io_delegate_));
207632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  options.fail_on_parcelable_ = true;
208632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley  EXPECT_NE(0, ::android::aidl::compile_aidl_to_java(options, io_delegate_));
209632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley}
210632801d891bd269badc780ab5f0f08e56e6df10aChristopher Wiley
2119078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher WileyTEST_F(AidlTest, UnderstandsNativeParcelables) {
2129078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  io_delegate_.SetFileContents(
2139078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley      "p/Bar.aidl",
2149078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley      "package p; parcelable Bar from \"baz/header\";");
2159078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  import_paths_.push_back("");
2169078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  const string input_path = "p/IFoo.aidl";
2179078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  const string input = "package p; import p.Bar; interface IFoo { }";
2189078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley
2199078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  // C++ understands C++ specific stuff
2209078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  auto cpp_parse_result = Parse(input_path, input, &cpp_types_);
2219078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_NE(nullptr, cpp_parse_result);
2229078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  auto cpp_type = cpp_types_.Find("Bar");
2239078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  ASSERT_NE(nullptr, cpp_type);
224a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin  EXPECT_EQ("::p::Bar", cpp_type->CppType());
2259078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  set<string> headers;
226a2f77c40fb6287895e2030055c0104eac0a1f73aCasey Dahlin  cpp_type->GetHeaders(&headers);
2279078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_EQ(1u, headers.size());
2289078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_EQ(1u, headers.count("baz/header"));
2299078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley
2309078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  // Java ignores C++ specific stuff
2319078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  auto java_parse_result = Parse(input_path, input, &java_types_);
2329078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_NE(nullptr, java_parse_result);
2339078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  auto java_type = java_types_.Find("Bar");
2349078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  ASSERT_NE(nullptr, java_type);
2359078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley  EXPECT_EQ("p.Bar", java_type->InstantiableName());
2369078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley}
2379078d724c0e9017e2a9bf8defb954d5620da1e8aChristopher Wiley
23890be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}  // namespace aidl
23990be4e3fe6d16ea8e8263b80989ef2ab4e6ef9c6Christopher Wiley}  // namespace android
240