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