1d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza/* 2d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * Copyright 2016 The Android Open Source Project 3d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * 4d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * Licensed under the Apache License, Version 2.0 (the "License"); 5d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * you may not use this file except in compliance with the License. 6d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * You may obtain a copy of the License at 7d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * 8d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * http://www.apache.org/licenses/LICENSE-2.0 9d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * 10d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * Unless required by applicable law or agreed to in writing, software 11d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * distributed under the License is distributed on an "AS IS" BASIS, 12d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * See the License for the specific language governing permissions and 14d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza * limitations under the License. 15d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza */ 16d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 17d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#include <binder/SafeInterface.h> 18d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 19d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#include <binder/IInterface.h> 20d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#include <binder/IPCThreadState.h> 21d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#include <binder/IServiceManager.h> 22d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#include <binder/Parcel.h> 23d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#include <binder/Parcelable.h> 24d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#include <binder/ProcessState.h> 25d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 26d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic push 27d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic ignored "-Weverything" 28d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#include <gtest/gtest.h> 29d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic pop 30d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 316dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza#include <utils/LightRefBase.h> 322537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza#include <utils/NativeHandle.h> 332537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 342537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza#include <cutils/native_handle.h> 356dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza 36d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#include <optional> 37d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 382537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza#include <sys/eventfd.h> 392537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 40d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozausing namespace std::chrono_literals; // NOLINT - google-build-using-namespace 41d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 42d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozanamespace android { 43d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozanamespace tests { 44d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 4581ea3efb75a6427c946221f95dcf9c388b27a977Dan Stozaenum class TestEnum : uint32_t { 4681ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza INVALID = 0, 4781ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza INITIAL = 1, 4881ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza FINAL = 2, 4981ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza}; 5081ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza 51d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza// This class serves two purposes: 52d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza// 1) It ensures that the implementation doesn't require copying or moving the data (for 53d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza// efficiency purposes) 54d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza// 2) It tests that Parcelables can be passed correctly 55d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaclass NoCopyNoMove : public Parcelable { 56d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozapublic: 57d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza NoCopyNoMove() = default; 58d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza explicit NoCopyNoMove(int32_t value) : mValue(value) {} 59d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ~NoCopyNoMove() override = default; 60d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 61d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // Not copyable 62d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza NoCopyNoMove(const NoCopyNoMove&) = delete; 63d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza NoCopyNoMove& operator=(const NoCopyNoMove&) = delete; 64d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 65d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // Not movable 66d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza NoCopyNoMove(NoCopyNoMove&&) = delete; 67d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza NoCopyNoMove& operator=(NoCopyNoMove&&) = delete; 68d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 69d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // Parcelable interface 70d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t writeToParcel(Parcel* parcel) const override { return parcel->writeInt32(mValue); } 71d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t readFromParcel(const Parcel* parcel) override { return parcel->readInt32(&mValue); } 72d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 73d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza int32_t getValue() const { return mValue; } 74d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza void setValue(int32_t value) { mValue = value; } 75d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 76d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaprivate: 77d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza int32_t mValue = 0; 78d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza uint8_t mPadding[4] = {}; // Avoids a warning from -Wpadded 79d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 80d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 81df614ae850b0b277030f94fd32062d45e723f91bDan Stozastruct TestFlattenable : Flattenable<TestFlattenable> { 82df614ae850b0b277030f94fd32062d45e723f91bDan Stoza TestFlattenable() = default; 83df614ae850b0b277030f94fd32062d45e723f91bDan Stoza explicit TestFlattenable(int32_t v) : value(v) {} 84df614ae850b0b277030f94fd32062d45e723f91bDan Stoza 85df614ae850b0b277030f94fd32062d45e723f91bDan Stoza // Flattenable protocol 86df614ae850b0b277030f94fd32062d45e723f91bDan Stoza size_t getFlattenedSize() const { return sizeof(value); } 87df614ae850b0b277030f94fd32062d45e723f91bDan Stoza size_t getFdCount() const { return 0; } 88df614ae850b0b277030f94fd32062d45e723f91bDan Stoza status_t flatten(void*& buffer, size_t& size, int*& /*fds*/, size_t& /*count*/) const { 89df614ae850b0b277030f94fd32062d45e723f91bDan Stoza FlattenableUtils::write(buffer, size, value); 90df614ae850b0b277030f94fd32062d45e723f91bDan Stoza return NO_ERROR; 91df614ae850b0b277030f94fd32062d45e723f91bDan Stoza } 92df614ae850b0b277030f94fd32062d45e723f91bDan Stoza status_t unflatten(void const*& buffer, size_t& size, int const*& /*fds*/, size_t& /*count*/) { 93df614ae850b0b277030f94fd32062d45e723f91bDan Stoza FlattenableUtils::read(buffer, size, value); 94df614ae850b0b277030f94fd32062d45e723f91bDan Stoza return NO_ERROR; 95df614ae850b0b277030f94fd32062d45e723f91bDan Stoza } 96df614ae850b0b277030f94fd32062d45e723f91bDan Stoza 97df614ae850b0b277030f94fd32062d45e723f91bDan Stoza int32_t value = 0; 98df614ae850b0b277030f94fd32062d45e723f91bDan Stoza}; 99df614ae850b0b277030f94fd32062d45e723f91bDan Stoza 100d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozastruct TestLightFlattenable : LightFlattenablePod<TestLightFlattenable> { 101d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza TestLightFlattenable() = default; 102d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza explicit TestLightFlattenable(int32_t v) : value(v) {} 103d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza int32_t value = 0; 104d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 105d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 1066dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza// It seems like this should be able to inherit from TestFlattenable (to avoid duplicating code), 1076dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza// but the SafeInterface logic can't easily be extended to find an indirect Flattenable<T> 1086dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza// base class 1096dd325b9396c9946ced9d01665152a44167a8fa2Dan Stozaclass TestLightRefBaseFlattenable : public Flattenable<TestLightRefBaseFlattenable>, 1106dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza public LightRefBase<TestLightRefBaseFlattenable> { 1116dd325b9396c9946ced9d01665152a44167a8fa2Dan Stozapublic: 1126dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza TestLightRefBaseFlattenable() = default; 1136dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza explicit TestLightRefBaseFlattenable(int32_t v) : value(v) {} 1146dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza 1156dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza // Flattenable protocol 1166dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza size_t getFlattenedSize() const { return sizeof(value); } 1176dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza size_t getFdCount() const { return 0; } 1186dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza status_t flatten(void*& buffer, size_t& size, int*& /*fds*/, size_t& /*count*/) const { 1196dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza FlattenableUtils::write(buffer, size, value); 1206dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza return NO_ERROR; 1216dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza } 1226dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza status_t unflatten(void const*& buffer, size_t& size, int const*& /*fds*/, size_t& /*count*/) { 1236dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza FlattenableUtils::read(buffer, size, value); 1246dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza return NO_ERROR; 1256dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza } 1266dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza 1276dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza int32_t value = 0; 1286dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza}; 1296dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza 1301af8a880ef2a2af061de0dd451d69595937245eaDan Stozaclass TestParcelable : public Parcelable { 1311af8a880ef2a2af061de0dd451d69595937245eaDan Stozapublic: 1321af8a880ef2a2af061de0dd451d69595937245eaDan Stoza TestParcelable() = default; 1331af8a880ef2a2af061de0dd451d69595937245eaDan Stoza explicit TestParcelable(int32_t value) : mValue(value) {} 1341af8a880ef2a2af061de0dd451d69595937245eaDan Stoza TestParcelable(const TestParcelable& other) : TestParcelable(other.mValue) {} 1351af8a880ef2a2af061de0dd451d69595937245eaDan Stoza TestParcelable(TestParcelable&& other) : TestParcelable(other.mValue) {} 1361af8a880ef2a2af061de0dd451d69595937245eaDan Stoza 1371af8a880ef2a2af061de0dd451d69595937245eaDan Stoza // Parcelable interface 1381af8a880ef2a2af061de0dd451d69595937245eaDan Stoza status_t writeToParcel(Parcel* parcel) const override { return parcel->writeInt32(mValue); } 1391af8a880ef2a2af061de0dd451d69595937245eaDan Stoza status_t readFromParcel(const Parcel* parcel) override { return parcel->readInt32(&mValue); } 1401af8a880ef2a2af061de0dd451d69595937245eaDan Stoza 1411af8a880ef2a2af061de0dd451d69595937245eaDan Stoza int32_t getValue() const { return mValue; } 1421af8a880ef2a2af061de0dd451d69595937245eaDan Stoza void setValue(int32_t value) { mValue = value; } 1431af8a880ef2a2af061de0dd451d69595937245eaDan Stoza 1441af8a880ef2a2af061de0dd451d69595937245eaDan Stozaprivate: 1451af8a880ef2a2af061de0dd451d69595937245eaDan Stoza int32_t mValue = 0; 1461af8a880ef2a2af061de0dd451d69595937245eaDan Stoza}; 1471af8a880ef2a2af061de0dd451d69595937245eaDan Stoza 148d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaclass ExitOnDeath : public IBinder::DeathRecipient { 149d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozapublic: 150d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ~ExitOnDeath() override = default; 151d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 152d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza void binderDied(const wp<IBinder>& /*who*/) override { 153d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, "ExitOnDeath", "Exiting"); 154d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza exit(0); 155d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 156d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 157d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 158d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza// This callback class is used to test both one-way transactions and that sp<IInterface> can be 159d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza// passed correctly 160d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaclass ICallback : public IInterface { 161d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozapublic: 162d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza DECLARE_META_INTERFACE(Callback) 163d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 164d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza enum class Tag : uint32_t { 165d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza OnCallback = IBinder::FIRST_CALL_TRANSACTION, 166d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza Last, 167d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza }; 168d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 169d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual void onCallback(int32_t aPlusOne) = 0; 170d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 171d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 172d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaclass BpCallback : public SafeBpInterface<ICallback> { 173d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozapublic: 174d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza explicit BpCallback(const sp<IBinder>& impl) : SafeBpInterface<ICallback>(impl, getLogTag()) {} 175d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 176d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza void onCallback(int32_t aPlusOne) override { 177d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 178d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemoteAsync<decltype(&ICallback::onCallback)>(Tag::OnCallback, aPlusOne); 179d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 180d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 181d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaprivate: 182d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza static constexpr const char* getLogTag() { return "BpCallback"; } 183d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 184d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 185d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic push 186d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic ignored "-Wexit-time-destructors" 187d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaIMPLEMENT_META_INTERFACE(Callback, "android.gfx.tests.ICallback"); 188d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic pop 189d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 190d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaclass BnCallback : public SafeBnInterface<ICallback> { 191d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozapublic: 192d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza BnCallback() : SafeBnInterface("BnCallback") {} 193d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 194d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, 195d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza uint32_t /*flags*/) override { 196d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza EXPECT_GE(code, IBinder::FIRST_CALL_TRANSACTION); 197d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza EXPECT_LT(code, static_cast<uint32_t>(ICallback::Tag::Last)); 198d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ICallback::Tag tag = static_cast<ICallback::Tag>(code); 199d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza switch (tag) { 200d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ICallback::Tag::OnCallback: { 201d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocalAsync(data, reply, &ICallback::onCallback); 202d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 203d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ICallback::Tag::Last: 204d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // Should not be possible because of the asserts at the beginning of the method 205d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza [&]() { FAIL(); }(); 206d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return UNKNOWN_ERROR; 207d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 208d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 209d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 210d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 211d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaclass ISafeInterfaceTest : public IInterface { 212d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozapublic: 213d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza DECLARE_META_INTERFACE(SafeInterfaceTest) 214d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 215d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza enum class Tag : uint32_t { 216d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza SetDeathToken = IBinder::FIRST_CALL_TRANSACTION, 217d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ReturnsNoMemory, 218d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza LogicalNot, 21981ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza ModifyEnum, 220df614ae850b0b277030f94fd32062d45e723f91bDan Stoza IncrementFlattenable, 221d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza IncrementLightFlattenable, 2226dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza IncrementLightRefBaseFlattenable, 2232537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza IncrementNativeHandle, 224d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza IncrementNoCopyNoMove, 2251af8a880ef2a2af061de0dd451d69595937245eaDan Stoza IncrementParcelableVector, 226d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ToUpper, 227d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza CallMeBack, 228d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza IncrementInt32, 229d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza IncrementUint32, 230662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza IncrementInt64, 231662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza IncrementUint64, 232d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza IncrementTwo, 233d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza Last, 234d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza }; 235d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 236d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // This is primarily so that the remote service dies when the test does, but it also serves to 237d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // test the handling of sp<IBinder> and non-const methods 238d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual status_t setDeathToken(const sp<IBinder>& token) = 0; 239d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 240d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // This is the most basic test since it doesn't require parceling any arguments 241d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual status_t returnsNoMemory() const = 0; 242d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 243d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // These are ordered according to their corresponding methods in SafeInterface::ParcelHandler 244d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual status_t logicalNot(bool a, bool* notA) const = 0; 24581ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza virtual status_t modifyEnum(TestEnum a, TestEnum* b) const = 0; 246df614ae850b0b277030f94fd32062d45e723f91bDan Stoza virtual status_t increment(const TestFlattenable& a, TestFlattenable* aPlusOne) const = 0; 247d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual status_t increment(const TestLightFlattenable& a, 248d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza TestLightFlattenable* aPlusOne) const = 0; 2496dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza virtual status_t increment(const sp<TestLightRefBaseFlattenable>& a, 2506dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza sp<TestLightRefBaseFlattenable>* aPlusOne) const = 0; 2512537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza virtual status_t increment(const sp<NativeHandle>& a, sp<NativeHandle>* aPlusOne) const = 0; 252d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual status_t increment(const NoCopyNoMove& a, NoCopyNoMove* aPlusOne) const = 0; 2531af8a880ef2a2af061de0dd451d69595937245eaDan Stoza virtual status_t increment(const std::vector<TestParcelable>& a, 2541af8a880ef2a2af061de0dd451d69595937245eaDan Stoza std::vector<TestParcelable>* aPlusOne) const = 0; 255d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual status_t toUpper(const String8& str, String8* upperStr) const = 0; 256d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // As mentioned above, sp<IBinder> is already tested by setDeathToken 257d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual void callMeBack(const sp<ICallback>& callback, int32_t a) const = 0; 258d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual status_t increment(int32_t a, int32_t* aPlusOne) const = 0; 259d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual status_t increment(uint32_t a, uint32_t* aPlusOne) const = 0; 260662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza virtual status_t increment(int64_t a, int64_t* aPlusOne) const = 0; 261662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza virtual status_t increment(uint64_t a, uint64_t* aPlusOne) const = 0; 262d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 263d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // This tests that input/output parameter interleaving works correctly 264d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza virtual status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, 265d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza int32_t* bPlusOne) const = 0; 266d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 267d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 268d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaclass BpSafeInterfaceTest : public SafeBpInterface<ISafeInterfaceTest> { 269d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozapublic: 270d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza explicit BpSafeInterfaceTest(const sp<IBinder>& impl) 271d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza : SafeBpInterface<ISafeInterfaceTest>(impl, getLogTag()) {} 272d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 273d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t setDeathToken(const sp<IBinder>& token) override { 274d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 275d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemote<decltype(&ISafeInterfaceTest::setDeathToken)>(Tag::SetDeathToken, token); 276d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 277d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t returnsNoMemory() const override { 278d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 279d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemote<decltype(&ISafeInterfaceTest::returnsNoMemory)>(Tag::ReturnsNoMemory); 280d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 281d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t logicalNot(bool a, bool* notA) const override { 282d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 283d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemote<decltype(&ISafeInterfaceTest::logicalNot)>(Tag::LogicalNot, a, notA); 284d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 28581ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza status_t modifyEnum(TestEnum a, TestEnum* b) const override { 28681ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 28781ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza return callRemote<decltype(&ISafeInterfaceTest::modifyEnum)>(Tag::ModifyEnum, a, b); 28881ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza } 289df614ae850b0b277030f94fd32062d45e723f91bDan Stoza status_t increment(const TestFlattenable& a, TestFlattenable* aPlusOne) const override { 290df614ae850b0b277030f94fd32062d45e723f91bDan Stoza using Signature = 291df614ae850b0b277030f94fd32062d45e723f91bDan Stoza status_t (ISafeInterfaceTest::*)(const TestFlattenable&, TestFlattenable*) const; 292df614ae850b0b277030f94fd32062d45e723f91bDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 293df614ae850b0b277030f94fd32062d45e723f91bDan Stoza return callRemote<Signature>(Tag::IncrementFlattenable, a, aPlusOne); 294df614ae850b0b277030f94fd32062d45e723f91bDan Stoza } 295d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(const TestLightFlattenable& a, 296d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza TestLightFlattenable* aPlusOne) const override { 297d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(const TestLightFlattenable&, 298d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza TestLightFlattenable*) const; 299d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 300d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemote<Signature>(Tag::IncrementLightFlattenable, a, aPlusOne); 301d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 3026dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza status_t increment(const sp<TestLightRefBaseFlattenable>& a, 3036dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza sp<TestLightRefBaseFlattenable>* aPlusOne) const override { 3046dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza using Signature = status_t (ISafeInterfaceTest::*)(const sp<TestLightRefBaseFlattenable>&, 3056dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza sp<TestLightRefBaseFlattenable>*) const; 3066dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza return callRemote<Signature>(Tag::IncrementLightRefBaseFlattenable, a, aPlusOne); 3076dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza } 3082537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza status_t increment(const sp<NativeHandle>& a, sp<NativeHandle>* aPlusOne) const override { 3092537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 3102537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza using Signature = 3112537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza status_t (ISafeInterfaceTest::*)(const sp<NativeHandle>&, sp<NativeHandle>*) const; 3122537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza return callRemote<Signature>(Tag::IncrementNativeHandle, a, aPlusOne); 3132537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza } 314d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(const NoCopyNoMove& a, NoCopyNoMove* aPlusOne) const override { 315d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 316d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(const NoCopyNoMove& a, 317d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza NoCopyNoMove* aPlusOne) const; 318d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemote<Signature>(Tag::IncrementNoCopyNoMove, a, aPlusOne); 319d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 3201af8a880ef2a2af061de0dd451d69595937245eaDan Stoza status_t increment(const std::vector<TestParcelable>& a, 3211af8a880ef2a2af061de0dd451d69595937245eaDan Stoza std::vector<TestParcelable>* aPlusOne) const override { 3221af8a880ef2a2af061de0dd451d69595937245eaDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 3231af8a880ef2a2af061de0dd451d69595937245eaDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(const std::vector<TestParcelable>&, 3241af8a880ef2a2af061de0dd451d69595937245eaDan Stoza std::vector<TestParcelable>*); 3251af8a880ef2a2af061de0dd451d69595937245eaDan Stoza return callRemote<Signature>(Tag::IncrementParcelableVector, a, aPlusOne); 3261af8a880ef2a2af061de0dd451d69595937245eaDan Stoza } 327d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t toUpper(const String8& str, String8* upperStr) const override { 328d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 329d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemote<decltype(&ISafeInterfaceTest::toUpper)>(Tag::ToUpper, str, upperStr); 330d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 331d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza void callMeBack(const sp<ICallback>& callback, int32_t a) const override { 332d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 333d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemoteAsync<decltype(&ISafeInterfaceTest::callMeBack)>(Tag::CallMeBack, callback, 334d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza a); 335d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 336d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(int32_t a, int32_t* aPlusOne) const override { 337d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 338d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(int32_t, int32_t*) const; 339d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemote<Signature>(Tag::IncrementInt32, a, aPlusOne); 340d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 341d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(uint32_t a, uint32_t* aPlusOne) const override { 342d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 343d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(uint32_t, uint32_t*) const; 344d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemote<Signature>(Tag::IncrementUint32, a, aPlusOne); 345d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 346662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza status_t increment(int64_t a, int64_t* aPlusOne) const override { 347662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 348662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza using Signature = status_t (ISafeInterfaceTest::*)(int64_t, int64_t*) const; 349662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza return callRemote<Signature>(Tag::IncrementInt64, a, aPlusOne); 350662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza } 351662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza status_t increment(uint64_t a, uint64_t* aPlusOne) const override { 352662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 353662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza using Signature = status_t (ISafeInterfaceTest::*)(uint64_t, uint64_t*) const; 354662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza return callRemote<Signature>(Tag::IncrementUint64, a, aPlusOne); 355662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza } 356d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, int32_t* bPlusOne) const override { 357d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 358d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = 359d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t (ISafeInterfaceTest::*)(int32_t, int32_t*, int32_t, int32_t*) const; 360d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callRemote<Signature>(Tag::IncrementTwo, a, aPlusOne, b, bPlusOne); 361d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 362d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 363d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaprivate: 364d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza static constexpr const char* getLogTag() { return "BpSafeInterfaceTest"; } 365d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 366d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 367d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic push 368d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic ignored "-Wexit-time-destructors" 369d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaIMPLEMENT_META_INTERFACE(SafeInterfaceTest, "android.gfx.tests.ISafeInterfaceTest"); 370d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 371d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozastatic sp<IBinder::DeathRecipient> getDeathRecipient() { 372d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza static sp<IBinder::DeathRecipient> recipient = new ExitOnDeath; 373d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return recipient; 374d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 375d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic pop 376d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 377d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaclass BnSafeInterfaceTest : public SafeBnInterface<ISafeInterfaceTest> { 378d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozapublic: 379d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza BnSafeInterfaceTest() : SafeBnInterface(getLogTag()) {} 380d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 381d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t setDeathToken(const sp<IBinder>& token) override { 382d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 383d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza token->linkToDeath(getDeathRecipient()); 384d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return NO_ERROR; 385d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 386d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t returnsNoMemory() const override { 387d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 388d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return NO_MEMORY; 389d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 390d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t logicalNot(bool a, bool* notA) const override { 391d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 392d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza *notA = !a; 393d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return NO_ERROR; 394d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 39581ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza status_t modifyEnum(TestEnum a, TestEnum* b) const override { 39681ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 39781ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza *b = (a == TestEnum::INITIAL) ? TestEnum::FINAL : TestEnum::INVALID; 39881ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza return NO_ERROR; 39981ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza } 400df614ae850b0b277030f94fd32062d45e723f91bDan Stoza status_t increment(const TestFlattenable& a, TestFlattenable* aPlusOne) const override { 401df614ae850b0b277030f94fd32062d45e723f91bDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 402df614ae850b0b277030f94fd32062d45e723f91bDan Stoza aPlusOne->value = a.value + 1; 403df614ae850b0b277030f94fd32062d45e723f91bDan Stoza return NO_ERROR; 404df614ae850b0b277030f94fd32062d45e723f91bDan Stoza } 405d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(const TestLightFlattenable& a, 406d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza TestLightFlattenable* aPlusOne) const override { 407d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 408d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza aPlusOne->value = a.value + 1; 409d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return NO_ERROR; 410d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 4116dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza status_t increment(const sp<TestLightRefBaseFlattenable>& a, 4126dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza sp<TestLightRefBaseFlattenable>* aPlusOne) const override { 4136dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 4146dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza *aPlusOne = new TestLightRefBaseFlattenable(a->value + 1); 4156dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza return NO_ERROR; 4166dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza } 4172537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza status_t increment(const sp<NativeHandle>& a, sp<NativeHandle>* aPlusOne) const override { 4182537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 4192537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza native_handle* rawHandle = native_handle_create(1 /*numFds*/, 1 /*numInts*/); 4202537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza if (rawHandle == nullptr) return NO_MEMORY; 4212537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 4222537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza // Copy the fd over directly 4232537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza rawHandle->data[0] = dup(a->handle()->data[0]); 4242537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 4252537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza // Increment the int 4262537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza rawHandle->data[1] = a->handle()->data[1] + 1; 4272537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 4282537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza // This cannot fail, as it is just the sp<NativeHandle> taking responsibility for closing 4292537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza // the native_handle when it goes out of scope 4302537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza *aPlusOne = NativeHandle::create(rawHandle, true); 4312537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza return NO_ERROR; 4322537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza } 433d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(const NoCopyNoMove& a, NoCopyNoMove* aPlusOne) const override { 434d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 435d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza aPlusOne->setValue(a.getValue() + 1); 436d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return NO_ERROR; 437d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 4381af8a880ef2a2af061de0dd451d69595937245eaDan Stoza status_t increment(const std::vector<TestParcelable>& a, 4391af8a880ef2a2af061de0dd451d69595937245eaDan Stoza std::vector<TestParcelable>* aPlusOne) const override { 4401af8a880ef2a2af061de0dd451d69595937245eaDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 4411af8a880ef2a2af061de0dd451d69595937245eaDan Stoza aPlusOne->resize(a.size()); 4421af8a880ef2a2af061de0dd451d69595937245eaDan Stoza for (size_t i = 0; i < a.size(); ++i) { 4431af8a880ef2a2af061de0dd451d69595937245eaDan Stoza (*aPlusOne)[i].setValue(a[i].getValue() + 1); 4441af8a880ef2a2af061de0dd451d69595937245eaDan Stoza } 4451af8a880ef2a2af061de0dd451d69595937245eaDan Stoza return NO_ERROR; 4461af8a880ef2a2af061de0dd451d69595937245eaDan Stoza } 447d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t toUpper(const String8& str, String8* upperStr) const override { 448d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 449d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza *upperStr = str; 450d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza upperStr->toUpper(); 451d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return NO_ERROR; 452d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 453d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza void callMeBack(const sp<ICallback>& callback, int32_t a) const override { 454d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 455d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza callback->onCallback(a + 1); 456d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 457d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(int32_t a, int32_t* aPlusOne) const override { 458d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 459d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza *aPlusOne = a + 1; 460d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return NO_ERROR; 461d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 462d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(uint32_t a, uint32_t* aPlusOne) const override { 463d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 464d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza *aPlusOne = a + 1; 465d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return NO_ERROR; 466d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 467662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza status_t increment(int64_t a, int64_t* aPlusOne) const override { 468662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 469662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza *aPlusOne = a + 1; 470662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza return NO_ERROR; 471662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza } 472662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza status_t increment(uint64_t a, uint64_t* aPlusOne) const override { 473662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 474662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza *aPlusOne = a + 1; 475662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza return NO_ERROR; 476662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza } 477d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t increment(int32_t a, int32_t* aPlusOne, int32_t b, int32_t* bPlusOne) const override { 478d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "%s", __PRETTY_FUNCTION__); 479d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza *aPlusOne = a + 1; 480d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza *bPlusOne = b + 1; 481d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return NO_ERROR; 482d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 483d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 484d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // BnInterface 485d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, 486d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza uint32_t /*flags*/) override { 487d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza EXPECT_GE(code, IBinder::FIRST_CALL_TRANSACTION); 488d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza EXPECT_LT(code, static_cast<uint32_t>(Tag::Last)); 489d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ISafeInterfaceTest::Tag tag = static_cast<ISafeInterfaceTest::Tag>(code); 490d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza switch (tag) { 491d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::SetDeathToken: { 492d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocal(data, reply, &ISafeInterfaceTest::setDeathToken); 493d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 494d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::ReturnsNoMemory: { 495d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocal(data, reply, &ISafeInterfaceTest::returnsNoMemory); 496d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 497d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::LogicalNot: { 498d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocal(data, reply, &ISafeInterfaceTest::logicalNot); 499d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 50081ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza case ISafeInterfaceTest::Tag::ModifyEnum: { 50181ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza return callLocal(data, reply, &ISafeInterfaceTest::modifyEnum); 50281ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza } 503df614ae850b0b277030f94fd32062d45e723f91bDan Stoza case ISafeInterfaceTest::Tag::IncrementFlattenable: { 504df614ae850b0b277030f94fd32062d45e723f91bDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(const TestFlattenable& a, 505df614ae850b0b277030f94fd32062d45e723f91bDan Stoza TestFlattenable* aPlusOne) const; 506df614ae850b0b277030f94fd32062d45e723f91bDan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 507df614ae850b0b277030f94fd32062d45e723f91bDan Stoza } 508d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::IncrementLightFlattenable: { 509d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = 510d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t (ISafeInterfaceTest::*)(const TestLightFlattenable& a, 511d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza TestLightFlattenable* aPlusOne) const; 512d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 513d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 5146dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza case ISafeInterfaceTest::Tag::IncrementLightRefBaseFlattenable: { 5156dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza using Signature = 5166dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza status_t (ISafeInterfaceTest::*)(const sp<TestLightRefBaseFlattenable>&, 5176dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza sp<TestLightRefBaseFlattenable>*) const; 5186dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 5196dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza } 5202537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza case ISafeInterfaceTest::Tag::IncrementNativeHandle: { 5212537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(const sp<NativeHandle>&, 5222537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza sp<NativeHandle>*) const; 5232537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 5242537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza } 525d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::IncrementNoCopyNoMove: { 526d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(const NoCopyNoMove& a, 527d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza NoCopyNoMove* aPlusOne) const; 528d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 529d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 5301af8a880ef2a2af061de0dd451d69595937245eaDan Stoza case ISafeInterfaceTest::Tag::IncrementParcelableVector: { 5311af8a880ef2a2af061de0dd451d69595937245eaDan Stoza using Signature = 5321af8a880ef2a2af061de0dd451d69595937245eaDan Stoza status_t (ISafeInterfaceTest::*)(const std::vector<TestParcelable>&, 5331af8a880ef2a2af061de0dd451d69595937245eaDan Stoza std::vector<TestParcelable>*) const; 5341af8a880ef2a2af061de0dd451d69595937245eaDan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 5351af8a880ef2a2af061de0dd451d69595937245eaDan Stoza } 536d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::ToUpper: { 537d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocal(data, reply, &ISafeInterfaceTest::toUpper); 538d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 539d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::CallMeBack: { 540d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocalAsync(data, reply, &ISafeInterfaceTest::callMeBack); 541d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 542d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::IncrementInt32: { 543d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(int32_t, int32_t*) const; 544d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 545d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 546d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::IncrementUint32: { 547d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(uint32_t, uint32_t*) const; 548d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 549d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 550662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza case ISafeInterfaceTest::Tag::IncrementInt64: { 551662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza using Signature = status_t (ISafeInterfaceTest::*)(int64_t, int64_t*) const; 552662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 553662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza } 554662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza case ISafeInterfaceTest::Tag::IncrementUint64: { 555662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza using Signature = status_t (ISafeInterfaceTest::*)(uint64_t, uint64_t*) const; 556662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 557662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza } 558d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::IncrementTwo: { 559d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza using Signature = status_t (ISafeInterfaceTest::*)(int32_t, int32_t*, int32_t, 560d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza int32_t*) const; 561d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return callLocal<Signature>(data, reply, &ISafeInterfaceTest::increment); 562d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 563d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza case ISafeInterfaceTest::Tag::Last: 564d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // Should not be possible because of the asserts at the beginning of the method 565d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza [&]() { FAIL(); }(); 566d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return UNKNOWN_ERROR; 567d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 568d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 569d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 570d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaprivate: 571d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza static constexpr const char* getLogTag() { return "BnSafeInterfaceTest"; } 572d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 573d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 574d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaclass SafeInterfaceTest : public ::testing::Test { 575d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozapublic: 576d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza SafeInterfaceTest() : mSafeInterfaceTest(getRemoteService()) { 577d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ProcessState::self()->startThreadPool(); 578d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 579d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ~SafeInterfaceTest() override = default; 580d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 581d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaprotected: 582d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza sp<ISafeInterfaceTest> mSafeInterfaceTest; 583d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 584d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stozaprivate: 585d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza static constexpr const char* getLogTag() { return "SafeInterfaceTest"; } 586d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 587d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza sp<ISafeInterfaceTest> getRemoteService() { 588d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic push 589d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic ignored "-Wexit-time-destructors" 590d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza static std::mutex sMutex; 591d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza static sp<ISafeInterfaceTest> sService; 592d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza static sp<IBinder> sDeathToken = new BBinder; 593d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza#pragma clang diagnostic pop 594d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 595d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza std::unique_lock<decltype(sMutex)> lock; 596d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza if (sService == nullptr) { 597d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "Forking remote process"); 598d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza pid_t forkPid = fork(); 599d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza EXPECT_NE(forkPid, -1); 600d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 601d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const String16 serviceName("SafeInterfaceTest"); 602d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 603d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza if (forkPid == 0) { 604d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, getLogTag(), "Remote process checking in"); 605d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza sp<ISafeInterfaceTest> nativeService = new BnSafeInterfaceTest; 606d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza defaultServiceManager()->addService(serviceName, 607d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza IInterface::asBinder(nativeService)); 608d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ProcessState::self()->startThreadPool(); 609d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza IPCThreadState::self()->joinThreadPool(); 610d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // We shouldn't get to this point 611d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza [&]() { FAIL(); }(); 612d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 613d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 614d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza sp<IBinder> binder = defaultServiceManager()->getService(serviceName); 615d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza sService = interface_cast<ISafeInterfaceTest>(binder); 616d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza EXPECT_TRUE(sService != nullptr); 617d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 618d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza sService->setDeathToken(sDeathToken); 619d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 620d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 621d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return sService; 622d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 623d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza}; 624d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 625d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaTEST_F(SafeInterfaceTest, TestReturnsNoMemory) { 626d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t result = mSafeInterfaceTest->returnsNoMemory(); 627d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(NO_MEMORY, result); 628d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 629d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 630d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaTEST_F(SafeInterfaceTest, TestLogicalNot) { 631d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const bool a = true; 632d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza bool notA = true; 633d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t result = mSafeInterfaceTest->logicalNot(a, ¬A); 634d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(NO_ERROR, result); 635d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(!a, notA); 636d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza // Test both since we don't want to accidentally catch a default false somewhere 637d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const bool b = false; 638d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza bool notB = false; 639d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza result = mSafeInterfaceTest->logicalNot(b, ¬B); 640d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(NO_ERROR, result); 641d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(!b, notB); 642d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 643d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 64481ea3efb75a6427c946221f95dcf9c388b27a977Dan StozaTEST_F(SafeInterfaceTest, TestModifyEnum) { 64581ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza const TestEnum a = TestEnum::INITIAL; 64681ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza TestEnum b = TestEnum::INVALID; 64781ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza status_t result = mSafeInterfaceTest->modifyEnum(a, &b); 64881ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza ASSERT_EQ(NO_ERROR, result); 64981ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza ASSERT_EQ(TestEnum::FINAL, b); 65081ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza} 65181ea3efb75a6427c946221f95dcf9c388b27a977Dan Stoza 652df614ae850b0b277030f94fd32062d45e723f91bDan StozaTEST_F(SafeInterfaceTest, TestIncrementFlattenable) { 653df614ae850b0b277030f94fd32062d45e723f91bDan Stoza const TestFlattenable a{1}; 654df614ae850b0b277030f94fd32062d45e723f91bDan Stoza TestFlattenable aPlusOne{0}; 655df614ae850b0b277030f94fd32062d45e723f91bDan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 656df614ae850b0b277030f94fd32062d45e723f91bDan Stoza ASSERT_EQ(NO_ERROR, result); 657df614ae850b0b277030f94fd32062d45e723f91bDan Stoza ASSERT_EQ(a.value + 1, aPlusOne.value); 658df614ae850b0b277030f94fd32062d45e723f91bDan Stoza} 659df614ae850b0b277030f94fd32062d45e723f91bDan Stoza 660d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaTEST_F(SafeInterfaceTest, TestIncrementLightFlattenable) { 661d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const TestLightFlattenable a{1}; 662d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza TestLightFlattenable aPlusOne{0}; 663d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 664d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(NO_ERROR, result); 665d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(a.value + 1, aPlusOne.value); 666d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 667d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 6686dd325b9396c9946ced9d01665152a44167a8fa2Dan StozaTEST_F(SafeInterfaceTest, TestIncrementLightRefBaseFlattenable) { 6696dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza sp<TestLightRefBaseFlattenable> a = new TestLightRefBaseFlattenable{1}; 6706dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza sp<TestLightRefBaseFlattenable> aPlusOne; 6716dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 6726dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza ASSERT_EQ(NO_ERROR, result); 6736dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza ASSERT_NE(nullptr, aPlusOne.get()); 6746dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza ASSERT_EQ(a->value + 1, aPlusOne->value); 6756dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza} 6766dd325b9396c9946ced9d01665152a44167a8fa2Dan Stoza 6772537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stozanamespace { // Anonymous namespace 6782537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 6792537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stozabool fdsAreEquivalent(int a, int b) { 6802537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza struct stat statA {}; 6812537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza struct stat statB {}; 6822537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza if (fstat(a, &statA) != 0) return false; 6832537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza if (fstat(b, &statB) != 0) return false; 6842537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza return (statA.st_dev == statB.st_dev) && (statA.st_ino == statB.st_ino); 6852537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza} 6862537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 6872537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza} // Anonymous namespace 6882537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 6892537db72f62d53d7c7cab85ccbba2e8d0286a2daDan StozaTEST_F(SafeInterfaceTest, TestIncrementNativeHandle) { 6902537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza // Create an fd we can use to send and receive from the remote process 6912537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza base::unique_fd eventFd{eventfd(0 /*initval*/, 0 /*flags*/)}; 6922537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza ASSERT_NE(-1, eventFd); 6932537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 6942537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza // Determine the maximum number of fds this process can have open 6952537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza struct rlimit limit {}; 6962537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza ASSERT_EQ(0, getrlimit(RLIMIT_NOFILE, &limit)); 6972537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza uint32_t maxFds = static_cast<uint32_t>(limit.rlim_cur); 6982537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 6992537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza // Perform this test enough times to rule out fd leaks 7002537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza for (uint32_t iter = 0; iter < (2 * maxFds); ++iter) { 7012537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza native_handle* handle = native_handle_create(1 /*numFds*/, 1 /*numInts*/); 7022537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza ASSERT_NE(nullptr, handle); 7032537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza handle->data[0] = dup(eventFd.get()); 7042537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza handle->data[1] = 1; 7052537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 7062537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza // This cannot fail, as it is just the sp<NativeHandle> taking responsibility for closing 7072537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza // the native_handle when it goes out of scope 7082537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza sp<NativeHandle> a = NativeHandle::create(handle, true); 7092537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 7102537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza sp<NativeHandle> aPlusOne; 7112537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 7122537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza ASSERT_EQ(NO_ERROR, result); 7132537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza ASSERT_TRUE(fdsAreEquivalent(a->handle()->data[0], aPlusOne->handle()->data[0])); 7142537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza ASSERT_EQ(a->handle()->data[1] + 1, aPlusOne->handle()->data[1]); 7152537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza } 7162537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza} 7172537db72f62d53d7c7cab85ccbba2e8d0286a2daDan Stoza 718d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaTEST_F(SafeInterfaceTest, TestIncrementNoCopyNoMove) { 719d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const NoCopyNoMove a{1}; 720d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza NoCopyNoMove aPlusOne{0}; 721d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 722d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(NO_ERROR, result); 723d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(a.getValue() + 1, aPlusOne.getValue()); 724d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 725d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 7261af8a880ef2a2af061de0dd451d69595937245eaDan StozaTEST_F(SafeInterfaceTest, TestIncremementParcelableVector) { 7271af8a880ef2a2af061de0dd451d69595937245eaDan Stoza const std::vector<TestParcelable> a{TestParcelable{1}, TestParcelable{2}}; 7281af8a880ef2a2af061de0dd451d69595937245eaDan Stoza std::vector<TestParcelable> aPlusOne; 7291af8a880ef2a2af061de0dd451d69595937245eaDan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 7301af8a880ef2a2af061de0dd451d69595937245eaDan Stoza ASSERT_EQ(a.size(), aPlusOne.size()); 7311af8a880ef2a2af061de0dd451d69595937245eaDan Stoza for (size_t i = 0; i < a.size(); ++i) { 7321af8a880ef2a2af061de0dd451d69595937245eaDan Stoza ASSERT_EQ(a[i].getValue() + 1, aPlusOne[i].getValue()); 7331af8a880ef2a2af061de0dd451d69595937245eaDan Stoza } 7341af8a880ef2a2af061de0dd451d69595937245eaDan Stoza} 7351af8a880ef2a2af061de0dd451d69595937245eaDan Stoza 736d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaTEST_F(SafeInterfaceTest, TestToUpper) { 737d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const String8 str{"Hello, world!"}; 738d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza String8 upperStr; 739d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t result = mSafeInterfaceTest->toUpper(str, &upperStr); 740d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(NO_ERROR, result); 741d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_TRUE(upperStr == String8{"HELLO, WORLD!"}); 742d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 743d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 744d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaTEST_F(SafeInterfaceTest, TestCallMeBack) { 745d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza class CallbackReceiver : public BnCallback { 746d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza public: 747d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza void onCallback(int32_t aPlusOne) override { 748d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ALOG(LOG_INFO, "CallbackReceiver", "%s", __PRETTY_FUNCTION__); 749d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza std::unique_lock<decltype(mMutex)> lock(mMutex); 750d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza mValue = aPlusOne; 751d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza mCondition.notify_one(); 752d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 753d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 754d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza std::optional<int32_t> waitForCallback() { 755d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza std::unique_lock<decltype(mMutex)> lock(mMutex); 756d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza bool success = 757d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza mCondition.wait_for(lock, 100ms, [&]() { return static_cast<bool>(mValue); }); 758d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza return success ? mValue : std::nullopt; 759d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza } 760d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 761d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza private: 762d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza std::mutex mMutex; 763d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza std::condition_variable mCondition; 764d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza std::optional<int32_t> mValue; 765d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza }; 766d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 767d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza sp<CallbackReceiver> receiver = new CallbackReceiver; 768d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const int32_t a = 1; 769d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza mSafeInterfaceTest->callMeBack(receiver, a); 770d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza auto result = receiver->waitForCallback(); 771d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_TRUE(result); 772d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(a + 1, *result); 773d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 774d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 775d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaTEST_F(SafeInterfaceTest, TestIncrementInt32) { 776d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const int32_t a = 1; 777d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza int32_t aPlusOne = 0; 778d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 779d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(NO_ERROR, result); 780d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(a + 1, aPlusOne); 781d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 782d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 783d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaTEST_F(SafeInterfaceTest, TestIncrementUint32) { 784d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const uint32_t a = 1; 785d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza uint32_t aPlusOne = 0; 786d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 787d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(NO_ERROR, result); 788d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(a + 1, aPlusOne); 789d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 790d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 791662a899ed9bb727c1267ec10d24d87a2f0be3355Dan StozaTEST_F(SafeInterfaceTest, TestIncrementInt64) { 792662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza const int64_t a = 1; 793662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza int64_t aPlusOne = 0; 794662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 795662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza ASSERT_EQ(NO_ERROR, result); 796662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza ASSERT_EQ(a + 1, aPlusOne); 797662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza} 798662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza 799662a899ed9bb727c1267ec10d24d87a2f0be3355Dan StozaTEST_F(SafeInterfaceTest, TestIncrementUint64) { 800662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza const uint64_t a = 1; 801662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza uint64_t aPlusOne = 0; 802662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza status_t result = mSafeInterfaceTest->increment(a, &aPlusOne); 803662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza ASSERT_EQ(NO_ERROR, result); 804662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza ASSERT_EQ(a + 1, aPlusOne); 805662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza} 806662a899ed9bb727c1267ec10d24d87a2f0be3355Dan Stoza 807d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan StozaTEST_F(SafeInterfaceTest, TestIncrementTwo) { 808d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const int32_t a = 1; 809d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza int32_t aPlusOne = 0; 810d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza const int32_t b = 2; 811d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza int32_t bPlusOne = 0; 812d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza status_t result = mSafeInterfaceTest->increment(1, &aPlusOne, 2, &bPlusOne); 813d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(NO_ERROR, result); 814d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(a + 1, aPlusOne); 815d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza ASSERT_EQ(b + 1, bPlusOne); 816d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} 817d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza 818d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} // namespace tests 819d630e520de9ff4bc50723a7e8f91b6d9be27db1cDan Stoza} // namespace android 820