1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcel.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <binder/RpcSession.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <binder/Status.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
21*38e8c45fSAndroid Build Coastguard Worker
22*38e8c45fSAndroid Build Coastguard Worker #ifdef __ANDROID__
23*38e8c45fSAndroid Build Coastguard Worker #include <android-base/properties.h>
24*38e8c45fSAndroid Build Coastguard Worker #endif
25*38e8c45fSAndroid Build Coastguard Worker
26*38e8c45fSAndroid Build Coastguard Worker #include "../Debug.h"
27*38e8c45fSAndroid Build Coastguard Worker #include "../Utils.h"
28*38e8c45fSAndroid Build Coastguard Worker
29*38e8c45fSAndroid Build Coastguard Worker namespace android {
30*38e8c45fSAndroid Build Coastguard Worker
31*38e8c45fSAndroid Build Coastguard Worker static const int32_t kInt32Array[] = {-1, 0, 17};
32*38e8c45fSAndroid Build Coastguard Worker static const uint8_t kByteArray[] = {0, 17, 255};
33*38e8c45fSAndroid Build Coastguard Worker enum EnumInt8 : int8_t { Int8A, Int8B };
34*38e8c45fSAndroid Build Coastguard Worker enum EnumInt32 : int32_t { Int32A, Int32B };
35*38e8c45fSAndroid Build Coastguard Worker enum EnumInt64 : int64_t { Int64A, Int64B };
36*38e8c45fSAndroid Build Coastguard Worker struct AParcelable : Parcelable {
writeToParcelandroid::AParcelable37*38e8c45fSAndroid Build Coastguard Worker status_t writeToParcel(Parcel* parcel) const { return parcel->writeInt32(37); }
readFromParcelandroid::AParcelable38*38e8c45fSAndroid Build Coastguard Worker status_t readFromParcel(const Parcel*) { return OK; }
39*38e8c45fSAndroid Build Coastguard Worker };
40*38e8c45fSAndroid Build Coastguard Worker
41*38e8c45fSAndroid Build Coastguard Worker // clang-format off
42*38e8c45fSAndroid Build Coastguard Worker constexpr size_t kFillFunIndexLineBase = __LINE__ + 2;
43*38e8c45fSAndroid Build Coastguard Worker static const std::vector<std::function<void(Parcel* p)>> kFillFuns {
__anone7eb5c2c0102(Parcel* p) 44*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInterfaceToken(String16(u"tok"))); },
__anone7eb5c2c0202(Parcel* p) 45*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32(-1)); },
__anone7eb5c2c0302(Parcel* p) 46*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32(0)); },
__anone7eb5c2c0402(Parcel* p) 47*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32(17)); },
__anone7eb5c2c0502(Parcel* p) 48*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint32(0)); },
__anone7eb5c2c0602(Parcel* p) 49*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint32(1)); },
__anone7eb5c2c0702(Parcel* p) 50*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint32(10003)); },
__anone7eb5c2c0802(Parcel* p) 51*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt64(-1)); },
__anone7eb5c2c0902(Parcel* p) 52*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt64(0)); },
__anone7eb5c2c0a02(Parcel* p) 53*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt64(17)); },
__anone7eb5c2c0b02(Parcel* p) 54*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint64(0)); },
__anone7eb5c2c0c02(Parcel* p) 55*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint64(1)); },
__anone7eb5c2c0d02(Parcel* p) 56*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint64(10003)); },
__anone7eb5c2c0e02(Parcel* p) 57*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeFloat(0.0f)); },
__anone7eb5c2c0f02(Parcel* p) 58*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeFloat(0.1f)); },
__anone7eb5c2c1002(Parcel* p) 59*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeFloat(9.1f)); },
__anone7eb5c2c1102(Parcel* p) 60*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeDouble(0.0)); },
__anone7eb5c2c1202(Parcel* p) 61*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeDouble(0.1)); },
__anone7eb5c2c1302(Parcel* p) 62*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeDouble(9.1)); },
__anone7eb5c2c1402(Parcel* p) 63*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeCString("")); },
__anone7eb5c2c1502(Parcel* p) 64*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeCString("a")); },
__anone7eb5c2c1602(Parcel* p) 65*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeCString("baba")); },
__anone7eb5c2c1702(Parcel* p) 66*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString8(String8(""))); },
__anone7eb5c2c1802(Parcel* p) 67*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString8(String8("a"))); },
__anone7eb5c2c1902(Parcel* p) 68*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString8(String8("baba"))); },
__anone7eb5c2c1a02(Parcel* p) 69*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString16(String16(u""))); },
__anone7eb5c2c1b02(Parcel* p) 70*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString16(String16(u"a"))); },
__anone7eb5c2c1c02(Parcel* p) 71*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString16(String16(u"baba"))); },
__anone7eb5c2c1d02(Parcel* p) 72*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeStrongBinder(nullptr)); },
__anone7eb5c2c1e02(Parcel* p) 73*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32Array(countof(kInt32Array), kInt32Array)); },
__anone7eb5c2c1f02(Parcel* p) 74*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByteArray(countof(kByteArray), kByteArray)); },
__anone7eb5c2c2002(Parcel* p) 75*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeBool(true)); },
__anone7eb5c2c2102(Parcel* p) 76*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeBool(false)); },
__anone7eb5c2c2202(Parcel* p) 77*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeChar('a')); },
__anone7eb5c2c2302(Parcel* p) 78*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeChar('?')); },
__anone7eb5c2c2402(Parcel* p) 79*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeChar('\0')); },
__anone7eb5c2c2502(Parcel* p) 80*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByte(-128)); },
__anone7eb5c2c2602(Parcel* p) 81*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByte(0)); },
__anone7eb5c2c2702(Parcel* p) 82*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByte(127)); },
__anone7eb5c2c2802(Parcel* p) 83*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8AsUtf16(std::string(""))); },
__anone7eb5c2c2902(Parcel* p) 84*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8AsUtf16(std::string("a"))); },
__anone7eb5c2c2a02(Parcel* p) 85*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8AsUtf16(std::string("abab"))); },
__anone7eb5c2c2b02(Parcel* p) 86*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8AsUtf16(std::nullopt)); },
__anone7eb5c2c2c02(Parcel* p) 87*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8AsUtf16(std::optional<std::string>(""))); },
__anone7eb5c2c2d02(Parcel* p) 88*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8AsUtf16(std::optional<std::string>("a"))); },
__anone7eb5c2c2e02(Parcel* p) 89*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8AsUtf16(std::optional<std::string>("abab"))); },
__anone7eb5c2c2f02(Parcel* p) 90*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByteVector(std::optional<std::vector<int8_t>>(std::nullopt))); },
__anone7eb5c2c3002(Parcel* p) 91*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByteVector(std::optional<std::vector<int8_t>>({-1, 0, 17}))); },
__anone7eb5c2c3102(Parcel* p) 92*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByteVector(std::vector<int8_t>({}))); },
__anone7eb5c2c3202(Parcel* p) 93*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByteVector(std::vector<int8_t>({-1, 0, 17}))); },
__anone7eb5c2c3302(Parcel* p) 94*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByteVector(std::optional<std::vector<uint8_t>>(std::nullopt))); },
__anone7eb5c2c3402(Parcel* p) 95*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByteVector(std::optional<std::vector<uint8_t>>({0, 1, 17}))); },
__anone7eb5c2c3502(Parcel* p) 96*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByteVector(std::vector<uint8_t>({}))); },
__anone7eb5c2c3602(Parcel* p) 97*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeByteVector(std::vector<uint8_t>({0, 1, 17}))); },
__anone7eb5c2c3702(Parcel* p) 98*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32Vector(std::optional<std::vector<int32_t>>(std::nullopt))); },
__anone7eb5c2c3802(Parcel* p) 99*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32Vector(std::optional<std::vector<int32_t>>({-1, 0, 17}))); },
__anone7eb5c2c3902(Parcel* p) 100*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32Vector(std::vector<int32_t>({}))); },
__anone7eb5c2c3a02(Parcel* p) 101*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt32Vector(std::vector<int32_t>({-1, 0, 17}))); },
__anone7eb5c2c3b02(Parcel* p) 102*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt64Vector(std::optional<std::vector<int64_t>>(std::nullopt))); },
__anone7eb5c2c3c02(Parcel* p) 103*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt64Vector(std::optional<std::vector<int64_t>>({-1, 0, 17}))); },
__anone7eb5c2c3d02(Parcel* p) 104*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt64Vector(std::vector<int64_t>({}))); },
__anone7eb5c2c3e02(Parcel* p) 105*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeInt64Vector(std::vector<int64_t>({-1, 0, 17}))); },
__anone7eb5c2c3f02(Parcel* p) 106*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint64Vector(std::optional<std::vector<uint64_t>>(std::nullopt))); },
__anone7eb5c2c4002(Parcel* p) 107*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint64Vector(std::optional<std::vector<uint64_t>>({0, 1, 17}))); },
__anone7eb5c2c4102(Parcel* p) 108*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint64Vector(std::vector<uint64_t>({}))); },
__anone7eb5c2c4202(Parcel* p) 109*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUint64Vector(std::vector<uint64_t>({0, 1, 17}))); },
__anone7eb5c2c4302(Parcel* p) 110*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeFloatVector(std::optional<std::vector<float>>(std::nullopt))); },
__anone7eb5c2c4402(Parcel* p) 111*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeFloatVector(std::optional<std::vector<float>>({0.0f, 0.1f, 9.1f}))); },
__anone7eb5c2c4502(Parcel* p) 112*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeFloatVector(std::vector<float>({}))); },
__anone7eb5c2c4602(Parcel* p) 113*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeFloatVector(std::vector<float>({0.0f, 0.1f, 9.1f}))); },
__anone7eb5c2c4702(Parcel* p) 114*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeDoubleVector(std::optional<std::vector<double>>(std::nullopt))); },
__anone7eb5c2c4802(Parcel* p) 115*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeDoubleVector(std::optional<std::vector<double>>({0.0, 0.1, 9.1}))); },
__anone7eb5c2c4902(Parcel* p) 116*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeDoubleVector(std::vector<double>({}))); },
__anone7eb5c2c4a02(Parcel* p) 117*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeDoubleVector(std::vector<double>({0.0, 0.1, 9.1}))); },
__anone7eb5c2c4b02(Parcel* p) 118*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeBoolVector(std::optional<std::vector<bool>>(std::nullopt))); },
__anone7eb5c2c4c02(Parcel* p) 119*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeBoolVector(std::optional<std::vector<bool>>({true, false}))); },
__anone7eb5c2c4d02(Parcel* p) 120*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeBoolVector(std::vector<bool>({}))); },
__anone7eb5c2c4e02(Parcel* p) 121*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeBoolVector(std::vector<bool>({true, false}))); },
__anone7eb5c2c4f02(Parcel* p) 122*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeCharVector(std::optional<std::vector<char16_t>>(std::nullopt))); },
__anone7eb5c2c5002(Parcel* p) 123*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeCharVector(std::optional<std::vector<char16_t>>({'a', '\0', '?'}))); },
__anone7eb5c2c5102(Parcel* p) 124*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeCharVector(std::vector<char16_t>({}))); },
__anone7eb5c2c5202(Parcel* p) 125*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeCharVector(std::vector<char16_t>({'a', '\0', '?'}))); },
__anone7eb5c2c5302(Parcel* p) 126*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString16Vector(std::optional<std::vector<std::optional<String16>>>(std::nullopt))); },
__anone7eb5c2c5402(Parcel* p) 127*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString16Vector(std::optional<std::vector<std::optional<String16>>>({std::nullopt, String16(), String16(u"a")}))); },
__anone7eb5c2c5502(Parcel* p) 128*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString16Vector(std::vector<std::optional<String16>>({}))); },
__anone7eb5c2c5602(Parcel* p) 129*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeString16Vector(std::vector<std::optional<String16>>({std::nullopt, String16(), String16(u"a")}))); },
__anone7eb5c2c5702(Parcel* p) 130*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8VectorAsUtf16Vector(std::optional<std::vector<std::optional<std::string>>>(std::nullopt))); },
__anone7eb5c2c5802(Parcel* p) 131*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8VectorAsUtf16Vector(std::optional<std::vector<std::optional<std::string>>>({std::nullopt, std::string(), std::string("a")}))); },
__anone7eb5c2c5902(Parcel* p) 132*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8VectorAsUtf16Vector(std::vector<std::optional<std::string>>({}))); },
__anone7eb5c2c5a02(Parcel* p) 133*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeUtf8VectorAsUtf16Vector(std::vector<std::optional<std::string>>({std::nullopt, std::string(), std::string("a")}))); },
__anone7eb5c2c5b02(Parcel* p) 134*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeStrongBinderVector(std::optional<std::vector<sp<IBinder>>>(std::nullopt))); },
__anone7eb5c2c5c02(Parcel* p) 135*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeStrongBinderVector(std::optional<std::vector<sp<IBinder>>>({nullptr}))); },
__anone7eb5c2c5d02(Parcel* p) 136*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeStrongBinderVector(std::vector<sp<IBinder>>({}))); },
__anone7eb5c2c5e02(Parcel* p) 137*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeStrongBinderVector(std::vector<sp<IBinder>>({nullptr}))); },
__anone7eb5c2c5f02(Parcel* p) 138*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeEnumVector(std::optional<std::vector<EnumInt8>>(std::nullopt))); },
__anone7eb5c2c6002(Parcel* p) 139*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeEnumVector(std::optional<std::vector<EnumInt8>>({Int8A, Int8B}))); },
__anone7eb5c2c6102(Parcel* p) 140*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeEnumVector(std::vector<EnumInt8>({Int8A, Int8B}))); },
__anone7eb5c2c6202(Parcel* p) 141*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeEnumVector(std::optional<std::vector<EnumInt32>>(std::nullopt))); },
__anone7eb5c2c6302(Parcel* p) 142*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeEnumVector(std::optional<std::vector<EnumInt32>>({Int32A, Int32B}))); },
__anone7eb5c2c6402(Parcel* p) 143*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeEnumVector(std::vector<EnumInt32>({Int32A, Int32B}))); },
__anone7eb5c2c6502(Parcel* p) 144*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeEnumVector(std::optional<std::vector<EnumInt64>>(std::nullopt))); },
__anone7eb5c2c6602(Parcel* p) 145*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeEnumVector(std::optional<std::vector<EnumInt64>>({Int64A, Int64B}))); },
__anone7eb5c2c6702(Parcel* p) 146*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeEnumVector(std::vector<EnumInt64>({Int64A, Int64B}))); },
__anone7eb5c2c6802(Parcel* p) 147*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeParcelableVector(std::optional<std::vector<std::optional<AParcelable>>>(std::nullopt))); },
__anone7eb5c2c6902(Parcel* p) 148*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeParcelableVector(std::optional<std::vector<std::optional<AParcelable>>>({AParcelable()}))); },
__anone7eb5c2c6a02(Parcel* p) 149*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeParcelableVector(std::vector<AParcelable>({AParcelable()}))); },
__anone7eb5c2c6b02(Parcel* p) 150*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeNullableParcelable(std::optional<AParcelable>(std::nullopt))); },
__anone7eb5c2c6c02(Parcel* p) 151*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeNullableParcelable(std::optional<AParcelable>(AParcelable()))); },
__anone7eb5c2c6d02(Parcel* p) 152*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeParcelable(AParcelable())); },
__anone7eb5c2c6e02(Parcel* p) 153*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeVectorSize(std::vector<int32_t>({0, 1, 17}))); },
__anone7eb5c2c6f02(Parcel* p) 154*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeVectorSize(std::vector<AParcelable>({}))); },
__anone7eb5c2c7002(Parcel* p) 155*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeVectorSize(std::optional<std::vector<int32_t>>(std::nullopt))); },
__anone7eb5c2c7102(Parcel* p) 156*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeVectorSize(std::optional<std::vector<int32_t>>({0, 1, 17}))); },
__anone7eb5c2c7202(Parcel* p) 157*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, p->writeNoException()); },
__anone7eb5c2c7302(Parcel* p) 158*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, binder::Status::ok().writeToParcel(p)); },
__anone7eb5c2c7402(Parcel* p) 159*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, binder::Status::fromExceptionCode(7, ":D").writeToParcel(p)); },
__anone7eb5c2c7502(Parcel* p) 160*38e8c45fSAndroid Build Coastguard Worker [](Parcel* p) { ASSERT_EQ(OK, binder::Status::fromServiceSpecificError(8, ":/").writeToParcel(p)); },
161*38e8c45fSAndroid Build Coastguard Worker };
162*38e8c45fSAndroid Build Coastguard Worker // clang-format on
163*38e8c45fSAndroid Build Coastguard Worker
setParcelForRpc(Parcel * p,uint32_t version)164*38e8c45fSAndroid Build Coastguard Worker static void setParcelForRpc(Parcel* p, uint32_t version) {
165*38e8c45fSAndroid Build Coastguard Worker auto session = RpcSession::make();
166*38e8c45fSAndroid Build Coastguard Worker EXPECT_TRUE(session->setProtocolVersion(version));
167*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(OK, session->addNullDebuggingClient());
168*38e8c45fSAndroid Build Coastguard Worker p->markForRpc(session);
169*38e8c45fSAndroid Build Coastguard Worker }
170*38e8c45fSAndroid Build Coastguard Worker
buildRepr(uint32_t version)171*38e8c45fSAndroid Build Coastguard Worker static std::string buildRepr(uint32_t version) {
172*38e8c45fSAndroid Build Coastguard Worker std::string result;
173*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < kFillFuns.size(); i++) {
174*38e8c45fSAndroid Build Coastguard Worker if (i != 0) result += "|";
175*38e8c45fSAndroid Build Coastguard Worker Parcel p;
176*38e8c45fSAndroid Build Coastguard Worker setParcelForRpc(&p, version);
177*38e8c45fSAndroid Build Coastguard Worker kFillFuns[i](&p);
178*38e8c45fSAndroid Build Coastguard Worker
179*38e8c45fSAndroid Build Coastguard Worker result += HexString(p.data(), p.dataSize());
180*38e8c45fSAndroid Build Coastguard Worker }
181*38e8c45fSAndroid Build Coastguard Worker return result;
182*38e8c45fSAndroid Build Coastguard Worker }
183*38e8c45fSAndroid Build Coastguard Worker
184*38e8c45fSAndroid Build Coastguard Worker // To be replaced with std::views::split (and std::views::zip) once C++ compilers catch up.
split(std::string_view s,char delimiter)185*38e8c45fSAndroid Build Coastguard Worker static std::vector<std::string> split(std::string_view s, char delimiter) {
186*38e8c45fSAndroid Build Coastguard Worker std::vector<std::string> result;
187*38e8c45fSAndroid Build Coastguard Worker size_t pos = 0;
188*38e8c45fSAndroid Build Coastguard Worker while (true) {
189*38e8c45fSAndroid Build Coastguard Worker const auto found = s.find(delimiter, pos);
190*38e8c45fSAndroid Build Coastguard Worker result.emplace_back(s.substr(pos, found - pos));
191*38e8c45fSAndroid Build Coastguard Worker if (found == s.npos) return result;
192*38e8c45fSAndroid Build Coastguard Worker pos = found + 1;
193*38e8c45fSAndroid Build Coastguard Worker }
194*38e8c45fSAndroid Build Coastguard Worker }
195*38e8c45fSAndroid Build Coastguard Worker
checkRepr(const std::string & repr,uint32_t version)196*38e8c45fSAndroid Build Coastguard Worker static void checkRepr(const std::string& repr, uint32_t version) {
197*38e8c45fSAndroid Build Coastguard Worker const std::string actualRepr = buildRepr(version);
198*38e8c45fSAndroid Build Coastguard Worker
199*38e8c45fSAndroid Build Coastguard Worker auto expected = split(repr, '|');
200*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(expected.size(), kFillFuns.size());
201*38e8c45fSAndroid Build Coastguard Worker
202*38e8c45fSAndroid Build Coastguard Worker auto actual = split(actualRepr, '|');
203*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(actual.size(), kFillFuns.size());
204*38e8c45fSAndroid Build Coastguard Worker
205*38e8c45fSAndroid Build Coastguard Worker for (size_t i = 0; i < kFillFuns.size(); i++) {
206*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(expected[i], actual[i])
207*38e8c45fSAndroid Build Coastguard Worker << "Format mismatch, see " __FILE__ " line " << (kFillFunIndexLineBase + i);
208*38e8c45fSAndroid Build Coastguard Worker }
209*38e8c45fSAndroid Build Coastguard Worker
210*38e8c45fSAndroid Build Coastguard Worker // same check as in the loop, but the above error is more clear to debug,
211*38e8c45fSAndroid Build Coastguard Worker // and this error is more clear to be able to update the source file here.
212*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(repr, actualRepr);
213*38e8c45fSAndroid Build Coastguard Worker }
214*38e8c45fSAndroid Build Coastguard Worker
215*38e8c45fSAndroid Build Coastguard Worker const std::string kCurrentRepr =
216*38e8c45fSAndroid Build Coastguard Worker "0300000074006f006b000000|ffffffff|00000000|11000000|00000000|01000000|13270000|"
217*38e8c45fSAndroid Build Coastguard Worker "ffffffffffffffff|0000000000000000|1100000000000000|0000000000000000|0100000000000000|"
218*38e8c45fSAndroid Build Coastguard Worker "1327000000000000|00000000|cdcccc3d|9a991141|0000000000000000|9a9999999999b93f|"
219*38e8c45fSAndroid Build Coastguard Worker "3333333333332240|00000000|61000000|6261626100000000|0000000000000000|0100000061000000|"
220*38e8c45fSAndroid Build Coastguard Worker "040000006261626100000000|0000000000000000|0100000061000000|"
221*38e8c45fSAndroid Build Coastguard Worker "04000000620061006200610000000000|0000000000000000|03000000ffffffff0000000011000000|"
222*38e8c45fSAndroid Build Coastguard Worker "030000000011ff00|01000000|00000000|61000000|3f000000|00000000|80ffffff|00000000|7f000000|"
223*38e8c45fSAndroid Build Coastguard Worker "0000000000000000|0100000061000000|04000000610062006100620000000000|ffffffff|"
224*38e8c45fSAndroid Build Coastguard Worker "0000000000000000|0100000061000000|04000000610062006100620000000000|ffffffff|"
225*38e8c45fSAndroid Build Coastguard Worker "03000000ff001100|00000000|03000000ff001100|ffffffff|0300000000011100|00000000|"
226*38e8c45fSAndroid Build Coastguard Worker "0300000000011100|ffffffff|03000000ffffffff0000000011000000|00000000|"
227*38e8c45fSAndroid Build Coastguard Worker "03000000ffffffff0000000011000000|ffffffff|"
228*38e8c45fSAndroid Build Coastguard Worker "03000000ffffffffffffffff00000000000000001100000000000000|00000000|"
229*38e8c45fSAndroid Build Coastguard Worker "03000000ffffffffffffffff00000000000000001100000000000000|ffffffff|"
230*38e8c45fSAndroid Build Coastguard Worker "03000000000000000000000001000000000000001100000000000000|00000000|"
231*38e8c45fSAndroid Build Coastguard Worker "03000000000000000000000001000000000000001100000000000000|ffffffff|"
232*38e8c45fSAndroid Build Coastguard Worker "0300000000000000cdcccc3d9a991141|00000000|0300000000000000cdcccc3d9a991141|ffffffff|"
233*38e8c45fSAndroid Build Coastguard Worker "0300000000000000000000009a9999999999b93f3333333333332240|00000000|"
234*38e8c45fSAndroid Build Coastguard Worker "0300000000000000000000009a9999999999b93f3333333333332240|ffffffff|"
235*38e8c45fSAndroid Build Coastguard Worker "020000000100000000000000|00000000|020000000100000000000000|ffffffff|"
236*38e8c45fSAndroid Build Coastguard Worker "0300000061000000000000003f000000|00000000|0300000061000000000000003f000000|ffffffff|"
237*38e8c45fSAndroid Build Coastguard Worker "03000000ffffffff00000000000000000100000061000000|00000000|"
238*38e8c45fSAndroid Build Coastguard Worker "03000000ffffffff00000000000000000100000061000000|ffffffff|"
239*38e8c45fSAndroid Build Coastguard Worker "03000000ffffffff00000000000000000100000061000000|00000000|"
240*38e8c45fSAndroid Build Coastguard Worker "03000000ffffffff00000000000000000100000061000000|ffffffff|010000000000000000000000|"
241*38e8c45fSAndroid Build Coastguard Worker "00000000|010000000000000000000000|ffffffff|0200000000010000|0200000000010000|ffffffff|"
242*38e8c45fSAndroid Build Coastguard Worker "020000000000000001000000|020000000000000001000000|ffffffff|"
243*38e8c45fSAndroid Build Coastguard Worker "0200000000000000000000000100000000000000|0200000000000000000000000100000000000000|"
244*38e8c45fSAndroid Build Coastguard Worker "ffffffff|010000000100000025000000|010000000100000025000000|00000000|0100000025000000|"
245*38e8c45fSAndroid Build Coastguard Worker "0100000025000000|03000000|00000000|ffffffff|03000000|00000000|00000000|"
246*38e8c45fSAndroid Build Coastguard Worker "07000000020000003a0044000000000000000000|f8ffffff020000003a002f00000000000000000008000000";
247*38e8c45fSAndroid Build Coastguard Worker
TEST(RpcWire,V0)248*38e8c45fSAndroid Build Coastguard Worker TEST(RpcWire, V0) {
249*38e8c45fSAndroid Build Coastguard Worker checkRepr(kCurrentRepr, 0);
250*38e8c45fSAndroid Build Coastguard Worker }
251*38e8c45fSAndroid Build Coastguard Worker
TEST(RpcWire,V1)252*38e8c45fSAndroid Build Coastguard Worker TEST(RpcWire, V1) {
253*38e8c45fSAndroid Build Coastguard Worker checkRepr(kCurrentRepr, 1);
254*38e8c45fSAndroid Build Coastguard Worker }
255*38e8c45fSAndroid Build Coastguard Worker
TEST(RpcWire,CurrentVersion)256*38e8c45fSAndroid Build Coastguard Worker TEST(RpcWire, CurrentVersion) {
257*38e8c45fSAndroid Build Coastguard Worker checkRepr(kCurrentRepr, RPC_WIRE_PROTOCOL_VERSION);
258*38e8c45fSAndroid Build Coastguard Worker }
259*38e8c45fSAndroid Build Coastguard Worker
260*38e8c45fSAndroid Build Coastguard Worker static_assert(RPC_WIRE_PROTOCOL_VERSION == 1,
261*38e8c45fSAndroid Build Coastguard Worker "If the binder wire protocol is updated, this test should test additional versions. "
262*38e8c45fSAndroid Build Coastguard Worker "The binder wire protocol should only be updated on upstream AOSP.");
263*38e8c45fSAndroid Build Coastguard Worker
TEST(RpcWire,NextIsPlusOneReminder)264*38e8c45fSAndroid Build Coastguard Worker TEST(RpcWire, NextIsPlusOneReminder) {
265*38e8c45fSAndroid Build Coastguard Worker if (RPC_WIRE_PROTOCOL_VERSION != RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL) {
266*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(RPC_WIRE_PROTOCOL_VERSION + 1, RPC_WIRE_PROTOCOL_VERSION_NEXT)
267*38e8c45fSAndroid Build Coastguard Worker << "Make sure to note what the next version should be.";
268*38e8c45fSAndroid Build Coastguard Worker }
269*38e8c45fSAndroid Build Coastguard Worker }
270*38e8c45fSAndroid Build Coastguard Worker
TEST(RpcWire,ReleaseBranchHasFrozenRpcWireProtocol)271*38e8c45fSAndroid Build Coastguard Worker TEST(RpcWire, ReleaseBranchHasFrozenRpcWireProtocol) {
272*38e8c45fSAndroid Build Coastguard Worker if (RPC_WIRE_PROTOCOL_VERSION == RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL) {
273*38e8c45fSAndroid Build Coastguard Worker #ifdef __ANDROID__
274*38e8c45fSAndroid Build Coastguard Worker bool isRelease = base::GetProperty("ro.build.version.codename", "") == "REL";
275*38e8c45fSAndroid Build Coastguard Worker #else
276*38e8c45fSAndroid Build Coastguard Worker bool isRelease = true;
277*38e8c45fSAndroid Build Coastguard Worker #endif
278*38e8c45fSAndroid Build Coastguard Worker EXPECT_FALSE(isRelease)
279*38e8c45fSAndroid Build Coastguard Worker << "Binder RPC wire protocol must be frozen in release configuration!";
280*38e8c45fSAndroid Build Coastguard Worker }
281*38e8c45fSAndroid Build Coastguard Worker }
282*38e8c45fSAndroid Build Coastguard Worker
283*38e8c45fSAndroid Build Coastguard Worker } // namespace android
284