checkapi: enum type for new field should have 0
checkapi checks if new fields has a default value or it is nullable. But
enum type can't have a default value(b/142893595) and can't be nullable.
So checkapi should allow enum types as a new field if enum types
have 0 as a valid value (enum type's implicit default value).
Bug: 171003934
Test: aidl_unittests / aidl_integeration_test
Change-Id: Ie4f262121e623cfe983111beb672a311b2a23128
diff --git a/aidl_unittest.cpp b/aidl_unittest.cpp
index b6dd77c..869ef00 100644
--- a/aidl_unittest.cpp
+++ b/aidl_unittest.cpp
@@ -1871,6 +1871,28 @@
EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
}
+TEST_F(AidlTestCompatibleChanges, NewFieldOfNewType) {
+ io_delegate_.SetFileContents("old/p/Data.aidl",
+ "package p;"
+ "parcelable Data {"
+ " int num;"
+ "}");
+ io_delegate_.SetFileContents(
+ "new/p/Data.aidl",
+ "package p;"
+ "parcelable Data {"
+ " int num;"
+ " p.Enum e;" // this is considered as valid since 0(enum default) is valid for "Enum" type
+ "}");
+ io_delegate_.SetFileContents("new/p/Enum.aidl",
+ "package p;"
+ "enum Enum {"
+ " FOO = 0,"
+ " BAR = 1,"
+ "}");
+ EXPECT_TRUE(::android::aidl::check_api(options_, io_delegate_));
+}
+
class AidlTestIncompatibleChanges : public AidlTest {
protected:
Options options_ = Options::From("aidl --checkapi old new");
@@ -1997,6 +2019,32 @@
EXPECT_EQ(expected_stderr, GetCapturedStderr());
}
+TEST_F(AidlTestIncompatibleChanges, NewFieldWithNonZeroEnum) {
+ const string expected_stderr =
+ "ERROR: new/p/Data.aidl:1.46-48: Field 'e' of enum 'Enum' can't be initialized as '0'. "
+ "Please make sure 'Enum' has '0' as a valid value.\n";
+ io_delegate_.SetFileContents("old/p/Data.aidl",
+ "package p;"
+ "parcelable Data {"
+ " int num;"
+ "}");
+ io_delegate_.SetFileContents("new/p/Data.aidl",
+ "package p;"
+ "parcelable Data {"
+ " int num;"
+ " p.Enum e;"
+ "}");
+ io_delegate_.SetFileContents("new/p/Enum.aidl",
+ "package p;"
+ "enum Enum {"
+ " FOO = 1,"
+ " BAR = 2,"
+ "}");
+ CaptureStderr();
+ EXPECT_FALSE(::android::aidl::check_api(options_, io_delegate_));
+ EXPECT_EQ(expected_stderr, GetCapturedStderr());
+}
+
TEST_F(AidlTestIncompatibleChanges, RemovedEnumerator) {
const string expected_stderr =
"ERROR: new/p/Enum.aidl:1.15-20: Removed enumerator from p.Enum: FOO\n";