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