• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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.server
18 
19 import android.content.Intent
20 import android.net.ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED
21 import android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED
22 import android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED
23 import android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_WHITELISTED
24 import android.os.Build
25 import androidx.test.filters.SmallTest
26 import com.android.testutils.DevSdkIgnoreRule
27 import com.android.testutils.DevSdkIgnoreRule.IgnoreAfter
28 import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
29 import com.android.testutils.DevSdkIgnoreRunner
30 import com.android.testutils.visibleOnHandlerThread
31 import org.junit.Rule
32 import org.junit.Test
33 import org.junit.runner.RunWith
34 import org.mockito.ArgumentMatchers.anyBoolean
35 import org.mockito.ArgumentMatchers.anyInt
36 import org.mockito.Mockito.doReturn
37 import org.mockito.Mockito.inOrder
38 import org.mockito.Mockito.never
39 import org.mockito.Mockito.verify
40 
41 @DevSdkIgnoreRunner.MonitorThreadLeak
42 @RunWith(DevSdkIgnoreRunner::class)
43 @SmallTest
44 @IgnoreUpTo(Build.VERSION_CODES.S_V2) // Bpf only supports in T+.
45 class CSBpfNetMapsTest : CSTest() {
46     @get:Rule
47     val ignoreRule = DevSdkIgnoreRule()
48 
49     @IgnoreAfter(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
50     @Test
testCSTrackDataSaverBeforeVnull51     fun testCSTrackDataSaverBeforeV() {
52         val inOrder = inOrder(bpfNetMaps)
53         mockDataSaverStatus(RESTRICT_BACKGROUND_STATUS_WHITELISTED)
54         inOrder.verify(bpfNetMaps).setDataSaverEnabled(true)
55         mockDataSaverStatus(RESTRICT_BACKGROUND_STATUS_DISABLED)
56         inOrder.verify(bpfNetMaps).setDataSaverEnabled(false)
57         mockDataSaverStatus(RESTRICT_BACKGROUND_STATUS_ENABLED)
58         inOrder.verify(bpfNetMaps).setDataSaverEnabled(true)
59     }
60 
61     // Data Saver Status is updated from platform code in V+.
62     @IgnoreUpTo(Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
63     @Test
testCSTrackDataSaverAboveUnull64     fun testCSTrackDataSaverAboveU() {
65         listOf(RESTRICT_BACKGROUND_STATUS_WHITELISTED, RESTRICT_BACKGROUND_STATUS_ENABLED,
66             RESTRICT_BACKGROUND_STATUS_DISABLED).forEach {
67             mockDataSaverStatus(it)
68             verify(bpfNetMaps, never()).setDataSaverEnabled(anyBoolean())
69         }
70     }
71 
mockDataSaverStatusnull72     private fun mockDataSaverStatus(status: Int) {
73         doReturn(status).`when`(context.networkPolicyManager).getRestrictBackgroundStatus(anyInt())
74         // While the production code dispatches the intent on the handler thread,
75         // The test would dispatch the intent in the caller thread. Make it dispatch
76         // on the handler thread to match production behavior.
77         visibleOnHandlerThread(csHandler) {
78             context.sendBroadcast(Intent(ACTION_RESTRICT_BACKGROUND_CHANGED))
79         }
80         waitForIdle()
81     }
82 }
83