1 /*
2  * Copyright 2021 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.internal.telephony.data;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.Mockito.doReturn;
22 
23 import android.net.NetworkCapabilities;
24 import android.net.NetworkRequest;
25 
26 import com.android.internal.telephony.TelephonyTest;
27 import com.android.internal.telephony.data.DataNetworkController.NetworkRequestList;
28 import com.android.internal.telephony.flags.FeatureFlags;
29 
30 import org.junit.After;
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.mockito.Mockito;
34 
35 import java.util.List;
36 
37 public class DataUtilsTest extends TelephonyTest {
38 
39     private FeatureFlags mFeatureFlags;
40 
41     @Before
setUp()42     public void setUp() throws Exception {
43         logd("DataUtilsTest +Setup!");
44         super.setUp(getClass().getSimpleName());
45         mFeatureFlags = Mockito.mock(FeatureFlags.class);
46         doReturn(true).when(mFeatureFlags).satelliteInternet();
47         logd("DataUtilsTest -Setup!");
48     }
49 
50     @After
tearDown()51     public void tearDown() throws Exception {
52         super.tearDown();
53     }
54 
55     @Test
testGetGroupedNetworkRequestList()56     public void testGetGroupedNetworkRequestList() {
57         NetworkRequestList requestList = new NetworkRequestList();
58 
59         int[] netCaps = new int[]{
60                 NetworkCapabilities.NET_CAPABILITY_INTERNET,
61                 NetworkCapabilities.NET_CAPABILITY_INTERNET,
62                 NetworkCapabilities.NET_CAPABILITY_MMS,
63                 NetworkCapabilities.NET_CAPABILITY_MMS,
64                 NetworkCapabilities.NET_CAPABILITY_EIMS,
65                 NetworkCapabilities.NET_CAPABILITY_ENTERPRISE,
66                 NetworkCapabilities.NET_CAPABILITY_ENTERPRISE,
67                 NetworkCapabilities.NET_CAPABILITY_ENTERPRISE,
68                 NetworkCapabilities.NET_CAPABILITY_IMS,
69                 NetworkCapabilities.NET_CAPABILITY_IMS,
70         };
71 
72         int requestId = 0;
73         int enterpriseId = 1;
74         int transportType = NetworkCapabilities.TRANSPORT_CELLULAR;
75         TelephonyNetworkRequest networkRequest;
76         for (int netCap : netCaps) {
77             if (netCap == NetworkCapabilities.NET_CAPABILITY_ENTERPRISE) {
78                 networkRequest = new TelephonyNetworkRequest(new NetworkRequest(
79                         new NetworkCapabilities.Builder()
80                                 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
81                                 .addCapability(NetworkCapabilities.NET_CAPABILITY_ENTERPRISE)
82                                 .addEnterpriseId(enterpriseId).build(), -1, requestId++,
83                         NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags);
84                 if (enterpriseId == 1) enterpriseId++;
85             } else if (netCap == NetworkCapabilities.NET_CAPABILITY_IMS) {
86                 networkRequest = new TelephonyNetworkRequest(new NetworkRequest(
87                         new NetworkCapabilities.Builder()
88                                 .addTransportType(transportType)
89                                 .addCapability(netCap).build(), -1, requestId++,
90                         NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags);
91                 transportType = NetworkCapabilities.TRANSPORT_SATELLITE;
92             } else {
93                 networkRequest = new TelephonyNetworkRequest(new NetworkRequest(
94                         new NetworkCapabilities.Builder()
95                                 .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
96                                 .addCapability(netCap).build(), -1, requestId++,
97                         NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags);
98             }
99             requestList.add(networkRequest);
100         }
101 
102         assertThat(requestList).hasSize(10);
103 
104         List<NetworkRequestList> requestListList =
105                 DataUtils.getGroupedNetworkRequestList(requestList, mFeatureFlags);
106 
107         assertThat(requestListList).hasSize(7);
108         requestList = requestListList.get(0);
109         assertThat(requestList).hasSize(1);
110         assertThat(requestList.get(0).hasCapability(
111                 NetworkCapabilities.NET_CAPABILITY_EIMS)).isTrue();
112 
113         requestList = requestListList.get(1);
114         assertThat(requestList).hasSize(2);
115         assertThat(requestList.get(0).hasCapability(
116                 NetworkCapabilities.NET_CAPABILITY_MMS)).isTrue();
117         assertThat(requestList.get(1).hasCapability(
118                 NetworkCapabilities.NET_CAPABILITY_MMS)).isTrue();
119 
120         requestList = requestListList.get(2);
121         assertThat(requestList).hasSize(1);
122         assertThat(requestList.get(0).hasCapability(
123                 NetworkCapabilities.NET_CAPABILITY_IMS)).isTrue();
124         assertThat(requestList.get(0).getNativeNetworkRequest().hasTransport(
125                 NetworkCapabilities.TRANSPORT_CELLULAR)).isTrue();
126 
127         requestList = requestListList.get(3);
128         assertThat(requestList).hasSize(1);
129         assertThat(requestList.get(0).hasCapability(
130                 NetworkCapabilities.NET_CAPABILITY_IMS)).isTrue();
131         assertThat(requestList.get(0).getNativeNetworkRequest().hasTransport(
132                 NetworkCapabilities.TRANSPORT_SATELLITE)).isTrue();
133 
134         requestList = requestListList.get(4);
135         assertThat(requestList).hasSize(2);
136         assertThat(requestList.get(0).hasCapability(
137                 NetworkCapabilities.NET_CAPABILITY_INTERNET)).isTrue();
138         assertThat(requestList.get(1).hasCapability(
139                 NetworkCapabilities.NET_CAPABILITY_INTERNET)).isTrue();
140 
141         requestList = requestListList.get(5);
142         assertThat(requestList).hasSize(1);
143         assertThat(requestList.get(0).hasCapability(
144                 NetworkCapabilities.NET_CAPABILITY_ENTERPRISE)).isTrue();
145         assertThat(requestList.get(0).getCapabilityDifferentiator()).isEqualTo(1);
146 
147         requestList = requestListList.get(6);
148         assertThat(requestList).hasSize(2);
149         assertThat(requestList.get(0).hasCapability(
150                 NetworkCapabilities.NET_CAPABILITY_ENTERPRISE)).isTrue();
151         assertThat(requestList.get(0).getCapabilityDifferentiator()).isEqualTo(2);
152         assertThat(requestList.get(1).hasCapability(
153                 NetworkCapabilities.NET_CAPABILITY_ENTERPRISE)).isTrue();
154         assertThat(requestList.get(1).getCapabilityDifferentiator()).isEqualTo(2);
155     }
156 
157     @Test
testGetNetworkCapabilitiesFromString()158     public void testGetNetworkCapabilitiesFromString() {
159         String normal = " MMS  ";
160         assertThat(DataUtils.getNetworkCapabilitiesFromString(normal)).containsExactly(
161                 NetworkCapabilities.NET_CAPABILITY_MMS);
162         String normal2 = "MMS|IMS";
163         assertThat(DataUtils.getNetworkCapabilitiesFromString(normal2)).containsExactly(
164                 NetworkCapabilities.NET_CAPABILITY_MMS, NetworkCapabilities.NET_CAPABILITY_IMS);
165         String normal3 = " MMS |IMS ";
166         assertThat(DataUtils.getNetworkCapabilitiesFromString(normal3)).containsExactly(
167                 NetworkCapabilities.NET_CAPABILITY_MMS, NetworkCapabilities.NET_CAPABILITY_IMS);
168 
169         String containsUnknown = "MMS |IMS | what";
170         assertThat(DataUtils.getNetworkCapabilitiesFromString(containsUnknown)
171                 .contains(-1)).isTrue();
172 
173         String malFormatted = "";
174         assertThat(DataUtils.getNetworkCapabilitiesFromString(malFormatted).contains(-1)).isTrue();
175         String malFormatted2 = " ";
176         assertThat(DataUtils.getNetworkCapabilitiesFromString(malFormatted2).contains(-1)).isTrue();
177         String malFormatted3 = "MMS |IMS |";
178         assertThat(DataUtils.getNetworkCapabilitiesFromString(malFormatted3).contains(-1)).isTrue();
179         String composedDelim = " | ||";
180         assertThat(DataUtils.getNetworkCapabilitiesFromString(composedDelim).contains(-1)).isTrue();
181         String malFormatted4 = "mms||ims";
182         assertThat(DataUtils.getNetworkCapabilitiesFromString(malFormatted4).contains(-1)).isTrue();
183     }
184 
185 }
186