xref: /aosp_15_r20/frameworks/native/libs/binder/tests/binderStabilityTest.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2019 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #include <android/binder_libbinder.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <android/binder_manager.h>
19*38e8c45fSAndroid Build Coastguard Worker #include <android/binder_stability.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <binder/Binder.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/IBinder.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcel.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <binder/Stability.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker #include <sys/prctl.h>
29*38e8c45fSAndroid Build Coastguard Worker 
30*38e8c45fSAndroid Build Coastguard Worker #include "../Utils.h"
31*38e8c45fSAndroid Build Coastguard Worker #include "BnBinderStabilityTest.h"
32*38e8c45fSAndroid Build Coastguard Worker #include "aidl/BnBinderStabilityTest.h"
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker using namespace android;
35*38e8c45fSAndroid Build Coastguard Worker using namespace ndk;
36*38e8c45fSAndroid Build Coastguard Worker using android::binder::Status;
37*38e8c45fSAndroid Build Coastguard Worker using android::internal::Stability; // for testing only!
38*38e8c45fSAndroid Build Coastguard Worker 
39*38e8c45fSAndroid Build Coastguard Worker const String16 kSystemStabilityServer = String16("binder_stability_test_service_system");
40*38e8c45fSAndroid Build Coastguard Worker 
41*38e8c45fSAndroid Build Coastguard Worker // This is handwritten so that we can test different stability levels w/o having the AIDL
42*38e8c45fSAndroid Build Coastguard Worker // compiler assign them. Hand-writing binder interfaces is considered a bad practice
43*38e8c45fSAndroid Build Coastguard Worker // sanity reasons. YOU SHOULD DEFINE AN AIDL INTERFACE INSTEAD!
44*38e8c45fSAndroid Build Coastguard Worker class BadStableBinder : public BBinder {
45*38e8c45fSAndroid Build Coastguard Worker public:
46*38e8c45fSAndroid Build Coastguard Worker     static constexpr uint32_t USER_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION;
47*38e8c45fSAndroid Build Coastguard Worker     static String16 kDescriptor;
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker     bool gotUserTransaction = false;
50*38e8c45fSAndroid Build Coastguard Worker 
doUserTransaction(const sp<IBinder> & binder)51*38e8c45fSAndroid Build Coastguard Worker     static status_t doUserTransaction(const sp<IBinder>& binder) {
52*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
53*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(kDescriptor);
54*38e8c45fSAndroid Build Coastguard Worker         return binder->transact(USER_TRANSACTION, data, &reply, 0/*flags*/);
55*38e8c45fSAndroid Build Coastguard Worker     }
56*38e8c45fSAndroid Build Coastguard Worker 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)57*38e8c45fSAndroid Build Coastguard Worker     status_t onTransact(uint32_t code,
58*38e8c45fSAndroid Build Coastguard Worker             const Parcel& data, Parcel* reply, uint32_t flags) override {
59*38e8c45fSAndroid Build Coastguard Worker         if (code == USER_TRANSACTION) {
60*38e8c45fSAndroid Build Coastguard Worker             // not interested in this kind of stability. Make sure
61*38e8c45fSAndroid Build Coastguard Worker             // we have a test failure
62*38e8c45fSAndroid Build Coastguard Worker             LOG_ALWAYS_FATAL_IF(!data.enforceInterface(kDescriptor));
63*38e8c45fSAndroid Build Coastguard Worker 
64*38e8c45fSAndroid Build Coastguard Worker             gotUserTransaction = true;
65*38e8c45fSAndroid Build Coastguard Worker 
66*38e8c45fSAndroid Build Coastguard Worker             ALOGE("binder stability: Got user transaction");
67*38e8c45fSAndroid Build Coastguard Worker             return OK;
68*38e8c45fSAndroid Build Coastguard Worker         }
69*38e8c45fSAndroid Build Coastguard Worker         return BBinder::onTransact(code, data, reply, flags);
70*38e8c45fSAndroid Build Coastguard Worker     }
71*38e8c45fSAndroid Build Coastguard Worker 
undef()72*38e8c45fSAndroid Build Coastguard Worker     static sp<BadStableBinder> undef() {
73*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> iface = new BadStableBinder();
74*38e8c45fSAndroid Build Coastguard Worker         return iface;
75*38e8c45fSAndroid Build Coastguard Worker     }
76*38e8c45fSAndroid Build Coastguard Worker 
system()77*38e8c45fSAndroid Build Coastguard Worker     static sp<BadStableBinder> system() {
78*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> iface = new BadStableBinder();
79*38e8c45fSAndroid Build Coastguard Worker         Stability::markCompilationUnit(iface.get()); // <- for test only
80*38e8c45fSAndroid Build Coastguard Worker         return iface;
81*38e8c45fSAndroid Build Coastguard Worker     }
82*38e8c45fSAndroid Build Coastguard Worker 
vintf()83*38e8c45fSAndroid Build Coastguard Worker     static sp<BadStableBinder> vintf() {
84*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> iface = new BadStableBinder();
85*38e8c45fSAndroid Build Coastguard Worker         Stability::markVintf(iface.get()); // <- for test only
86*38e8c45fSAndroid Build Coastguard Worker         return iface;
87*38e8c45fSAndroid Build Coastguard Worker     }
88*38e8c45fSAndroid Build Coastguard Worker 
vendor()89*38e8c45fSAndroid Build Coastguard Worker     static sp<BadStableBinder> vendor() {
90*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> iface = new BadStableBinder();
91*38e8c45fSAndroid Build Coastguard Worker         Stability::markVndk(iface.get()); // <- for test only
92*38e8c45fSAndroid Build Coastguard Worker         return iface;
93*38e8c45fSAndroid Build Coastguard Worker     }
94*38e8c45fSAndroid Build Coastguard Worker };
95*38e8c45fSAndroid Build Coastguard Worker String16 BadStableBinder::kDescriptor = String16("BadStableBinder.test");
96*38e8c45fSAndroid Build Coastguard Worker 
97*38e8c45fSAndroid Build Coastguard Worker // NO! NO! NO! Do not even think of doing something like this!
98*38e8c45fSAndroid Build Coastguard Worker // This is for testing! If a class like this was actually used in production,
99*38e8c45fSAndroid Build Coastguard Worker // it would ruin everything!
100*38e8c45fSAndroid Build Coastguard Worker class MyBinderStabilityTest : public BnBinderStabilityTest {
101*38e8c45fSAndroid Build Coastguard Worker public:
sendBinder(const sp<IBinder> &)102*38e8c45fSAndroid Build Coastguard Worker     Status sendBinder(const sp<IBinder>& /*binder*/) override {
103*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
104*38e8c45fSAndroid Build Coastguard Worker     }
sendAndCallBinder(const sp<IBinder> & binder)105*38e8c45fSAndroid Build Coastguard Worker     Status sendAndCallBinder(const sp<IBinder>& binder) override {
106*38e8c45fSAndroid Build Coastguard Worker         ALOGI("Debug log stability: %s", Stability::debugToString(binder).c_str());
107*38e8c45fSAndroid Build Coastguard Worker         return Status::fromExceptionCode(BadStableBinder::doUserTransaction(binder));
108*38e8c45fSAndroid Build Coastguard Worker     }
returnNoStabilityBinder(sp<IBinder> * _aidl_return)109*38e8c45fSAndroid Build Coastguard Worker     Status returnNoStabilityBinder(sp<IBinder>* _aidl_return) override {
110*38e8c45fSAndroid Build Coastguard Worker         *_aidl_return = BadStableBinder::undef();
111*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
112*38e8c45fSAndroid Build Coastguard Worker     }
returnLocalStabilityBinder(sp<IBinder> * _aidl_return)113*38e8c45fSAndroid Build Coastguard Worker     Status returnLocalStabilityBinder(sp<IBinder>* _aidl_return) override {
114*38e8c45fSAndroid Build Coastguard Worker         *_aidl_return = BadStableBinder::system();
115*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
116*38e8c45fSAndroid Build Coastguard Worker     }
returnVintfStabilityBinder(sp<IBinder> * _aidl_return)117*38e8c45fSAndroid Build Coastguard Worker     Status returnVintfStabilityBinder(sp<IBinder>* _aidl_return) override {
118*38e8c45fSAndroid Build Coastguard Worker         *_aidl_return = BadStableBinder::vintf();
119*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
120*38e8c45fSAndroid Build Coastguard Worker     }
returnVendorStabilityBinder(sp<IBinder> * _aidl_return)121*38e8c45fSAndroid Build Coastguard Worker     Status returnVendorStabilityBinder(sp<IBinder>* _aidl_return) override {
122*38e8c45fSAndroid Build Coastguard Worker         *_aidl_return = BadStableBinder::vendor();
123*38e8c45fSAndroid Build Coastguard Worker         return Status::ok();
124*38e8c45fSAndroid Build Coastguard Worker     }
125*38e8c45fSAndroid Build Coastguard Worker };
126*38e8c45fSAndroid Build Coastguard Worker 
TEST(BinderStability,OnlyVintfStabilityBinderNeedsVintfDeclaration)127*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, OnlyVintfStabilityBinderNeedsVintfDeclaration) {
128*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(Stability::requiresVintfDeclaration(nullptr));
129*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(Stability::requiresVintfDeclaration(BadStableBinder::undef()));
130*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(Stability::requiresVintfDeclaration(BadStableBinder::system()));
131*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(Stability::requiresVintfDeclaration(BadStableBinder::vendor()));
132*38e8c45fSAndroid Build Coastguard Worker 
133*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(Stability::requiresVintfDeclaration(BadStableBinder::vintf()));
134*38e8c45fSAndroid Build Coastguard Worker }
135*38e8c45fSAndroid Build Coastguard Worker 
TEST(BinderStability,ForceDowngradeToLocalStability)136*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, ForceDowngradeToLocalStability) {
137*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> someBinder = BadStableBinder::vintf();
138*38e8c45fSAndroid Build Coastguard Worker 
139*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(Stability::requiresVintfDeclaration(someBinder));
140*38e8c45fSAndroid Build Coastguard Worker 
141*38e8c45fSAndroid Build Coastguard Worker     // silly to do this after already using the binder, but it's for the test
142*38e8c45fSAndroid Build Coastguard Worker     Stability::forceDowngradeToLocalStability(someBinder);
143*38e8c45fSAndroid Build Coastguard Worker 
144*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(Stability::requiresVintfDeclaration(someBinder));
145*38e8c45fSAndroid Build Coastguard Worker }
146*38e8c45fSAndroid Build Coastguard Worker 
TEST(BinderStability,NdkForceDowngradeToLocalStability)147*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, NdkForceDowngradeToLocalStability) {
148*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> someBinder = BadStableBinder::vintf();
149*38e8c45fSAndroid Build Coastguard Worker 
150*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(Stability::requiresVintfDeclaration(someBinder));
151*38e8c45fSAndroid Build Coastguard Worker 
152*38e8c45fSAndroid Build Coastguard Worker     // silly to do this after already using the binder, but it's for the test
153*38e8c45fSAndroid Build Coastguard Worker     AIBinder_forceDowngradeToLocalStability(AIBinder_fromPlatformBinder(someBinder));
154*38e8c45fSAndroid Build Coastguard Worker 
155*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(Stability::requiresVintfDeclaration(someBinder));
156*38e8c45fSAndroid Build Coastguard Worker }
157*38e8c45fSAndroid Build Coastguard Worker 
TEST(BinderStability,ForceDowngradeToVendorStability)158*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, ForceDowngradeToVendorStability) {
159*38e8c45fSAndroid Build Coastguard Worker     LIBBINDER_IGNORE("-Wdeprecated-declarations")
160*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> serverBinder = android::defaultServiceManager()->getService(kSystemStabilityServer);
161*38e8c45fSAndroid Build Coastguard Worker     LIBBINDER_IGNORE_END()
162*38e8c45fSAndroid Build Coastguard Worker     auto server = interface_cast<IBinderStabilityTest>(serverBinder);
163*38e8c45fSAndroid Build Coastguard Worker 
164*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, server.get());
165*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, IInterface::asBinder(server)->remoteBinder());
166*38e8c45fSAndroid Build Coastguard Worker 
167*38e8c45fSAndroid Build Coastguard Worker     {
168*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> binder = BadStableBinder::vintf();
169*38e8c45fSAndroid Build Coastguard Worker 
170*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(Stability::requiresVintfDeclaration(binder));
171*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(server->sendAndCallBinder(binder).isOk());
172*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(binder->gotUserTransaction);
173*38e8c45fSAndroid Build Coastguard Worker     }
174*38e8c45fSAndroid Build Coastguard Worker     {
175*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> binder = BadStableBinder::vintf();
176*38e8c45fSAndroid Build Coastguard Worker 
177*38e8c45fSAndroid Build Coastguard Worker         // This method should never be called directly. This is done only for the test.
178*38e8c45fSAndroid Build Coastguard Worker         Stability::forceDowngradeToVendorStability(binder);
179*38e8c45fSAndroid Build Coastguard Worker 
180*38e8c45fSAndroid Build Coastguard Worker         // Binder downgraded to vendor stability, cannot be called from system context
181*38e8c45fSAndroid Build Coastguard Worker         EXPECT_FALSE(Stability::requiresVintfDeclaration(binder));
182*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(BAD_TYPE, server->sendAndCallBinder(binder).exceptionCode());
183*38e8c45fSAndroid Build Coastguard Worker         EXPECT_FALSE(binder->gotUserTransaction);
184*38e8c45fSAndroid Build Coastguard Worker     }
185*38e8c45fSAndroid Build Coastguard Worker }
186*38e8c45fSAndroid Build Coastguard Worker 
TEST(BinderStability,VintfStabilityServerMustBeDeclaredInManifest)187*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, VintfStabilityServerMustBeDeclaredInManifest) {
188*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> vintfServer = BadStableBinder::vintf();
189*38e8c45fSAndroid Build Coastguard Worker 
190*38e8c45fSAndroid Build Coastguard Worker     for (const char* instance8 : {
191*38e8c45fSAndroid Build Coastguard Worker         ".", "/", "/.", "a.d.IFoo", "foo", "a.d.IFoo/foo"
192*38e8c45fSAndroid Build Coastguard Worker     }) {
193*38e8c45fSAndroid Build Coastguard Worker         String16 instance (instance8);
194*38e8c45fSAndroid Build Coastguard Worker 
195*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT,
196*38e8c45fSAndroid Build Coastguard Worker             android::defaultServiceManager()->addService(String16("."), vintfServer)) << instance8;
197*38e8c45fSAndroid Build Coastguard Worker         EXPECT_FALSE(android::defaultServiceManager()->isDeclared(instance)) << instance8;
198*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(std::nullopt, android::defaultServiceManager()->updatableViaApex(instance))
199*38e8c45fSAndroid Build Coastguard Worker                 << instance8;
200*38e8c45fSAndroid Build Coastguard Worker     }
201*38e8c45fSAndroid Build Coastguard Worker }
202*38e8c45fSAndroid Build Coastguard Worker 
TEST(BinderStability,ConnectionInfoRequiresManifestEntries)203*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, ConnectionInfoRequiresManifestEntries) {
204*38e8c45fSAndroid Build Coastguard Worker     sp<IServiceManager> sm = android::defaultServiceManager();
205*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> systemBinder = BadStableBinder::system();
206*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, sm->addService(String16("no.connection.foo"), systemBinder));
207*38e8c45fSAndroid Build Coastguard Worker     std::optional<android::IServiceManager::ConnectionInfo> connectionInfo;
208*38e8c45fSAndroid Build Coastguard Worker     connectionInfo = sm->getConnectionInfo(String16("no.connection.foo"));
209*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(connectionInfo, std::nullopt);
210*38e8c45fSAndroid Build Coastguard Worker }
TEST(BinderStability,CantCallVendorBinderInSystemContext)211*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, CantCallVendorBinderInSystemContext) {
212*38e8c45fSAndroid Build Coastguard Worker     LIBBINDER_IGNORE("-Wdeprecated-declarations")
213*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> serverBinder = android::defaultServiceManager()->getService(kSystemStabilityServer);
214*38e8c45fSAndroid Build Coastguard Worker     LIBBINDER_IGNORE_END()
215*38e8c45fSAndroid Build Coastguard Worker     auto server = interface_cast<IBinderStabilityTest>(serverBinder);
216*38e8c45fSAndroid Build Coastguard Worker 
217*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, server.get());
218*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, IInterface::asBinder(server)->remoteBinder());
219*38e8c45fSAndroid Build Coastguard Worker 
220*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(server->sendBinder(BadStableBinder::undef()).isOk());
221*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(server->sendBinder(BadStableBinder::system()).isOk());
222*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(server->sendBinder(BadStableBinder::vintf()).isOk());
223*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(server->sendBinder(BadStableBinder::vendor()).isOk());
224*38e8c45fSAndroid Build Coastguard Worker 
225*38e8c45fSAndroid Build Coastguard Worker     {
226*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> binder = BadStableBinder::undef();
227*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(server->sendAndCallBinder(binder).isOk());
228*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(binder->gotUserTransaction);
229*38e8c45fSAndroid Build Coastguard Worker     }
230*38e8c45fSAndroid Build Coastguard Worker     {
231*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> binder = BadStableBinder::system();
232*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(server->sendAndCallBinder(binder).isOk());
233*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(binder->gotUserTransaction);
234*38e8c45fSAndroid Build Coastguard Worker     }
235*38e8c45fSAndroid Build Coastguard Worker     {
236*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> binder = BadStableBinder::vintf();
237*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(server->sendAndCallBinder(binder).isOk());
238*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(binder->gotUserTransaction);
239*38e8c45fSAndroid Build Coastguard Worker     }
240*38e8c45fSAndroid Build Coastguard Worker     {
241*38e8c45fSAndroid Build Coastguard Worker         // !!! user-defined transaction may not be stable for remote server !!!
242*38e8c45fSAndroid Build Coastguard Worker         // !!! so, it does not work !!!
243*38e8c45fSAndroid Build Coastguard Worker         sp<BadStableBinder> binder = BadStableBinder::vendor();
244*38e8c45fSAndroid Build Coastguard Worker         EXPECT_EQ(BAD_TYPE, server->sendAndCallBinder(binder).exceptionCode());
245*38e8c45fSAndroid Build Coastguard Worker         EXPECT_FALSE(binder->gotUserTransaction);
246*38e8c45fSAndroid Build Coastguard Worker     }
247*38e8c45fSAndroid Build Coastguard Worker 
248*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> out;
249*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(server->returnNoStabilityBinder(&out).isOk());
250*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, out.get());
251*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, out->pingBinder());
252*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, BadStableBinder::doUserTransaction(out));
253*38e8c45fSAndroid Build Coastguard Worker 
254*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(server->returnLocalStabilityBinder(&out).isOk());
255*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, out.get());
256*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, out->pingBinder());
257*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, BadStableBinder::doUserTransaction(out));
258*38e8c45fSAndroid Build Coastguard Worker 
259*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(server->returnVintfStabilityBinder(&out).isOk());
260*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, out.get());
261*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, out->pingBinder());
262*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, BadStableBinder::doUserTransaction(out));
263*38e8c45fSAndroid Build Coastguard Worker 
264*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(server->returnVendorStabilityBinder(&out).isOk());
265*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, out.get());
266*38e8c45fSAndroid Build Coastguard Worker 
267*38e8c45fSAndroid Build Coastguard Worker     // !!! libbinder-defined transaction works !!!
268*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(OK, out->pingBinder());
269*38e8c45fSAndroid Build Coastguard Worker 
270*38e8c45fSAndroid Build Coastguard Worker     // !!! user-defined transaction may not be stable !!!
271*38e8c45fSAndroid Build Coastguard Worker     // !!! so, it does not work !!!
272*38e8c45fSAndroid Build Coastguard Worker     EXPECT_EQ(BAD_TYPE, BadStableBinder::doUserTransaction(out));
273*38e8c45fSAndroid Build Coastguard Worker }
274*38e8c45fSAndroid Build Coastguard Worker 
275*38e8c45fSAndroid Build Coastguard Worker // This is handwritten so that we can test different stability levels w/o having the AIDL
276*38e8c45fSAndroid Build Coastguard Worker // compiler assign them. Hand-writing binder interfaces is considered a bad practice
277*38e8c45fSAndroid Build Coastguard Worker // sanity reasons. YOU SHOULD DEFINE AN AIDL INTERFACE INSTEAD!
278*38e8c45fSAndroid Build Coastguard Worker 
279*38e8c45fSAndroid Build Coastguard Worker struct NdkBinderStable_DataClass {
280*38e8c45fSAndroid Build Coastguard Worker     bool gotUserTransaction = false;
281*38e8c45fSAndroid Build Coastguard Worker };
NdkBadStableBinder_Class_onCreate(void * args)282*38e8c45fSAndroid Build Coastguard Worker void* NdkBadStableBinder_Class_onCreate(void* args) {
283*38e8c45fSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(args != nullptr, "Takes no args");
284*38e8c45fSAndroid Build Coastguard Worker     return static_cast<void*>(new NdkBinderStable_DataClass);
285*38e8c45fSAndroid Build Coastguard Worker }
NdkBadStableBinder_Class_onDestroy(void * userData)286*38e8c45fSAndroid Build Coastguard Worker void NdkBadStableBinder_Class_onDestroy(void* userData) {
287*38e8c45fSAndroid Build Coastguard Worker     delete static_cast<NdkBinderStable_DataClass*>(userData);
288*38e8c45fSAndroid Build Coastguard Worker }
NdkBadStableBinder_getUserData(AIBinder * binder)289*38e8c45fSAndroid Build Coastguard Worker NdkBinderStable_DataClass* NdkBadStableBinder_getUserData(AIBinder* binder) {
290*38e8c45fSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(binder == nullptr);
291*38e8c45fSAndroid Build Coastguard Worker     void* userData = AIBinder_getUserData(binder);
292*38e8c45fSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(userData == nullptr, "null data - binder is remote?");
293*38e8c45fSAndroid Build Coastguard Worker 
294*38e8c45fSAndroid Build Coastguard Worker     return static_cast<NdkBinderStable_DataClass*>(userData);
295*38e8c45fSAndroid Build Coastguard Worker }
NdkBadStableBinder_Class_onTransact(AIBinder * binder,transaction_code_t code,const AParcel *,AParcel *)296*38e8c45fSAndroid Build Coastguard Worker binder_status_t NdkBadStableBinder_Class_onTransact(
297*38e8c45fSAndroid Build Coastguard Worker     AIBinder* binder, transaction_code_t code, const AParcel* /*in*/, AParcel* /*out*/) {
298*38e8c45fSAndroid Build Coastguard Worker 
299*38e8c45fSAndroid Build Coastguard Worker     if (code == BadStableBinder::USER_TRANSACTION) {
300*38e8c45fSAndroid Build Coastguard Worker         ALOGE("ndk binder stability: Got user transaction");
301*38e8c45fSAndroid Build Coastguard Worker         NdkBadStableBinder_getUserData(binder)->gotUserTransaction = true;
302*38e8c45fSAndroid Build Coastguard Worker         return STATUS_OK;
303*38e8c45fSAndroid Build Coastguard Worker     }
304*38e8c45fSAndroid Build Coastguard Worker 
305*38e8c45fSAndroid Build Coastguard Worker     return STATUS_UNKNOWN_TRANSACTION;
306*38e8c45fSAndroid Build Coastguard Worker }
307*38e8c45fSAndroid Build Coastguard Worker 
308*38e8c45fSAndroid Build Coastguard Worker static AIBinder_Class* kNdkBadStableBinder =
309*38e8c45fSAndroid Build Coastguard Worker     AIBinder_Class_define(String8(BadStableBinder::kDescriptor).c_str(),
310*38e8c45fSAndroid Build Coastguard Worker                           NdkBadStableBinder_Class_onCreate,
311*38e8c45fSAndroid Build Coastguard Worker                           NdkBadStableBinder_Class_onDestroy,
312*38e8c45fSAndroid Build Coastguard Worker                           NdkBadStableBinder_Class_onTransact);
313*38e8c45fSAndroid Build Coastguard Worker 
314*38e8c45fSAndroid Build Coastguard Worker // for testing only to get around __ANDROID_VNDK__ guard.
315*38e8c45fSAndroid Build Coastguard Worker extern "C" void AIBinder_markVendorStability(AIBinder* binder); // <- BAD DO NOT COPY
316*38e8c45fSAndroid Build Coastguard Worker 
TEST(BinderStability,NdkCantCallVendorBinderInSystemContext)317*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, NdkCantCallVendorBinderInSystemContext) {
318*38e8c45fSAndroid Build Coastguard Worker     LIBBINDER_IGNORE("-Wdeprecated-declarations")
319*38e8c45fSAndroid Build Coastguard Worker     SpAIBinder binder = SpAIBinder(AServiceManager_getService(
320*38e8c45fSAndroid Build Coastguard Worker         String8(kSystemStabilityServer).c_str()));
321*38e8c45fSAndroid Build Coastguard Worker     LIBBINDER_IGNORE_END()
322*38e8c45fSAndroid Build Coastguard Worker 
323*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<aidl::IBinderStabilityTest> remoteServer =
324*38e8c45fSAndroid Build Coastguard Worker         aidl::IBinderStabilityTest::fromBinder(binder);
325*38e8c45fSAndroid Build Coastguard Worker 
326*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, remoteServer.get());
327*38e8c45fSAndroid Build Coastguard Worker 
328*38e8c45fSAndroid Build Coastguard Worker     SpAIBinder comp = SpAIBinder(AIBinder_new(kNdkBadStableBinder, nullptr /*args*/));
329*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(remoteServer->sendBinder(comp).isOk());
330*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(remoteServer->sendAndCallBinder(comp).isOk());
331*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(NdkBadStableBinder_getUserData(comp.get())->gotUserTransaction);
332*38e8c45fSAndroid Build Coastguard Worker 
333*38e8c45fSAndroid Build Coastguard Worker     SpAIBinder vendor = SpAIBinder(AIBinder_new(kNdkBadStableBinder, nullptr /*args*/));
334*38e8c45fSAndroid Build Coastguard Worker     AIBinder_markVendorStability(vendor.get());
335*38e8c45fSAndroid Build Coastguard Worker     EXPECT_TRUE(remoteServer->sendBinder(vendor).isOk());
336*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(remoteServer->sendAndCallBinder(vendor).isOk());
337*38e8c45fSAndroid Build Coastguard Worker     EXPECT_FALSE(NdkBadStableBinder_getUserData(vendor.get())->gotUserTransaction);
338*38e8c45fSAndroid Build Coastguard Worker }
339*38e8c45fSAndroid Build Coastguard Worker 
340*38e8c45fSAndroid Build Coastguard Worker class MarksStabilityInConstructor : public BBinder {
341*38e8c45fSAndroid Build Coastguard Worker public:
342*38e8c45fSAndroid Build Coastguard Worker     static bool gDestructed;
343*38e8c45fSAndroid Build Coastguard Worker 
MarksStabilityInConstructor()344*38e8c45fSAndroid Build Coastguard Worker     MarksStabilityInConstructor() {
345*38e8c45fSAndroid Build Coastguard Worker         Stability::markCompilationUnit(this);
346*38e8c45fSAndroid Build Coastguard Worker     }
~MarksStabilityInConstructor()347*38e8c45fSAndroid Build Coastguard Worker     ~MarksStabilityInConstructor() {
348*38e8c45fSAndroid Build Coastguard Worker         gDestructed = true;
349*38e8c45fSAndroid Build Coastguard Worker     }
350*38e8c45fSAndroid Build Coastguard Worker };
351*38e8c45fSAndroid Build Coastguard Worker bool MarksStabilityInConstructor::gDestructed = false;
352*38e8c45fSAndroid Build Coastguard Worker 
TEST(BinderStability,MarkingObjectNoDestructTest)353*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, MarkingObjectNoDestructTest) {
354*38e8c45fSAndroid Build Coastguard Worker     ASSERT_FALSE(MarksStabilityInConstructor::gDestructed);
355*38e8c45fSAndroid Build Coastguard Worker 
356*38e8c45fSAndroid Build Coastguard Worker     // best practice is to put this directly in an sp, but for this test, we
357*38e8c45fSAndroid Build Coastguard Worker     // want to explicitly check what happens before that happens
358*38e8c45fSAndroid Build Coastguard Worker     MarksStabilityInConstructor* binder = new MarksStabilityInConstructor();
359*38e8c45fSAndroid Build Coastguard Worker     ASSERT_FALSE(MarksStabilityInConstructor::gDestructed);
360*38e8c45fSAndroid Build Coastguard Worker 
361*38e8c45fSAndroid Build Coastguard Worker     sp<MarksStabilityInConstructor> binderSp = binder;
362*38e8c45fSAndroid Build Coastguard Worker     ASSERT_FALSE(MarksStabilityInConstructor::gDestructed);
363*38e8c45fSAndroid Build Coastguard Worker 
364*38e8c45fSAndroid Build Coastguard Worker     binderSp = nullptr;
365*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(MarksStabilityInConstructor::gDestructed);
366*38e8c45fSAndroid Build Coastguard Worker }
367*38e8c45fSAndroid Build Coastguard Worker 
TEST(BinderStability,RemarkDies)368*38e8c45fSAndroid Build Coastguard Worker TEST(BinderStability, RemarkDies) {
369*38e8c45fSAndroid Build Coastguard Worker     ASSERT_DEATH({
370*38e8c45fSAndroid Build Coastguard Worker         sp<IBinder> binder = new BBinder();
371*38e8c45fSAndroid Build Coastguard Worker         Stability::markCompilationUnit(binder.get()); // <-- only called for tests
372*38e8c45fSAndroid Build Coastguard Worker         Stability::markVndk(binder.get()); // <-- only called for tests
373*38e8c45fSAndroid Build Coastguard Worker     }, "Should only mark known object.");
374*38e8c45fSAndroid Build Coastguard Worker }
375*38e8c45fSAndroid Build Coastguard Worker 
main(int argc,char ** argv)376*38e8c45fSAndroid Build Coastguard Worker int main(int argc, char** argv) {
377*38e8c45fSAndroid Build Coastguard Worker     ::testing::InitGoogleTest(&argc, argv);
378*38e8c45fSAndroid Build Coastguard Worker 
379*38e8c45fSAndroid Build Coastguard Worker     if (fork() == 0) {
380*38e8c45fSAndroid Build Coastguard Worker         // child process
381*38e8c45fSAndroid Build Coastguard Worker         prctl(PR_SET_PDEATHSIG, SIGHUP);
382*38e8c45fSAndroid Build Coastguard Worker 
383*38e8c45fSAndroid Build Coastguard Worker         sp<IBinder> server = new MyBinderStabilityTest;
384*38e8c45fSAndroid Build Coastguard Worker         android::defaultServiceManager()->addService(kSystemStabilityServer, server);
385*38e8c45fSAndroid Build Coastguard Worker 
386*38e8c45fSAndroid Build Coastguard Worker         IPCThreadState::self()->joinThreadPool(true);
387*38e8c45fSAndroid Build Coastguard Worker         exit(1);  // should not reach
388*38e8c45fSAndroid Build Coastguard Worker     }
389*38e8c45fSAndroid Build Coastguard Worker 
390*38e8c45fSAndroid Build Coastguard Worker     // This is not racey. Just giving these services some time to register before we call
391*38e8c45fSAndroid Build Coastguard Worker     // getService which sleeps for much longer...
392*38e8c45fSAndroid Build Coastguard Worker     usleep(10000);
393*38e8c45fSAndroid Build Coastguard Worker 
394*38e8c45fSAndroid Build Coastguard Worker     return RUN_ALL_TESTS();
395*38e8c45fSAndroid Build Coastguard Worker }
396