blob: fc62d2af841e01999baaefc9d9b01828910a763e [file] [log] [blame]
Hugo Benichi50a84c62016-09-02 09:00:59 +09001/*
2 * Copyright (C) 2016 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
17package com.android.server.connectivity;
18
19import android.net.ConnectivityMetricsEvent;
20import android.net.metrics.ApfProgramEvent;
21import android.net.metrics.ApfStats;
22import android.net.metrics.DefaultNetworkEvent;
23import android.net.metrics.DhcpClientEvent;
24import android.net.metrics.DhcpErrorEvent;
25import android.net.metrics.DnsEvent;
26import android.net.metrics.IpManagerEvent;
27import android.net.metrics.IpReachabilityEvent;
28import android.net.metrics.NetworkEvent;
29import android.net.metrics.RaEvent;
30import android.net.metrics.ValidationProbeEvent;
31import com.google.protobuf.nano.MessageNano;
32import java.util.Arrays;
33import junit.framework.TestCase;
34
Tamas Berghammercbd3f0c2016-06-22 15:21:38 +010035import static com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityLog;
Hugo Benichi50a84c62016-09-02 09:00:59 +090036import static com.android.server.connectivity.MetricsTestUtil.aBool;
37import static com.android.server.connectivity.MetricsTestUtil.aByteArray;
38import static com.android.server.connectivity.MetricsTestUtil.aLong;
39import static com.android.server.connectivity.MetricsTestUtil.aString;
40import static com.android.server.connectivity.MetricsTestUtil.aType;
41import static com.android.server.connectivity.MetricsTestUtil.anInt;
42import static com.android.server.connectivity.MetricsTestUtil.anIntArray;
43import static com.android.server.connectivity.MetricsTestUtil.b;
44import static com.android.server.connectivity.MetricsTestUtil.describeIpEvent;
45import static com.android.server.connectivity.MetricsTestUtil.ipEv;
46
47public class IpConnectivityEventBuilderTest extends TestCase {
48
49 public void testDefaultNetworkEventSerialization() {
50 ConnectivityMetricsEvent ev = describeIpEvent(
51 aType(DefaultNetworkEvent.class),
52 anInt(102),
53 anIntArray(1, 2, 3),
54 anInt(101),
55 aBool(true),
56 aBool(false));
57
58 String want = joinLines(
59 "dropped_events: 0",
60 "events <",
61 " default_network_event <",
62 " network_id <",
63 " network_id: 102",
64 " >",
65 " previous_network_id <",
66 " network_id: 101",
67 " >",
68 " previous_network_ip_support: 1",
69 " transport_types: 1",
70 " transport_types: 2",
71 " transport_types: 3",
72 " >",
73 " time_ms: 1",
74 ">");
75
76 verifySerialization(want, ev);
77 }
78
79 public void testDhcpClientEventSerialization() {
80 ConnectivityMetricsEvent ev = describeIpEvent(
81 aType(DhcpClientEvent.class),
82 aString("wlan0"),
83 aString("SomeState"),
84 anInt(192));
85
86 String want = joinLines(
87 "dropped_events: 0",
88 "events <",
89 " dhcp_event <",
90 " duration_ms: 192",
91 " error_code: 0",
92 " if_name: \"wlan0\"",
93 " state_transition: \"SomeState\"",
94 " >",
95 " time_ms: 1",
96 ">");
97
98 verifySerialization(want, ev);
99 }
100
101 public void testDhcpErrorEventSerialization() {
102 ConnectivityMetricsEvent ev = describeIpEvent(
103 aType(DhcpErrorEvent.class),
104 aString("wlan0"),
105 anInt(DhcpErrorEvent.L4_NOT_UDP));
106
107 String want = joinLines(
108 "dropped_events: 0",
109 "events <",
110 " dhcp_event <",
111 " duration_ms: 0",
112 " error_code: 50397184",
113 " if_name: \"wlan0\"",
114 " state_transition: \"\"",
115 " >",
116 " time_ms: 1",
117 ">");
118
119 verifySerialization(want, ev);
120 }
121
122 public void testDnsEventSerialization() {
123 ConnectivityMetricsEvent ev = describeIpEvent(
124 aType(DnsEvent.class),
125 anInt(101),
126 aByteArray(b(1), b(1), b(2), b(1), b(1), b(1), b(2), b(2)),
127 aByteArray(b(0), b(0), b(22), b(3), b(1), b(0), b(200), b(178)),
128 anIntArray(3456, 267, 1230, 45, 2111, 450, 638, 1300));
129
130 String want = joinLines(
131 "dropped_events: 0",
132 "events <",
133 " dns_lookup_batch <",
134 " event_types: 1",
135 " event_types: 1",
136 " event_types: 2",
137 " event_types: 1",
138 " event_types: 1",
139 " event_types: 1",
140 " event_types: 2",
141 " event_types: 2",
142 " latencies_ms: 3456",
143 " latencies_ms: 267",
144 " latencies_ms: 1230",
145 " latencies_ms: 45",
146 " latencies_ms: 2111",
147 " latencies_ms: 450",
148 " latencies_ms: 638",
149 " latencies_ms: 1300",
150 " network_id <",
151 " network_id: 101",
152 " >",
153 " return_codes: 0",
154 " return_codes: 0",
155 " return_codes: 22",
156 " return_codes: 3",
157 " return_codes: 1",
158 " return_codes: 0",
159 " return_codes: 200",
160 " return_codes: 178",
161 " >",
162 " time_ms: 1",
163 ">");
164
165 verifySerialization(want, ev);
166 }
167
168 public void testIpManagerEventSerialization() {
169 ConnectivityMetricsEvent ev = describeIpEvent(
170 aType(IpManagerEvent.class),
171 aString("wlan0"),
172 anInt(IpManagerEvent.PROVISIONING_OK),
173 aLong(5678));
174
175 String want = joinLines(
176 "dropped_events: 0",
177 "events <",
178 " ip_provisioning_event <",
179 " event_type: 1",
180 " if_name: \"wlan0\"",
181 " latency_ms: 5678",
182 " >",
183 " time_ms: 1",
184 ">");
185
186 verifySerialization(want, ev);
187 }
188
189 public void testIpReachabilityEventSerialization() {
190 ConnectivityMetricsEvent ev = describeIpEvent(
191 aType(IpReachabilityEvent.class),
192 aString("wlan0"),
193 anInt(IpReachabilityEvent.NUD_FAILED));
194
195 String want = joinLines(
196 "dropped_events: 0",
197 "events <",
198 " ip_reachability_event <",
199 " event_type: 512",
200 " if_name: \"wlan0\"",
201 " >",
202 " time_ms: 1",
203 ">");
204
205 verifySerialization(want, ev);
206 }
207
208 public void testNetworkEventSerialization() {
209 ConnectivityMetricsEvent ev = describeIpEvent(
210 aType(NetworkEvent.class),
211 anInt(100),
212 anInt(5),
213 aLong(20410));
214
215 String want = joinLines(
216 "dropped_events: 0",
217 "events <",
218 " network_event <",
219 " event_type: 5",
220 " latency_ms: 20410",
221 " network_id <",
222 " network_id: 100",
223 " >",
224 " >",
225 " time_ms: 1",
226 ">");
227
228 verifySerialization(want, ev);
229 }
230
231 public void testValidationProbeEventSerialization() {
232 ConnectivityMetricsEvent ev = describeIpEvent(
233 aType(ValidationProbeEvent.class),
234 anInt(120),
235 aLong(40730),
236 anInt(ValidationProbeEvent.PROBE_HTTP),
237 anInt(204));
238
239 String want = joinLines(
240 "dropped_events: 0",
241 "events <",
242 " time_ms: 1",
243 " validation_probe_event <",
244 " latency_ms: 40730",
245 " network_id <",
246 " network_id: 120",
247 " >",
248 " probe_result: 204",
249 " probe_type: 1",
250 " >",
251 ">");
252
253 verifySerialization(want, ev);
254 }
255
256 public void testApfProgramEventSerialization() {
257 ConnectivityMetricsEvent ev = describeIpEvent(
258 aType(ApfProgramEvent.class),
259 aLong(200),
260 anInt(7),
261 anInt(9),
262 anInt(2048),
263 anInt(3));
264
265 String want = joinLines(
266 "dropped_events: 0",
267 "events <",
268 " apf_program_event <",
269 " current_ras: 9",
270 " drop_multicast: true",
271 " filtered_ras: 7",
272 " has_ipv4_addr: true",
273 " lifetime: 200",
274 " program_length: 2048",
275 " >",
276 " time_ms: 1",
277 ">");
278
279 verifySerialization(want, ev);
280 }
281
282 public void testApfStatsSerialization() {
283 ConnectivityMetricsEvent ev = describeIpEvent(
284 aType(ApfStats.class),
285 aLong(45000),
286 anInt(10),
287 anInt(2),
288 anInt(2),
289 anInt(1),
290 anInt(2),
291 anInt(4),
292 anInt(2048));
293
294 String want = joinLines(
295 "dropped_events: 0",
296 "events <",
297 " apf_statistics <",
298 " dropped_ras: 2",
299 " duration_ms: 45000",
300 " matching_ras: 2",
301 " max_program_size: 2048",
302 " parse_errors: 2",
303 " program_updates: 4",
304 " received_ras: 10",
305 " zero_lifetime_ras: 1",
306 " >",
307 " time_ms: 1",
308 ">");
309
310 verifySerialization(want, ev);
311 }
312
313 public void testRaEventSerialization() {
314 ConnectivityMetricsEvent ev = describeIpEvent(
315 aType(RaEvent.class),
316 aLong(2000),
317 aLong(400),
318 aLong(300),
319 aLong(-1),
320 aLong(1000),
321 aLong(-1));
322
323 String want = joinLines(
324 "dropped_events: 0",
325 "events <",
326 " ra_event <",
327 " dnssl_lifetime: -1",
328 " prefix_preferred_lifetime: 300",
329 " prefix_valid_lifetime: 400",
330 " rdnss_lifetime: 1000",
331 " route_info_lifetime: -1",
332 " router_lifetime: 2000",
333 " >",
334 " time_ms: 1",
335 ">");
336
337 verifySerialization(want, ev);
338 }
339
340 static void verifySerialization(String want, ConnectivityMetricsEvent... input) {
341 try {
342 byte[] got = IpConnectivityEventBuilder.serialize(0, Arrays.asList(input));
343 IpConnectivityLog log = new IpConnectivityLog();
344 MessageNano.mergeFrom(log, got);
345 assertEquals(want, log.toString());
346 } catch (Exception e) {
347 fail(e.toString());
348 }
349 }
350
351 static String joinLines(String ... elems) {
352 StringBuilder b = new StringBuilder();
353 for (String s : elems) {
354 b.append(s);
355 b.append("\n");
356 }
357 return b.toString();
358 }
359}