1 /*
2  * Copyright (C) 2024 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.settings.network.telephony.wificalling
18 
19 import android.content.Context
20 import android.telephony.AccessNetworkConstants
21 import android.telephony.CarrierConfigManager
22 import android.telephony.CarrierConfigManager.KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL
23 import android.telephony.TelephonyManager
24 import android.telephony.ims.ImsMmTelManager
25 import android.telephony.ims.feature.MmTelFeature
26 import androidx.core.os.persistableBundleOf
27 import androidx.test.core.app.ApplicationProvider
28 import androidx.test.ext.junit.runners.AndroidJUnit4
29 import com.android.settings.network.telephony.ims.ImsMmTelRepository
30 import com.google.common.truth.Truth.assertThat
31 import kotlinx.coroutines.runBlocking
32 import org.junit.Test
33 import org.junit.runner.RunWith
34 import org.mockito.kotlin.any
35 import org.mockito.kotlin.doReturn
36 import org.mockito.kotlin.mock
37 import org.mockito.kotlin.spy
38 import org.mockito.kotlin.stub
39 
40 @RunWith(AndroidJUnit4::class)
41 class WifiCallingRepositoryTest {
42 
<lambda>null43     private val mockTelephonyManager = mock<TelephonyManager> {
44         on { createForSubscriptionId(SUB_ID) } doReturn mock
45     }
46 
47     private val mockCarrierConfigManager = mock<CarrierConfigManager>()
48 
<lambda>null49     private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
50         on { getSystemService(TelephonyManager::class.java) } doReturn mockTelephonyManager
51         on { getSystemService(CarrierConfigManager::class.java) } doReturn mockCarrierConfigManager
52     }
53 
<lambda>null54     private val mockImsMmTelRepository = mock<ImsMmTelRepository> {
55         on { getWiFiCallingMode(any()) } doReturn ImsMmTelManager.WIFI_MODE_UNKNOWN
56     }
57 
58     private val repository =
59         WifiCallingRepository(context, SUB_ID, imsMmTelRepository = mockImsMmTelRepository)
60 
61     @Test
getWiFiCallingMode_roamingAndNotUseWfcHomeModeForRoaming_returnRoamingSettingnull62     fun getWiFiCallingMode_roamingAndNotUseWfcHomeModeForRoaming_returnRoamingSetting() {
63         mockTelephonyManager.stub {
64             on { isNetworkRoaming } doReturn true
65         }
66         mockUseWfcHomeModeForRoaming(false)
67         mockImsMmTelRepository.stub {
68             on { getWiFiCallingMode(true) } doReturn ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED
69         }
70 
71         val wiFiCallingMode = repository.getWiFiCallingMode()
72 
73         assertThat(wiFiCallingMode).isEqualTo(ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED)
74     }
75 
76     @Test
getWiFiCallingMode_roamingAndUseWfcHomeModeForRoaming_returnHomeSettingnull77     fun getWiFiCallingMode_roamingAndUseWfcHomeModeForRoaming_returnHomeSetting() {
78         mockTelephonyManager.stub {
79             on { isNetworkRoaming } doReturn true
80         }
81         mockUseWfcHomeModeForRoaming(true)
82         mockImsMmTelRepository.stub {
83             on { getWiFiCallingMode(false) } doReturn ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED
84         }
85 
86         val wiFiCallingMode = repository.getWiFiCallingMode()
87 
88         assertThat(wiFiCallingMode).isEqualTo(ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED)
89     }
90 
91     @Test
getWiFiCallingMode_notRoaming_returnHomeSettingnull92     fun getWiFiCallingMode_notRoaming_returnHomeSetting() {
93         mockTelephonyManager.stub {
94             on { isNetworkRoaming } doReturn false
95         }
96         mockImsMmTelRepository.stub {
97             on { getWiFiCallingMode(false) } doReturn ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED
98         }
99 
100         val wiFiCallingMode = repository.getWiFiCallingMode()
101 
102         assertThat(wiFiCallingMode).isEqualTo(ImsMmTelManager.WIFI_MODE_WIFI_PREFERRED)
103     }
104 
mockUseWfcHomeModeForRoamingnull105     private fun mockUseWfcHomeModeForRoaming(config: Boolean) {
106         mockCarrierConfigManager.stub {
107             on {
108                 getConfigForSubId(SUB_ID, KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL)
109             } doReturn persistableBundleOf(
110                 KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL to config,
111             )
112         }
113     }
114 
115     private companion object {
116         const val SUB_ID = 1
117     }
118 }
119