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