1 package org.robolectric.shadows; 2 3 import static com.google.common.truth.Truth.assertThat; 4 import static org.junit.Assert.assertTrue; 5 import static org.junit.Assert.fail; 6 7 import android.os.Binder; 8 import android.os.Parcel; 9 import android.os.RemoteException; 10 import androidx.test.ext.junit.runners.AndroidJUnit4; 11 import org.junit.Test; 12 import org.junit.runner.RunWith; 13 14 @RunWith(AndroidJUnit4.class) 15 public class ShadowBinderTest { 16 @Test transactCallsOnTransact()17 public void transactCallsOnTransact() throws Exception { 18 TestBinder testBinder = new TestBinder(); 19 Parcel data = Parcel.obtain(); 20 Parcel reply = Parcel.obtain(); 21 data.writeString("Hello Robolectric"); 22 assertTrue(testBinder.transact(2, data, reply, 3)); 23 assertThat(testBinder.code).isEqualTo(2); 24 assertThat(testBinder.data).isSameInstanceAs(data); 25 assertThat(testBinder.reply).isSameInstanceAs(reply); 26 assertThat(testBinder.flags).isEqualTo(3); 27 reply.readException(); 28 assertThat(reply.readString()).isEqualTo("Hello Robolectric"); 29 } 30 31 static class TestBinder extends Binder { 32 int code; 33 Parcel data; 34 Parcel reply; 35 int flags; 36 37 @Override onTransact(int code, Parcel data, Parcel reply, int flags)38 protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { 39 this.code = code; 40 this.data = data; 41 this.reply = reply; 42 this.flags = flags; 43 String string = data.readString(); 44 reply.writeNoException(); 45 reply.writeString(string); 46 return true; 47 } 48 } 49 50 @Test thrownExceptionIsParceled()51 public void thrownExceptionIsParceled() throws Exception { 52 TestThrowingBinder testThrowingBinder = new TestThrowingBinder(); 53 Parcel data = Parcel.obtain(); 54 Parcel reply = Parcel.obtain(); 55 testThrowingBinder.transact(2, data, reply, 3); 56 try { 57 reply.readException(); 58 fail(); // Expect thrown 59 } catch (SecurityException e) { 60 assertThat(e.getMessage()).isEqualTo("Halt! Who goes there?"); 61 } 62 } 63 64 static class TestThrowingBinder extends Binder { 65 66 @Override onTransact(int code, Parcel data, Parcel reply, int flags)67 protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { 68 throw new SecurityException("Halt! Who goes there?"); 69 } 70 } 71 72 @Test testSetCallingUid()73 public void testSetCallingUid() { 74 ShadowBinder.setCallingUid(37); 75 assertThat(Binder.getCallingUid()).isEqualTo(37); 76 } 77 78 @Test testSetCallingPid()79 public void testSetCallingPid() { 80 ShadowBinder.setCallingPid(25); 81 assertThat(Binder.getCallingPid()).isEqualTo(25); 82 } 83 84 @Test testGetCallingUidShouldUseProcessUidByDefault()85 public void testGetCallingUidShouldUseProcessUidByDefault() { 86 assertThat(Binder.getCallingUid()).isEqualTo(android.os.Process.myUid()); 87 } 88 89 @Test testGetCallingPidShouldUseProcessPidByDefault()90 public void testGetCallingPidShouldUseProcessPidByDefault() { 91 assertThat(Binder.getCallingPid()).isEqualTo(android.os.Process.myPid()); 92 } 93 94 @Test testResetUpdatesCallingUidAndPid()95 public void testResetUpdatesCallingUidAndPid() { 96 ShadowBinder.setCallingPid(48); 97 ShadowBinder.setCallingUid(49); 98 ShadowBinder.reset(); 99 assertThat(Binder.getCallingPid()).isEqualTo(android.os.Process.myPid()); 100 assertThat(Binder.getCallingUid()).isEqualTo(android.os.Process.myUid()); 101 } 102 } 103