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