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.net.LocalNetworkConfig
20 import android.net.NetworkCapabilities
21 import android.net.NetworkCapabilities.NET_CAPABILITY_LOCAL_NETWORK
22 import android.net.NetworkCapabilities.TRANSPORT_WIFI
23 import android.net.NetworkRequest
24 import android.net.NetworkScore
25 import android.net.NetworkScore.KEEP_CONNECTED_FOR_TEST
26 import android.net.NetworkScore.KEEP_CONNECTED_LOCAL_NETWORK
27 import android.os.Build
28 import androidx.test.filters.SmallTest
29 import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
30 import com.android.testutils.DevSdkIgnoreRunner
31 import com.android.testutils.RecorderCallback.CallbackEntry.Lost
32 import com.android.testutils.TestableNetworkCallback
33 import org.junit.Test
34 import org.junit.runner.RunWith
35 
36 @DevSdkIgnoreRunner.MonitorThreadLeak
37 @RunWith(DevSdkIgnoreRunner::class)
38 @SmallTest
39 @IgnoreUpTo(Build.VERSION_CODES.TIRAMISU)
40 class CSKeepConnectedTest : CSTest() {
41     @Test
testKeepConnectedLocalAgentnull42     fun testKeepConnectedLocalAgent() {
43         deps.setBuildSdk(VERSION_V)
44         val nc = NetworkCapabilities.Builder()
45                 .addTransportType(TRANSPORT_WIFI)
46                 .addCapability(NET_CAPABILITY_LOCAL_NETWORK)
47                 .build()
48         val keepConnectedAgent = Agent(nc = nc, score = FromS(NetworkScore.Builder()
49                 .setKeepConnectedReason(KEEP_CONNECTED_LOCAL_NETWORK)
50                 .build()),
51                 lnc = FromS(LocalNetworkConfig.Builder().build()))
52         val dontKeepConnectedAgent = Agent(nc = nc,
53                 lnc = FromS(LocalNetworkConfig.Builder().build()))
54         doTestKeepConnected(keepConnectedAgent, dontKeepConnectedAgent)
55     }
56 
57     @Test
testKeepConnectedForTestnull58     fun testKeepConnectedForTest() {
59         val keepAgent = Agent(score = FromS(NetworkScore.Builder()
60                 .setKeepConnectedReason(KEEP_CONNECTED_FOR_TEST)
61                 .build()))
62         val dontKeepAgent = Agent()
63         doTestKeepConnected(keepAgent, dontKeepAgent)
64     }
65 
doTestKeepConnectednull66     fun doTestKeepConnected(keepAgent: CSAgentWrapper, dontKeepAgent: CSAgentWrapper) {
67         val cb = TestableNetworkCallback()
68         cm.registerNetworkCallback(NetworkRequest.Builder().clearCapabilities().build(), cb)
69 
70         keepAgent.connect()
71         dontKeepAgent.connect()
72 
73         cb.expectAvailableCallbacks(keepAgent.network, validated = false)
74         cb.expectAvailableCallbacks(dontKeepAgent.network, validated = false)
75 
76         // After the nascent timer, the agent without keep connected gets lost.
77         cb.expect<Lost>(dontKeepAgent.network)
78         cb.assertNoCallback()
79     }
80 }
81