1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1; 4 import static android.os.Build.VERSION_CODES.R; 5 import static android.os.Build.VERSION_CODES.S; 6 import static com.google.common.truth.Truth.assertThat; 7 import static org.junit.Assert.assertThrows; 8 import static org.robolectric.Shadows.shadowOf; 9 10 import android.app.PendingIntent; 11 import android.net.Uri; 12 import android.os.Bundle; 13 import android.telephony.SmsManager; 14 import androidx.test.core.app.ApplicationProvider; 15 import androidx.test.ext.junit.runners.AndroidJUnit4; 16 import com.google.android.collect.Lists; 17 import org.junit.Test; 18 import org.junit.runner.RunWith; 19 import org.robolectric.annotation.Config; 20 import org.robolectric.shadows.ShadowSmsManager.DownloadMultimediaMessageParams; 21 import org.robolectric.shadows.ShadowSmsManager.SendMultimediaMessageParams; 22 import org.robolectric.shadows.ShadowSmsManager.TextMultipartParams; 23 import org.robolectric.shadows.ShadowSmsManager.TextSmsParams; 24 import org.robolectric.util.ReflectionHelpers; 25 26 @RunWith(AndroidJUnit4.class) 27 public class ShadowSmsManagerTest { 28 private SmsManager smsManager = SmsManager.getDefault(); 29 private final String scAddress = "serviceCenterAddress"; 30 private final String destAddress = "destinationAddress"; 31 private final Uri mmsContentUri = Uri.parse("content://mms/123"); 32 private final String mmsLocationUrl = "https://somewherefancy.com/myMms"; 33 34 @Test 35 @Config(minSdk = LOLLIPOP_MR1) getForSubscriptionId()36 public void getForSubscriptionId() { 37 final int subId = 101; 38 39 smsManager = SmsManager.getSmsManagerForSubscriptionId(subId); 40 assertThat(smsManager.getSubscriptionId()).isEqualTo(subId); 41 } 42 43 @Test sendTextMessage_shouldStoreLastSentTextParameters()44 public void sendTextMessage_shouldStoreLastSentTextParameters() { 45 smsManager.sendTextMessage(destAddress, scAddress, "Body Text", null, null); 46 ShadowSmsManager.TextSmsParams params = shadowOf(smsManager).getLastSentTextMessageParams(); 47 48 assertThat(params.getDestinationAddress()).isEqualTo(destAddress); 49 assertThat(params.getScAddress()).isEqualTo(scAddress); 50 assertThat(params.getText()).isEqualTo("Body Text"); 51 assertThat(params.getSentIntent()).isNull(); 52 assertThat(params.getDeliveryIntent()).isNull(); 53 } 54 55 @Test(expected = IllegalArgumentException.class) sendTextMessage_shouldThrowExceptionWithEmptyDestination()56 public void sendTextMessage_shouldThrowExceptionWithEmptyDestination() { 57 smsManager.sendTextMessage("", scAddress, "testSmsBodyText", null, null); 58 } 59 60 @Test(expected = IllegalArgumentException.class) sentTextMessage_shouldThrowExceptionWithEmptyText()61 public void sentTextMessage_shouldThrowExceptionWithEmptyText() { 62 smsManager.sendTextMessage(destAddress, scAddress, "", null, null); 63 } 64 65 @Test sendMultipartMessage_shouldStoreLastSendMultimediaParameters()66 public void sendMultipartMessage_shouldStoreLastSendMultimediaParameters() { 67 smsManager.sendMultipartTextMessage( 68 destAddress, scAddress, Lists.newArrayList("Foo", "Bar", "Baz"), null, null); 69 ShadowSmsManager.TextMultipartParams params = 70 shadowOf(smsManager).getLastSentMultipartTextMessageParams(); 71 72 assertThat(params.getDestinationAddress()).isEqualTo(destAddress); 73 assertThat(params.getScAddress()).isEqualTo(scAddress); 74 assertThat(params.getParts()).containsExactly("Foo", "Bar", "Baz"); 75 assertThat(params.getSentIntents()).isNull(); 76 assertThat(params.getDeliveryIntents()).isNull(); 77 } 78 79 @Test(expected = IllegalArgumentException.class) sendMultipartTextMessage_shouldThrowExceptionWithEmptyDestination()80 public void sendMultipartTextMessage_shouldThrowExceptionWithEmptyDestination() { 81 smsManager.sendMultipartTextMessage("", scAddress, Lists.newArrayList("Foo"), null, null); 82 } 83 84 @Test(expected = IllegalArgumentException.class) sentMultipartTextMessage_shouldThrowExceptionWithEmptyText()85 public void sentMultipartTextMessage_shouldThrowExceptionWithEmptyText() { 86 smsManager.sendMultipartTextMessage(destAddress, scAddress, null, null, null); 87 } 88 89 @Test sendDataMessage_shouldStoreLastParameters()90 public void sendDataMessage_shouldStoreLastParameters() { 91 final short destPort = 24; 92 final byte[] data = new byte[] {0, 1, 2, 3, 4}; 93 final PendingIntent sentIntent = 94 PendingIntent.getActivity(ApplicationProvider.getApplicationContext(), 10, null, 0); 95 final PendingIntent deliveryIntent = 96 PendingIntent.getActivity(ApplicationProvider.getApplicationContext(), 10, null, 0); 97 98 smsManager.sendDataMessage(destAddress, scAddress, destPort, data, sentIntent, deliveryIntent); 99 100 final ShadowSmsManager.DataMessageParams params = 101 shadowOf(smsManager).getLastSentDataMessageParams(); 102 assertThat(params.getDestinationAddress()).isEqualTo(destAddress); 103 assertThat(params.getScAddress()).isEqualTo(scAddress); 104 assertThat(params.getDestinationPort()).isEqualTo(destPort); 105 assertThat(params.getData()).isEqualTo(data); 106 assertThat(params.getSentIntent()).isSameInstanceAs(sentIntent); 107 assertThat(params.getDeliveryIntent()).isSameInstanceAs(deliveryIntent); 108 } 109 110 @Test(expected = IllegalArgumentException.class) sendDataMessage_shouldThrowExceptionWithEmptyDestination()111 public void sendDataMessage_shouldThrowExceptionWithEmptyDestination() { 112 smsManager.sendDataMessage("", null, (short) 0, null, null, null); 113 } 114 115 @Test clearLastSentDataMessageParams_shouldClearParameters()116 public void clearLastSentDataMessageParams_shouldClearParameters() { 117 smsManager.sendDataMessage(destAddress, scAddress, (short) 0, null, null, null); 118 assertThat(shadowOf(smsManager).getLastSentDataMessageParams()).isNotNull(); 119 120 shadowOf(smsManager).clearLastSentDataMessageParams(); 121 assertThat(shadowOf(smsManager).getLastSentDataMessageParams()).isNull(); 122 } 123 124 @Test clearLastSentTextMessageParams_shouldClearParameters()125 public void clearLastSentTextMessageParams_shouldClearParameters() { 126 smsManager.sendTextMessage(destAddress, scAddress, "testSmsBodyText", null, null); 127 assertThat(shadowOf(smsManager).getLastSentTextMessageParams()).isNotNull(); 128 129 shadowOf(smsManager).clearLastSentTextMessageParams(); 130 assertThat(shadowOf(smsManager).getLastSentTextMessageParams()).isNull(); 131 } 132 133 @Test clearLastSentMultipartTextMessageParams_shouldClearParameters()134 public void clearLastSentMultipartTextMessageParams_shouldClearParameters() { 135 smsManager.sendMultipartTextMessage( 136 destAddress, scAddress, Lists.newArrayList("Foo", "Bar", "Baz"), null, null); 137 assertThat(shadowOf(smsManager).getLastSentMultipartTextMessageParams()).isNotNull(); 138 139 shadowOf(smsManager).clearLastSentMultipartTextMessageParams(); 140 assertThat(shadowOf(smsManager).getLastSentMultipartTextMessageParams()).isNull(); 141 } 142 143 // Tests for {@link SmsManager#sendMultimediaMessage} 144 145 @Test sendMultimediaMessage_shouldStoreLastSentMultimediaMessageParameters()146 public void sendMultimediaMessage_shouldStoreLastSentMultimediaMessageParameters() { 147 Bundle configOverrides = new Bundle(); 148 configOverrides.putBoolean("enableMMSDeliveryReports", true); 149 PendingIntent sentIntent = ReflectionHelpers.callConstructor(PendingIntent.class); 150 151 smsManager.sendMultimediaMessage( 152 null, mmsContentUri, mmsLocationUrl, configOverrides, sentIntent); 153 ShadowSmsManager.SendMultimediaMessageParams params = 154 shadowOf(smsManager).getLastSentMultimediaMessageParams(); 155 156 assertThat(params.getContentUri()).isEqualTo(mmsContentUri); 157 assertThat(params.getLocationUrl()).isEqualTo(mmsLocationUrl); 158 assertThat(params.getConfigOverrides()).isSameInstanceAs(configOverrides); 159 assertThat(params.getSentIntent()).isSameInstanceAs(sentIntent); 160 } 161 162 @Test(expected = IllegalArgumentException.class) sendMultimediaMessage_shouldThrowExceptionWithEmptyContentUri()163 public void sendMultimediaMessage_shouldThrowExceptionWithEmptyContentUri() { 164 smsManager.sendMultimediaMessage( 165 null, 166 null, 167 mmsLocationUrl, 168 new Bundle(), 169 ReflectionHelpers.callConstructor(PendingIntent.class)); 170 } 171 172 @Test 173 @Config(minSdk = S) sendMultimediaMessage_shouldStoreMessageId()174 public void sendMultimediaMessage_shouldStoreMessageId() { 175 Bundle configOverrides = new Bundle(); 176 configOverrides.putBoolean("enableMMSDeliveryReports", true); 177 PendingIntent sentIntent = ReflectionHelpers.callConstructor(PendingIntent.class); 178 179 long messageId = 32767L; 180 smsManager.sendMultimediaMessage( 181 null, mmsContentUri, mmsLocationUrl, configOverrides, sentIntent, messageId); 182 SendMultimediaMessageParams params = shadowOf(smsManager).getLastSentMultimediaMessageParams(); 183 184 assertThat(params.getMessageId()).isEqualTo(messageId); 185 } 186 187 @Test clearLastSentMultimediaMessageParams_shouldClearParameters()188 public void clearLastSentMultimediaMessageParams_shouldClearParameters() { 189 smsManager.sendMultimediaMessage( 190 null, 191 mmsContentUri, 192 mmsLocationUrl, 193 new Bundle(), 194 ReflectionHelpers.callConstructor(PendingIntent.class)); 195 assertThat(shadowOf(smsManager).getLastSentMultimediaMessageParams()).isNotNull(); 196 197 shadowOf(smsManager).clearLastSentMultimediaMessageParams(); 198 assertThat(shadowOf(smsManager).getLastSentMultimediaMessageParams()).isNull(); 199 } 200 201 // Tests for {@link SmsManager#downloadMultimediaMessage} 202 203 @Test downloadMultimediaMessage_shouldStoreLastDownloadedMultimediaMessageParameters()204 public void downloadMultimediaMessage_shouldStoreLastDownloadedMultimediaMessageParameters() { 205 Bundle configOverrides = new Bundle(); 206 configOverrides.putBoolean("enableMMSDeliveryReports", true); 207 PendingIntent downloadedIntent = ReflectionHelpers.callConstructor(PendingIntent.class); 208 209 smsManager.downloadMultimediaMessage( 210 null, mmsLocationUrl, mmsContentUri, configOverrides, downloadedIntent); 211 ShadowSmsManager.DownloadMultimediaMessageParams params = 212 shadowOf(smsManager).getLastDownloadedMultimediaMessageParams(); 213 214 assertThat(params.getContentUri()).isEqualTo(mmsContentUri); 215 assertThat(params.getLocationUrl()).isEqualTo(mmsLocationUrl); 216 assertThat(params.getConfigOverrides()).isSameInstanceAs(configOverrides); 217 assertThat(params.getDownloadedIntent()).isSameInstanceAs(downloadedIntent); 218 } 219 220 @Test 221 @Config(minSdk = S) downloadMultimediaMessageS_shouldStoreLastDownloadedMultimediaMessageParameters()222 public void downloadMultimediaMessageS_shouldStoreLastDownloadedMultimediaMessageParameters() { 223 Bundle configOverrides = new Bundle(); 224 configOverrides.putBoolean("enableMMSDeliveryReports", true); 225 PendingIntent downloadedIntent = ReflectionHelpers.callConstructor(PendingIntent.class); 226 227 long messageId = -231543663L; 228 smsManager.downloadMultimediaMessage( 229 null, mmsLocationUrl, mmsContentUri, configOverrides, downloadedIntent, messageId); 230 DownloadMultimediaMessageParams params = 231 shadowOf(smsManager).getLastDownloadedMultimediaMessageParams(); 232 233 assertThat(params.getMessageId()).isEqualTo(messageId); 234 } 235 236 @Test(expected = IllegalArgumentException.class) downloadMultimediaMessage_shouldThrowExceptionWithEmptyLocationUrl()237 public void downloadMultimediaMessage_shouldThrowExceptionWithEmptyLocationUrl() { 238 smsManager.downloadMultimediaMessage( 239 null, 240 null, 241 mmsContentUri, 242 new Bundle(), 243 ReflectionHelpers.callConstructor(PendingIntent.class)); 244 } 245 246 @Test(expected = IllegalArgumentException.class) downloadMultimediaMessage_shouldThrowExceptionWithEmptyContentUri()247 public void downloadMultimediaMessage_shouldThrowExceptionWithEmptyContentUri() { 248 smsManager.downloadMultimediaMessage( 249 null, 250 mmsLocationUrl, 251 null, 252 new Bundle(), 253 ReflectionHelpers.callConstructor(PendingIntent.class)); 254 } 255 256 @Test clearLastDownloadedMultimediaMessageParams_shouldClearParameters()257 public void clearLastDownloadedMultimediaMessageParams_shouldClearParameters() { 258 smsManager.downloadMultimediaMessage( 259 null, 260 mmsLocationUrl, 261 mmsContentUri, 262 new Bundle(), 263 ReflectionHelpers.callConstructor(PendingIntent.class)); 264 assertThat(shadowOf(smsManager).getLastDownloadedMultimediaMessageParams()).isNotNull(); 265 266 shadowOf(smsManager).clearLastDownloadedMultimediaMessageParams(); 267 assertThat(shadowOf(smsManager).getLastDownloadedMultimediaMessageParams()).isNull(); 268 } 269 270 @Test 271 @Config(minSdk = R) sendTextMessage_withMessageId_shouldStoreLastSentTextParameters()272 public void sendTextMessage_withMessageId_shouldStoreLastSentTextParameters() { 273 smsManager.sendTextMessage(destAddress, scAddress, "Body Text", null, null, 1231L); 274 TextSmsParams params = shadowOf(smsManager).getLastSentTextMessageParams(); 275 276 assertThat(params.getDestinationAddress()).isEqualTo(destAddress); 277 assertThat(params.getScAddress()).isEqualTo(scAddress); 278 assertThat(params.getText()).isEqualTo("Body Text"); 279 assertThat(params.getSentIntent()).isNull(); 280 assertThat(params.getMessageId()).isEqualTo(1231L); 281 } 282 283 @Test 284 @Config(minSdk = R) sendMultipartMessage_withMessageId_shouldStoreLastSendMultimediaParameters()285 public void sendMultipartMessage_withMessageId_shouldStoreLastSendMultimediaParameters() { 286 smsManager.sendMultipartTextMessage( 287 destAddress, scAddress, Lists.newArrayList("Foo", "Bar", "Baz"), null, null, 12312L); 288 TextMultipartParams params = shadowOf(smsManager).getLastSentMultipartTextMessageParams(); 289 290 assertThat(params.getDestinationAddress()).isEqualTo(destAddress); 291 assertThat(params.getScAddress()).isEqualTo(scAddress); 292 assertThat(params.getParts()).containsExactly("Foo", "Bar", "Baz"); 293 assertThat(params.getSentIntents()).isNull(); 294 assertThat(params.getDeliveryIntents()).isNull(); 295 assertThat(params.getMessageId()).isEqualTo(12312L); 296 } 297 298 @Test 299 @Config(minSdk = R) shouldGiveSmscAddress()300 public void shouldGiveSmscAddress() { 301 shadowOf(smsManager).setSmscAddress("123-244-2222"); 302 assertThat(smsManager.getSmscAddress()).isEqualTo("123-244-2222"); 303 } 304 305 @Test 306 @Config(minSdk = R) getSmscAddress_shouldThrowSecurityExceptionWhenReadPhoneStatePermissionNotGranted()307 public void getSmscAddress_shouldThrowSecurityExceptionWhenReadPhoneStatePermissionNotGranted() 308 throws Exception { 309 shadowOf(smsManager).setSmscAddressPermission(false); 310 assertThrows(SecurityException.class, () -> smsManager.getSmscAddress()); 311 } 312 313 @Test 314 @Config(minSdk = R) shouldGiveDefaultSmsSubscriptionId()315 public void shouldGiveDefaultSmsSubscriptionId() { 316 ShadowSmsManager.setDefaultSmsSubscriptionId(3); 317 assertThat(ShadowSmsManager.getDefaultSmsSubscriptionId()).isEqualTo(3); 318 } 319 } 320