1 /*
2  * Copyright (C) 2022 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.systemui.statusbar.connectivity.ui
18 
19 import android.telephony.SubscriptionInfo
20 import androidx.test.filters.SmallTest
21 import com.android.systemui.SysuiTestCase
22 import com.android.systemui.demomode.DemoModeController
23 import com.android.systemui.dump.DumpManager
24 import com.android.systemui.statusbar.connectivity.NetworkController
25 import com.android.systemui.statusbar.connectivity.SignalCallback
26 import com.android.systemui.util.mockito.mock
27 import com.android.systemui.util.mockito.withArgCaptor
28 import com.google.common.truth.Truth.assertThat
29 import org.junit.Before
30 import org.junit.Test
31 import org.mockito.Mock
32 import org.mockito.Mockito.verify
33 import org.mockito.Mockito.`when` as whenever
34 import org.mockito.MockitoAnnotations
35 
36 @SmallTest
37 class MobileContextProviderTest : SysuiTestCase() {
38     @Mock private lateinit var networkController: NetworkController
39     @Mock private lateinit var dumpManager: DumpManager
40     @Mock private lateinit var demoModeController: DemoModeController
41 
42     private lateinit var provider: MobileContextProvider
43     private lateinit var signalCallback: SignalCallback
44 
45     @Before
46     fun setup() {
47         MockitoAnnotations.initMocks(this)
48         provider =
49             MobileContextProvider(
50                 networkController,
51                 dumpManager,
52                 demoModeController,
53             )
54 
55         signalCallback = withArgCaptor { verify(networkController).addCallback(capture()) }
56     }
57 
58     @Test
59     fun test_oneSubscription_contextHasMccMnc() {
60         // GIVEN there is one SubscriptionInfo
61         signalCallback.setSubs(listOf(SUB_1))
62 
63         // WHEN we ask for a mobile context
64         val ctx = provider.getMobileContextForSub(SUB_1_ID, context)
65 
66         // THEN the configuration of that context reflect this subscription's MCC/MNC override
67         val config = ctx.resources.configuration
68         assertThat(config.mcc).isEqualTo(SUB_1_MCC)
69         assertThat(config.mnc).isEqualTo(SUB_1_MNC)
70     }
71 
72     @Test
73     fun test_twoSubscriptions_eachContextReflectsMccMnc() {
74         // GIVEN there are two SubscriptionInfos
75         signalCallback.setSubs(listOf(SUB_1, SUB_2))
76 
77         // WHEN we ask for a mobile context for each sub
78         val ctx1 = provider.getMobileContextForSub(SUB_1_ID, context)
79         val ctx2 = provider.getMobileContextForSub(SUB_2_ID, context)
80 
81         // THEN the configuration of each context reflect this subscription's MCC/MNC override
82         val config1 = ctx1.resources.configuration
83         assertThat(config1.mcc).isEqualTo(SUB_1_MCC)
84         assertThat(config1.mnc).isEqualTo(SUB_1_MNC)
85 
86         val config2 = ctx2.resources.configuration
87         assertThat(config2.mcc).isEqualTo(SUB_2_MCC)
88         assertThat(config2.mnc).isEqualTo(SUB_2_MNC)
89     }
90 
91     @Test
92     fun test_requestingContextForNonexistentSubscription_returnsGivenContext() {
93         // GIVEN no SubscriptionInfos
94         signalCallback.setSubs(listOf())
95 
96         // WHEN we ask for a mobile context for an unknown subscription
97         val ctx = provider.getMobileContextForSub(SUB_1_ID, context)
98 
99         // THEN we get the original context back
100         assertThat(ctx).isEqualTo(context)
101     }
102 
103     private val SUB_1_ID = 1
104     private val SUB_1_MCC = 123
105     private val SUB_1_MNC = 456
106     private val SUB_1 =
107         mock<SubscriptionInfo>().also {
108             whenever(it.subscriptionId).thenReturn(SUB_1_ID)
109             whenever(it.mcc).thenReturn(SUB_1_MCC)
110             whenever(it.mnc).thenReturn(SUB_1_MNC)
111         }
112 
113     private val SUB_2_ID = 2
114     private val SUB_2_MCC = 666
115     private val SUB_2_MNC = 777
116     private val SUB_2 =
117         mock<SubscriptionInfo>().also {
118             whenever(it.subscriptionId).thenReturn(SUB_2_ID)
119             whenever(it.mcc).thenReturn(SUB_2_MCC)
120             whenever(it.mnc).thenReturn(SUB_2_MNC)
121         }
122 }
123