1/*
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.internal.telephony.metrics;
18
19import android.telephony.ServiceState;
20import android.test.suitebuilder.annotation.SmallTest;
21import android.util.Base64;
22
23import com.android.ims.ImsConfig;
24import com.android.ims.ImsReasonInfo;
25import com.android.ims.internal.ImsCallSession;
26import com.android.internal.telephony.Call;
27import com.android.internal.telephony.PhoneConstants;
28import com.android.internal.telephony.SmsResponse;
29import com.android.internal.telephony.TelephonyProto;
30import com.android.internal.telephony.TelephonyProto.ImsConnectionState;
31import com.android.internal.telephony.TelephonyProto.SmsSession;
32import com.android.internal.telephony.TelephonyProto.RadioAccessTechnology;
33import com.android.internal.telephony.TelephonyProto.TelephonyCallSession;
34import com.android.internal.telephony.TelephonyProto.TelephonyCallSession.Event.CallState;
35import com.android.internal.telephony.TelephonyProto.TelephonyCallSession.Event.ImsCommand;
36import com.android.internal.telephony.TelephonyProto.TelephonyEvent;
37import com.android.internal.telephony.TelephonyProto.TelephonyLog;
38import com.android.internal.telephony.TelephonyProto.TelephonyServiceState;
39import com.android.internal.telephony.TelephonyProto.TelephonyServiceState.RoamingType;
40import com.android.internal.telephony.TelephonyTest;
41import com.android.internal.telephony.UUSInfo;
42import com.android.internal.telephony.dataconnection.DataCallResponse;
43
44import org.junit.After;
45import org.junit.Before;
46import org.junit.Test;
47import org.mockito.Mock;
48
49import java.lang.reflect.Method;
50
51import static android.telephony.ServiceState.RIL_RADIO_TECHNOLOGY_LTE;
52import static android.telephony.ServiceState.ROAMING_TYPE_DOMESTIC;
53import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL;
54import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS;
55import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL;
56import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IPV4V6;
57import static org.junit.Assert.assertArrayEquals;
58import static org.junit.Assert.assertEquals;
59import static org.junit.Assert.assertFalse;
60import static org.junit.Assert.assertTrue;
61import static org.mockito.Mockito.doReturn;
62
63public class TelephonyMetricsTest extends TelephonyTest {
64
65    @Mock
66    private ImsCallSession mImsCallSession;
67
68    @Mock
69    private ImsReasonInfo mImsReasonInfo;
70
71    @Mock
72    private ServiceState mServiceState;
73
74    private TelephonyMetrics mMetrics;
75
76    private UUSInfo mUusInfo;
77
78    @Before
79    public void setUp() throws Exception {
80        super.setUp(getClass().getSimpleName());
81        mMetrics = new TelephonyMetrics();
82        mUusInfo = new UUSInfo(1, 2, new byte[]{1, 2});
83        doReturn("123").when(mImsCallSession).getCallId();
84        doReturn("extramessage").when(mImsReasonInfo).getExtraMessage();
85        doReturn(123).when(mImsReasonInfo).getCode();
86        doReturn(456).when(mImsReasonInfo).getExtraCode();
87
88        doReturn(ROAMING_TYPE_DOMESTIC).when(mServiceState).getVoiceRoamingType();
89        doReturn(ROAMING_TYPE_DOMESTIC).when(mServiceState).getDataRoamingType();
90        doReturn("voiceshort").when(mServiceState).getVoiceOperatorAlphaShort();
91        doReturn("voicelong").when(mServiceState).getVoiceOperatorAlphaLong();
92        doReturn("datashort").when(mServiceState).getDataOperatorAlphaShort();
93        doReturn("datalong").when(mServiceState).getDataOperatorAlphaLong();
94        doReturn("123456").when(mServiceState).getVoiceOperatorNumeric();
95        doReturn("123456").when(mServiceState).getDataOperatorNumeric();
96        doReturn(RIL_RADIO_TECHNOLOGY_LTE).when(mServiceState).getRilVoiceRadioTechnology();
97        doReturn(RIL_RADIO_TECHNOLOGY_LTE).when(mServiceState).getRilDataRadioTechnology();
98    }
99
100    @After
101    public void tearDown() throws Exception {
102        super.tearDown();
103    }
104
105    private TelephonyLog buildProto() throws Exception {
106        Method method = TelephonyMetrics.class.getDeclaredMethod("buildProto");
107        method.setAccessible(true);
108        return (TelephonyLog) method.invoke(mMetrics);
109    }
110
111    private void reset() throws Exception {
112        Method method = TelephonyMetrics.class.getDeclaredMethod("reset");
113        method.setAccessible(true);
114        method.invoke(mMetrics);
115    }
116
117    private String convertProtoToBase64String(TelephonyLog log) throws Exception {
118        Class[] cArgs = new Class[1];
119        cArgs[0] = TelephonyLog.class;
120        Method method = TelephonyMetrics.class.getDeclaredMethod("convertProtoToBase64String",
121                cArgs);
122        method.setAccessible(true);
123        return (String) method.invoke(null, log);
124    }
125
126    @Test
127    @SmallTest
128    public void testEventDropped() throws Exception {
129        for (int i = 0; i < 1001; i++) {
130            mMetrics.writeDataStallEvent(mPhone.getPhoneId(), i);
131        }
132        TelephonyLog log = buildProto();
133        assertEquals(1000, log.events.length);
134        assertEquals(0, log.callSessions.length);
135        assertEquals(0, log.smsSessions.length);
136        assertTrue(log.hasEventsDropped());
137        assertTrue(log.getEventsDropped());
138        assertEquals(1, log.events[0].getDataStallAction());
139    }
140
141    // Test write data stall event
142    @Test
143    @SmallTest
144    public void testWriteDataStallEvent() throws Exception {
145        mMetrics.writeDataStallEvent(mPhone.getPhoneId(), 3);
146        TelephonyLog log = buildProto();
147
148        assertEquals(1, log.events.length);
149        assertEquals(0, log.callSessions.length);
150        assertEquals(0, log.smsSessions.length);
151        assertTrue(log.events[0].hasPhoneId());
152        assertEquals(mPhone.getPhoneId(), log.events[0].getPhoneId());
153        assertEquals(3, log.events[0].getDataStallAction());
154    }
155
156    // Test write on IMS call start
157    @Test
158    @SmallTest
159    public void testWriteOnImsCallStart() throws Exception {
160        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
161        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
162        TelephonyLog log = buildProto();
163
164        assertEquals(0, log.events.length);
165        assertEquals(1, log.callSessions.length);
166        assertEquals(0, log.smsSessions.length);
167        assertTrue(log.callSessions[0].hasPhoneId());
168        assertEquals(mPhone.getPhoneId(), log.callSessions[0].getPhoneId());
169        assertTrue(log.callSessions[0].hasEventsDropped());
170        assertFalse(log.callSessions[0].getEventsDropped());
171        assertTrue(log.callSessions[0].hasStartTimeMinutes());
172        assertEquals(1, log.callSessions[0].events.length);
173        assertTrue(log.callSessions[0].events[0].hasCallIndex());
174        assertEquals(123, log.callSessions[0].events[0].getCallIndex());
175        assertTrue(log.callSessions[0].events[0].hasImsCommand());
176        assertEquals(ImsCommand.IMS_CMD_START, log.callSessions[0].events[0].getImsCommand());
177    }
178
179    // Test write ims call state
180    @Test
181    @SmallTest
182    public void testWriteImsCallState() throws Exception {
183        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
184        mMetrics.writeImsCallState(mPhone.getPhoneId(), mImsCallSession, Call.State.ACTIVE);
185        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
186        TelephonyLog log = buildProto();
187
188        assertEquals(0, log.events.length);
189        assertEquals(1, log.callSessions.length);
190        assertEquals(0, log.smsSessions.length);
191        assertEquals(2, log.callSessions[0].events.length);
192        assertTrue(log.callSessions[0].hasEventsDropped());
193        assertFalse(log.callSessions[0].getEventsDropped());
194        assertTrue(log.callSessions[0].events[1].hasCallIndex());
195        assertEquals(123, log.callSessions[0].events[1].getCallIndex());
196        assertTrue(log.callSessions[0].events[1].hasCallState());
197        assertEquals(CallState.CALL_ACTIVE, log.callSessions[0].events[1].getCallState());
198    }
199
200    // Test write ims set feature value
201    @Test
202    @SmallTest
203    public void testWriteImsSetFeatureValue() throws Exception {
204        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
205        mMetrics.writeImsSetFeatureValue(mPhone.getPhoneId(),
206                ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE, 0, 1, 0);
207        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
208        TelephonyLog log = buildProto();
209
210        assertEquals(1, log.events.length);
211        assertEquals(1, log.callSessions.length);
212        assertEquals(0, log.smsSessions.length);
213        assertEquals(2, log.callSessions[0].events.length);
214        assertTrue(log.callSessions[0].hasEventsDropped());
215        assertFalse(log.callSessions[0].getEventsDropped());
216        assertTrue(log.callSessions[0].events[1].settings.hasIsEnhanced4GLteModeEnabled());
217        assertTrue(log.callSessions[0].events[1].settings.getIsEnhanced4GLteModeEnabled());
218    }
219
220    // Test write on ims call handover event
221    @Test
222    @SmallTest
223    public void testWriteOnImsCallHandoverEvent() throws Exception {
224        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
225        mMetrics.writeOnImsCallHandoverEvent(mPhone.getPhoneId(),
226                TelephonyCallSession.Event.Type.IMS_CALL_HANDOVER, mImsCallSession, 5, 6,
227                mImsReasonInfo);
228        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
229        TelephonyLog log = buildProto();
230
231        assertEquals(0, log.events.length);
232        assertEquals(1, log.callSessions.length);
233        assertEquals(0, log.smsSessions.length);
234        assertEquals(2, log.callSessions[0].events.length);
235        assertTrue(log.callSessions[0].hasEventsDropped());
236        assertFalse(log.callSessions[0].getEventsDropped());
237        assertTrue(log.callSessions[0].events[1].hasType());
238        assertEquals(TelephonyCallSession.Event.Type.IMS_CALL_HANDOVER,
239                log.callSessions[0].events[1].getType());
240        assertTrue(log.callSessions[0].events[1].hasCallIndex());
241        assertEquals(123, log.callSessions[0].events[1].getCallIndex());
242        assertTrue(log.callSessions[0].events[1].hasSrcAccessTech());
243        assertEquals(5, log.callSessions[0].events[1].getSrcAccessTech());
244        assertTrue(log.callSessions[0].events[1].hasTargetAccessTech());
245        assertEquals(6, log.callSessions[0].events[1].getTargetAccessTech());
246
247        assertTrue(log.callSessions[0].events[1].reasonInfo.hasExtraMessage());
248        assertEquals("extramessage", log.callSessions[0].events[1].reasonInfo.getExtraMessage());
249        assertTrue(log.callSessions[0].events[1].reasonInfo.hasExtraCode());
250        assertEquals(456, log.callSessions[0].events[1].reasonInfo.getExtraCode());
251        assertTrue(log.callSessions[0].events[1].reasonInfo.hasReasonCode());
252        assertEquals(123, log.callSessions[0].events[1].reasonInfo.getReasonCode());
253    }
254
255    // Test write on ims command
256    @Test
257    @SmallTest
258    public void testWriteOnImsCommand() throws Exception {
259        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
260        mMetrics.writeOnImsCommand(mPhone.getPhoneId(), mImsCallSession, 123);
261        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
262        TelephonyLog log = buildProto();
263
264        assertEquals(0, log.events.length);
265        assertEquals(1, log.callSessions.length);
266        assertEquals(0, log.smsSessions.length);
267        assertEquals(2, log.callSessions[0].events.length);
268        assertTrue(log.callSessions[0].hasEventsDropped());
269        assertFalse(log.callSessions[0].getEventsDropped());
270        assertTrue(log.callSessions[0].events[1].hasType());
271        assertEquals(TelephonyCallSession.Event.Type.IMS_COMMAND,
272                log.callSessions[0].events[1].getType());
273        assertTrue(log.callSessions[0].events[1].hasImsCommand());
274        assertEquals(123, log.callSessions[0].events[1].getImsCommand());
275        assertTrue(log.callSessions[0].events[1].hasCallIndex());
276        assertEquals(123, log.callSessions[0].events[1].getCallIndex());
277    }
278
279    // Test write on ims connection state
280    @Test
281    @SmallTest
282    public void testWriteOnImsConnectionState() throws Exception {
283        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
284        mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
285                ImsConnectionState.State.CONNECTED, mImsReasonInfo);
286        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
287        TelephonyLog log = buildProto();
288
289        assertEquals(1, log.events.length);
290        assertEquals(1, log.callSessions.length);
291        assertEquals(0, log.smsSessions.length);
292        assertEquals(2, log.callSessions[0].events.length);
293        assertTrue(log.hasEventsDropped());
294        assertFalse(log.getEventsDropped());
295        assertTrue(log.events[0].hasType());
296        assertEquals(TelephonyEvent.Type.IMS_CONNECTION_STATE_CHANGED, log.events[0].getType());
297        assertTrue(log.events[0].imsConnectionState.hasState());
298        assertEquals(ImsConnectionState.State.CONNECTED,
299                log.events[0].imsConnectionState.getState());
300        assertTrue(log.events[0].imsConnectionState.reasonInfo.hasReasonCode());
301        assertEquals(123, log.events[0].imsConnectionState.reasonInfo.getReasonCode());
302        assertTrue(log.events[0].imsConnectionState.reasonInfo.hasExtraCode());
303        assertEquals(456, log.events[0].imsConnectionState.reasonInfo.getExtraCode());
304        assertTrue(log.events[0].imsConnectionState.reasonInfo.hasExtraMessage());
305        assertEquals("extramessage", log.events[0].imsConnectionState.reasonInfo.getExtraMessage());
306        assertTrue(log.callSessions[0].hasEventsDropped());
307        assertFalse(log.callSessions[0].getEventsDropped());
308        assertTrue(log.callSessions[0].events[1].hasType());
309        assertEquals(TelephonyCallSession.Event.Type.IMS_CONNECTION_STATE_CHANGED,
310                log.callSessions[0].events[1].getType());
311        assertTrue(log.callSessions[0].events[1].imsConnectionState.hasState());
312        assertEquals(ImsConnectionState.State.CONNECTED,
313                log.callSessions[0].events[1].imsConnectionState.getState());
314    }
315
316    // Test write on setup data call response
317    @Test
318    @SmallTest
319    public void testWriteOnSetupDataCallResponse() throws Exception {
320        DataCallResponse response = new DataCallResponse();
321        response.status = 5;
322        response.suggestedRetryTime = 6;
323        response.cid = 7;
324        response.active = 8;
325        response.type = "IPV4V6";
326        response.ifname = "ifname";
327
328        mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 1, 2,
329                RIL_REQUEST_SETUP_DATA_CALL, response);
330        TelephonyLog log = buildProto();
331
332        assertEquals(1, log.events.length);
333        assertEquals(0, log.callSessions.length);
334        assertEquals(0, log.smsSessions.length);
335        assertTrue(log.hasEventsDropped());
336        assertFalse(log.getEventsDropped());
337
338        TelephonyEvent.RilSetupDataCallResponse respProto = log.events[0].setupDataCallResponse;
339
340        assertTrue(respProto.hasStatus());
341        assertEquals(5, respProto.getStatus());
342        assertTrue(respProto.hasSuggestedRetryTimeMillis());
343        assertEquals(6, respProto.getSuggestedRetryTimeMillis());
344        assertTrue(respProto.call.hasCid());
345        assertEquals(7, respProto.call.getCid());
346        assertTrue(respProto.call.hasType());
347        assertEquals(PDP_TYPE_IPV4V6, respProto.call.getType());
348        assertTrue(respProto.call.hasIframe());
349        assertEquals("ifname", respProto.call.getIframe());
350    }
351
352    // Test write on deactivate data call response
353    @Test
354    @SmallTest
355    public void testWriteOnDeactivateDataCallResponse() throws Exception {
356        mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 2, 3,
357                RIL_REQUEST_DEACTIVATE_DATA_CALL, null);
358        TelephonyLog log = buildProto();
359
360        assertEquals(1, log.events.length);
361        assertEquals(0, log.callSessions.length);
362        assertEquals(0, log.smsSessions.length);
363        assertTrue(log.hasEventsDropped());
364        assertFalse(log.getEventsDropped());
365
366        assertTrue(log.events[0].hasType());
367        assertEquals(TelephonyEvent.Type.DATA_CALL_DEACTIVATE_RESPONSE, log.events[0].getType());
368        assertTrue(log.events[0].hasError());
369        assertEquals(4, log.events[0].getError());
370    }
371
372    // Test write RIL send SMS
373    @Test
374    @SmallTest
375    public void testWriteRilSendSms() throws Exception {
376        mMetrics.writeRilSendSms(mPhone.getPhoneId(), 1, 2, 1);
377        mMetrics.writeRilSendSms(mPhone.getPhoneId(), 4, 5, 2);
378
379        SmsResponse response = new SmsResponse(0, null, 123);
380
381        mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 1, 0, RIL_REQUEST_SEND_SMS,
382                response);
383        response = new SmsResponse(0, null, 456);
384        mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 4, 0, RIL_REQUEST_SEND_SMS,
385                response);
386        TelephonyLog log = buildProto();
387
388        assertEquals(0, log.events.length);
389        assertEquals(0, log.callSessions.length);
390        assertEquals(1, log.smsSessions.length);
391        assertTrue(log.hasEventsDropped());
392        assertFalse(log.getEventsDropped());
393
394        SmsSession.Event[] events = log.smsSessions[0].events;
395        assertEquals(4, events.length);
396        assertTrue(events[0].hasType());
397        assertEquals(SmsSession.Event.Type.SMS_SEND, events[0].getType());
398        assertTrue(events[0].hasRilRequestId());
399        assertEquals(1, events[0].getRilRequestId());
400        assertTrue(events[0].hasTech());
401        assertEquals(2, events[0].getTech());
402        assertTrue(events[0].hasFormat());
403        assertEquals(1, events[0].getFormat());
404
405        assertTrue(events[1].hasType());
406        assertEquals(SmsSession.Event.Type.SMS_SEND, events[1].getType());
407        assertTrue(events[1].hasRilRequestId());
408        assertEquals(4, events[1].getRilRequestId());
409        assertTrue(events[1].hasTech());
410        assertEquals(5, events[1].getTech());
411        assertTrue(events[1].hasFormat());
412        assertEquals(2, events[1].getFormat());
413
414        assertTrue(events[2].hasType());
415        assertEquals(SmsSession.Event.Type.SMS_SEND_RESULT, events[2].getType());
416        assertTrue(events[2].hasRilRequestId());
417        assertEquals(1, events[2].getRilRequestId());
418        assertTrue(events[2].hasError());
419        assertEquals(0, events[2].getError());
420        assertTrue(events[2].hasErrorCode());
421        assertEquals(123, events[2].getErrorCode());
422
423        assertTrue(events[3].hasType());
424        assertEquals(SmsSession.Event.Type.SMS_SEND_RESULT, events[3].getType());
425        assertTrue(events[3].hasRilRequestId());
426        assertEquals(4, events[3].getRilRequestId());
427        assertTrue(events[3].hasError());
428        assertEquals(0, events[3].getError());
429        assertTrue(events[3].hasErrorCode());
430        assertEquals(456, events[3].getErrorCode());
431    }
432
433    // Test write phone state
434    @Test
435    @SmallTest
436    public void testWritePhoneState() throws Exception {
437        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
438        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.OFFHOOK);
439        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
440        TelephonyLog log = buildProto();
441
442        assertEquals(0, log.events.length);
443        assertEquals(1, log.callSessions.length);
444        assertEquals(0, log.smsSessions.length);
445        assertTrue(log.hasEventsDropped());
446        assertFalse(log.getEventsDropped());
447
448        assertTrue(log.callSessions[0].hasPhoneId());
449        assertEquals(mPhone.getPhoneId(), log.callSessions[0].getPhoneId());
450        assertEquals(2, log.callSessions[0].events.length);
451        assertTrue(log.callSessions[0].events[1].hasType());
452        assertEquals(TelephonyCallSession.Event.Type.PHONE_STATE_CHANGED,
453                log.callSessions[0].events[1].getType());
454        assertTrue(log.callSessions[0].events[1].hasPhoneState());
455        assertEquals(TelephonyCallSession.Event.PhoneState.STATE_OFFHOOK,
456                log.callSessions[0].events[1].getPhoneState());
457    }
458
459    // Test write RIL dial and hangup
460    @Test
461    @SmallTest
462    public void testWriteRilDialHangup() throws Exception {
463        mMetrics.writeRilDial(mPhone.getPhoneId(), 1, 2, mUusInfo);
464        mMetrics.writeRilHangup(mPhone.getPhoneId(), 2, 3);
465        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
466        TelephonyLog log = buildProto();
467
468        assertEquals(0, log.events.length);
469        assertEquals(1, log.callSessions.length);
470        assertEquals(0, log.smsSessions.length);
471        assertTrue(log.hasEventsDropped());
472        assertFalse(log.getEventsDropped());
473
474        TelephonyCallSession.Event[] events = log.callSessions[0].events;
475
476        assertEquals(2, events.length);
477        assertTrue(events[0].hasType());
478        assertEquals(TelephonyCallSession.Event.Type.RIL_REQUEST, events[0].getType());
479        assertTrue(events[0].hasRilRequest());
480        assertEquals(TelephonyCallSession.Event.RilRequest.RIL_REQUEST_DIAL,
481                events[0].getRilRequest());
482        assertTrue(events[0].hasRilRequestId());
483        assertEquals(1, events[0].getRilRequestId());
484
485        assertTrue(events[1].hasType());
486        assertEquals(TelephonyCallSession.Event.Type.RIL_REQUEST, events[1].getType());
487        assertTrue(events[1].hasRilRequest());
488        assertEquals(TelephonyCallSession.Event.RilRequest.RIL_REQUEST_HANGUP,
489                events[1].getRilRequest());
490        assertTrue(events[1].hasCallIndex());
491        assertEquals(3, events[1].getCallIndex());
492    }
493
494    // Test write RIL setup data call
495    @Test
496    @SmallTest
497    public void testWriteRilSetupDataCall() throws Exception {
498        mMetrics.writeRilSetupDataCall(
499                mPhone.getPhoneId(), 1, 14, 3, "apn", 0, "IPV4V6");
500
501        TelephonyLog log = buildProto();
502
503        assertEquals(1, log.events.length);
504        assertEquals(0, log.callSessions.length);
505        assertEquals(0, log.smsSessions.length);
506        assertTrue(log.hasEventsDropped());
507        assertFalse(log.getEventsDropped());
508
509        assertTrue(log.events[0].hasType());
510        assertEquals(TelephonyEvent.Type.DATA_CALL_SETUP, log.events[0].getType());
511
512        TelephonyEvent.RilSetupDataCall setupDataCall = log.events[0].setupDataCall;
513        assertTrue(setupDataCall.hasApn());
514        assertEquals("apn", setupDataCall.getApn());
515        assertTrue(setupDataCall.hasRat());
516        assertEquals(14, setupDataCall.getRat());
517        assertTrue(setupDataCall.hasDataProfile());
518        assertEquals(4, setupDataCall.getDataProfile());
519        assertTrue(setupDataCall.hasType());
520        assertEquals(PDP_TYPE_IPV4V6, setupDataCall.getType());
521    }
522
523    // Test write service state changed
524    @Test
525    @SmallTest
526    public void testWriteServiceStateChanged() throws Exception {
527        mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
528        TelephonyLog log = buildProto();
529
530        assertEquals(1, log.events.length);
531        assertEquals(0, log.callSessions.length);
532        assertEquals(0, log.smsSessions.length);
533        assertTrue(log.hasEventsDropped());
534        assertFalse(log.getEventsDropped());
535
536        TelephonyEvent event = log.events[0];
537        assertTrue(event.hasType());
538        assertEquals(TelephonyEvent.Type.RIL_SERVICE_STATE_CHANGED, event.getType());
539
540        TelephonyServiceState state = event.serviceState;
541        assertTrue(state.hasVoiceRat());
542        assertEquals(RadioAccessTechnology.RAT_LTE, state.getVoiceRat());
543        assertTrue(state.hasDataRat());
544        assertEquals(RadioAccessTechnology.RAT_LTE, state.getDataRat());
545        assertTrue(state.hasVoiceRoamingType());
546        assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.getVoiceRoamingType());
547        assertTrue(state.hasDataRoamingType());
548        assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.getDataRoamingType());
549        assertTrue(state.voiceOperator.hasAlphaLong());
550        assertEquals("voicelong", state.voiceOperator.getAlphaLong());
551        assertTrue(state.voiceOperator.hasAlphaShort());
552        assertEquals("voiceshort", state.voiceOperator.getAlphaShort());
553        assertTrue(state.voiceOperator.hasNumeric());
554        assertEquals("123456", state.voiceOperator.getNumeric());
555        assertTrue(state.dataOperator.hasAlphaLong());
556        assertEquals("datalong", state.dataOperator.getAlphaLong());
557        assertTrue(state.dataOperator.hasAlphaShort());
558        assertEquals("datashort", state.dataOperator.getAlphaShort());
559        assertTrue(state.dataOperator.hasNumeric());
560        assertEquals("123456", state.dataOperator.getNumeric());
561    }
562
563    // Test reset scenario
564    @Test
565    @SmallTest
566    public void testReset() throws Exception {
567        mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
568        reset();
569        TelephonyLog log = buildProto();
570
571        assertEquals(1, log.events.length);
572        assertEquals(0, log.callSessions.length);
573        assertEquals(0, log.smsSessions.length);
574        assertTrue(log.hasEventsDropped());
575        assertFalse(log.getEventsDropped());
576
577        TelephonyEvent event = log.events[0];
578        assertTrue(event.hasType());
579        assertEquals(TelephonyEvent.Type.RIL_SERVICE_STATE_CHANGED, event.getType());
580
581        TelephonyServiceState state = event.serviceState;
582        assertTrue(state.hasVoiceRat());
583        assertEquals(RadioAccessTechnology.RAT_LTE, state.getVoiceRat());
584        assertTrue(state.hasDataRat());
585        assertEquals(RadioAccessTechnology.RAT_LTE, state.getDataRat());
586        assertTrue(state.hasVoiceRoamingType());
587        assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.getVoiceRoamingType());
588        assertTrue(state.hasDataRoamingType());
589        assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.getDataRoamingType());
590        assertTrue(state.voiceOperator.hasAlphaLong());
591        assertEquals("voicelong", state.voiceOperator.getAlphaLong());
592        assertTrue(state.voiceOperator.hasAlphaShort());
593        assertEquals("voiceshort", state.voiceOperator.getAlphaShort());
594        assertTrue(state.voiceOperator.hasNumeric());
595        assertEquals("123456", state.voiceOperator.getNumeric());
596        assertTrue(state.dataOperator.hasAlphaLong());
597        assertEquals("datalong", state.dataOperator.getAlphaLong());
598        assertTrue(state.dataOperator.hasAlphaShort());
599        assertEquals("datashort", state.dataOperator.getAlphaShort());
600        assertTrue(state.dataOperator.hasNumeric());
601        assertEquals("123456", state.dataOperator.getNumeric());
602    }
603
604    // Test Proto Encoding/Decoding
605    @Test
606    @SmallTest
607    public void testProtoEncodingDecoding() throws Exception {
608        mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
609        TelephonyLog log = buildProto();
610        String encodedString = convertProtoToBase64String(log);
611
612        byte[] decodedString = Base64.decode(encodedString, Base64.DEFAULT);
613        assertArrayEquals(TelephonyProto.TelephonyLog.toByteArray(log), decodedString);
614    }
615}