diff options
Diffstat (limited to 'libs/binder/tests/binderStabilityTest.cpp')
-rw-r--r-- | libs/binder/tests/binderStabilityTest.cpp | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/libs/binder/tests/binderStabilityTest.cpp b/libs/binder/tests/binderStabilityTest.cpp index 1f2779abf0..2ce13df4b3 100644 --- a/libs/binder/tests/binderStabilityTest.cpp +++ b/libs/binder/tests/binderStabilityTest.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include <android/binder_libbinder.h> #include <android/binder_manager.h> #include <android/binder_stability.h> #include <binder/Binder.h> @@ -131,6 +132,55 @@ TEST(BinderStability, OnlyVintfStabilityBinderNeedsVintfDeclaration) { EXPECT_TRUE(Stability::requiresVintfDeclaration(BadStableBinder::vintf())); } +TEST(BinderStability, ForceDowngradeToLocalStability) { + sp<IBinder> someBinder = BadStableBinder::vintf(); + + EXPECT_TRUE(Stability::requiresVintfDeclaration(someBinder)); + + // silly to do this after already using the binder, but it's for the test + Stability::forceDowngradeToLocalStability(someBinder); + + EXPECT_FALSE(Stability::requiresVintfDeclaration(someBinder)); +} + +TEST(BinderStability, NdkForceDowngradeToLocalStability) { + sp<IBinder> someBinder = BadStableBinder::vintf(); + + EXPECT_TRUE(Stability::requiresVintfDeclaration(someBinder)); + + // silly to do this after already using the binder, but it's for the test + AIBinder_forceDowngradeToLocalStability(AIBinder_fromPlatformBinder(someBinder)); + + EXPECT_FALSE(Stability::requiresVintfDeclaration(someBinder)); +} + +TEST(BinderStability, ForceDowngradeToVendorStability) { + sp<IBinder> serverBinder = android::defaultServiceManager()->getService(kSystemStabilityServer); + auto server = interface_cast<IBinderStabilityTest>(serverBinder); + + ASSERT_NE(nullptr, server.get()); + ASSERT_NE(nullptr, IInterface::asBinder(server)->remoteBinder()); + + { + sp<BadStableBinder> binder = BadStableBinder::vintf(); + + EXPECT_TRUE(Stability::requiresVintfDeclaration(binder)); + EXPECT_TRUE(server->sendAndCallBinder(binder).isOk()); + EXPECT_TRUE(binder->gotUserTransaction); + } + { + sp<BadStableBinder> binder = BadStableBinder::vintf(); + + // This method should never be called directly. This is done only for the test. + Stability::forceDowngradeToVendorStability(binder); + + // Binder downgraded to vendor stability, cannot be called from system context + EXPECT_FALSE(Stability::requiresVintfDeclaration(binder)); + EXPECT_EQ(BAD_TYPE, server->sendAndCallBinder(binder).exceptionCode()); + EXPECT_FALSE(binder->gotUserTransaction); + } +} + TEST(BinderStability, VintfStabilityServerMustBeDeclaredInManifest) { sp<IBinder> vintfServer = BadStableBinder::vintf(); @@ -142,6 +192,8 @@ TEST(BinderStability, VintfStabilityServerMustBeDeclaredInManifest) { EXPECT_EQ(Status::EX_ILLEGAL_ARGUMENT, android::defaultServiceManager()->addService(String16("."), vintfServer)) << instance8; EXPECT_FALSE(android::defaultServiceManager()->isDeclared(instance)) << instance8; + EXPECT_EQ(std::nullopt, android::defaultServiceManager()->updatableViaApex(instance)) + << instance8; } } |