blob: 790aabb1234e7213f53179c9e0c28462e0f0176c [file] [log] [blame]
Christopher Wiley90be4e32015-10-20 14:55:25 -07001/*
2 * Copyright (C) 2015, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Christopher Wiley90be4e32015-10-20 14:55:25 -070017#include <memory>
Christopher Wiley12e894a2016-01-29 11:55:07 -080018#include <set>
19#include <string>
Christopher Wiley90be4e32015-10-20 14:55:25 -070020#include <vector>
21
Christopher Wileyec31a052016-01-25 07:28:51 -080022#include <android-base/stringprintf.h>
Jiyong Parkf1f5c802020-05-19 17:33:00 +090023#include <gmock/gmock.h>
Christopher Wiley90be4e32015-10-20 14:55:25 -070024#include <gtest/gtest.h>
25
26#include "aidl.h"
Steven Moreland49585242019-12-18 16:06:49 -080027#include "aidl_checkapi.h"
Christopher Wiley90be4e32015-10-20 14:55:25 -070028#include "aidl_language.h"
Steven Moreland860b1942018-08-16 14:59:28 -070029#include "aidl_to_cpp.h"
Jeongik Cha047c5ee2019-08-07 23:16:49 +090030#include "aidl_to_java.h"
Jiyong Park2a7c92b2020-07-22 19:12:36 +090031#include "logging.h"
Jeongik Cha047c5ee2019-08-07 23:16:49 +090032#include "options.h"
Christopher Wiley90be4e32015-10-20 14:55:25 -070033#include "tests/fake_io_delegate.h"
Christopher Wiley90be4e32015-10-20 14:55:25 -070034
Jeongik Cha2a5b4d82019-08-06 19:37:59 +090035using android::aidl::internals::parse_preprocessed_file;
Christopher Wiley90be4e32015-10-20 14:55:25 -070036using android::aidl::test::FakeIoDelegate;
Christopher Wileyec31a052016-01-25 07:28:51 -080037using android::base::StringPrintf;
Christopher Wiley12e894a2016-01-29 11:55:07 -080038using std::set;
Christopher Wiley90be4e32015-10-20 14:55:25 -070039using std::string;
40using std::unique_ptr;
Christopher Wiley12e894a2016-01-29 11:55:07 -080041using std::vector;
Devin Moore7b8d5c92020-03-17 14:14:08 -070042using testing::TestParamInfo;
Jeongik Cha2a5b4d82019-08-06 19:37:59 +090043using testing::internal::CaptureStderr;
44using testing::internal::GetCapturedStderr;
Christopher Wiley90be4e32015-10-20 14:55:25 -070045
46namespace android {
47namespace aidl {
Christopher Wileyf8136192016-04-12 14:19:35 -070048namespace {
49
50const char kExpectedDepFileContents[] =
51R"(place/for/output/p/IFoo.java : \
52 p/IFoo.aidl
53
54p/IFoo.aidl :
55)";
56
Dan Willemsen93298ee2016-11-10 23:55:55 -080057const char kExpectedNinjaDepFileContents[] =
58R"(place/for/output/p/IFoo.java : \
59 p/IFoo.aidl
60)";
61
Jiyong Parkdf202122019-09-30 20:48:35 +090062const char kExpectedParcelableDeclarationDepFileContents[] =
63 R"( : \
64 p/Foo.aidl
65
66p/Foo.aidl :
67)";
68
69const char kExpectedStructuredParcelableDepFileContents[] =
Steven Moreland2a9a7d62019-02-05 16:11:54 -080070 R"(place/for/output/p/Foo.java : \
Christopher Wileyb1bbdf82016-04-21 11:43:45 -070071 p/Foo.aidl
72
73p/Foo.aidl :
74)";
75
Jiyong Parkd4e73c82019-07-24 21:39:15 +090076const char kExpectedJavaParcelableOutputContests[] =
Jeongik Chaa755c2a2018-12-12 16:28:23 +090077 R"(/*
78 * This file is auto-generated. DO NOT MODIFY.
Jeongik Chaa755c2a2018-12-12 16:28:23 +090079 */
Makoto Onuki78a1c1c2020-03-04 16:57:23 -080080@android.annotation.Hide
Jeongik Chaa755c2a2018-12-12 16:28:23 +090081public class Rect implements android.os.Parcelable
82{
83 // Comment
84
Makoto Onuki78a1c1c2020-03-04 16:57:23 -080085 @android.annotation.Hide
Jeongik Chaa755c2a2018-12-12 16:28:23 +090086 public int x = 5;
87
Makoto Onuki78a1c1c2020-03-04 16:57:23 -080088 @android.annotation.Hide
89 @android.compat.annotation.UnsupportedAppUsage(expectedSignature = "dummy", implicitMember = "dummy", maxTargetSdk = 28, publicAlternatives = "dummy", trackingBug = 42L, overrideSourcePosition="Rect.aidl:7:1:10:14")
Steven Moreland541788d2020-05-21 22:05:52 +000090 public int y = 0;
Jiyong Parkd4e73c82019-07-24 21:39:15 +090091
92 public android.os.ParcelFileDescriptor fd;
Jeongik Chaa755c2a2018-12-12 16:28:23 +090093 public static final android.os.Parcelable.Creator<Rect> CREATOR = new android.os.Parcelable.Creator<Rect>() {
94 @Override
95 public Rect createFromParcel(android.os.Parcel _aidl_source) {
96 Rect _aidl_out = new Rect();
97 _aidl_out.readFromParcel(_aidl_source);
98 return _aidl_out;
99 }
100 @Override
101 public Rect[] newArray(int _aidl_size) {
102 return new Rect[_aidl_size];
103 }
104 };
105 @Override public final void writeToParcel(android.os.Parcel _aidl_parcel, int _aidl_flag)
106 {
107 int _aidl_start_pos = _aidl_parcel.dataPosition();
108 _aidl_parcel.writeInt(0);
109 _aidl_parcel.writeInt(x);
110 _aidl_parcel.writeInt(y);
Jiyong Parkd4e73c82019-07-24 21:39:15 +0900111 if ((fd!=null)) {
112 _aidl_parcel.writeInt(1);
113 fd.writeToParcel(_aidl_parcel, 0);
114 }
115 else {
116 _aidl_parcel.writeInt(0);
117 }
Jeongik Chaa755c2a2018-12-12 16:28:23 +0900118 int _aidl_end_pos = _aidl_parcel.dataPosition();
119 _aidl_parcel.setDataPosition(_aidl_start_pos);
120 _aidl_parcel.writeInt(_aidl_end_pos - _aidl_start_pos);
121 _aidl_parcel.setDataPosition(_aidl_end_pos);
122 }
123 public final void readFromParcel(android.os.Parcel _aidl_parcel)
124 {
125 int _aidl_start_pos = _aidl_parcel.dataPosition();
126 int _aidl_parcelable_size = _aidl_parcel.readInt();
127 if (_aidl_parcelable_size < 0) return;
128 try {
129 x = _aidl_parcel.readInt();
130 if (_aidl_parcel.dataPosition() - _aidl_start_pos >= _aidl_parcelable_size) return;
131 y = _aidl_parcel.readInt();
132 if (_aidl_parcel.dataPosition() - _aidl_start_pos >= _aidl_parcelable_size) return;
Jiyong Parkd4e73c82019-07-24 21:39:15 +0900133 if ((0!=_aidl_parcel.readInt())) {
134 fd = android.os.ParcelFileDescriptor.CREATOR.createFromParcel(_aidl_parcel);
135 }
136 else {
137 fd = null;
138 }
139 if (_aidl_parcel.dataPosition() - _aidl_start_pos >= _aidl_parcelable_size) return;
Jeongik Chaa755c2a2018-12-12 16:28:23 +0900140 } finally {
141 _aidl_parcel.setDataPosition(_aidl_start_pos + _aidl_parcelable_size);
142 }
143 }
144 @Override public int describeContents()
145 {
Jeongik Cha372a8c82018-12-12 16:31:11 +0900146 return 0;
147 }
Jeongik Chaa755c2a2018-12-12 16:28:23 +0900148}
149)";
150
Christopher Wileyf8136192016-04-12 14:19:35 -0700151} // namespace
Christopher Wiley90be4e32015-10-20 14:55:25 -0700152
Devin Moore7b8d5c92020-03-17 14:14:08 -0700153class AidlTest : public ::testing::TestWithParam<Options::Language> {
Christopher Wiley90be4e32015-10-20 14:55:25 -0700154 protected:
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900155 AidlDefinedType* Parse(const string& path, const string& contents, AidlTypenames& typenames_,
156 Options::Language lang, AidlError* error = nullptr,
Steven Moreland1eac5fa2018-08-27 19:35:05 -0700157 const vector<string> additional_arguments = {}) {
Christopher Wiley0522cd52015-10-28 15:39:44 -0700158 io_delegate_.SetFileContents(path, contents);
Jiyong Parkfbbfa932018-07-30 21:44:10 +0900159 vector<string> args;
Devin Moore7b8d5c92020-03-17 14:14:08 -0700160 args.emplace_back("aidl");
161 args.emplace_back("--lang=" + Options::LanguageToString(lang));
Steven Moreland1eac5fa2018-08-27 19:35:05 -0700162 for (const string& s : additional_arguments) {
163 args.emplace_back(s);
164 }
165 for (const string& f : preprocessed_files_) {
Jiyong Parkfbbfa932018-07-30 21:44:10 +0900166 args.emplace_back("--preprocessed=" + f);
167 }
Steven Moreland1eac5fa2018-08-27 19:35:05 -0700168 for (const string& i : import_paths_) {
Jiyong Parkfbbfa932018-07-30 21:44:10 +0900169 args.emplace_back("--include=" + i);
170 }
171 args.emplace_back(path);
172 Options options = Options::From(args);
Jiyong Parkb034bf02018-07-30 17:44:33 +0900173 vector<string> imported_files;
Jiyong Park8c380532018-08-30 14:55:26 +0900174 ImportResolver import_resolver{io_delegate_, path, import_paths_, {}};
Christopher Wiley69b44cf2016-05-03 13:43:33 -0700175 AidlError actual_error = ::android::aidl::internals::load_and_validate_aidl(
Jiyong Park8e79b7f2020-07-20 20:52:38 +0900176 path, options, io_delegate_, &typenames_, &imported_files);
Jiyong Parkb034bf02018-07-30 17:44:33 +0900177
Christopher Wiley69b44cf2016-05-03 13:43:33 -0700178 if (error != nullptr) {
179 *error = actual_error;
180 }
Jiyong Parkb034bf02018-07-30 17:44:33 +0900181
182 if (actual_error != AidlError::OK) {
183 return nullptr;
184 }
185
Jiyong Park8e79b7f2020-07-20 20:52:38 +0900186 const auto& defined_types = typenames_.MainDocument().DefinedTypes();
Jiyong Parkb034bf02018-07-30 17:44:33 +0900187 EXPECT_EQ(1ul, defined_types.size());
188
Jiyong Park8e79b7f2020-07-20 20:52:38 +0900189 return defined_types.front().get();
Christopher Wiley90be4e32015-10-20 14:55:25 -0700190 }
Christopher Wiley0522cd52015-10-28 15:39:44 -0700191
Devin Moore7b8d5c92020-03-17 14:14:08 -0700192 Options::Language GetLanguage() { return GetParam(); }
193
Christopher Wiley0522cd52015-10-28 15:39:44 -0700194 FakeIoDelegate io_delegate_;
Christopher Wiley41544372015-11-03 14:52:29 -0800195 vector<string> preprocessed_files_;
Jiyong Park8c380532018-08-30 14:55:26 +0900196 set<string> import_paths_;
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900197 AidlTypenames typenames_;
Christopher Wiley90be4e32015-10-20 14:55:25 -0700198};
199
Devin Moore7b8d5c92020-03-17 14:14:08 -0700200// Instantiate the AidlTest parameterized suite, calling all of the TEST_P
201// tests with each of the supported languages as a parameter.
202INSTANTIATE_TEST_SUITE_P(AidlTestSuite, AidlTest,
203 testing::Values(Options::Language::CPP, Options::Language::JAVA,
204 Options::Language::NDK),
205 [](const testing::TestParamInfo<Options::Language>& info) {
206 return Options::LanguageToString(info.param);
207 });
208
209TEST_P(AidlTest, AcceptMissingPackage) {
210 EXPECT_NE(nullptr, Parse("IFoo.aidl", "interface IFoo { }", typenames_, GetLanguage()));
Christopher Wiley90be4e32015-10-20 14:55:25 -0700211}
212
Devin Moore7b8d5c92020-03-17 14:14:08 -0700213TEST_P(AidlTest, EndsInSingleLineComment) {
214 EXPECT_NE(nullptr, Parse("IFoo.aidl", "interface IFoo { } // foo", typenames_, GetLanguage()));
Steven Moreland9c2988f2019-07-17 17:49:10 -0700215}
216
Devin Moore7b8d5c92020-03-17 14:14:08 -0700217TEST_P(AidlTest, RejectsArraysOfBinders) {
Jiyong Park8c380532018-08-30 14:55:26 +0900218 import_paths_.emplace("");
Christopher Wiley0522cd52015-10-28 15:39:44 -0700219 io_delegate_.SetFileContents("bar/IBar.aidl",
220 "package bar; interface IBar {}");
Devin Moore097a3ab2020-03-11 16:08:44 -0700221 const string path = "foo/IFoo.aidl";
222 const string contents =
223 "package foo;\n"
224 "import bar.IBar;\n"
225 "interface IFoo { void f(in IBar[] input); }";
226 const string expected_stderr = "ERROR: foo/IFoo.aidl:3.27-32: Binder type cannot be an array\n";
227 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700228 EXPECT_EQ(nullptr, Parse(path, contents, typenames_, GetLanguage()));
Devin Moore097a3ab2020-03-11 16:08:44 -0700229 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Christopher Wiley0522cd52015-10-28 15:39:44 -0700230}
231
Devin Moore7b8d5c92020-03-17 14:14:08 -0700232TEST_P(AidlTest, SupportOnlyOutParameters) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700233 const string interface_list = "package a; interface IBar { void f(out List<String> bar); }";
Devin Moore7b8d5c92020-03-17 14:14:08 -0700234 EXPECT_NE(nullptr, Parse("a/IBar.aidl", interface_list, typenames_, GetLanguage()));
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900235 typenames_.Reset();
Devin Moore097a3ab2020-03-11 16:08:44 -0700236
237 const string interface_ibinder = "package a; interface IBaz { void f(out IBinder bar); }";
238 const string expected_ibinder_stderr =
239 "ERROR: a/IBaz.aidl:1.47-51: 'out IBinder bar' can only be an in parameter.\n";
240 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700241 EXPECT_EQ(nullptr, Parse("a/IBaz.aidl", interface_ibinder, typenames_, GetLanguage()));
Devin Moore097a3ab2020-03-11 16:08:44 -0700242 EXPECT_EQ(expected_ibinder_stderr, GetCapturedStderr());
Jeongik Chaa2080bf2019-06-18 16:44:29 +0900243}
244
Devin Moore7b8d5c92020-03-17 14:14:08 -0700245TEST_P(AidlTest, RejectsOnewayOutParameters) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700246 const string oneway_interface = "package a; oneway interface IBar { void f(out int bar); }";
247 const string expected_stderr =
248 "ERROR: a/IBar.aidl:1.40-42: oneway method 'f' cannot have out parameters\n";
Devin Moore7b8d5c92020-03-17 14:14:08 -0700249 CaptureStderr();
250 EXPECT_EQ(nullptr, Parse("a/IBar.aidl", oneway_interface, typenames_, GetLanguage()));
251 EXPECT_EQ(expected_stderr, GetCapturedStderr());
252 typenames_.Reset();
253
Devin Moore097a3ab2020-03-11 16:08:44 -0700254 const string oneway_method = "package a; interface IBar { oneway void f(out int bar); }";
255 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700256 EXPECT_EQ(nullptr, Parse("a/IBar.aidl", oneway_method, typenames_, GetLanguage()));
Devin Moore097a3ab2020-03-11 16:08:44 -0700257 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Christopher Wiley90be4e32015-10-20 14:55:25 -0700258}
259
Devin Moore7b8d5c92020-03-17 14:14:08 -0700260TEST_P(AidlTest, RejectsOnewayNonVoidReturn) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700261 const string oneway_method = "package a; interface IFoo { oneway int f(); }";
262 const string expected_stderr =
263 "ERROR: a/IFoo.aidl:1.39-41: oneway method 'f' cannot return a value\n";
264 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700265 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, GetLanguage()));
Devin Moore097a3ab2020-03-11 16:08:44 -0700266 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Christopher Wiley90be4e32015-10-20 14:55:25 -0700267}
268
Devin Moore7b8d5c92020-03-17 14:14:08 -0700269TEST_P(AidlTest, RejectsNullablePrimitive) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700270 const string oneway_method = "package a; interface IFoo { @nullable int f(); }";
271 const string expected_stderr =
272 "ERROR: a/IFoo.aidl:1.38-42: Primitive type cannot get nullable annotation\n";
273 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700274 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, GetLanguage()));
Devin Moore097a3ab2020-03-11 16:08:44 -0700275 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Casey Dahlin57dbe242015-12-04 11:44:02 -0800276}
277
Devin Moore7b8d5c92020-03-17 14:14:08 -0700278TEST_P(AidlTest, RejectsDuplicatedArgumentNames) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700279 const string method = "package a; interface IFoo { void f(int a, int a); }";
280 const string expected_stderr =
281 "ERROR: a/IFoo.aidl:1.33-35: method 'f' has duplicate argument name 'a'\n";
282 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700283 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, GetLanguage()));
Devin Moore097a3ab2020-03-11 16:08:44 -0700284 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Steven Morelandb3cd3c72018-10-11 12:37:45 -0700285}
286
Devin Moore7b8d5c92020-03-17 14:14:08 -0700287TEST_P(AidlTest, RejectsDuplicatedAnnotationParams) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700288 const string method = "package a; interface IFoo { @UnsupportedAppUsage(foo=1, foo=2)void f(); }";
289 const string expected_stderr = "ERROR: a/IFoo.aidl:1.56-62: Trying to redefine parameter foo.\n";
290 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700291 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, GetLanguage()));
Devin Moore097a3ab2020-03-11 16:08:44 -0700292 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Andrei Onea9445fc62019-06-27 18:11:59 +0100293}
294
Devin Moore7b8d5c92020-03-17 14:14:08 -0700295TEST_P(AidlTest, RejectUnsupportedInterfaceAnnotations) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700296 AidlError error;
297 const string method = "package a; @nullable interface IFoo { int f(); }";
298 const string expected_stderr =
Devin Moore24f68572020-02-26 13:20:59 -0800299 "ERROR: a/IFoo.aidl:1.21-31: 'nullable' is not a supported annotation for this node. "
Jiyong Parkbf5fd5c2020-06-05 19:48:05 +0900300 "It must be one of: Hide, UnsupportedAppUsage, VintfStability, JavaPassthrough\n";
Devin Moorec054bf82020-03-10 16:31:48 -0700301 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700302 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, GetLanguage(), &error));
Devin Moorec054bf82020-03-10 16:31:48 -0700303 EXPECT_EQ(expected_stderr, GetCapturedStderr());
304 EXPECT_EQ(AidlError::BAD_TYPE, error);
Devin Moore24f68572020-02-26 13:20:59 -0800305}
306
Devin Moore7b8d5c92020-03-17 14:14:08 -0700307TEST_P(AidlTest, RejectUnsupportedTypeAnnotations) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700308 AidlError error;
309 const string method = "package a; interface IFoo { @JavaOnlyStableParcelable int f(); }";
310 const string expected_stderr =
Devin Moore24f68572020-02-26 13:20:59 -0800311 "ERROR: a/IFoo.aidl:1.54-58: 'JavaOnlyStableParcelable' is not a supported annotation "
Jiyong Parkbf5fd5c2020-06-05 19:48:05 +0900312 "for this node. It must be one of: Hide, UnsupportedAppUsage, nullable, utf8InCpp, JavaPassthrough\n";
Devin Moorec054bf82020-03-10 16:31:48 -0700313 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700314 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", method, typenames_, GetLanguage(), &error));
Devin Moorec054bf82020-03-10 16:31:48 -0700315 EXPECT_EQ(expected_stderr, GetCapturedStderr());
316 EXPECT_EQ(AidlError::BAD_TYPE, error);
Devin Moore24f68572020-02-26 13:20:59 -0800317}
318
Devin Moore7b8d5c92020-03-17 14:14:08 -0700319TEST_P(AidlTest, RejectUnsupportedParcelableAnnotations) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700320 AidlError error;
321 const string method = "package a; @nullable parcelable IFoo cpp_header \"IFoo.h\";";
322 const string expected_stderr =
Devin Moore24f68572020-02-26 13:20:59 -0800323 "ERROR: a/Foo.aidl:1.32-37: 'nullable' is not a supported annotation for this node. "
Jiyong Parkbf5fd5c2020-06-05 19:48:05 +0900324 "It must be one of: Hide, JavaOnlyStableParcelable, UnsupportedAppUsage, VintfStability, JavaPassthrough\n";
Devin Moorec054bf82020-03-10 16:31:48 -0700325 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700326 EXPECT_EQ(nullptr, Parse("a/Foo.aidl", method, typenames_, GetLanguage(), &error));
Devin Moorec054bf82020-03-10 16:31:48 -0700327 EXPECT_EQ(expected_stderr, GetCapturedStderr());
328 EXPECT_EQ(AidlError::BAD_TYPE, error);
Devin Moore24f68572020-02-26 13:20:59 -0800329}
330
Devin Moore7b8d5c92020-03-17 14:14:08 -0700331TEST_P(AidlTest, RejectUnsupportedParcelableDefineAnnotations) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700332 AidlError error;
333 const string method = "package a; @nullable parcelable Foo { String a; String b; }";
334 const string expected_stderr =
Devin Moore24f68572020-02-26 13:20:59 -0800335 "ERROR: a/Foo.aidl:1.32-36: 'nullable' is not a supported annotation for this node. "
Jiyong Park43113fb2020-07-20 16:26:19 +0900336 "It must be one of: Hide, UnsupportedAppUsage, VintfStability, JavaPassthrough, JavaDebug\n";
Devin Moorec054bf82020-03-10 16:31:48 -0700337 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700338 EXPECT_EQ(nullptr, Parse("a/Foo.aidl", method, typenames_, GetLanguage(), &error));
Devin Moorec054bf82020-03-10 16:31:48 -0700339 EXPECT_EQ(expected_stderr, GetCapturedStderr());
340 EXPECT_EQ(AidlError::BAD_TYPE, error);
Devin Moore24f68572020-02-26 13:20:59 -0800341}
342
Devin Moore7b8d5c92020-03-17 14:14:08 -0700343TEST_P(AidlTest, ParsesNullableAnnotation) {
Christopher Wileyec31a052016-01-25 07:28:51 -0800344 for (auto is_nullable: {true, false}) {
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900345 auto parse_result = Parse("a/IFoo.aidl",
346 StringPrintf("package a; interface IFoo {%s String f(); }",
347 (is_nullable) ? "@nullable" : ""),
Devin Moore7b8d5c92020-03-17 14:14:08 -0700348 typenames_, GetLanguage());
Christopher Wileyec31a052016-01-25 07:28:51 -0800349 ASSERT_NE(nullptr, parse_result);
Steven Moreland5557f1c2018-07-02 13:50:23 -0700350 const AidlInterface* interface = parse_result->AsInterface();
351 ASSERT_NE(nullptr, interface);
352 ASSERT_FALSE(interface->GetMethods().empty());
353 EXPECT_EQ(interface->GetMethods()[0]->GetType().IsNullable(), is_nullable);
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900354 typenames_.Reset();
Christopher Wileyec31a052016-01-25 07:28:51 -0800355 }
356}
357
Devin Moore7b8d5c92020-03-17 14:14:08 -0700358TEST_P(AidlTest, ParsesUtf8Annotations) {
Christopher Wileyec31a052016-01-25 07:28:51 -0800359 for (auto is_utf8: {true, false}) {
360 auto parse_result = Parse(
361 "a/IFoo.aidl",
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900362 StringPrintf("package a; interface IFoo {%s String f(); }", (is_utf8) ? "@utf8InCpp" : ""),
Devin Moore7b8d5c92020-03-17 14:14:08 -0700363 typenames_, GetLanguage());
Christopher Wileyec31a052016-01-25 07:28:51 -0800364 ASSERT_NE(nullptr, parse_result);
Steven Moreland5557f1c2018-07-02 13:50:23 -0700365 const AidlInterface* interface = parse_result->AsInterface();
366 ASSERT_NE(nullptr, interface);
367 ASSERT_FALSE(interface->GetMethods().empty());
368 EXPECT_EQ(interface->GetMethods()[0]->GetType().IsUtf8InCpp(), is_utf8);
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900369 typenames_.Reset();
Christopher Wileyec31a052016-01-25 07:28:51 -0800370 }
371}
372
Devin Moore7b8d5c92020-03-17 14:14:08 -0700373TEST_P(AidlTest, VintfRequiresStructuredAndStability) {
Steven Morelanda57d0a62019-07-30 09:41:14 -0700374 AidlError error;
Devin Moore0d0e3f62020-03-30 17:45:39 -0700375 const string expected_stderr =
376 "ERROR: IFoo.aidl:1.16-26: Must compile @VintfStability type w/ aidl_interface 'stability: "
377 "\"vintf\"'\n"
378 "ERROR: IFoo.aidl:1.16-26: Must compile @VintfStability type w/ aidl_interface "
379 "--structured\n";
380 CaptureStderr();
Devin Moore097a3ab2020-03-11 16:08:44 -0700381 ASSERT_EQ(nullptr, Parse("IFoo.aidl", "@VintfStability interface IFoo {}", typenames_,
Devin Moore7b8d5c92020-03-17 14:14:08 -0700382 GetLanguage(), &error));
Devin Moore0d0e3f62020-03-30 17:45:39 -0700383 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Steven Morelanda57d0a62019-07-30 09:41:14 -0700384 ASSERT_EQ(AidlError::NOT_STRUCTURED, error);
Steven Morelanda57d0a62019-07-30 09:41:14 -0700385}
386
Devin Moore7b8d5c92020-03-17 14:14:08 -0700387TEST_P(AidlTest, VintfRequiresStructured) {
Steven Morelanda57d0a62019-07-30 09:41:14 -0700388 AidlError error;
Devin Moore0d0e3f62020-03-30 17:45:39 -0700389 const string expected_stderr =
390 "ERROR: IFoo.aidl:1.16-26: Must compile @VintfStability type w/ aidl_interface "
391 "--structured\n";
392 CaptureStderr();
Devin Moore097a3ab2020-03-11 16:08:44 -0700393 ASSERT_EQ(nullptr, Parse("IFoo.aidl", "@VintfStability interface IFoo {}", typenames_,
Devin Moore7b8d5c92020-03-17 14:14:08 -0700394 GetLanguage(), &error, {"--stability", "vintf"}));
Devin Moore0d0e3f62020-03-30 17:45:39 -0700395 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Steven Morelanda57d0a62019-07-30 09:41:14 -0700396 ASSERT_EQ(AidlError::NOT_STRUCTURED, error);
Steven Morelanda57d0a62019-07-30 09:41:14 -0700397}
398
Devin Moore7b8d5c92020-03-17 14:14:08 -0700399TEST_P(AidlTest, VintfRequiresSpecifiedStability) {
Steven Morelanda57d0a62019-07-30 09:41:14 -0700400 AidlError error;
Devin Moore097a3ab2020-03-11 16:08:44 -0700401 const string expected_stderr =
402 "ERROR: IFoo.aidl:1.16-26: Must compile @VintfStability type w/ aidl_interface 'stability: "
403 "\"vintf\"'\n";
404 CaptureStderr();
405 ASSERT_EQ(nullptr, Parse("IFoo.aidl", "@VintfStability interface IFoo {}", typenames_,
Devin Moore7b8d5c92020-03-17 14:14:08 -0700406 GetLanguage(), &error, {"--structured"}));
Devin Moore097a3ab2020-03-11 16:08:44 -0700407 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Steven Morelanda57d0a62019-07-30 09:41:14 -0700408 ASSERT_EQ(AidlError::NOT_STRUCTURED, error);
Steven Morelanda57d0a62019-07-30 09:41:14 -0700409}
410
Devin Moore7b8d5c92020-03-17 14:14:08 -0700411TEST_P(AidlTest, ParsesStabilityAnnotations) {
Steven Morelanda57d0a62019-07-30 09:41:14 -0700412 AidlError error;
Devin Moore7b8d5c92020-03-17 14:14:08 -0700413 auto parse_result = Parse("IFoo.aidl", "@VintfStability interface IFoo {}", typenames_,
414 GetLanguage(), &error, {"--structured", "--stability", "vintf"});
Steven Morelanda57d0a62019-07-30 09:41:14 -0700415 ASSERT_EQ(AidlError::OK, error);
416 ASSERT_NE(nullptr, parse_result);
417 const AidlInterface* interface = parse_result->AsInterface();
418 ASSERT_NE(nullptr, interface);
419 ASSERT_TRUE(interface->IsVintfStability());
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900420 typenames_.Reset();
Steven Morelanda57d0a62019-07-30 09:41:14 -0700421}
422
Jeongik Cha64783ed2019-06-07 18:30:54 +0900423TEST_F(AidlTest, ParsesJavaOnlyStableParcelable) {
424 Options java_options = Options::From("aidl -o out --structured a/Foo.aidl");
Jeongik Cha88f95a82020-01-15 13:02:16 +0900425 Options cpp_options = Options::From("aidl --lang=cpp -o out -h out/include a/Foo.aidl");
426 Options cpp_structured_options =
Jeongik Cha64783ed2019-06-07 18:30:54 +0900427 Options::From("aidl --lang=cpp --structured -o out -h out/include a/Foo.aidl");
428 io_delegate_.SetFileContents(
Jeongik Cha88f95a82020-01-15 13:02:16 +0900429 "a/Foo.aidl",
430 StringPrintf("package a; @JavaOnlyStableParcelable parcelable Foo cpp_header \"Foo.h\" ;"));
Jeongik Cha64783ed2019-06-07 18:30:54 +0900431
432 EXPECT_EQ(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
Jeongik Cha88f95a82020-01-15 13:02:16 +0900433 EXPECT_EQ(0, ::android::aidl::compile_aidl(cpp_options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -0700434 const string expected_stderr =
Jeongik Cha88f95a82020-01-15 13:02:16 +0900435 "ERROR: a/Foo.aidl:1.48-52: Cannot declared parcelable in a --structured interface. "
Devin Moorec054bf82020-03-10 16:31:48 -0700436 "Parcelable must be defined in AIDL directly.\n";
437 CaptureStderr();
Jeongik Cha88f95a82020-01-15 13:02:16 +0900438 EXPECT_NE(0, ::android::aidl::compile_aidl(cpp_structured_options, io_delegate_));
Devin Moorec054bf82020-03-10 16:31:48 -0700439 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jeongik Cha64783ed2019-06-07 18:30:54 +0900440}
441
Jiyong Park43113fb2020-07-20 16:26:19 +0900442TEST_F(AidlTest, ParsesJavaDebugAnnotation) {
443 io_delegate_.SetFileContents("a/IFoo.aidl", R"(package a;
444 @JavaDebug parcelable IFoo { int a; float b; })");
445 Options java_options = Options::From("aidl --lang=java -o out a/IFoo.aidl");
446 EXPECT_EQ(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
447
448 string java_out;
449 EXPECT_TRUE(io_delegate_.GetWrittenContents("out/a/IFoo.java", &java_out));
450 EXPECT_THAT(java_out, testing::HasSubstr("public String toString() {"));
451
452 // Other backends shouldn't be bothered
453 Options cpp_options = Options::From("aidl --lang=cpp -o out -h out a/IFoo.aidl");
454 EXPECT_EQ(0, ::android::aidl::compile_aidl(cpp_options, io_delegate_));
455
456 Options ndk_options = Options::From("aidl --lang=ndk -o out -h out a/IFoo.aidl");
457 EXPECT_EQ(0, ::android::aidl::compile_aidl(ndk_options, io_delegate_));
458}
459
460TEST_F(AidlTest, RejectsJavaDebugAnnotation) {
461 {
462 io_delegate_.SetFileContents("a/IFoo.aidl", "package a; @JavaDebug interface IFoo{}");
463 Options java_options = Options::From("aidl --lang=java -o out a/IFoo.aidl");
464 CaptureStderr();
465 EXPECT_NE(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
466 const std::string expected_stderr =
467 "ERROR: a/IFoo.aidl:1.22-32: 'JavaDebug' is not a supported annotation for this node. "
468 "It must be one of: Hide, UnsupportedAppUsage, VintfStability, JavaPassthrough\n";
469 EXPECT_EQ(expected_stderr, GetCapturedStderr());
470 }
471
472 {
473 io_delegate_.SetFileContents("a/IFoo.aidl", "package a; @JavaDebug enum IFoo { A=1, }");
474 Options java_options = Options::From("aidl --lang=java -o out a/IFoo.aidl");
475 CaptureStderr();
476 EXPECT_NE(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
477 const std::string expected_stderr =
478 "ERROR: a/IFoo.aidl:1.27-32: 'JavaDebug' is not a supported annotation for this node. "
479 "It must be one of: Backing, Hide, VintfStability, JavaPassthrough\n";
480 EXPECT_EQ(expected_stderr, GetCapturedStderr());
481 }
482}
483
Devin Moore7b8d5c92020-03-17 14:14:08 -0700484TEST_P(AidlTest, AcceptsOneway) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700485 const string oneway_method = "package a; interface IFoo { oneway void f(int a); }";
486 const string oneway_interface = "package a; oneway interface IBar { void f(int a); }";
Devin Moore7b8d5c92020-03-17 14:14:08 -0700487 EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, GetLanguage()));
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900488 typenames_.Reset();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700489 EXPECT_NE(nullptr, Parse("a/IBar.aidl", oneway_interface, typenames_, GetLanguage()));
Christopher Wiley90be4e32015-10-20 14:55:25 -0700490}
Christopher Wileyef140932015-11-03 09:29:19 -0800491
Devin Moore7b8d5c92020-03-17 14:14:08 -0700492TEST_P(AidlTest, AcceptsAnnotatedOnewayMethod) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700493 const string oneway_method =
494 "package a; interface IFoo { @UnsupportedAppUsage oneway void f(int a); }";
Devin Moore7b8d5c92020-03-17 14:14:08 -0700495 EXPECT_NE(nullptr, Parse("a/IFoo.aidl", oneway_method, typenames_, GetLanguage()));
Artur Satayev91fe8712019-07-29 13:06:01 +0100496}
497
Steven Moreland65297cc2020-04-20 20:17:36 -0700498TEST_P(AidlTest, AnnotationsInMultiplePlaces) {
499 const string oneway_method =
500 "package a; interface IFoo { @UnsupportedAppUsage oneway @Hide void f(int a); }";
501 const AidlDefinedType* defined = Parse("a/IFoo.aidl", oneway_method, typenames_, GetLanguage());
502 ASSERT_NE(nullptr, defined);
503 const AidlInterface* iface = defined->AsInterface();
504 ASSERT_NE(nullptr, iface);
505
506 const auto& methods = iface->GetMethods();
507 ASSERT_EQ(1u, methods.size());
508 const auto& method = methods[0];
509 const AidlTypeSpecifier& ret_type = method->GetType();
510
511 // TODO(b/151102494): these annotations should be on the method
512 ASSERT_NE(nullptr, ret_type.UnsupportedAppUsage());
513 ASSERT_TRUE(ret_type.IsHide());
514}
515
Devin Moore7b8d5c92020-03-17 14:14:08 -0700516TEST_P(AidlTest, WritesComments) {
Artur Satayev91fe8712019-07-29 13:06:01 +0100517 string foo_interface =
518 "package a; /* foo */ interface IFoo {"
519 " /* i */ int i();"
520 " /* j */ @nullable String j();"
521 " /* k */ @UnsupportedAppUsage oneway void k(int a); }";
522
Devin Moore7b8d5c92020-03-17 14:14:08 -0700523 auto parse_result = Parse("a/IFoo.aidl", foo_interface, typenames_, GetLanguage());
Artur Satayev91fe8712019-07-29 13:06:01 +0100524 EXPECT_NE(nullptr, parse_result);
525 EXPECT_EQ("/* foo */", parse_result->GetComments());
526
527 const AidlInterface* interface = parse_result->AsInterface();
528 EXPECT_EQ("/* i */", interface->GetMethods()[0]->GetComments());
529 EXPECT_EQ("/* j */", interface->GetMethods()[1]->GetComments());
530 EXPECT_EQ("/* k */", interface->GetMethods()[2]->GetComments());
531}
532
Christopher Wileyef140932015-11-03 09:29:19 -0800533TEST_F(AidlTest, ParsesPreprocessedFile) {
534 string simple_content = "parcelable a.Foo;\ninterface b.IBar;";
535 io_delegate_.SetFileContents("path", simple_content);
Steven Morelandcb1bcd72020-04-29 16:30:35 -0700536 EXPECT_FALSE(typenames_.ResolveTypename("a.Foo").is_resolved);
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900537 EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &typenames_));
Steven Morelandcb1bcd72020-04-29 16:30:35 -0700538 EXPECT_TRUE(typenames_.ResolveTypename("a.Foo").is_resolved);
539 EXPECT_TRUE(typenames_.ResolveTypename("b.IBar").is_resolved);
Christopher Wileyef140932015-11-03 09:29:19 -0800540}
541
542TEST_F(AidlTest, ParsesPreprocessedFileWithWhitespace) {
543 string simple_content = "parcelable a.Foo;\n interface b.IBar ;\t";
544 io_delegate_.SetFileContents("path", simple_content);
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900545
Steven Morelandcb1bcd72020-04-29 16:30:35 -0700546 EXPECT_FALSE(typenames_.ResolveTypename("a.Foo").is_resolved);
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900547 EXPECT_TRUE(parse_preprocessed_file(io_delegate_, "path", &typenames_));
Steven Morelandcb1bcd72020-04-29 16:30:35 -0700548 EXPECT_TRUE(typenames_.ResolveTypename("a.Foo").is_resolved);
549 EXPECT_TRUE(typenames_.ResolveTypename("b.IBar").is_resolved);
Christopher Wileyef140932015-11-03 09:29:19 -0800550}
551
Devin Moore7b8d5c92020-03-17 14:14:08 -0700552TEST_P(AidlTest, PreferImportToPreprocessed) {
Christopher Wiley41544372015-11-03 14:52:29 -0800553 io_delegate_.SetFileContents("preprocessed", "interface another.IBar;");
554 io_delegate_.SetFileContents("one/IBar.aidl", "package one; "
555 "interface IBar {}");
556 preprocessed_files_.push_back("preprocessed");
Jiyong Park8c380532018-08-30 14:55:26 +0900557 import_paths_.emplace("");
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900558 auto parse_result = Parse("p/IFoo.aidl", "package p; import one.IBar; interface IFoo {}",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700559 typenames_, GetLanguage());
Christopher Wiley41544372015-11-03 14:52:29 -0800560 EXPECT_NE(nullptr, parse_result);
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900561
Christopher Wiley41544372015-11-03 14:52:29 -0800562 // We expect to know about both kinds of IBar
Steven Morelandcb1bcd72020-04-29 16:30:35 -0700563 EXPECT_TRUE(typenames_.ResolveTypename("one.IBar").is_resolved);
564 EXPECT_TRUE(typenames_.ResolveTypename("another.IBar").is_resolved);
Christopher Wiley41544372015-11-03 14:52:29 -0800565 // But if we request just "IBar" we should get our imported one.
Steven Moreland02e012e2018-08-02 14:58:10 -0700566 AidlTypeSpecifier ambiguous_type(AIDL_LOCATION_HERE, "IBar", false, nullptr, "");
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900567 ambiguous_type.Resolve(typenames_);
568 EXPECT_EQ("one.IBar", ambiguous_type.GetName());
Christopher Wiley41544372015-11-03 14:52:29 -0800569}
570
Jiyong Park8f6ec462020-01-19 20:52:47 +0900571// Special case of PreferImportToPreprocessed. Imported type should be preferred
572// even when the preprocessed file already has the same type.
Devin Moore7b8d5c92020-03-17 14:14:08 -0700573TEST_P(AidlTest, B147918827) {
Jiyong Park8f6ec462020-01-19 20:52:47 +0900574 io_delegate_.SetFileContents("preprocessed", "interface another.IBar;\ninterface one.IBar;");
575 io_delegate_.SetFileContents("one/IBar.aidl",
576 "package one; "
577 "interface IBar {}");
578 preprocessed_files_.push_back("preprocessed");
579 import_paths_.emplace("");
580 auto parse_result = Parse("p/IFoo.aidl", "package p; import one.IBar; interface IFoo {}",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700581 typenames_, GetLanguage());
Jiyong Park8f6ec462020-01-19 20:52:47 +0900582 EXPECT_NE(nullptr, parse_result);
583
584 // We expect to know about both kinds of IBar
Steven Morelandcb1bcd72020-04-29 16:30:35 -0700585 EXPECT_TRUE(typenames_.ResolveTypename("one.IBar").is_resolved);
586 EXPECT_TRUE(typenames_.ResolveTypename("another.IBar").is_resolved);
Jiyong Park8f6ec462020-01-19 20:52:47 +0900587 // But if we request just "IBar" we should get our imported one.
588 AidlTypeSpecifier ambiguous_type(AIDL_LOCATION_HERE, "IBar", false, nullptr, "");
589 ambiguous_type.Resolve(typenames_);
590 EXPECT_EQ("one.IBar", ambiguous_type.GetName());
591}
592
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800593TEST_F(AidlTest, WritePreprocessedFile) {
594 io_delegate_.SetFileContents("p/Outer.aidl",
595 "package p; parcelable Outer.Inner;");
596 io_delegate_.SetFileContents("one/IBar.aidl", "package one; import p.Outer;"
597 "interface IBar {}");
598
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900599 vector<string> args {
600 "aidl",
601 "--preprocess",
602 "preprocessed",
603 "p/Outer.aidl",
604 "one/IBar.aidl"};
605 Options options = Options::From(args);
Casey Dahlinc1f39b42015-11-24 10:34:34 -0800606 EXPECT_TRUE(::android::aidl::preprocess_aidl(options, io_delegate_));
607
608 string output;
609 EXPECT_TRUE(io_delegate_.GetWrittenContents("preprocessed", &output));
610 EXPECT_EQ("parcelable p.Outer.Inner;\ninterface one.IBar;\n", output);
611}
612
Jeongik Chaa755c2a2018-12-12 16:28:23 +0900613TEST_F(AidlTest, JavaParcelableOutput) {
Andrei Onea9445fc62019-06-27 18:11:59 +0100614 io_delegate_.SetFileContents(
615 "Rect.aidl",
Makoto Onuki78a1c1c2020-03-04 16:57:23 -0800616 "@Hide\n"
Andrei Onea9445fc62019-06-27 18:11:59 +0100617 "parcelable Rect {\n"
618 " // Comment\n"
Makoto Onuki78a1c1c2020-03-04 16:57:23 -0800619 " @Hide\n"
Andrei Onea9445fc62019-06-27 18:11:59 +0100620 " int x=5;\n"
Makoto Onuki78a1c1c2020-03-04 16:57:23 -0800621 " @Hide\n"
Andrei Onea9445fc62019-06-27 18:11:59 +0100622 " @UnsupportedAppUsage(maxTargetSdk = 28, trackingBug = 42, implicitMember = \"dummy\", "
Andrei Onea07fa3e02019-07-04 17:55:19 +0100623 "expectedSignature = \"dummy\", publicAlternatives = \"d\" \n + \"u\" + \n \"m\" \n + \"m\" "
624 "+ \"y\")\n"
Andrei Onea9445fc62019-06-27 18:11:59 +0100625 " int y;\n"
Jiyong Parkd4e73c82019-07-24 21:39:15 +0900626 " ParcelFileDescriptor fd;\n"
Andrei Onea9445fc62019-06-27 18:11:59 +0100627 "}");
Jeongik Chaa755c2a2018-12-12 16:28:23 +0900628
629 vector<string> args{"aidl", "Rect.aidl"};
630 Options options = Options::From(args);
631 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
632
633 string output;
634 EXPECT_TRUE(io_delegate_.GetWrittenContents("Rect.java", &output));
Jiyong Parkd4e73c82019-07-24 21:39:15 +0900635 EXPECT_EQ(kExpectedJavaParcelableOutputContests, output);
Jeongik Chaa755c2a2018-12-12 16:28:23 +0900636}
637
Devin Moore7b8d5c92020-03-17 14:14:08 -0700638TEST_P(AidlTest, RequireOuterClass) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700639 const string expected_stderr = "ERROR: p/IFoo.aidl:1.54-60: Failed to resolve 'Inner'\n";
Christopher Wiley63bce2a2015-11-03 14:55:03 -0800640 io_delegate_.SetFileContents("p/Outer.aidl",
641 "package p; parcelable Outer.Inner;");
Jiyong Park8c380532018-08-30 14:55:26 +0900642 import_paths_.emplace("");
Devin Moore097a3ab2020-03-11 16:08:44 -0700643 CaptureStderr();
644 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
645 "package p; import p.Outer; interface IFoo { void f(in Inner c); }",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700646 typenames_, GetLanguage()));
Devin Moore097a3ab2020-03-11 16:08:44 -0700647 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Christopher Wiley63bce2a2015-11-03 14:55:03 -0800648}
649
Devin Moore7b8d5c92020-03-17 14:14:08 -0700650TEST_P(AidlTest, ParseCompoundParcelableFromPreprocess) {
Christopher Wiley63bce2a2015-11-03 14:55:03 -0800651 io_delegate_.SetFileContents("preprocessed",
652 "parcelable p.Outer.Inner;");
653 preprocessed_files_.push_back("preprocessed");
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900654 auto parse_result = Parse("p/IFoo.aidl", "package p; interface IFoo { void f(in Inner c); }",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700655 typenames_, GetLanguage());
Christopher Wiley63bce2a2015-11-03 14:55:03 -0800656 // TODO(wiley): This should actually return nullptr because we require
657 // the outer class name. However, for legacy reasons,
658 // this behavior must be maintained. b/17415692
659 EXPECT_NE(nullptr, parse_result);
660}
661
Christopher Wiley632801d2015-11-05 14:15:49 -0800662TEST_F(AidlTest, FailOnParcelable) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700663 const string expected_foo_stderr =
664 "ERROR: p/IFoo.aidl:1.22-27: Refusing to generate code with unstructured parcelables. "
665 "Declared parcelables should be in their own file and/or cannot be used with --structured "
666 "interfaces.\n";
Steven Morelande2c64b42018-09-18 15:06:37 -0700667 io_delegate_.SetFileContents("p/IFoo.aidl", "package p; parcelable IFoo;");
668
Christopher Wiley632801d2015-11-05 14:15:49 -0800669 // By default, we shouldn't fail on parcelable.
Steven Morelande2c64b42018-09-18 15:06:37 -0700670 Options options1 = Options::From("aidl p/IFoo.aidl");
Devin Moore097a3ab2020-03-11 16:08:44 -0700671 CaptureStderr();
Jiyong Parkb034bf02018-07-30 17:44:33 +0900672 EXPECT_EQ(0, ::android::aidl::compile_aidl(options1, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -0700673 EXPECT_EQ("", GetCapturedStderr());
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900674
Steven Morelande2c64b42018-09-18 15:06:37 -0700675 // -b considers this an error
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900676 Options options2 = Options::From("aidl -b p/IFoo.aidl");
Devin Moore097a3ab2020-03-11 16:08:44 -0700677 CaptureStderr();
Jiyong Parkb034bf02018-07-30 17:44:33 +0900678 EXPECT_NE(0, ::android::aidl::compile_aidl(options2, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -0700679 EXPECT_EQ(expected_foo_stderr, GetCapturedStderr());
Steven Morelande2c64b42018-09-18 15:06:37 -0700680
Devin Moore097a3ab2020-03-11 16:08:44 -0700681 const string expected_bar_stderr =
682 "ERROR: p/IBar.aidl:1.22-26: Refusing to generate code with unstructured parcelables. "
683 "Declared parcelables should be in their own file and/or cannot be used with --structured "
684 "interfaces.\n";
Steven Morelande2c64b42018-09-18 15:06:37 -0700685 io_delegate_.SetFileContents("p/IBar.aidl", "package p; parcelable Foo; interface IBar{}");
686
Jiyong Parkda8c6932019-08-12 19:56:08 +0900687 // With '-b' option, a parcelable and an interface should fail.
Steven Morelande2c64b42018-09-18 15:06:37 -0700688 Options options3 = Options::From("aidl p/IBar.aidl");
Devin Moore097a3ab2020-03-11 16:08:44 -0700689 CaptureStderr();
Jiyong Parkda8c6932019-08-12 19:56:08 +0900690 EXPECT_EQ(0, ::android::aidl::compile_aidl(options3, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -0700691 EXPECT_EQ("", GetCapturedStderr());
Steven Morelande2c64b42018-09-18 15:06:37 -0700692 Options options4 = Options::From("aidl -b p/IBar.aidl");
Devin Moore097a3ab2020-03-11 16:08:44 -0700693 CaptureStderr();
Steven Morelande2c64b42018-09-18 15:06:37 -0700694 EXPECT_NE(0, ::android::aidl::compile_aidl(options4, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -0700695 EXPECT_EQ(expected_bar_stderr, GetCapturedStderr());
Christopher Wiley632801d2015-11-05 14:15:49 -0800696}
697
Devin Moore7b8d5c92020-03-17 14:14:08 -0700698TEST_P(AidlTest, StructuredFailOnUnstructuredParcelable) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700699 const string expected_stderr =
700 "ERROR: ./o/WhoKnowsWhat.aidl:1.22-35: o.WhoKnowsWhat is not structured, but this is a "
701 "structured interface.\n";
Steven Moreland1eac5fa2018-08-27 19:35:05 -0700702 io_delegate_.SetFileContents("o/WhoKnowsWhat.aidl", "package o; parcelable WhoKnowsWhat;");
703 import_paths_.emplace("");
Devin Moore097a3ab2020-03-11 16:08:44 -0700704 AidlError error;
705 CaptureStderr();
706 EXPECT_EQ(
707 nullptr,
Steven Moreland1eac5fa2018-08-27 19:35:05 -0700708 Parse("p/IFoo.aidl",
709 "package p; import o.WhoKnowsWhat; interface IFoo { void f(in WhoKnowsWhat thisIs); }",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700710 typenames_, GetLanguage(), &error, {"--structured"}));
Devin Moore097a3ab2020-03-11 16:08:44 -0700711 EXPECT_EQ(expected_stderr, GetCapturedStderr());
712 EXPECT_EQ(AidlError::NOT_STRUCTURED, error);
Steven Moreland1eac5fa2018-08-27 19:35:05 -0700713}
714
Devin Moore7b8d5c92020-03-17 14:14:08 -0700715TEST_P(AidlTest, FailOnDuplicateConstantNames) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700716 AidlError error;
717 const string expected_stderr =
718 "ERROR: p/IFoo.aidl:4.34-45: Found duplicate constant name 'DUPLICATED'\n";
719 CaptureStderr();
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900720 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
721 R"(package p;
Christopher Wiley69b44cf2016-05-03 13:43:33 -0700722 interface IFoo {
723 const String DUPLICATED = "d";
724 const int DUPLICATED = 1;
725 }
726 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700727 typenames_, GetLanguage(), &error));
Devin Moore097a3ab2020-03-11 16:08:44 -0700728 EXPECT_EQ(expected_stderr, GetCapturedStderr());
729 EXPECT_EQ(AidlError::BAD_TYPE, error);
Christopher Wiley69b44cf2016-05-03 13:43:33 -0700730}
731
Devin Moore7b8d5c92020-03-17 14:14:08 -0700732TEST_P(AidlTest, FailOnManyDefinedTypes) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700733 AidlError error;
Devin Moore5de18ed2020-04-02 13:52:29 -0700734 const string expected_stderr =
735 "ERROR: p/IFoo.aidl:3.33-38: You must declare only one type per file.\n";
Devin Moorec054bf82020-03-10 16:31:48 -0700736 CaptureStderr();
Steven Morelandc258abc2018-07-10 14:03:38 -0700737 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
738 R"(package p;
739 interface IFoo {}
Steven Morelandc258abc2018-07-10 14:03:38 -0700740 parcelable IBar {}
741 parcelable StructuredParcelable {}
742 interface IBaz {}
Jeongik Cha2a5b4d82019-08-06 19:37:59 +0900743 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700744 typenames_, GetLanguage(), &error));
Devin Moorec054bf82020-03-10 16:31:48 -0700745 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Steven Morelandc258abc2018-07-10 14:03:38 -0700746 // Parse success is important for clear error handling even if the cases aren't
747 // actually supported in code generation.
Devin Moore097a3ab2020-03-11 16:08:44 -0700748 EXPECT_EQ(AidlError::BAD_TYPE, error);
Steven Morelandc258abc2018-07-10 14:03:38 -0700749}
750
Devin Moore7b8d5c92020-03-17 14:14:08 -0700751TEST_P(AidlTest, FailOnNoDefinedTypes) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700752 AidlError error;
753 const string expected_stderr = "ERROR: p/IFoo.aidl:1.11-11: syntax error, unexpected $end\n";
754 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -0700755 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl", R"(package p;)", typenames_, GetLanguage(), &error));
Devin Moore097a3ab2020-03-11 16:08:44 -0700756 EXPECT_EQ(expected_stderr, GetCapturedStderr());
757 EXPECT_EQ(AidlError::PARSE_ERROR, error);
Steven Morelandc258abc2018-07-10 14:03:38 -0700758}
759
Steven Morelandf9e922f2020-07-08 21:15:27 +0000760TEST_P(AidlTest, FailOnEmptyListWithComma) {
761 AidlError error;
762 const string expected_stderr =
763 "ERROR: p/Foo.aidl:1.45-47: syntax error, unexpected ',', expecting '}'\n";
764 CaptureStderr();
765 EXPECT_EQ(nullptr, Parse("p/Foo.aidl", R"(package p; parcelable Foo { uint64_t[] a = { , }; })",
766 typenames_, GetLanguage(), &error));
767 EXPECT_EQ(expected_stderr, GetCapturedStderr());
768 EXPECT_EQ(AidlError::PARSE_ERROR, error);
769}
770
Devin Moore7b8d5c92020-03-17 14:14:08 -0700771TEST_P(AidlTest, FailOnMalformedConstHexValue) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700772 AidlError error;
773 const string expected_stderr =
774 "ERROR: Could not parse hexvalue: 0xffffffffffffffffff at p/IFoo.aidl:3.50-70.\n";
775 CaptureStderr();
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900776 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
777 R"(package p;
Roshan Pius3b2203d2016-07-22 16:13:20 -0700778 interface IFoo {
779 const int BAD_HEX_VALUE = 0xffffffffffffffffff;
780 }
781 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700782 typenames_, GetLanguage(), &error));
Devin Moore097a3ab2020-03-11 16:08:44 -0700783 EXPECT_EQ(expected_stderr, GetCapturedStderr());
784 EXPECT_EQ(AidlError::PARSE_ERROR, error);
Roshan Pius3b2203d2016-07-22 16:13:20 -0700785}
786
Jiyong Park18132182020-06-08 20:24:40 +0900787TEST_P(AidlTest, FailOnMalformedQualifiedNameAsIdentifier) {
788 AidlError error;
789 const string expected_stderr =
790 "ERROR: p/IFoo.aidl:1.25-26: syntax error, unexpected ';', expecting identifier or "
791 "cpp_header (which can also be used as an identifier)\n";
792 CaptureStderr();
793 // Notice the trailing dot(.) in the name, which isn't a correct name
794 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl", R"(package p; parcelable A.; )", typenames_,
795 GetLanguage(), &error));
796 EXPECT_EQ(expected_stderr, GetCapturedStderr());
797 EXPECT_EQ(AidlError::PARSE_ERROR, error);
798}
799
800TEST_P(AidlTest, FailOnMalformedQualifiedNameAsPackage) {
801 AidlError error;
802 const string expected_stderr =
803 "ERROR: p/IFoo.aidl:1.11-12: syntax error, unexpected ';', expecting identifier or "
804 "cpp_header (which can also be used as an identifier)\n";
805 CaptureStderr();
806 // Notice the trailing dot(.) in the package name
807 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl", R"(package p.; parcelable A; )", typenames_,
808 GetLanguage(), &error));
809 EXPECT_EQ(expected_stderr, GetCapturedStderr());
810 EXPECT_EQ(AidlError::PARSE_ERROR, error);
811}
812
Devin Moore7b8d5c92020-03-17 14:14:08 -0700813TEST_P(AidlTest, ParsePositiveConstHexValue) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700814 AidlError error;
Devin Moore7b8d5c92020-03-17 14:14:08 -0700815 auto parse_result = Parse("p/IFoo.aidl",
816 R"(package p;
Roshan Pius3b2203d2016-07-22 16:13:20 -0700817 interface IFoo {
818 const int POSITIVE_HEX_VALUE = 0xf5;
819 }
820 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700821 typenames_, GetLanguage(), &error);
822 EXPECT_NE(nullptr, parse_result);
823 const AidlInterface* interface = parse_result->AsInterface();
Steven Moreland5557f1c2018-07-02 13:50:23 -0700824 ASSERT_NE(nullptr, interface);
Steven Moreland693640b2018-07-19 13:46:27 -0700825 const auto& cpp_constants = interface->GetConstantDeclarations();
826 EXPECT_EQ((size_t)1, cpp_constants.size());
827 EXPECT_EQ("POSITIVE_HEX_VALUE", cpp_constants[0]->GetName());
Will McVickerd7d18df2019-09-12 13:40:50 -0700828 EXPECT_TRUE(cpp_constants[0]->CheckValid(typenames_));
Steven Moreland860b1942018-08-16 14:59:28 -0700829 EXPECT_EQ("245", cpp_constants[0]->ValueString(cpp::ConstantValueDecorator));
Roshan Pius3b2203d2016-07-22 16:13:20 -0700830}
831
Devin Moore7b8d5c92020-03-17 14:14:08 -0700832TEST_P(AidlTest, ParseNegativeConstHexValue) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700833 AidlError error;
Devin Moore7b8d5c92020-03-17 14:14:08 -0700834 auto parse_result = Parse("p/IFoo.aidl",
835 R"(package p;
Roshan Pius3b2203d2016-07-22 16:13:20 -0700836 interface IFoo {
837 const int NEGATIVE_HEX_VALUE = 0xffffffff;
838 }
839 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -0700840 typenames_, GetLanguage(), &error);
841 ASSERT_NE(nullptr, parse_result);
842 const AidlInterface* interface = parse_result->AsInterface();
Steven Moreland5557f1c2018-07-02 13:50:23 -0700843 ASSERT_NE(nullptr, interface);
Steven Moreland693640b2018-07-19 13:46:27 -0700844 const auto& cpp_constants = interface->GetConstantDeclarations();
845 EXPECT_EQ((size_t)1, cpp_constants.size());
846 EXPECT_EQ("NEGATIVE_HEX_VALUE", cpp_constants[0]->GetName());
Will McVickerd7d18df2019-09-12 13:40:50 -0700847 EXPECT_EQ(true, cpp_constants[0]->CheckValid(typenames_));
Steven Moreland860b1942018-08-16 14:59:28 -0700848 EXPECT_EQ("-1", cpp_constants[0]->ValueString(cpp::ConstantValueDecorator));
Roshan Pius3b2203d2016-07-22 16:13:20 -0700849}
850
Devin Moore7b8d5c92020-03-17 14:14:08 -0700851TEST_P(AidlTest, UnderstandsNestedParcelables) {
Ningyuan Wangd17c58b2016-09-29 14:33:14 -0700852 io_delegate_.SetFileContents(
853 "p/Outer.aidl",
854 "package p; parcelable Outer.Inner cpp_header \"baz/header\";");
Jiyong Park8c380532018-08-30 14:55:26 +0900855 import_paths_.emplace("");
Ningyuan Wangd17c58b2016-09-29 14:33:14 -0700856 const string input_path = "p/IFoo.aidl";
857 const string input = "package p; import p.Outer; interface IFoo"
858 " { Outer.Inner get(); }";
859
Devin Moore7b8d5c92020-03-17 14:14:08 -0700860 auto parse_result = Parse(input_path, input, typenames_, GetLanguage());
861 EXPECT_NE(nullptr, parse_result);
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900862
Steven Morelandcb1bcd72020-04-29 16:30:35 -0700863 EXPECT_TRUE(typenames_.ResolveTypename("p.Outer.Inner").is_resolved);
Ningyuan Wangd17c58b2016-09-29 14:33:14 -0700864 // C++ uses "::" instead of "." to refer to a inner class.
Jeongik Cha047c5ee2019-08-07 23:16:49 +0900865 AidlTypeSpecifier nested_type(AIDL_LOCATION_HERE, "p.Outer.Inner", false, nullptr, "");
866 EXPECT_EQ("::p::Outer::Inner", cpp::CppNameOf(nested_type, typenames_));
Ningyuan Wangd17c58b2016-09-29 14:33:14 -0700867}
868
Devin Moore7b8d5c92020-03-17 14:14:08 -0700869TEST_P(AidlTest, UnderstandsNativeParcelables) {
Christopher Wiley9078d722015-11-17 10:23:49 -0800870 io_delegate_.SetFileContents(
871 "p/Bar.aidl",
Casey Dahlincd639212015-12-15 12:51:04 -0800872 "package p; parcelable Bar cpp_header \"baz/header\";");
Jiyong Park8c380532018-08-30 14:55:26 +0900873 import_paths_.emplace("");
Christopher Wiley9078d722015-11-17 10:23:49 -0800874 const string input_path = "p/IFoo.aidl";
875 const string input = "package p; import p.Bar; interface IFoo { }";
Devin Moore7b8d5c92020-03-17 14:14:08 -0700876 auto parse_result = Parse(input_path, input, typenames_, GetLanguage());
877 EXPECT_NE(nullptr, parse_result);
Steven Morelandcb1bcd72020-04-29 16:30:35 -0700878 EXPECT_TRUE(typenames_.ResolveTypename("p.Bar").is_resolved);
Devin Moore7b8d5c92020-03-17 14:14:08 -0700879 AidlTypeSpecifier native_type(AIDL_LOCATION_HERE, "p.Bar", false, nullptr, "");
880 native_type.Resolve(typenames_);
881
882 EXPECT_EQ("p.Bar", java::InstantiableJavaSignatureOf(native_type, typenames_));
883 // C++ understands C++ specific stuff
884 EXPECT_EQ("::p::Bar", cpp::CppNameOf(native_type, typenames_));
885 set<string> headers;
886 cpp::AddHeaders(native_type, typenames_, headers);
887 EXPECT_EQ(1u, headers.size());
888 EXPECT_EQ(1u, headers.count("baz/header"));
Christopher Wiley9078d722015-11-17 10:23:49 -0800889}
890
Christopher Wileyf8136192016-04-12 14:19:35 -0700891TEST_F(AidlTest, WritesCorrectDependencyFile) {
892 // While the in tree build system always gives us an output file name,
893 // other android tools take advantage of our ability to infer the intended
894 // file name. This test makes sure we handle this correctly.
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900895 vector<string> args = {
896 "aidl",
897 "-d dep/file/path",
898 "-o place/for/output",
899 "p/IFoo.aidl"};
900 Options options = Options::From(args);
901 io_delegate_.SetFileContents(options.InputFiles().front(), "package p; interface IFoo {}");
Jiyong Parkb034bf02018-07-30 17:44:33 +0900902 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
Christopher Wileyf8136192016-04-12 14:19:35 -0700903 string actual_dep_file_contents;
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900904 EXPECT_TRUE(io_delegate_.GetWrittenContents(options.DependencyFile(), &actual_dep_file_contents));
Christopher Wileyf8136192016-04-12 14:19:35 -0700905 EXPECT_EQ(actual_dep_file_contents, kExpectedDepFileContents);
906}
907
Dan Willemsen93298ee2016-11-10 23:55:55 -0800908TEST_F(AidlTest, WritesCorrectDependencyFileNinja) {
909 // While the in tree build system always gives us an output file name,
910 // other android tools take advantage of our ability to infer the intended
911 // file name. This test makes sure we handle this correctly.
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900912 vector<string> args = {
913 "aidl",
914 "-d dep/file/path",
915 "--ninja",
916 "-o place/for/output",
917 "p/IFoo.aidl"};
918 Options options = Options::From(args);
919 io_delegate_.SetFileContents(options.InputFiles().front(), "package p; interface IFoo {}");
Jiyong Parkb034bf02018-07-30 17:44:33 +0900920 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
Dan Willemsen93298ee2016-11-10 23:55:55 -0800921 string actual_dep_file_contents;
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900922 EXPECT_TRUE(io_delegate_.GetWrittenContents(options.DependencyFile(), &actual_dep_file_contents));
Dan Willemsen93298ee2016-11-10 23:55:55 -0800923 EXPECT_EQ(actual_dep_file_contents, kExpectedNinjaDepFileContents);
924}
925
Jiyong Parkdf202122019-09-30 20:48:35 +0900926TEST_F(AidlTest, WritesTrivialDependencyFileForParcelableDeclaration) {
Christopher Wileyb1bbdf82016-04-21 11:43:45 -0700927 // The SDK uses aidl to decide whether a .aidl file is a parcelable. It does
928 // this by calling aidl with every .aidl file it finds, then parsing the
929 // generated dependency files. Those that reference .java output files are
930 // for interfaces and those that do not are parcelables. However, for both
931 // parcelables and interfaces, we *must* generate a non-empty dependency file.
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900932 vector<string> args = {
933 "aidl",
934 "-o place/for/output",
935 "-d dep/file/path",
936 "p/Foo.aidl"};
937 Options options = Options::From(args);
938 io_delegate_.SetFileContents(options.InputFiles().front(), "package p; parcelable Foo;");
Jiyong Parkb034bf02018-07-30 17:44:33 +0900939 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
Christopher Wileyb1bbdf82016-04-21 11:43:45 -0700940 string actual_dep_file_contents;
Jiyong Park6f77e0c2018-07-28 16:55:44 +0900941 EXPECT_TRUE(io_delegate_.GetWrittenContents(options.DependencyFile(), &actual_dep_file_contents));
Jiyong Parkdf202122019-09-30 20:48:35 +0900942 EXPECT_EQ(actual_dep_file_contents, kExpectedParcelableDeclarationDepFileContents);
943}
944
945TEST_F(AidlTest, WritesDependencyFileForStructuredParcelable) {
946 vector<string> args = {
947 "aidl",
948 "--structured",
949 "-o place/for/output",
950 "-d dep/file/path",
951 "p/Foo.aidl"};
952 Options options = Options::From(args);
953 io_delegate_.SetFileContents(options.InputFiles().front(), "package p; parcelable Foo {int a;}");
954 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
955 string actual_dep_file_contents;
956 EXPECT_TRUE(io_delegate_.GetWrittenContents(options.DependencyFile(), &actual_dep_file_contents));
957 EXPECT_EQ(actual_dep_file_contents, kExpectedStructuredParcelableDepFileContents);
Christopher Wileyb1bbdf82016-04-21 11:43:45 -0700958}
959
Jiyong Park9ca5c7e2019-10-17 15:01:14 +0900960TEST_F(AidlTest, NoJavaOutputForParcelableDeclaration) {
961 vector<string> args = {
962 "aidl",
963 "--lang=java",
964 "-o place/for/output",
965 "p/Foo.aidl"};
966 Options options = Options::From(args);
967 io_delegate_.SetFileContents(options.InputFiles().front(), "package p; parcelable Foo;");
968 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
969 string output_file_contents;
970 EXPECT_FALSE(io_delegate_.GetWrittenContents(options.OutputFile(), &output_file_contents));
971}
972
Jeongik Cha08ca2182019-11-21 14:01:13 +0900973// TODO(b/136048684)
Devin Moore7b8d5c92020-03-17 14:14:08 -0700974TEST_P(AidlTest, PrimitiveList) {
Devin Moore097a3ab2020-03-11 16:08:44 -0700975 const string primitive_interface =
Jeongik Cha08ca2182019-11-21 14:01:13 +0900976 "package a; interface IFoo {\n"
977 " List<int> foo(); }";
Devin Moore7b8d5c92020-03-17 14:14:08 -0700978 string expected_stderr;
979 switch (GetLanguage()) {
980 case Options::Language::CPP:
981 expected_stderr =
982 "ERROR: a/IFoo.aidl:2.1-7: List<int> is not supported. List in cpp supports only "
983 "String and IBinder.\n";
984 break;
985 case Options::Language::JAVA:
986 expected_stderr =
987 "ERROR: a/IFoo.aidl:2.1-7: List<int> is not supported. List in Java supports only "
988 "String, IBinder, and ParcelFileDescriptor.\n";
989 break;
990 case Options::Language::NDK:
991 expected_stderr =
992 "ERROR: a/IFoo.aidl:2.1-7: A generic type cannot have any primitive type parameters.\n";
993 break;
994 default:
995 AIDL_FATAL(AIDL_LOCATION_HERE)
996 << "Unexpected Options::Language enumerator: " << static_cast<size_t>(GetLanguage());
997 }
998 CaptureStderr();
999 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", primitive_interface, typenames_, GetLanguage()));
1000 EXPECT_EQ(expected_stderr, GetCapturedStderr());
1001 typenames_.Reset();
1002
1003 string primitive_parcelable =
1004 "package a; parcelable IFoo {\n"
Jeongik Cha08ca2182019-11-21 14:01:13 +09001005 " List<int> foo;}";
Devin Moore097a3ab2020-03-11 16:08:44 -07001006 CaptureStderr();
Devin Moore7b8d5c92020-03-17 14:14:08 -07001007 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", primitive_parcelable, typenames_, GetLanguage()));
1008 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jeongik Cha08ca2182019-11-21 14:01:13 +09001009}
1010
Jiyong Parkf8d53612020-05-04 14:06:13 +09001011TEST_P(AidlTest, RejectsPrimitiveListInStableAidl) {
1012 AidlError error;
1013 string expected_stderr =
1014 "ERROR: a/IFoo.aidl:2.7-11: "
1015 "Encountered an untyped List or Map. The use of untyped List/Map is "
1016 "prohibited because it is not guaranteed that the objects in the list are recognizable in "
1017 "the receiving side. Consider switching to an array or a generic List/Map.\n";
1018 if (GetLanguage() != Options::Language::JAVA) {
1019 expected_stderr =
1020 "ERROR: a/IFoo.aidl:2.1-7: "
1021 "Currently, only the Java backend supports non-generic List.\n";
1022 }
1023
1024 const string primitive_interface =
1025 "package a; interface IFoo {\n"
1026 " List foo(); }";
1027 CaptureStderr();
1028 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", primitive_interface, typenames_, GetLanguage(), &error,
1029 {"--structured"}));
1030 EXPECT_EQ(expected_stderr, GetCapturedStderr());
1031 typenames_.Reset();
1032
1033 string primitive_parcelable =
1034 "package a; parcelable IFoo {\n"
1035 " List foo;}";
1036 CaptureStderr();
1037 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", primitive_parcelable, typenames_, GetLanguage(), &error,
1038 {"--structured"}));
1039 EXPECT_EQ(expected_stderr, GetCapturedStderr());
1040}
1041
Jeongik Cha649e8a72020-03-27 17:47:40 +09001042TEST_F(AidlTest, ExtensionTest) {
1043 string extendable_parcelable =
1044 "package a; parcelable Data {\n"
1045 " ParcelableHolder extension;\n"
1046 " ParcelableHolder extension2;\n"
1047 "}";
1048 EXPECT_NE(nullptr,
1049 Parse("a/Data.aidl", extendable_parcelable, typenames_, Options::Language::JAVA));
1050 EXPECT_EQ(nullptr,
1051 Parse("a/Data.aidl", extendable_parcelable, typenames_, Options::Language::CPP));
1052 EXPECT_EQ(nullptr,
1053 Parse("a/Data.aidl", extendable_parcelable, typenames_, Options::Language::NDK));
1054
1055 string parcelableholder_return_interface =
1056 "package a; interface IFoo {\n"
1057 " ParcelableHolder foo();\n"
1058 "}";
1059 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", parcelableholder_return_interface, typenames_,
1060 Options::Language::JAVA));
1061 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", parcelableholder_return_interface, typenames_,
1062 Options::Language::CPP));
1063 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", parcelableholder_return_interface, typenames_,
1064 Options::Language::NDK));
1065
1066 string extendable_parcelable_arg_interface =
1067 "package a; interface IFoo {\n"
1068 " void foo(in ParcelableHolder ph);\n"
1069 "}";
1070 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", extendable_parcelable_arg_interface, typenames_,
1071 Options::Language::JAVA));
1072 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", extendable_parcelable_arg_interface, typenames_,
1073 Options::Language::CPP));
1074 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", extendable_parcelable_arg_interface, typenames_,
1075 Options::Language::NDK));
1076}
1077
Jiyong Park02da7422018-07-16 16:00:26 +09001078TEST_F(AidlTest, ApiDump) {
1079 io_delegate_.SetFileContents(
1080 "foo/bar/IFoo.aidl",
1081 "package foo.bar;\n"
1082 "import foo.bar.Data;\n"
Jeongik Cha997281d2020-01-16 15:23:59 +09001083 "// comment @hide\n"
Jiyong Park02da7422018-07-16 16:00:26 +09001084 "interface IFoo {\n"
Jeongik Cha997281d2020-01-16 15:23:59 +09001085 " /* @hide */\n"
Jiyong Park02da7422018-07-16 16:00:26 +09001086 " int foo(out int[] a, String b, boolean c, inout List<String> d);\n"
1087 " int foo2(@utf8InCpp String x, inout List<String> y);\n"
1088 " IFoo foo3(IFoo foo);\n"
1089 " Data getData();\n"
Jeongik Cha997281d2020-01-16 15:23:59 +09001090 " // @hide\n"
Jiyong Parka428d212018-08-29 22:26:30 +09001091 " const int A = 1;\n"
1092 " const String STR = \"Hello\";\n"
Jiyong Park02da7422018-07-16 16:00:26 +09001093 "}\n");
1094 io_delegate_.SetFileContents("foo/bar/Data.aidl",
1095 "package foo.bar;\n"
1096 "import foo.bar.IFoo;\n"
Jeongik Cha997281d2020-01-16 15:23:59 +09001097 "/* @hide*/\n"
Jiyong Park02da7422018-07-16 16:00:26 +09001098 "parcelable Data {\n"
Jeongik Cha997281d2020-01-16 15:23:59 +09001099 " // @hide\n"
Jiyong Parka468e2a2018-08-29 21:25:18 +09001100 " int x = 10;\n"
Jeongik Cha997281d2020-01-16 15:23:59 +09001101 " // @hide\n"
Jiyong Park02da7422018-07-16 16:00:26 +09001102 " int y;\n"
1103 " IFoo foo;\n"
1104 " List<IFoo> a;\n"
Jeongik Cha997281d2020-01-16 15:23:59 +09001105 " /*@hide2*/\n"
Jiyong Park02da7422018-07-16 16:00:26 +09001106 " List<foo.bar.IFoo> b;\n"
Jeongik Cha997281d2020-01-16 15:23:59 +09001107 " // It should be @hide property\n"
Jeongik Cha3271ffa2018-12-04 15:19:20 +09001108 " @nullable String[] c;\n"
Jiyong Park02da7422018-07-16 16:00:26 +09001109 "}\n");
1110 io_delegate_.SetFileContents("api.aidl", "");
Jiyong Park633246c2019-11-25 10:50:05 +09001111 vector<string> args = {"aidl", "--dumpapi", "--out=dump", "--include=.",
1112 "foo/bar/IFoo.aidl", "foo/bar/Data.aidl"};
Jiyong Park6f77e0c2018-07-28 16:55:44 +09001113 Options options = Options::From(args);
Jiyong Park02da7422018-07-16 16:00:26 +09001114 bool result = dump_api(options, io_delegate_);
1115 ASSERT_TRUE(result);
1116 string actual;
Jiyong Parke59c3682018-09-11 23:10:25 +09001117 EXPECT_TRUE(io_delegate_.GetWrittenContents("dump/foo/bar/IFoo.aidl", &actual));
Paul Trautrimb01451d2020-02-27 13:10:16 +09001118 EXPECT_EQ(actual, string(kPreamble).append(R"(package foo.bar;
Jeongik Cha997281d2020-01-16 15:23:59 +09001119/* @hide */
Jiyong Parke59c3682018-09-11 23:10:25 +09001120interface IFoo {
Jeongik Cha997281d2020-01-16 15:23:59 +09001121 /* @hide */
Jiyong Parke59c3682018-09-11 23:10:25 +09001122 int foo(out int[] a, String b, boolean c, inout List<String> d);
1123 int foo2(@utf8InCpp String x, inout List<String> y);
1124 foo.bar.IFoo foo3(foo.bar.IFoo foo);
1125 foo.bar.Data getData();
Jeongik Cha997281d2020-01-16 15:23:59 +09001126 /* @hide */
Jiyong Parke59c3682018-09-11 23:10:25 +09001127 const int A = 1;
1128 const String STR = "Hello";
1129}
Paul Trautrimb01451d2020-02-27 13:10:16 +09001130)"));
Jiyong Park02da7422018-07-16 16:00:26 +09001131
Jiyong Parke59c3682018-09-11 23:10:25 +09001132 EXPECT_TRUE(io_delegate_.GetWrittenContents("dump/foo/bar/Data.aidl", &actual));
Paul Trautrimb01451d2020-02-27 13:10:16 +09001133 EXPECT_EQ(actual, string(kPreamble).append(R"(package foo.bar;
Jeongik Cha997281d2020-01-16 15:23:59 +09001134/* @hide */
Jiyong Parke59c3682018-09-11 23:10:25 +09001135parcelable Data {
Jeongik Cha997281d2020-01-16 15:23:59 +09001136 /* @hide */
Jiyong Parke59c3682018-09-11 23:10:25 +09001137 int x = 10;
Jeongik Cha997281d2020-01-16 15:23:59 +09001138 /* @hide */
Jiyong Parke59c3682018-09-11 23:10:25 +09001139 int y;
1140 foo.bar.IFoo foo;
1141 List<foo.bar.IFoo> a;
1142 List<foo.bar.IFoo> b;
Jeongik Cha997281d2020-01-16 15:23:59 +09001143 /* @hide */
Jeongik Cha3271ffa2018-12-04 15:19:20 +09001144 @nullable String[] c;
Jiyong Park02da7422018-07-16 16:00:26 +09001145}
Paul Trautrimb01451d2020-02-27 13:10:16 +09001146)"));
Jiyong Park02da7422018-07-16 16:00:26 +09001147}
1148
Jiyong Parked65bf42018-08-28 15:43:27 +09001149TEST_F(AidlTest, ApiDumpWithManualIds) {
1150 io_delegate_.SetFileContents(
1151 "foo/bar/IFoo.aidl",
1152 "package foo.bar;\n"
1153 "interface IFoo {\n"
1154 " int foo() = 1;\n"
1155 " int bar() = 2;\n"
1156 " int baz() = 10;\n"
1157 "}\n");
1158
Jiyong Parke59c3682018-09-11 23:10:25 +09001159 vector<string> args = {"aidl", "--dumpapi", "-o dump", "foo/bar/IFoo.aidl"};
Jiyong Parked65bf42018-08-28 15:43:27 +09001160 Options options = Options::From(args);
1161 bool result = dump_api(options, io_delegate_);
1162 ASSERT_TRUE(result);
1163 string actual;
Jiyong Parke59c3682018-09-11 23:10:25 +09001164 EXPECT_TRUE(io_delegate_.GetWrittenContents("dump/foo/bar/IFoo.aidl", &actual));
Paul Trautrimb01451d2020-02-27 13:10:16 +09001165 EXPECT_EQ(actual, string(kPreamble).append(R"(package foo.bar;
Jiyong Parke59c3682018-09-11 23:10:25 +09001166interface IFoo {
1167 int foo() = 1;
1168 int bar() = 2;
1169 int baz() = 10;
Jiyong Parked65bf42018-08-28 15:43:27 +09001170}
Paul Trautrimb01451d2020-02-27 13:10:16 +09001171)"));
Jiyong Parked65bf42018-08-28 15:43:27 +09001172}
1173
1174TEST_F(AidlTest, ApiDumpWithManualIdsOnlyOnSomeMethods) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001175 const string expected_stderr =
1176 "ERROR: foo/bar/IFoo.aidl:4.8-12: You must either assign id's to all methods or to none of "
1177 "them.\n";
Jiyong Parked65bf42018-08-28 15:43:27 +09001178 io_delegate_.SetFileContents(
1179 "foo/bar/IFoo.aidl",
1180 "package foo.bar;\n"
1181 "interface IFoo {\n"
1182 " int foo() = 1;\n"
1183 " int bar();\n"
1184 " int baz() = 10;\n"
1185 "}\n");
1186
Jiyong Parke59c3682018-09-11 23:10:25 +09001187 vector<string> args = {"aidl", "--dumpapi", "-o dump", "foo/bar/IFoo.aidl"};
Jiyong Parked65bf42018-08-28 15:43:27 +09001188 Options options = Options::From(args);
Devin Moore097a3ab2020-03-11 16:08:44 -07001189 CaptureStderr();
Jiyong Parked65bf42018-08-28 15:43:27 +09001190 EXPECT_FALSE(dump_api(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001191 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Parked65bf42018-08-28 15:43:27 +09001192}
1193
Jiyong Park1d2df7d2018-07-23 15:22:50 +09001194TEST_F(AidlTest, CheckNumGenericTypeSecifier) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001195 const string expected_list_stderr =
1196 "ERROR: p/IFoo.aidl:1.37-41: List must have only one type parameter.\n";
1197 const string expected_map_stderr =
1198 "ERROR: p/IFoo.aidl:1.37-40: Map must have 0 or 2 type parameters, but got 'Map<String>'\n";
Jiyong Park6f77e0c2018-07-28 16:55:44 +09001199 Options options = Options::From("aidl p/IFoo.aidl IFoo.java");
1200 io_delegate_.SetFileContents(options.InputFiles().front(),
Jiyong Park1d2df7d2018-07-23 15:22:50 +09001201 "package p; interface IFoo {"
1202 "void foo(List<String, String> a);}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001203 CaptureStderr();
Jiyong Parkb034bf02018-07-30 17:44:33 +09001204 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001205 EXPECT_EQ(expected_list_stderr, GetCapturedStderr());
Jiyong Park1d2df7d2018-07-23 15:22:50 +09001206
Jiyong Park6f77e0c2018-07-28 16:55:44 +09001207 io_delegate_.SetFileContents(options.InputFiles().front(),
Jiyong Park1d2df7d2018-07-23 15:22:50 +09001208 "package p; interface IFoo {"
1209 "void foo(Map<String> a);}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001210 CaptureStderr();
Jiyong Parkb034bf02018-07-30 17:44:33 +09001211 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001212 EXPECT_EQ(expected_map_stderr, GetCapturedStderr());
Jiyong Parkb034bf02018-07-30 17:44:33 +09001213}
1214
Jeongik Chae48d9942020-01-02 17:39:00 +09001215TEST_F(AidlTest, CheckTypeParameterInMapType) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001216 const string expected_stderr =
1217 "ERROR: p/IFoo.aidl:1.28-31: The type of key in map must be String, but it is 'p.Bar'\n";
Jeongik Chae48d9942020-01-02 17:39:00 +09001218 Options options = Options::From("aidl -I p p/IFoo.aidl");
1219 io_delegate_.SetFileContents("p/Bar.aidl", "package p; parcelable Bar { String s; }");
1220
1221 io_delegate_.SetFileContents("p/IFoo.aidl",
1222 "package p; interface IFoo {"
1223 "Map<String, Bar> foo();}");
1224 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
1225
1226 io_delegate_.SetFileContents("p/IFoo.aidl",
1227 "package p; interface IFoo {"
1228 "Map<Bar, Bar> foo();}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001229 CaptureStderr();
Jeongik Chae48d9942020-01-02 17:39:00 +09001230 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001231 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jeongik Chae48d9942020-01-02 17:39:00 +09001232
1233 io_delegate_.SetFileContents("p/IFoo.aidl",
1234 "package p; interface IFoo {"
1235 "Map<String, String> foo();}");
1236 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
1237
1238 io_delegate_.SetFileContents("p/IFoo.aidl",
1239 "package p; interface IFoo {"
1240 "Map<String, ParcelFileDescriptor> foo();}");
1241 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
1242}
1243
Jeongik Chadf76dc72019-11-28 00:08:47 +09001244TEST_F(AidlTest, WrongGenericType) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001245 const string expected_stderr = "ERROR: p/IFoo.aidl:1.28-34: String is not a generic type.\n";
Jeongik Chadf76dc72019-11-28 00:08:47 +09001246 Options options = Options::From("aidl p/IFoo.aidl IFoo.java");
1247 io_delegate_.SetFileContents(options.InputFiles().front(),
1248 "package p; interface IFoo {"
1249 "String<String> foo(); }");
Devin Moore097a3ab2020-03-11 16:08:44 -07001250 CaptureStderr();
Jeongik Chadf76dc72019-11-28 00:08:47 +09001251 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001252 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jeongik Chadf76dc72019-11-28 00:08:47 +09001253}
1254
1255TEST_F(AidlTest, UserDefinedUnstructuredGenericParcelableType) {
1256 Options optionsForParcelable = Options::From("aidl -I p p/Bar.aidl");
1257 io_delegate_.SetFileContents("p/Bar.aidl", "package p; parcelable Bar<T, T>;");
Devin Moore097a3ab2020-03-11 16:08:44 -07001258 CaptureStderr();
Jeongik Chadf76dc72019-11-28 00:08:47 +09001259 EXPECT_NE(0, ::android::aidl::compile_aidl(optionsForParcelable, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001260 EXPECT_EQ("ERROR: p/Bar.aidl:1.22-26: Every type parameter should be unique.\n",
1261 GetCapturedStderr());
Jeongik Chadf76dc72019-11-28 00:08:47 +09001262
1263 Options options = Options::From("aidl -I p p/IFoo.aidl");
1264 io_delegate_.SetFileContents("p/Bar.aidl", "package p; parcelable Bar;");
1265 io_delegate_.SetFileContents("p/IFoo.aidl",
1266 "package p; interface IFoo {"
1267 "Bar<String, String> foo();}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001268 CaptureStderr();
Jeongik Chadf76dc72019-11-28 00:08:47 +09001269 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001270 EXPECT_EQ("ERROR: p/IFoo.aidl:1.28-31: p.Bar is not a generic type.\n", GetCapturedStderr());
Jeongik Chadf76dc72019-11-28 00:08:47 +09001271 io_delegate_.SetFileContents("p/Bar.aidl", "package p; parcelable Bar<T>;");
Devin Moore097a3ab2020-03-11 16:08:44 -07001272 CaptureStderr();
Jeongik Chadf76dc72019-11-28 00:08:47 +09001273 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001274 EXPECT_EQ("ERROR: p/IFoo.aidl:1.28-31: p.Bar must have 1 type parameters, but got 2\n",
1275 GetCapturedStderr());
Jeongik Chadf76dc72019-11-28 00:08:47 +09001276 io_delegate_.SetFileContents("p/Bar.aidl", "package p; parcelable Bar<T, V>;");
1277 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
1278 io_delegate_.SetFileContents("p/IFoo.aidl",
1279 "package p; interface IFoo {"
1280 "Bar<String, ParcelFileDescriptor> foo();}");
1281 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
Jeongik Chae74c86d2019-12-12 16:54:03 +09001282
1283 io_delegate_.SetFileContents("p/IFoo.aidl",
1284 "package p; interface IFoo {"
1285 "Bar<int, long> foo();}");
1286
1287 io_delegate_.SetFileContents("p/IFoo.aidl",
1288 "package p; interface IFoo {"
1289 "Bar<int[], long[]> foo();}");
1290
1291 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
Jeongik Chadf76dc72019-11-28 00:08:47 +09001292}
1293
Jeongik Cha0e426012019-07-29 15:57:02 +09001294TEST_F(AidlTest, FailOnMultipleTypesInSingleFile) {
1295 std::vector<std::string> rawOptions{"aidl --lang=java -o out foo/bar/Foo.aidl",
1296 "aidl --lang=cpp -o out -h out/include foo/bar/Foo.aidl"};
Devin Moore5de18ed2020-04-02 13:52:29 -07001297 for (const auto& rawOption : rawOptions) {
1298 string expected_stderr =
1299 "ERROR: foo/bar/Foo.aidl:3.1-10: You must declare only one type per file.\n";
Jeongik Cha0e426012019-07-29 15:57:02 +09001300 Options options = Options::From(rawOption);
1301 io_delegate_.SetFileContents(options.InputFiles().front(),
1302 "package foo.bar;\n"
1303 "interface IFoo1 { int foo(); }\n"
1304 "interface IFoo2 { int foo(); }\n"
1305 "parcelable Data1 { int a; int b;}\n"
1306 "parcelable Data2 { int a; int b;}\n");
Devin Moore097a3ab2020-03-11 16:08:44 -07001307 CaptureStderr();
Jeongik Cha0e426012019-07-29 15:57:02 +09001308 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001309 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Parkb034bf02018-07-30 17:44:33 +09001310
Jeongik Cha0e426012019-07-29 15:57:02 +09001311 io_delegate_.SetFileContents(options.InputFiles().front(),
1312 "package foo.bar;\n"
1313 "interface IFoo1 { int foo(); }\n"
1314 "interface IFoo2 { int foo(); }\n");
Devin Moore097a3ab2020-03-11 16:08:44 -07001315 CaptureStderr();
Jeongik Cha0e426012019-07-29 15:57:02 +09001316 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001317 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Parkb034bf02018-07-30 17:44:33 +09001318
Devin Moore5de18ed2020-04-02 13:52:29 -07001319 expected_stderr = "ERROR: foo/bar/Foo.aidl:3.11-17: You must declare only one type per file.\n";
Jeongik Cha0e426012019-07-29 15:57:02 +09001320 io_delegate_.SetFileContents(options.InputFiles().front(),
1321 "package foo.bar;\n"
1322 "parcelable Data1 { int a; int b;}\n"
1323 "parcelable Data2 { int a; int b;}\n");
Devin Moore097a3ab2020-03-11 16:08:44 -07001324 CaptureStderr();
Jeongik Cha0e426012019-07-29 15:57:02 +09001325 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001326 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Parkb034bf02018-07-30 17:44:33 +09001327 }
1328}
1329
Devin Moorebdba2a82020-03-31 15:19:02 -07001330TEST_P(AidlTest, FailParseOnEmptyFile) {
1331 const string contents = "";
1332 const string expected_stderr = "ERROR: a/IFoo.aidl:1.1-1: syntax error, unexpected $end\n";
1333 CaptureStderr();
1334 EXPECT_EQ(nullptr, Parse("a/IFoo.aidl", contents, typenames_, GetLanguage()));
1335 EXPECT_EQ(expected_stderr, GetCapturedStderr());
1336}
1337
Jiyong Parkb034bf02018-07-30 17:44:33 +09001338TEST_F(AidlTest, MultipleInputFiles) {
1339 Options options = Options::From(
Jiyong Park633246c2019-11-25 10:50:05 +09001340 "aidl --lang=java -o out -I . foo/bar/IFoo.aidl foo/bar/Data.aidl");
Jiyong Parkb034bf02018-07-30 17:44:33 +09001341
1342 io_delegate_.SetFileContents(options.InputFiles().at(0),
1343 "package foo.bar;\n"
1344 "import foo.bar.Data;\n"
1345 "interface IFoo { Data getData(); }\n");
1346
1347 io_delegate_.SetFileContents(options.InputFiles().at(1),
1348 "package foo.bar;\n"
1349 "import foo.bar.IFoo;\n"
1350 "parcelable Data { IFoo foo; }\n");
1351
1352 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
1353
1354 string content;
1355 for (const auto file : {
1356 "out/foo/bar/IFoo.java", "out/foo/bar/Data.java"}) {
1357 content.clear();
1358 EXPECT_TRUE(io_delegate_.GetWrittenContents(file, &content));
1359 EXPECT_FALSE(content.empty());
1360 }
1361}
1362
1363TEST_F(AidlTest, MultipleInputFilesCpp) {
1364 Options options = Options::From("aidl --lang=cpp -o out -h out/include "
Jiyong Park633246c2019-11-25 10:50:05 +09001365 "-I . foo/bar/IFoo.aidl foo/bar/Data.aidl");
Jiyong Parkb034bf02018-07-30 17:44:33 +09001366
1367 io_delegate_.SetFileContents(options.InputFiles().at(0),
1368 "package foo.bar;\n"
1369 "import foo.bar.Data;\n"
1370 "interface IFoo { Data getData(); }\n");
1371
1372 io_delegate_.SetFileContents(options.InputFiles().at(1),
1373 "package foo.bar;\n"
1374 "import foo.bar.IFoo;\n"
1375 "parcelable Data { IFoo foo; }\n");
1376
1377 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
1378
1379 string content;
1380 for (const auto file : {
Jiyong Parkb03551f2018-08-06 19:20:51 +09001381 "out/foo/bar/IFoo.cpp", "out/foo/bar/Data.cpp",
Jiyong Parkb034bf02018-07-30 17:44:33 +09001382 "out/include/foo/bar/IFoo.h", "out/include/foo/bar/Data.h",
1383 "out/include/foo/bar/BpFoo.h", "out/include/foo/bar/BpData.h",
1384 "out/include/foo/bar/BnFoo.h", "out/include/foo/bar/BnData.h"}) {
1385 content.clear();
1386 EXPECT_TRUE(io_delegate_.GetWrittenContents(file, &content));
1387 EXPECT_FALSE(content.empty());
1388 }
Jiyong Park1d2df7d2018-07-23 15:22:50 +09001389}
1390
Devin Moore097a3ab2020-03-11 16:08:44 -07001391TEST_F(AidlTest, ConflictWithMetaTransactionGetVersion) {
1392 const string expected_stderr =
1393 "ERROR: p/IFoo.aidl:1.31-51: method getInterfaceVersion() is reserved for internal use.\n";
Jiyong Park309668e2018-07-28 16:55:44 +09001394 Options options = Options::From("aidl --lang=java -o place/for/output p/IFoo.aidl");
1395 // int getInterfaceVersion() is one of the meta transactions
1396 io_delegate_.SetFileContents(options.InputFiles().front(),
1397 "package p; interface IFoo {"
1398 "int getInterfaceVersion(); }");
Devin Moore097a3ab2020-03-11 16:08:44 -07001399 CaptureStderr();
Jiyong Parkb034bf02018-07-30 17:44:33 +09001400 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001401 EXPECT_EQ(expected_stderr, GetCapturedStderr());
1402}
Jiyong Park309668e2018-07-28 16:55:44 +09001403
Devin Moore097a3ab2020-03-11 16:08:44 -07001404TEST_F(AidlTest, ConflictWithSimilarMetaTransaction) {
1405 // boolean getInterfaceVersion() is not a meta transaction, but should be
1406 // prevented because return type is not part of a method signature
1407 const string expected_stderr =
1408 "ERROR: p/IFoo.aidl:1.35-55: method getInterfaceVersion() is reserved for internal use.\n";
1409 Options options = Options::From("aidl --lang=java -o place/for/output p/IFoo.aidl");
Jiyong Park309668e2018-07-28 16:55:44 +09001410 io_delegate_.SetFileContents(options.InputFiles().front(),
1411 "package p; interface IFoo {"
1412 "boolean getInterfaceVersion(); }");
Devin Moore097a3ab2020-03-11 16:08:44 -07001413 CaptureStderr();
Jiyong Parkb034bf02018-07-30 17:44:33 +09001414 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001415 EXPECT_EQ(expected_stderr, GetCapturedStderr());
1416}
Jiyong Park309668e2018-07-28 16:55:44 +09001417
Devin Moore097a3ab2020-03-11 16:08:44 -07001418TEST_F(AidlTest, ConflictWithMetaTransactionGetName) {
Jiyong Park309668e2018-07-28 16:55:44 +09001419 // this is another reserved name
Devin Moore097a3ab2020-03-11 16:08:44 -07001420 const string expected_stderr =
1421 "ERROR: p/IFoo.aidl:1.34-53: method getTransactionName(int) is reserved for internal use.\n";
1422 Options options = Options::From("aidl --lang=java -o place/for/output p/IFoo.aidl");
Jiyong Park309668e2018-07-28 16:55:44 +09001423 io_delegate_.SetFileContents(options.InputFiles().front(),
1424 "package p; interface IFoo {"
1425 "String getTransactionName(int code); }");
Devin Moore097a3ab2020-03-11 16:08:44 -07001426 CaptureStderr();
Jiyong Parkb034bf02018-07-30 17:44:33 +09001427 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001428 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Park309668e2018-07-28 16:55:44 +09001429
1430 // this is not a meta interface method as it differs type arguments
1431 io_delegate_.SetFileContents(options.InputFiles().front(),
1432 "package p; interface IFoo {"
1433 "String getTransactionName(); }");
Jiyong Parkb034bf02018-07-30 17:44:33 +09001434 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
Jiyong Park309668e2018-07-28 16:55:44 +09001435}
1436
Daniel Norman85aed542019-08-21 12:01:14 -07001437TEST_F(AidlTest, DifferentOrderAnnotationsInCheckAPI) {
Jeongik Cha3271ffa2018-12-04 15:19:20 +09001438 Options options = Options::From("aidl --checkapi old new");
1439 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1440 "package p; interface IFoo{ @utf8InCpp @nullable String foo();}");
1441 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1442 "package p; interface IFoo{ @nullable @utf8InCpp String foo();}");
1443
1444 EXPECT_TRUE(::android::aidl::check_api(options, io_delegate_));
1445}
1446
Jiyong Park3656c3c2018-08-01 20:02:01 +09001447TEST_F(AidlTest, SuccessOnIdenticalApiDumps) {
Jiyong Parke59c3682018-09-11 23:10:25 +09001448 Options options = Options::From("aidl --checkapi old new");
1449 io_delegate_.SetFileContents("old/p/IFoo.aidl", "package p; interface IFoo{ void foo();}");
1450 io_delegate_.SetFileContents("new/p/IFoo.aidl", "package p; interface IFoo{ void foo();}");
Jiyong Park3656c3c2018-08-01 20:02:01 +09001451
1452 EXPECT_TRUE(::android::aidl::check_api(options, io_delegate_));
1453}
1454
Daniel Norman85aed542019-08-21 12:01:14 -07001455class AidlTestCompatibleChanges : public AidlTest {
1456 protected:
1457 Options options_ = Options::From("aidl --checkapi old new");
1458};
1459
1460TEST_F(AidlTestCompatibleChanges, NewType) {
1461 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1462 "package p;"
1463 "interface IFoo {"
1464 " void foo(int a);"
1465 "}");
1466 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1467 "package p;"
1468 "interface IFoo {"
1469 " void foo(int a);"
1470 "}");
1471 io_delegate_.SetFileContents("new/p/IBar.aidl",
1472 "package p;"
1473 "interface IBar {"
1474 " void bar();"
1475 "}");
1476 EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
1477}
1478
1479TEST_F(AidlTestCompatibleChanges, NewMethod) {
1480 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1481 "package p;"
1482 "interface IFoo {"
1483 " void foo(int a);"
1484 "}");
1485 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1486 "package p;"
1487 "interface IFoo {"
1488 " void foo(int a);"
1489 " void bar();"
Jiyong Parkf8d53612020-05-04 14:06:13 +09001490 " void baz(in List<IFoo> arg);"
Daniel Norman85aed542019-08-21 12:01:14 -07001491 "}");
1492 EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
1493}
1494
1495TEST_F(AidlTestCompatibleChanges, NewField) {
1496 io_delegate_.SetFileContents("old/p/Data.aidl",
1497 "package p;"
1498 "parcelable Data {"
1499 " int foo;"
1500 "}");
1501 io_delegate_.SetFileContents("new/p/Data.aidl",
1502 "package p;"
1503 "parcelable Data {"
1504 " int foo;"
Steven Moreland370ed342020-04-28 18:14:39 -07001505 " int bar = 0;"
Jiyong Parkf8d53612020-05-04 14:06:13 +09001506 " @nullable List<Data> list;"
Daniel Norman85aed542019-08-21 12:01:14 -07001507 "}");
1508 EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
1509}
1510
1511TEST_F(AidlTestCompatibleChanges, NewEnumerator) {
1512 io_delegate_.SetFileContents("old/p/Enum.aidl",
1513 "package p;"
1514 "enum Enum {"
1515 " FOO = 1,"
1516 "}");
1517 io_delegate_.SetFileContents("new/p/Enum.aidl",
1518 "package p;"
1519 "enum Enum {"
1520 " FOO = 1,"
1521 " BAR = 2,"
1522 "}");
1523 EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
1524}
1525
1526TEST_F(AidlTestCompatibleChanges, ReorderedEnumerator) {
1527 io_delegate_.SetFileContents("old/p/Enum.aidl",
1528 "package p;"
1529 "enum Enum {"
1530 " FOO = 1,"
1531 " BAR = 2,"
1532 "}");
1533 io_delegate_.SetFileContents("new/p/Enum.aidl",
1534 "package p;"
1535 "enum Enum {"
1536 " BAR = 2,"
1537 " FOO = 1,"
1538 "}");
1539 EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
1540}
1541
1542TEST_F(AidlTestCompatibleChanges, NewPackage) {
Jiyong Parke59c3682018-09-11 23:10:25 +09001543 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1544 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001545 "interface IFoo {"
1546 " void foo(int a);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001547 "}");
1548 io_delegate_.SetFileContents("old/p/Data.aidl",
1549 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001550 "parcelable Data {"
1551 " int foo;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001552 "}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001553 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1554 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001555 "interface IFoo {"
1556 " void foo(int a);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001557 "}");
1558 io_delegate_.SetFileContents("new/p/Data.aidl",
1559 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001560 "parcelable Data {"
1561 " int foo;"
Jiyong Parke59c3682018-09-11 23:10:25 +09001562 "}");
1563 io_delegate_.SetFileContents("new/q/IFoo.aidl",
1564 "package q;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001565 "interface IFoo {"
Jiyong Parke59c3682018-09-11 23:10:25 +09001566 " void foo(int a);"
1567 "}");
1568 io_delegate_.SetFileContents("new/q/Data.aidl",
1569 "package q;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001570 "parcelable Data {"
1571 " int foo;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001572 "}");
Daniel Norman85aed542019-08-21 12:01:14 -07001573 EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
1574}
Jiyong Park3656c3c2018-08-01 20:02:01 +09001575
Daniel Norman85aed542019-08-21 12:01:14 -07001576TEST_F(AidlTestCompatibleChanges, ArgNameChange) {
1577 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1578 "package p;"
1579 "interface IFoo {"
1580 " void foo(int a);"
1581 "}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001582 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1583 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001584 "interface IFoo {"
1585 " void foo(int b);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001586 "}");
Daniel Norman85aed542019-08-21 12:01:14 -07001587 EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
1588}
Jiyong Parke59c3682018-09-11 23:10:25 +09001589
Daniel Norman85aed542019-08-21 12:01:14 -07001590TEST_F(AidlTestCompatibleChanges, AddedConstValue) {
Jiyong Parke59c3682018-09-11 23:10:25 +09001591 io_delegate_.SetFileContents("old/p/I.aidl",
1592 "package p; interface I {"
1593 "const int A = 1; }");
1594 io_delegate_.SetFileContents("new/p/I.aidl",
1595 "package p ; interface I {"
1596 "const int A = 1; const int B = 2;}");
Daniel Norman85aed542019-08-21 12:01:14 -07001597 EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
1598}
Jiyong Parka428d212018-08-29 22:26:30 +09001599
Daniel Norman85aed542019-08-21 12:01:14 -07001600TEST_F(AidlTestCompatibleChanges, ChangedConstValueOrder) {
Jiyong Parke59c3682018-09-11 23:10:25 +09001601 io_delegate_.SetFileContents("old/p/I.aidl",
1602 "package p; interface I {"
1603 "const int A = 1; const int B = 2;}");
1604 io_delegate_.SetFileContents("new/p/I.aidl",
1605 "package p ; interface I {"
1606 "const int B = 2; const int A = 1;}");
Daniel Norman85aed542019-08-21 12:01:14 -07001607 EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
Jiyong Park3656c3c2018-08-01 20:02:01 +09001608}
1609
Daniel Norman85aed542019-08-21 12:01:14 -07001610class AidlTestIncompatibleChanges : public AidlTest {
1611 protected:
1612 Options options_ = Options::From("aidl --checkapi old new");
1613};
1614
1615TEST_F(AidlTestIncompatibleChanges, RemovedType) {
Jiyong Park0cf03b12020-07-22 19:36:34 +09001616 const string expected_stderr = "ERROR: old/p/IFoo.aidl:1.11-20: Removed type: p.IFoo\n";
Jiyong Parke59c3682018-09-11 23:10:25 +09001617 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1618 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001619 "interface IFoo {"
1620 " void foo(in String[] str);"
1621 " void bar(@utf8InCpp String str);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001622 "}");
Devin Moored131d5e2020-03-31 10:39:10 -07001623 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001624 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moored131d5e2020-03-31 10:39:10 -07001625 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001626}
1627
1628TEST_F(AidlTestIncompatibleChanges, RemovedMethod) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001629 const string expected_stderr =
1630 "ERROR: old/p/IFoo.aidl:1.61-65: Removed or changed method: p.IFoo.bar(String)\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001631 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1632 "package p;"
1633 "interface IFoo {"
1634 " void foo(in String[] str);"
1635 " void bar(@utf8InCpp String str);"
1636 "}");
1637 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1638 "package p;"
1639 "interface IFoo {"
1640 " void foo(in String[] str);"
1641 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001642 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001643 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001644 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001645}
1646
Jiyong Parkf8d53612020-05-04 14:06:13 +09001647TEST_F(AidlTestIncompatibleChanges, UntypedListInInterface) {
1648 const string expected_stderr =
1649 "ERROR: new/p/IFoo.aidl:1.61-65: "
1650 "Encountered an untyped List or Map. The use of untyped List/Map is "
1651 "prohibited because it is not guaranteed that the objects in the list are recognizable in "
1652 "the receiving side. Consider switching to an array or a generic List/Map.\n"
1653 "ERROR: new/p/IFoo.aidl: Failed to read.\n";
1654 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1655 "package p;"
1656 "interface IFoo {"
1657 " void foo(in String[] str);"
1658 "}");
1659 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1660 "package p;"
1661 "interface IFoo {"
1662 " void foo(in String[] str);"
1663 " void bar(in List arg);"
1664 "}");
1665 CaptureStderr();
1666 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
1667 EXPECT_EQ(expected_stderr, GetCapturedStderr());
1668}
1669
1670TEST_F(AidlTestCompatibleChanges, UntypedListInParcelable) {
1671 const string expected_stderr =
1672 "ERROR: new/p/Data.aidl:1.54-59: "
1673 "Encountered an untyped List or Map. The use of untyped List/Map is "
1674 "prohibited because it is not guaranteed that the objects in the list are recognizable in "
1675 "the receiving side. Consider switching to an array or a generic List/Map.\n"
1676 "ERROR: new/p/Data.aidl: Failed to read.\n";
1677 io_delegate_.SetFileContents("old/p/Data.aidl",
1678 "package p;"
1679 "parcelable Data {"
1680 " int foo;"
1681 "}");
1682 io_delegate_.SetFileContents("new/p/Data.aidl",
1683 "package p;"
1684 "parcelable Data {"
1685 " int foo;"
1686 " @nullable List list;"
1687 "}");
1688 CaptureStderr();
1689 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
1690 EXPECT_EQ(expected_stderr, GetCapturedStderr());
1691}
1692
Daniel Norman85aed542019-08-21 12:01:14 -07001693TEST_F(AidlTestIncompatibleChanges, RemovedField) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001694 const string expected_stderr =
1695 "ERROR: new/p/Data.aidl:1.21-26: Number of fields in p.Data is reduced from 2 to 1.\n";
Jiyong Parke59c3682018-09-11 23:10:25 +09001696 io_delegate_.SetFileContents("old/p/Data.aidl",
1697 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001698 "parcelable Data {"
1699 " int foo;"
1700 " int bar;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001701 "}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001702 io_delegate_.SetFileContents("new/p/Data.aidl",
1703 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001704 "parcelable Data {"
1705 " int foo;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001706 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001707 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001708 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001709 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001710}
Jiyong Park3656c3c2018-08-01 20:02:01 +09001711
Daniel Norman85aed542019-08-21 12:01:14 -07001712TEST_F(AidlTestIncompatibleChanges, RemovedEnumerator) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001713 const string expected_stderr =
1714 "ERROR: new/p/Enum.aidl:1.15-20: Removed enumerator from p.Enum: FOO\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001715 io_delegate_.SetFileContents("old/p/Enum.aidl",
1716 "package p;"
1717 "enum Enum {"
1718 " FOO = 1,"
1719 " BAR = 2,"
1720 "}");
1721 io_delegate_.SetFileContents("new/p/Enum.aidl",
1722 "package p;"
1723 "enum Enum {"
1724 " BAR = 2,"
1725 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001726 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001727 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001728 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001729}
1730
1731TEST_F(AidlTestIncompatibleChanges, RenamedMethod) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001732 const string expected_stderr =
1733 "ERROR: old/p/IFoo.aidl:1.61-65: Removed or changed method: p.IFoo.bar(String)\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001734 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1735 "package p;"
1736 "interface IFoo {"
1737 " void foo(in String[] str);"
1738 " void bar(@utf8InCpp String str);"
1739 "}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001740 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1741 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001742 "interface IFoo {"
1743 " void foo(in String[] str);"
1744 " void bar2(@utf8InCpp String str);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001745 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001746 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001747 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001748 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001749}
1750
Daniel Norman85aed542019-08-21 12:01:14 -07001751TEST_F(AidlTestIncompatibleChanges, RenamedType) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001752 const string expected_stderr = "ERROR: old/p/IFoo.aidl:1.11-20: Removed type: p.IFoo\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001753 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1754 "package p;"
1755 "interface IFoo {"
1756 " void foo(in String[] str);"
1757 " void bar(@utf8InCpp String str);"
1758 "}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001759 io_delegate_.SetFileContents("new/p/IFoo2.aidl",
1760 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001761 "interface IFoo2 {"
1762 " void foo(in String[] str);"
1763 " void bar(@utf8InCpp String str);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001764 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001765 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001766 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001767 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001768}
Jiyong Park3656c3c2018-08-01 20:02:01 +09001769
Daniel Norman85aed542019-08-21 12:01:14 -07001770TEST_F(AidlTestIncompatibleChanges, ChangedEnumerator) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001771 const string expected_stderr =
1772 "ERROR: new/p/Enum.aidl:1.15-20: Changed enumerator value: p.Enum::FOO from 1 to 3.\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001773 io_delegate_.SetFileContents("old/p/Enum.aidl",
1774 "package p;"
1775 "enum Enum {"
1776 " FOO = 1,"
1777 " BAR = 2,"
1778 "}");
1779 io_delegate_.SetFileContents("new/p/Enum.aidl",
1780 "package p;"
1781 "enum Enum {"
1782 " FOO = 3,"
1783 " BAR = 2,"
1784 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001785 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001786 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001787 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001788}
1789
1790TEST_F(AidlTestIncompatibleChanges, ReorderedMethod) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001791 const string expected_stderr =
1792 "ERROR: new/p/IFoo.aidl:1.67-71: Transaction ID changed: p.IFoo.foo(String[]) is changed "
1793 "from 0 to 1.\n"
1794 "ERROR: new/p/IFoo.aidl:1.33-37: Transaction ID changed: p.IFoo.bar(String) is changed from "
1795 "1 to 0.\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001796 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1797 "package p;"
1798 "interface IFoo {"
1799 " void foo(in String[] str);"
1800 " void bar(@utf8InCpp String str);"
1801 "}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001802 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1803 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001804 "interface IFoo {"
1805 " void bar(@utf8InCpp String str);"
1806 " void foo(in String[] str);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001807 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001808 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001809 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001810 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001811}
1812
1813TEST_F(AidlTestIncompatibleChanges, ReorderedField) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001814 const string expected_stderr =
Jiyong Parkb07d9932020-05-15 12:56:54 +09001815 "ERROR: new/p/Data.aidl:1.33-37: Reordered bar from 1 to 0.\n"
1816 "ERROR: new/p/Data.aidl:1.43-47: Reordered foo from 0 to 1.\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001817 io_delegate_.SetFileContents("old/p/Data.aidl",
Jiyong Parke59c3682018-09-11 23:10:25 +09001818 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001819 "parcelable Data {"
1820 " int foo;"
1821 " int bar;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001822 "}");
Daniel Norman85aed542019-08-21 12:01:14 -07001823 io_delegate_.SetFileContents("new/p/Data.aidl",
1824 "package p;"
1825 "parcelable Data {"
1826 " int bar;"
1827 " int foo;"
1828 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001829 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001830 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001831 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001832}
Jiyong Park3656c3c2018-08-01 20:02:01 +09001833
Daniel Norman85aed542019-08-21 12:01:14 -07001834TEST_F(AidlTestIncompatibleChanges, ChangedDirectionSpecifier) {
Devin Mooreeccdb902020-03-24 16:22:40 -07001835 const string expected_stderr = "ERROR: new/p/IFoo.aidl:1.33-37: Direction changed: in to out.\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001836 io_delegate_.SetFileContents("old/p/IFoo.aidl",
Jiyong Parke59c3682018-09-11 23:10:25 +09001837 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001838 "interface IFoo {"
1839 " void foo(in String[] str);"
1840 " void bar(@utf8InCpp String str);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001841 "}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001842 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1843 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001844 "interface IFoo {"
1845 " void foo(out String[] str);"
1846 " void bar(@utf8InCpp String str);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001847 "}");
Devin Mooreeccdb902020-03-24 16:22:40 -07001848 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001849 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Mooreeccdb902020-03-24 16:22:40 -07001850 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001851}
Jiyong Park3656c3c2018-08-01 20:02:01 +09001852
Daniel Norman85aed542019-08-21 12:01:14 -07001853TEST_F(AidlTestIncompatibleChanges, AddedAnnotation) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001854 const string expected_stderr =
1855 "ERROR: new/p/IFoo.aidl:1.51-58: Changed annotations: (empty) to @utf8InCpp\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001856 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1857 "package p;"
1858 "interface IFoo {"
1859 " void foo(in String[] str);"
1860 " void bar(@utf8InCpp String str);"
1861 "}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001862 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1863 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001864 "interface IFoo {"
Jiyong Parke59c3682018-09-11 23:10:25 +09001865 " void foo(in @utf8InCpp String[] str);"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001866 " void bar(@utf8InCpp String str);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001867 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001868 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001869 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001870 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001871}
Jiyong Park3656c3c2018-08-01 20:02:01 +09001872
Daniel Norman85aed542019-08-21 12:01:14 -07001873TEST_F(AidlTestIncompatibleChanges, RemovedAnnotation) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001874 const string expected_stderr =
1875 "ERROR: new/p/IFoo.aidl:1.66-72: Changed annotations: @utf8InCpp to (empty)\n";
Daniel Norman85aed542019-08-21 12:01:14 -07001876 io_delegate_.SetFileContents("old/p/IFoo.aidl",
1877 "package p;"
1878 "interface IFoo {"
1879 " void foo(in String[] str);"
1880 " void bar(@utf8InCpp String str);"
1881 "}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001882 io_delegate_.SetFileContents("new/p/IFoo.aidl",
1883 "package p;"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001884 "interface IFoo {"
Jiyong Parke59c3682018-09-11 23:10:25 +09001885 " void foo(in String[] str);"
Jiyong Park3656c3c2018-08-01 20:02:01 +09001886 " void bar(String str);"
Jiyong Parke59c3682018-09-11 23:10:25 +09001887 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001888 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001889 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001890 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001891}
Jiyong Park3656c3c2018-08-01 20:02:01 +09001892
Daniel Norman85aed542019-08-21 12:01:14 -07001893TEST_F(AidlTestIncompatibleChanges, RemovedPackage) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001894 const string expected_stderr = "ERROR: old/q/IFoo.aidl:1.11-21: Removed type: q.IFoo\n";
Jiyong Parke59c3682018-09-11 23:10:25 +09001895 io_delegate_.SetFileContents("old/p/IFoo.aidl", "package p; interface IFoo{}");
1896 io_delegate_.SetFileContents("old/q/IFoo.aidl", "package q; interface IFoo{}");
Jiyong Parke59c3682018-09-11 23:10:25 +09001897 io_delegate_.SetFileContents("new/p/IFoo.aidl", "package p; interface IFoo{}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001898 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001899 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001900 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001901}
Jiyong Parka468e2a2018-08-29 21:25:18 +09001902
Daniel Norman85aed542019-08-21 12:01:14 -07001903TEST_F(AidlTestIncompatibleChanges, ChangedDefaultValue) {
Steven Moreland370ed342020-04-28 18:14:39 -07001904 const string expected_stderr = "ERROR: new/p/D.aidl:1.30-32: Changed default value: 1 to 2.\n";
Jiyong Parke59c3682018-09-11 23:10:25 +09001905 io_delegate_.SetFileContents("old/p/D.aidl", "package p; parcelable D { int a = 1; }");
1906 io_delegate_.SetFileContents("new/p/D.aidl", "package p; parcelable D { int a = 2; }");
Devin Moore097a3ab2020-03-11 16:08:44 -07001907 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001908 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001909 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001910}
Jiyong Parka428d212018-08-29 22:26:30 +09001911
Daniel Norman85aed542019-08-21 12:01:14 -07001912TEST_F(AidlTestIncompatibleChanges, RemovedConstValue) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001913 const string expected_stderr =
1914 "ERROR: old/p/I.aidl:1.51-53: Removed constant declaration: p.I.B\n";
Jiyong Parke59c3682018-09-11 23:10:25 +09001915 io_delegate_.SetFileContents("old/p/I.aidl",
1916 "package p; interface I {"
1917 "const int A = 1; const int B = 2;}");
1918 io_delegate_.SetFileContents("new/p/I.aidl", "package p; interface I { const int A = 1; }");
Devin Moore097a3ab2020-03-11 16:08:44 -07001919 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001920 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001921 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Daniel Norman85aed542019-08-21 12:01:14 -07001922}
Jiyong Parka428d212018-08-29 22:26:30 +09001923
Daniel Norman85aed542019-08-21 12:01:14 -07001924TEST_F(AidlTestIncompatibleChanges, ChangedConstValue) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001925 const string expected_stderr =
1926 "ERROR: new/p/I.aidl:1.11-21: Changed constant value: p.I.A from 1 to 2.\n";
Jiyong Parke59c3682018-09-11 23:10:25 +09001927 io_delegate_.SetFileContents("old/p/I.aidl", "package p; interface I { const int A = 1; }");
1928 io_delegate_.SetFileContents("new/p/I.aidl", "package p; interface I { const int A = 2; }");
Devin Moore097a3ab2020-03-11 16:08:44 -07001929 CaptureStderr();
Daniel Norman85aed542019-08-21 12:01:14 -07001930 EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001931 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Park3c35e392018-08-30 13:10:30 +09001932}
1933
Jiyong Park8c380532018-08-30 14:55:26 +09001934TEST_F(AidlTest, RejectAmbiguousImports) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001935 const string expected_stderr =
1936 "ERROR: p/IFoo.aidl: Duplicate files found for q.IBar from:\n"
1937 "dir1/q/IBar.aidl\n"
1938 "dir2/q/IBar.aidl\n"
Devin Moore5de18ed2020-04-02 13:52:29 -07001939 "ERROR: p/IFoo.aidl: Couldn't find import for class q.IBar\n";
Jiyong Park8c380532018-08-30 14:55:26 +09001940 Options options = Options::From("aidl --lang=java -o out -I dir1 -I dir2 p/IFoo.aidl");
1941 io_delegate_.SetFileContents("p/IFoo.aidl", "package p; import q.IBar; interface IFoo{}");
1942 io_delegate_.SetFileContents("dir1/q/IBar.aidl", "package q; interface IBar{}");
1943 io_delegate_.SetFileContents("dir2/q/IBar.aidl", "package q; interface IBar{}");
1944
Devin Moore097a3ab2020-03-11 16:08:44 -07001945 CaptureStderr();
Jiyong Park8c380532018-08-30 14:55:26 +09001946 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001947 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Park8c380532018-08-30 14:55:26 +09001948}
1949
Jiyong Parked65bf42018-08-28 15:43:27 +09001950TEST_F(AidlTest, HandleManualIdAssignments) {
Devin Moore097a3ab2020-03-11 16:08:44 -07001951 const string expected_stderr =
1952 "ERROR: new/p/IFoo.aidl:1.32-36: Transaction ID changed: p.IFoo.foo() is changed from 10 to "
1953 "11.\n";
Jiyong Parke59c3682018-09-11 23:10:25 +09001954 Options options = Options::From("aidl --checkapi old new");
1955 io_delegate_.SetFileContents("old/p/IFoo.aidl", "package p; interface IFoo{ void foo() = 10;}");
1956 io_delegate_.SetFileContents("new/p/IFoo.aidl", "package p; interface IFoo{ void foo() = 10;}");
Jiyong Parked65bf42018-08-28 15:43:27 +09001957
1958 EXPECT_TRUE(::android::aidl::check_api(options, io_delegate_));
1959
Jiyong Parke59c3682018-09-11 23:10:25 +09001960 io_delegate_.SetFileContents("new/p/IFoo.aidl", "package p; interface IFoo{ void foo() = 11;}");
Devin Moore097a3ab2020-03-11 16:08:44 -07001961 CaptureStderr();
Jiyong Parked65bf42018-08-28 15:43:27 +09001962 EXPECT_FALSE(::android::aidl::check_api(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07001963 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Parked65bf42018-08-28 15:43:27 +09001964}
1965
Jiyong Parke05195e2018-10-08 18:24:23 +09001966TEST_F(AidlTest, ParcelFileDescriptorIsBuiltinType) {
1967 Options javaOptions = Options::From("aidl --lang=java -o out p/IFoo.aidl");
1968 Options cppOptions = Options::From("aidl --lang=cpp -h out -o out p/IFoo.aidl");
1969
1970 // use without import
1971 io_delegate_.SetFileContents("p/IFoo.aidl",
1972 "package p; interface IFoo{ void foo(in ParcelFileDescriptor fd);}");
1973 EXPECT_EQ(0, ::android::aidl::compile_aidl(javaOptions, io_delegate_));
1974 EXPECT_EQ(0, ::android::aidl::compile_aidl(cppOptions, io_delegate_));
1975
Devin Moore7b8d5c92020-03-17 14:14:08 -07001976 // use without import but with full name
Jiyong Parke05195e2018-10-08 18:24:23 +09001977 io_delegate_.SetFileContents(
1978 "p/IFoo.aidl",
1979 "package p; interface IFoo{ void foo(in android.os.ParcelFileDescriptor fd);}");
1980 EXPECT_EQ(0, ::android::aidl::compile_aidl(javaOptions, io_delegate_));
1981 EXPECT_EQ(0, ::android::aidl::compile_aidl(cppOptions, io_delegate_));
1982
1983 // use with import (as before)
1984 io_delegate_.SetFileContents("p/IFoo.aidl",
1985 "package p;"
1986 "import android.os.ParcelFileDescriptor;"
1987 "interface IFoo{"
1988 " void foo(in ParcelFileDescriptor fd);"
1989 "}");
1990 EXPECT_EQ(0, ::android::aidl::compile_aidl(javaOptions, io_delegate_));
1991 EXPECT_EQ(0, ::android::aidl::compile_aidl(cppOptions, io_delegate_));
1992}
Jiyong Parked65bf42018-08-28 15:43:27 +09001993
Jiyong Park3633b722019-04-11 15:38:26 +09001994TEST_F(AidlTest, ManualIds) {
1995 Options options = Options::From("aidl --lang=java -o out IFoo.aidl");
1996 io_delegate_.SetFileContents("IFoo.aidl",
1997 "interface IFoo {\n"
1998 " void foo() = 0;\n"
1999 " void bar() = 1;\n"
2000 "}");
2001 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
2002}
2003
2004TEST_F(AidlTest, ManualIdsWithMetaTransactions) {
2005 Options options = Options::From("aidl --lang=java --version 10 -o out IFoo.aidl");
2006 io_delegate_.SetFileContents("IFoo.aidl",
2007 "interface IFoo {\n"
2008 " void foo() = 0;\n"
2009 " void bar() = 1;\n"
2010 "}");
2011 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
2012}
2013
2014TEST_F(AidlTest, FailOnDuplicatedIds) {
Devin Moore097a3ab2020-03-11 16:08:44 -07002015 const string expected_stderr =
2016 "ERROR: IFoo.aidl:3.7-11: Found duplicate method id (3) for method bar\n";
Jiyong Park3633b722019-04-11 15:38:26 +09002017 Options options = Options::From("aidl --lang=java --version 10 -o out IFoo.aidl");
2018 io_delegate_.SetFileContents("IFoo.aidl",
2019 "interface IFoo {\n"
2020 " void foo() = 3;\n"
2021 " void bar() = 3;\n"
2022 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07002023 CaptureStderr();
Jiyong Park3633b722019-04-11 15:38:26 +09002024 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07002025 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Park3633b722019-04-11 15:38:26 +09002026}
2027
2028TEST_F(AidlTest, FailOnOutOfRangeIds) {
2029 // 16777115 is kLastMetaMethodId + 1
Devin Moore097a3ab2020-03-11 16:08:44 -07002030 const string expected_stderr =
2031 "ERROR: IFoo.aidl:3.7-11: Found out of bounds id (16777115) for method bar. "
2032 "Value for id must be between 0 and 16777114 inclusive.\n";
Jiyong Park3633b722019-04-11 15:38:26 +09002033 Options options = Options::From("aidl --lang=java --version 10 -o out IFoo.aidl");
2034 io_delegate_.SetFileContents("IFoo.aidl",
2035 "interface IFoo {\n"
2036 " void foo() = 3;\n"
2037 " void bar() = 16777115;\n"
2038 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07002039 CaptureStderr();
Jiyong Park3633b722019-04-11 15:38:26 +09002040 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07002041 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Park3633b722019-04-11 15:38:26 +09002042}
2043
2044TEST_F(AidlTest, FailOnPartiallyAssignedIds) {
Devin Moore097a3ab2020-03-11 16:08:44 -07002045 const string expected_stderr =
2046 "ERROR: IFoo.aidl:3.7-11: You must either assign id's to all methods or to none of them.\n";
Jiyong Park3633b722019-04-11 15:38:26 +09002047 Options options = Options::From("aidl --lang=java --version 10 -o out IFoo.aidl");
2048 io_delegate_.SetFileContents("IFoo.aidl",
2049 "interface IFoo {\n"
2050 " void foo() = 3;\n"
2051 " void bar();\n"
2052 "}");
Devin Moore097a3ab2020-03-11 16:08:44 -07002053 CaptureStderr();
Jiyong Park3633b722019-04-11 15:38:26 +09002054 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07002055 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Park3633b722019-04-11 15:38:26 +09002056}
2057
Jiyong Parkc6816252019-07-08 08:12:28 +09002058TEST_F(AidlTest, AllowDuplicatedImportPaths) {
2059 Options options = Options::From("aidl --lang=java -I dir -I dir IFoo.aidl");
2060 io_delegate_.SetFileContents("dir/IBar.aidl", "interface IBar{}");
2061 io_delegate_.SetFileContents("IFoo.aidl", "import IBar; interface IFoo{}");
2062 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
2063}
2064
2065TEST_F(AidlTest, FailOnAmbiguousImports) {
Devin Moore097a3ab2020-03-11 16:08:44 -07002066 const string expected_stderr =
2067 "ERROR: IFoo.aidl: Duplicate files found for IBar from:\n"
2068 "dir/IBar.aidl\n"
2069 "dir2/IBar.aidl\n"
Devin Moore5de18ed2020-04-02 13:52:29 -07002070 "ERROR: IFoo.aidl: Couldn't find import for class IBar\n";
Devin Moore097a3ab2020-03-11 16:08:44 -07002071
Jiyong Parkc6816252019-07-08 08:12:28 +09002072 Options options = Options::From("aidl --lang=java -I dir -I dir2 IFoo.aidl");
2073 io_delegate_.SetFileContents("dir/IBar.aidl", "interface IBar{}");
2074 io_delegate_.SetFileContents("dir2/IBar.aidl", "interface IBar{}");
2075 io_delegate_.SetFileContents("IFoo.aidl", "import IBar; interface IFoo{}");
Devin Moore097a3ab2020-03-11 16:08:44 -07002076 CaptureStderr();
Jiyong Parkc6816252019-07-08 08:12:28 +09002077 EXPECT_NE(0, ::android::aidl::compile_aidl(options, io_delegate_));
Devin Moore097a3ab2020-03-11 16:08:44 -07002078 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Jiyong Parkc6816252019-07-08 08:12:28 +09002079}
2080
Jiyong Parkf1f5c802020-05-19 17:33:00 +09002081TEST_F(AidlTest, UnusedImportDoesNotContributeInclude) {
2082 io_delegate_.SetFileContents("a/b/IFoo.aidl",
2083 "package a.b;\n"
2084 "import a.b.IBar;\n"
2085 "import a.b.IQux;\n"
2086 "interface IFoo { IQux foo(); }\n");
2087 io_delegate_.SetFileContents("a/b/IBar.aidl", "package a.b; interface IBar { void foo(); }");
2088 io_delegate_.SetFileContents("a/b/IQux.aidl", "package a.b; interface IQux { void foo(); }");
2089
2090 Options options = Options::From("aidl --lang=ndk a/b/IFoo.aidl -I . -o out -h out/include");
2091 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
2092
2093 string output;
2094 EXPECT_TRUE(io_delegate_.GetWrittenContents("out/include/aidl/a/b/IFoo.h", &output));
2095 // IBar was imported but wasn't used. include is not expected.
2096 EXPECT_THAT(output, Not(testing::HasSubstr("#include <aidl/a/b/IBar.h>")));
2097 // IBar was imported and used. include is expected.
2098 EXPECT_THAT(output, (testing::HasSubstr("#include <aidl/a/b/IQux.h>")));
2099}
2100
Jiyong Parkbf5fd5c2020-06-05 19:48:05 +09002101TEST_F(AidlTest, ParseJavaPassthroughAnnotation) {
2102 io_delegate_.SetFileContents("a/IFoo.aidl", R"(package a;
2103 @JavaPassthrough(annotation="@com.android.Alice(arg=com.android.Alice.Value.A) ")
2104 interface IFoo {
2105 @JavaPassthrough(annotation="@com.android.Bob")
2106 void foo(@JavaPassthrough(annotation="@com.android.Cat") int x);
2107 })");
2108
2109 Options java_options = Options::From("aidl --lang=java -o out a/IFoo.aidl");
2110 EXPECT_EQ(0, ::android::aidl::compile_aidl(java_options, io_delegate_));
2111
2112 string java_out;
2113 EXPECT_TRUE(io_delegate_.GetWrittenContents("out/a/IFoo.java", &java_out));
2114 EXPECT_THAT(java_out, testing::HasSubstr("@com.android.Alice(arg=com.android.Alice.Value.A)"));
2115 EXPECT_THAT(java_out, testing::HasSubstr("@com.android.Bob"));
2116 EXPECT_THAT(java_out, testing::HasSubstr("@com.android.Cat"));
2117
2118 // Other backends shouldn't be bothered
2119 Options cpp_options = Options::From("aidl --lang=cpp -o out -h out a/IFoo.aidl");
2120 EXPECT_EQ(0, ::android::aidl::compile_aidl(cpp_options, io_delegate_));
2121
2122 Options ndk_options = Options::From("aidl --lang=ndk -o out -h out a/IFoo.aidl");
2123 EXPECT_EQ(0, ::android::aidl::compile_aidl(ndk_options, io_delegate_));
2124}
2125
Jiyong Park56f73d72019-06-11 12:20:28 +09002126class AidlOutputPathTest : public AidlTest {
2127 protected:
2128 void SetUp() override {
2129 AidlTest::SetUp();
2130 io_delegate_.SetFileContents("sub/dir/foo/bar/IFoo.aidl", "package foo.bar; interface IFoo {}");
2131 }
2132
2133 void Test(const Options& options, const std::string expected_output_path) {
2134 EXPECT_EQ(0, ::android::aidl::compile_aidl(options, io_delegate_));
2135 // check the existence
2136 EXPECT_TRUE(io_delegate_.GetWrittenContents(expected_output_path, nullptr));
2137 }
2138};
2139
2140TEST_F(AidlOutputPathTest, OutDirWithNoOutputFile) {
2141 // <out_dir> / <package_name> / <type_name>.java
2142 Test(Options::From("aidl -o out sub/dir/foo/bar/IFoo.aidl"), "out/foo/bar/IFoo.java");
2143}
2144
2145TEST_F(AidlOutputPathTest, OutDirWithOutputFile) {
2146 // when output file is explicitly set, it is always respected. -o option is
2147 // ignored.
2148 Test(Options::From("aidl -o out sub/dir/foo/bar/IFoo.aidl output/IFoo.java"), "output/IFoo.java");
2149}
2150
2151TEST_F(AidlOutputPathTest, NoOutDirWithOutputFile) {
2152 Test(Options::From("aidl -o out sub/dir/foo/bar/IFoo.aidl output/IFoo.java"), "output/IFoo.java");
2153}
2154
2155TEST_F(AidlOutputPathTest, NoOutDirWithNoOutputFile) {
2156 // output is the same as the input file except for the suffix
2157 Test(Options::From("aidl sub/dir/foo/bar/IFoo.aidl"), "sub/dir/foo/bar/IFoo.java");
2158}
2159
Devin Moore7b8d5c92020-03-17 14:14:08 -07002160TEST_P(AidlTest, FailOnOutOfBoundsInt32MaxConstInt) {
Devin Moore097a3ab2020-03-11 16:08:44 -07002161 AidlError error;
2162 const string expected_stderr =
2163 "ERROR: p/IFoo.aidl:3.58-69: Invalid type specifier for an int64 literal: int\n";
2164 CaptureStderr();
Will McVickera4e5b132019-10-03 13:52:21 -07002165 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
2166 R"(package p;
2167 interface IFoo {
2168 const int int32_max_oob = 2147483650;
2169 }
2170 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -07002171 typenames_, GetLanguage(), &error));
Devin Moore097a3ab2020-03-11 16:08:44 -07002172 EXPECT_EQ(expected_stderr, GetCapturedStderr());
2173 EXPECT_EQ(AidlError::BAD_TYPE, error);
Will McVickera4e5b132019-10-03 13:52:21 -07002174}
2175
Devin Moore7b8d5c92020-03-17 14:14:08 -07002176TEST_P(AidlTest, FailOnOutOfBoundsInt32MinConstInt) {
Devin Moore097a3ab2020-03-11 16:08:44 -07002177 AidlError error;
2178 const string expected_stderr =
2179 "ERROR: p/IFoo.aidl:3.58-60: Invalid type specifier for an int64 literal: int\n";
2180 CaptureStderr();
Will McVickera4e5b132019-10-03 13:52:21 -07002181 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
2182 R"(package p;
2183 interface IFoo {
2184 const int int32_min_oob = -2147483650;
2185 }
2186 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -07002187 typenames_, GetLanguage(), &error));
Devin Moore097a3ab2020-03-11 16:08:44 -07002188 EXPECT_EQ(expected_stderr, GetCapturedStderr());
2189 EXPECT_EQ(AidlError::BAD_TYPE, error);
Will McVickera4e5b132019-10-03 13:52:21 -07002190}
2191
Devin Moore7b8d5c92020-03-17 14:14:08 -07002192TEST_P(AidlTest, FailOnOutOfBoundsInt64MaxConstInt) {
Devin Moore097a3ab2020-03-11 16:08:44 -07002193 AidlError error;
2194 const string expected_stderr =
2195 "ERROR: Could not parse integer: 21474836509999999999999999 at p/IFoo.aidl:3.59-85.\n";
2196 CaptureStderr();
Will McVickera4e5b132019-10-03 13:52:21 -07002197 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
2198 R"(package p;
2199 interface IFoo {
2200 const long int64_max_oob = 21474836509999999999999999;
2201 }
2202 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -07002203 typenames_, GetLanguage(), &error));
Devin Moore097a3ab2020-03-11 16:08:44 -07002204 EXPECT_EQ(expected_stderr, GetCapturedStderr());
2205 EXPECT_EQ(AidlError::PARSE_ERROR, error);
Will McVickera4e5b132019-10-03 13:52:21 -07002206}
2207
Devin Moore7b8d5c92020-03-17 14:14:08 -07002208TEST_P(AidlTest, FailOnOutOfBoundsInt64MinConstInt) {
Devin Moore097a3ab2020-03-11 16:08:44 -07002209 AidlError error;
2210 const string expected_stderr =
2211 "ERROR: Could not parse integer: 21474836509999999999999999 at p/IFoo.aidl:3.61-86.\n";
2212 CaptureStderr();
Will McVickera4e5b132019-10-03 13:52:21 -07002213 EXPECT_EQ(nullptr, Parse("p/IFoo.aidl",
2214 R"(package p;
2215 interface IFoo {
2216 const long int64_min_oob = -21474836509999999999999999;
2217 }
2218 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -07002219 typenames_, GetLanguage(), &error));
Devin Moore097a3ab2020-03-11 16:08:44 -07002220 EXPECT_EQ(expected_stderr, GetCapturedStderr());
2221 EXPECT_EQ(AidlError::PARSE_ERROR, error);
Will McVickera4e5b132019-10-03 13:52:21 -07002222}
2223
Devin Moore7b8d5c92020-03-17 14:14:08 -07002224TEST_P(AidlTest, FailOnOutOfBoundsAutofilledEnum) {
Devin Moore097a3ab2020-03-11 16:08:44 -07002225 AidlError error;
Devin Mooredf93ebb2020-03-25 14:03:35 -07002226 const string expected_stderr =
2227 "ERROR: p/TestEnum.aidl:3.35-44: Invalid type specifier for an int32 "
2228 "literal: byte\n"
2229 "ERROR: p/TestEnum.aidl:5.1-36: Enumerator type differs from enum backing type.\n";
2230 CaptureStderr();
Daniel Normanb28684e2019-10-17 15:31:39 -07002231 EXPECT_EQ(nullptr, Parse("p/TestEnum.aidl",
2232 R"(package p;
2233 @Backing(type="byte")
2234 enum TestEnum {
2235 FOO = 127,
2236 BAR,
2237 }
2238 )",
Devin Moore7b8d5c92020-03-17 14:14:08 -07002239 typenames_, GetLanguage(), &error));
Devin Mooredf93ebb2020-03-25 14:03:35 -07002240 EXPECT_EQ(expected_stderr, GetCapturedStderr());
Devin Moore097a3ab2020-03-11 16:08:44 -07002241 EXPECT_EQ(AidlError::BAD_TYPE, error);
Daniel Normanb28684e2019-10-17 15:31:39 -07002242}
2243
Devin Mooredecaf292020-04-30 09:16:40 -07002244TEST_P(AidlTest, UnsupportedBackingAnnotationParam) {
2245 AidlError error;
2246 const string expected_stderr =
2247 "ERROR: p/TestEnum.aidl:2.1-51: Parameter foo not supported for annotation Backing. It must "
2248 "be one of: type\n"
2249 "ERROR: p/TestEnum.aidl:2.1-51: Parameter foo not supported for annotation Backing. It must "
2250 "be one of: type\n";
2251 CaptureStderr();
2252 EXPECT_EQ(nullptr, Parse("p/TestEnum.aidl",
2253 R"(package p;
2254 @Backing(foo="byte")
2255 enum TestEnum {
2256 FOO = 1,
2257 BAR,
2258 }
2259 )",
2260 typenames_, GetLanguage(), &error));
2261 EXPECT_EQ(expected_stderr, GetCapturedStderr());
2262 EXPECT_EQ(AidlError::BAD_TYPE, error);
2263}
2264
Christopher Wiley90be4e32015-10-20 14:55:25 -07002265} // namespace aidl
2266} // namespace android