Fixed file descriptor leak in telephony unit tests
[android/platform/frameworks/opt/telephony.git] / tests / telephonytests / src / com / android / internal / telephony / gsm / GsmSmsDispatcherTest.java
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.android.internal.telephony.gsm;
18
19 import static org.junit.Assert.assertEquals;
20 import static org.mockito.Matchers.any;
21 import static org.mockito.Matchers.anyString;
22 import static org.mockito.Mockito.verify;
23 import static org.mockito.Mockito.when;
24
25 import android.content.Context;
26 import android.location.Country;
27 import android.location.CountryDetector;
28 import android.os.HandlerThread;
29 import android.os.Message;
30 import android.os.SystemProperties;
31 import android.provider.Telephony;
32 import android.support.test.filters.FlakyTest;
33 import android.test.suitebuilder.annotation.MediumTest;
34 import android.test.suitebuilder.annotation.SmallTest;
35
36 import com.android.internal.telephony.ISub;
37 import com.android.internal.telephony.ImsSMSDispatcher;
38 import com.android.internal.telephony.TelephonyTest;
39 import com.android.internal.telephony.TelephonyTestUtils;
40
41 import org.junit.After;
42 import org.junit.Before;
43 import org.junit.Test;
44 import org.mockito.Mock;
45
46 public class GsmSmsDispatcherTest extends TelephonyTest {
47     @Mock
48     private android.telephony.SmsMessage mSmsMessage;
49     @Mock
50     private SmsMessage mGsmSmsMessage;
51     @Mock
52     private ImsSMSDispatcher mImsSmsDispatcher;
53     @Mock
54     private GsmInboundSmsHandler mGsmInboundSmsHandler;
55     @Mock
56     private CountryDetector mCountryDetector;
57     @Mock
58     private ISub.Stub mISubStub;
59
60     private GsmSMSDispatcher mGsmSmsDispatcher;
61     private GsmSmsDispatcherTestHandler mGsmSmsDispatcherTestHandler;
62
63     private class GsmSmsDispatcherTestHandler extends HandlerThread {
64
65         private GsmSmsDispatcherTestHandler(String name) {
66             super(name);
67         }
68
69         @Override
70         public void onLooperPrepared() {
71             mGsmSmsDispatcher = new GsmSMSDispatcher(mPhone, mSmsUsageMonitor,
72                     mImsSmsDispatcher, mGsmInboundSmsHandler);
73             setReady(true);
74         }
75     }
76
77     @Before
78     public void setUp() throws Exception {
79
80         super.setUp(getClass().getSimpleName());
81
82         // Note that this replaces only cached services in ServiceManager. If a service is not found
83         // in the cache, a real instance is used.
84         mServiceManagerMockedServices.put("isub", mISubStub);
85
86         mGsmSmsDispatcherTestHandler = new GsmSmsDispatcherTestHandler(getClass().getSimpleName());
87         mGsmSmsDispatcherTestHandler.start();
88         waitUntilReady();
89     }
90
91     @After
92     public void tearDown() throws Exception {
93         mGsmSmsDispatcher = null;
94         mGsmSmsDispatcherTestHandler.quit();
95         super.tearDown();
96     }
97
98     @Test @SmallTest
99     public void testSmsStatus() {
100         mSimulatedCommands.notifySmsStatus(new byte[]{(byte)0xFF, (byte)0xFF, (byte)0xFF});
101         TelephonyTestUtils.waitForMs(50);
102         verify(mSimulatedCommandsVerifier).acknowledgeLastIncomingGsmSms(true,
103                 Telephony.Sms.Intents.RESULT_SMS_HANDLED, null);
104     }
105
106     @Test @MediumTest
107     public void testSendSmsToRegularNumber_doesNotNotifyblockedNumberProvider() throws Exception {
108         setupMockPackagePermissionChecks();
109
110         mContextFixture.setSystemService(Context.COUNTRY_DETECTOR, mCountryDetector);
111         when(mCountryDetector.detectCountry())
112                 .thenReturn(new Country("US", Country.COUNTRY_SOURCE_SIM));
113
114         mGsmSmsDispatcher.sendText(
115                 "6501002000", "121" /*scAddr*/, "test sms", null, null, null, null, false);
116
117         verify(mSimulatedCommandsVerifier).sendSMS(anyString(), anyString(), any(Message.class));
118         // Blocked number provider is notified about the emergency contact asynchronously.
119         TelephonyTestUtils.waitForMs(50);
120         assertEquals(0, mFakeBlockedNumberContentProvider.mNumEmergencyContactNotifications);
121     }
122
123     @FlakyTest
124     @Test @MediumTest
125     public void testSendSmsToEmergencyNumber_notifiesBlockedNumberProvider() throws Exception {
126         setupMockPackagePermissionChecks();
127
128         mContextFixture.setSystemService(Context.COUNTRY_DETECTOR, mCountryDetector);
129         when(mCountryDetector.detectCountry())
130                 .thenReturn(new Country("US", Country.COUNTRY_SOURCE_SIM));
131
132         mGsmSmsDispatcher.sendText(
133                 getEmergencyNumberFromSystemPropertiesOrDefault(), "121" /*scAddr*/, "test sms",
134                 null, null, null, null, false);
135
136         verify(mSimulatedCommandsVerifier).sendSMS(anyString(), anyString(), any(Message.class));
137         // Blocked number provider is notified about the emergency contact asynchronously.
138         TelephonyTestUtils.waitForMs(50);
139         assertEquals(1, mFakeBlockedNumberContentProvider.mNumEmergencyContactNotifications);
140     }
141
142     private String getEmergencyNumberFromSystemPropertiesOrDefault() {
143         String systemEmergencyNumbers = SystemProperties.get("ril.ecclist");
144         if (systemEmergencyNumbers == null) {
145             return "911";
146         } else {
147             return systemEmergencyNumbers.split(",")[0];
148         }
149     }
150 }