• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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