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, &notA);
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, &notB);
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