Home | History | Annotate | Download | only in shadows
      1 package org.robolectric.shadows;
      2 
      3 import static android.os.Build.VERSION_CODES.KITKAT;
      4 import static android.os.Build.VERSION_CODES.LOLLIPOP;
      5 import static org.assertj.core.api.Assertions.assertThat;
      6 import static org.robolectric.Shadows.shadowOf;
      7 
      8 import android.os.Bundle;
      9 import android.os.Handler;
     10 import android.os.Message;
     11 import org.junit.Test;
     12 import org.junit.runner.RunWith;
     13 import org.robolectric.Robolectric;
     14 import org.robolectric.RobolectricTestRunner;
     15 import org.robolectric.annotation.Config;
     16 import org.robolectric.util.ReflectionHelpers;
     17 import org.robolectric.util.Scheduler;
     18 
     19 @RunWith(RobolectricTestRunner.class)
     20 public class ShadowMessageTest {
     21 
     22   @Test
     23   public void testGetDataShouldLazilyCreateBundle() throws Exception {
     24     assertThat(new Message().getData()).isNotNull();
     25     assertThat(new Message().getData().isEmpty()).isTrue();
     26   }
     27 
     28   @Test
     29   public void testGetData() throws Exception {
     30     Message m = new Message();
     31     Bundle b = new Bundle();
     32     m.setData(b);
     33     assertThat(m.getData()).isEqualTo(b);
     34   }
     35 
     36   @Test
     37   public void testPeekData() throws Exception {
     38     assertThat(new Message().peekData()).isNull();
     39 
     40     Message m = new Message();
     41     Bundle b = new Bundle();
     42     m.setData(b);
     43     assertThat(m.peekData()).isEqualTo(b);
     44   }
     45 
     46   @Test
     47   public void testGetTarget() throws Exception {
     48     Message m = new Message();
     49     Handler h = new Handler();
     50     m.setTarget(h);
     51     assertThat(m.getTarget()).isEqualTo(h);
     52   }
     53 
     54   @Test
     55   public void testCopyFrom() throws Exception {
     56     Bundle b = new Bundle();
     57     Message m = new Message();
     58     m.arg1 = 10;
     59     m.arg2 = 42;
     60     m.obj = "obj";
     61     m.what = 24;
     62     m.setData(b);
     63     m.setTarget(new Handler());
     64     Message m2 = new Message();
     65     m2.copyFrom(m);
     66 
     67     assertThat(m2.arg1).isEqualTo(m.arg1);
     68     assertThat(m2.arg2).isEqualTo(m.arg2);
     69     assertThat(m2.obj).isEqualTo(m.obj);
     70     assertThat(m2.what).isEqualTo(m.what);
     71     assertThat(m2.getTarget()).isNull();
     72     assertThat(m2.getData()).isNotNull();
     73     assertThat(m2.getData().isEmpty()).isTrue();
     74   }
     75 
     76   @Test
     77   public void testObtain() throws Exception {
     78     Message m = Message.obtain();
     79     assertThat(m).isNotNull();
     80   }
     81 
     82   @Test
     83   public void testObtainWithHandler() throws Exception {
     84     Handler h = new Handler();
     85     Message m = Message.obtain(h);
     86     assertThat(m.getTarget()).isEqualTo(h);
     87   }
     88 
     89   @Test
     90   public void testObtainWithHandlerAndWhat() throws Exception {
     91     Handler h = new Handler();
     92     int what = 10;
     93     Message m = Message.obtain(h, what);
     94 
     95     assertThat(m.getTarget()).isEqualTo(h);
     96     assertThat(m.what).isEqualTo(what);
     97     assertThat(m.getTarget()).isEqualTo(h);
     98   }
     99 
    100   @Test
    101   public void testObtainWithHandlerWhatAndObject() throws Exception {
    102     Handler h = new Handler();
    103     int what = 10;
    104     Object obj = "test";
    105     Message m = Message.obtain(h, what, obj);
    106 
    107     assertThat(m.getTarget()).isEqualTo(h);
    108     assertThat(m.what).isEqualTo(what);
    109     assertThat(m.getTarget()).isEqualTo(h);
    110     assertThat(m.obj).isEqualTo(obj);
    111   }
    112 
    113   @Test
    114   public void testObtainWithHandlerWhatAndTwoArgs() throws Exception {
    115     Handler h = new Handler();
    116     int what = 2;
    117     int arg1 = 3;
    118     int arg2 = 5;
    119     Message m = Message.obtain(h, what, arg1, arg2);
    120 
    121     assertThat(m.getTarget()).isEqualTo(h);
    122     assertThat(m.what).isEqualTo(what);
    123     assertThat(m.arg1).isEqualTo(arg1);
    124     assertThat(m.arg2).isEqualTo(arg2);
    125   }
    126 
    127   @Test
    128   public void testObtainWithHandlerWhatTwoArgsAndObj() throws Exception {
    129     Handler h = new Handler();
    130     int what = 2;
    131     int arg1 = 3;
    132     int arg2 = 5;
    133     Object obj = "test";
    134     Message m = Message.obtain(h, what, arg1, arg2, obj);
    135 
    136     assertThat(m.getTarget()).isEqualTo(h);
    137     assertThat(m.what).isEqualTo(what);
    138     assertThat(m.arg1).isEqualTo(arg1);
    139     assertThat(m.arg2).isEqualTo(arg2);
    140     assertThat(m.obj).isEqualTo(obj);
    141   }
    142 
    143   @Test
    144   public void testObtainWithMessage() throws Exception {
    145     Bundle b = new Bundle();
    146     Message m = new Message();
    147     m.arg1 = 10;
    148     m.arg2 = 42;
    149     m.obj = "obj";
    150     m.what = 24;
    151     m.setData(b);
    152     m.setTarget(new Handler());
    153     Message m2 = Message.obtain(m);
    154 
    155     assertThat(m2.arg1).isEqualTo(m.arg1);
    156     assertThat(m2.arg2).isEqualTo(m.arg2);
    157     assertThat(m2.obj).isEqualTo(m.obj);
    158     assertThat(m2.what).isEqualTo(m.what);
    159     assertThat(m2.getTarget()).isEqualTo(m.getTarget());
    160     assertThat(m2.getData()).isNotNull();
    161     assertThat(m2.getData().isEmpty()).isTrue();
    162   }
    163 
    164   @Test
    165   public void testSendToTarget() throws Exception {
    166     ShadowLooper.pauseMainLooper();
    167     Handler h = new Handler();
    168     Message.obtain(h, 123).sendToTarget();
    169     assertThat(h.hasMessages(123)).isTrue();
    170   }
    171 
    172   @Test
    173   public void testSetGetNext() {
    174     Message msg = Message.obtain();
    175     Message msg2 = Message.obtain();
    176     ShadowMessage sMsg = shadowOf(msg);
    177     sMsg.setNext(msg2);
    178     assertThat(sMsg.getNext()).isSameAs(msg2);
    179   }
    180 
    181   @Test
    182   @Config(minSdk = LOLLIPOP)
    183   public void testIsInUse() {
    184     ShadowLooper.pauseMainLooper();
    185     Handler h = new Handler();
    186     Message msg = Message.obtain(h, 123);
    187     ShadowMessage sMsg = shadowOf(msg);
    188     assertThat(sMsg.isInUse()).isFalse();
    189     msg.sendToTarget();
    190     assertThat(sMsg.isInUse()).isTrue();
    191   }
    192 
    193   @Test
    194   @Config(maxSdk = KITKAT)
    195   public void recycle_shouldInvokeRealObject19() {
    196     recycle_shouldInvokeRealObject("recycle");
    197   }
    198 
    199   @Test
    200   @Config(minSdk = LOLLIPOP)
    201   public void recycle_shouldInvokeRealObject21() {
    202     recycle_shouldInvokeRealObject("recycleUnchecked");
    203   }
    204 
    205   private void recycle_shouldInvokeRealObject(String recycleMethod) {
    206     Handler h = new Handler();
    207     Message msg = Message.obtain(h, 234);
    208     ReflectionHelpers.callInstanceMethod(msg, recycleMethod);
    209     assertThat(msg.what).isZero();
    210   }
    211 
    212   @Test
    213   @Config(maxSdk = KITKAT)
    214   public void recycle_shouldRemoveMessageFromScheduler19() {
    215     recycle_shouldRemoveMessageFromScheduler();
    216   }
    217 
    218   @Test
    219   @Config(minSdk = LOLLIPOP)
    220   public void recycle_shouldRemoveMessageFromScheduler21() {
    221     recycle_shouldRemoveMessageFromScheduler();
    222   }
    223 
    224   private void recycle_shouldRemoveMessageFromScheduler() {
    225     ShadowLooper.pauseMainLooper();
    226     Handler h = new Handler();
    227     Message msg = Message.obtain(h, 234);
    228     msg.sendToTarget();
    229     Scheduler scheduler = Robolectric.getForegroundThreadScheduler();
    230     assertThat(scheduler.size()).as("before recycle").isEqualTo(1);
    231     shadowOf(msg).recycleUnchecked();
    232     assertThat(scheduler.size()).as("after recycle").isEqualTo(0);
    233   }
    234 
    235   @Test
    236   public void reset_shouldEmptyMessagePool() {
    237     Message dummy1 = Message.obtain();
    238     shadowOf(dummy1).recycleUnchecked();
    239     Message dummy2 = Message.obtain();
    240     assertThat(dummy2).as("before resetting").isSameAs(dummy1);
    241 
    242     shadowOf(dummy2).recycleUnchecked();
    243     ShadowMessage.reset();
    244     dummy1 = Message.obtain();
    245     assertThat(dummy1).as("after resetting").isNotSameAs(dummy2);
    246   }
    247 }
    248