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 static android.telephony.ServiceState.RIL_RADIO_TECHNOLOGY_LTE;
20import static android.telephony.ServiceState.ROAMING_TYPE_DOMESTIC;
21
22import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL;
23import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS;
24import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL;
25import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_ADDRESS;
26import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_DNS;
27import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_GATEWAY;
28import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_IFNAME;
29import static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_PCSCF_ADDRESS;
30import static com.android.internal.telephony.nano.TelephonyProto.PdpType.PDP_TYPE_IPV4V6;
31
32import static org.junit.Assert.assertArrayEquals;
33import static org.junit.Assert.assertEquals;
34import static org.junit.Assert.assertFalse;
35import static org.junit.Assert.assertTrue;
36import static org.mockito.Mockito.doReturn;
37
38import android.hardware.radio.V1_0.SetupDataCallResult;
39import android.telephony.ServiceState;
40import android.telephony.TelephonyManager;
41import android.telephony.ims.ImsCallSession;
42import android.telephony.ims.ImsReasonInfo;
43import android.telephony.ims.feature.MmTelFeature;
44import android.telephony.ims.stub.ImsRegistrationImplBase;
45import android.test.suitebuilder.annotation.SmallTest;
46import android.util.Base64;
47
48import com.android.internal.telephony.Call;
49import com.android.internal.telephony.GsmCdmaConnection;
50import com.android.internal.telephony.PhoneConstants;
51import com.android.internal.telephony.SmsResponse;
52import com.android.internal.telephony.TelephonyTest;
53import com.android.internal.telephony.UUSInfo;
54import com.android.internal.telephony.nano.TelephonyProto;
55import com.android.internal.telephony.nano.TelephonyProto.ImsConnectionState;
56import com.android.internal.telephony.nano.TelephonyProto.RadioAccessTechnology;
57import com.android.internal.telephony.nano.TelephonyProto.SmsSession;
58import com.android.internal.telephony.nano.TelephonyProto.TelephonyCallSession;
59import com.android.internal.telephony.nano.TelephonyProto.TelephonyCallSession.Event.CallState;
60import com.android.internal.telephony.nano.TelephonyProto.TelephonyCallSession.Event.ImsCommand;
61import com.android.internal.telephony.nano.TelephonyProto.TelephonyCallSession.Event.RilCall;
62import com.android.internal.telephony.nano.TelephonyProto.TelephonyEvent;
63import com.android.internal.telephony.nano.TelephonyProto.TelephonyLog;
64import com.android.internal.telephony.nano.TelephonyProto.TelephonyServiceState;
65import com.android.internal.telephony.nano.TelephonyProto.TelephonyServiceState.RoamingType;
66
67import org.junit.After;
68import org.junit.Before;
69import org.junit.Test;
70import org.mockito.Mock;
71
72import java.lang.reflect.Method;
73
74public class TelephonyMetricsTest extends TelephonyTest {
75
76    @Mock
77    private ImsCallSession mImsCallSession;
78
79    @Mock
80    private ServiceState mServiceState;
81
82    @Mock
83    private GsmCdmaConnection mConnection;
84
85    private TelephonyMetrics mMetrics;
86
87    private UUSInfo mUusInfo;
88
89    private ImsReasonInfo mImsReasonInfo;
90
91    @Before
92    public void setUp() throws Exception {
93        super.setUp(getClass().getSimpleName());
94        mMetrics = new TelephonyMetrics();
95        mUusInfo = new UUSInfo(1, 2, new byte[]{1, 2});
96        doReturn("123").when(mImsCallSession).getCallId();
97        mImsReasonInfo = new ImsReasonInfo();
98        mImsReasonInfo.mExtraMessage = "extramessage";
99        mImsReasonInfo.mCode = 123;
100        mImsReasonInfo.mExtraCode = 456;
101
102        doReturn(ROAMING_TYPE_DOMESTIC).when(mServiceState).getVoiceRoamingType();
103        doReturn(ROAMING_TYPE_DOMESTIC).when(mServiceState).getDataRoamingType();
104        doReturn("voiceshort").when(mServiceState).getVoiceOperatorAlphaShort();
105        doReturn("voicelong").when(mServiceState).getVoiceOperatorAlphaLong();
106        doReturn("datashort").when(mServiceState).getDataOperatorAlphaShort();
107        doReturn("datalong").when(mServiceState).getDataOperatorAlphaLong();
108        doReturn("123456").when(mServiceState).getVoiceOperatorNumeric();
109        doReturn("123456").when(mServiceState).getDataOperatorNumeric();
110        doReturn(RIL_RADIO_TECHNOLOGY_LTE).when(mServiceState).getRilVoiceRadioTechnology();
111        doReturn(RIL_RADIO_TECHNOLOGY_LTE).when(mServiceState).getRilDataRadioTechnology();
112    }
113
114    @After
115    public void tearDown() throws Exception {
116        super.tearDown();
117    }
118
119    private TelephonyLog buildProto() throws Exception {
120        Method method = TelephonyMetrics.class.getDeclaredMethod("buildProto");
121        method.setAccessible(true);
122        return (TelephonyLog) method.invoke(mMetrics);
123    }
124
125    private void reset() throws Exception {
126        Method method = TelephonyMetrics.class.getDeclaredMethod("reset");
127        method.setAccessible(true);
128        method.invoke(mMetrics);
129    }
130
131    private String convertProtoToBase64String(TelephonyLog log) throws Exception {
132        Class[] cArgs = new Class[1];
133        cArgs[0] = TelephonyLog.class;
134        Method method = TelephonyMetrics.class.getDeclaredMethod("convertProtoToBase64String",
135                cArgs);
136        method.setAccessible(true);
137        return (String) method.invoke(null, log);
138    }
139
140    @Test
141    @SmallTest
142    public void testEventDropped() throws Exception {
143        for (int i = 0; i < 1001; i++) {
144            mMetrics.writeDataStallEvent(mPhone.getPhoneId(), i);
145        }
146        TelephonyLog log = buildProto();
147        assertEquals(1000, log.events.length);
148        assertEquals(0, log.callSessions.length);
149        assertEquals(0, log.smsSessions.length);
150        assertTrue(log.eventsDropped);
151        assertEquals(1, log.events[0].dataStallAction);
152    }
153
154    // Test write data stall event
155    @Test
156    @SmallTest
157    public void testWriteDataStallEvent() throws Exception {
158        mMetrics.writeDataStallEvent(mPhone.getPhoneId(), 3);
159        TelephonyLog log = buildProto();
160
161        assertEquals(1, log.events.length);
162        assertEquals(0, log.callSessions.length);
163        assertEquals(0, log.smsSessions.length);
164        assertEquals(mPhone.getPhoneId(), log.events[0].phoneId);
165        assertEquals(3, log.events[0].dataStallAction);
166    }
167
168    // Test write modem restart event
169    @Test
170    @SmallTest
171    public void testModemRestartEvent() throws Exception {
172        mMetrics.writeModemRestartEvent(mPhone.getPhoneId(), "Test");
173        TelephonyLog log = buildProto();
174
175        assertEquals(1, log.events.length);
176        assertEquals(0, log.callSessions.length);
177        assertEquals(0, log.smsSessions.length);
178
179        assertEquals(mPhone.getPhoneId(), log.events[0].phoneId);
180        assertEquals("Test", log.events[0].modemRestart.reason);
181    }
182
183    // Test write Carrier Identification matching event
184    @Test
185    @SmallTest
186    public void testWriteCarrierIdMatchingEventWithInvalidMatchingScore() throws Exception {
187
188        mMetrics.writeCarrierIdMatchingEvent(mPhone.getPhoneId(), 1,
189                TelephonyManager.UNKNOWN_CARRIER_ID, "mccmncTest", "gid1Test");
190        TelephonyLog log = buildProto();
191
192        assertEquals(1, log.events.length);
193        assertEquals(0, log.callSessions.length);
194        assertEquals(0, log.smsSessions.length);
195
196        assertEquals(mPhone.getPhoneId(), log.events[0].phoneId);
197        assertEquals(1, log.events[0].carrierIdMatching.cidTableVersion);
198        assertEquals(TelephonyEvent.Type.CARRIER_ID_MATCHING, log.events[0].type);
199        assertEquals("mccmncTest", log.events[0].carrierIdMatching.result.mccmnc);
200        assertTrue(log.events[0].carrierIdMatching.result.gid1.isEmpty());
201    }
202
203    // Test write Carrier Identification matching event
204    @Test
205    @SmallTest
206    public void testWriteCarrierIdMatchingEvent() throws Exception {
207
208        mMetrics.writeCarrierIdMatchingEvent(mPhone.getPhoneId(), 1, 1, "mccmncTest", "gid1Test");
209        TelephonyLog log = buildProto();
210
211        assertEquals(1, log.events.length);
212        assertEquals(0, log.callSessions.length);
213        assertEquals(0, log.smsSessions.length);
214
215        assertEquals(mPhone.getPhoneId(), log.events[0].phoneId);
216        assertEquals(TelephonyEvent.Type.CARRIER_ID_MATCHING, log.events[0].type);
217        assertEquals(1, log.events[0].carrierIdMatching.cidTableVersion);
218        assertEquals(1, log.events[0].carrierIdMatching.result.carrierId);
219        assertEquals("mccmncTest", log.events[0].carrierIdMatching.result.mccmnc);
220        assertEquals("gid1Test", log.events[0].carrierIdMatching.result.gid1);
221    }
222
223    // Test write on IMS call start
224    @Test
225    @SmallTest
226    public void testWriteOnImsCallStart() throws Exception {
227        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
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
235        assertEquals(mPhone.getPhoneId(), log.callSessions[0].phoneId);
236
237        assertFalse(log.callSessions[0].eventsDropped);
238
239        assertEquals(1, log.callSessions[0].events.length);
240
241        assertEquals(123, log.callSessions[0].events[0].callIndex);
242
243        assertEquals(ImsCommand.IMS_CMD_START, log.callSessions[0].events[0].imsCommand);
244    }
245
246    // Test write on IMS call received
247    @Test
248    @SmallTest
249    public void testWriteOnImsCallReceive() throws Exception {
250        mMetrics.writeOnImsCallReceive(mPhone.getPhoneId(), mImsCallSession);
251        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
252        TelephonyLog log = buildProto();
253
254        assertEquals(0, log.events.length);
255        assertEquals(1, log.callSessions.length);
256        assertEquals(0, log.smsSessions.length);
257        assertEquals(mPhone.getPhoneId(), log.callSessions[0].phoneId);
258
259        assertFalse(log.callSessions[0].eventsDropped);
260
261        assertEquals(1, log.callSessions[0].events.length);
262
263        assertEquals(123, log.callSessions[0].events[0].callIndex);
264    }
265
266    // Test write ims call state
267    @Test
268    @SmallTest
269    public void testWriteImsCallState() throws Exception {
270        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
271        mMetrics.writeImsCallState(mPhone.getPhoneId(), mImsCallSession, Call.State.ACTIVE);
272        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
273        TelephonyLog log = buildProto();
274
275        assertEquals(0, log.events.length);
276        assertEquals(1, log.callSessions.length);
277        assertEquals(0, log.smsSessions.length);
278        assertEquals(2, log.callSessions[0].events.length);
279        assertFalse(log.callSessions[0].eventsDropped);
280
281        assertEquals(123, log.callSessions[0].events[1].callIndex);
282
283        assertEquals(CallState.CALL_ACTIVE, log.callSessions[0].events[1].callState);
284    }
285
286    // Test write ims set feature value
287    @Test
288    @SmallTest
289    public void testWriteImsSetFeatureValue() throws Exception {
290        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
291        mMetrics.writeImsSetFeatureValue(mPhone.getPhoneId(),
292                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
293                ImsRegistrationImplBase.REGISTRATION_TECH_LTE, 1);
294        mMetrics.writeImsSetFeatureValue(mPhone.getPhoneId(),
295                MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE,
296                ImsRegistrationImplBase.REGISTRATION_TECH_LTE, 1);
297        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
298        TelephonyLog log = buildProto();
299
300        assertEquals(1, log.events.length);
301        assertEquals(1, log.callSessions.length);
302        assertEquals(0, log.smsSessions.length);
303        assertEquals(2, log.callSessions[0].events.length);
304        assertFalse(log.callSessions[0].eventsDropped);
305        assertTrue(log.callSessions[0].events[1].settings.isEnhanced4GLteModeEnabled);
306    }
307
308    // Test write on ims call handover event
309    @Test
310    @SmallTest
311    public void testWriteOnImsCallHandoverEvent() throws Exception {
312        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
313        mMetrics.writeOnImsCallHandoverEvent(mPhone.getPhoneId(),
314                TelephonyCallSession.Event.Type.IMS_CALL_HANDOVER, mImsCallSession, 5, 6,
315                mImsReasonInfo);
316        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
317        TelephonyLog log = buildProto();
318
319        assertEquals(0, log.events.length);
320        assertEquals(1, log.callSessions.length);
321        assertEquals(0, log.smsSessions.length);
322        assertEquals(2, log.callSessions[0].events.length);
323        assertFalse(log.callSessions[0].eventsDropped);
324        assertEquals(TelephonyCallSession.Event.Type.IMS_CALL_HANDOVER,
325                log.callSessions[0].events[1].type);
326        assertEquals(123, log.callSessions[0].events[1].callIndex);
327        assertEquals(5, log.callSessions[0].events[1].srcAccessTech);
328        assertEquals(6, log.callSessions[0].events[1].targetAccessTech);
329
330        assertEquals("extramessage", log.callSessions[0].events[1].reasonInfo.extraMessage);
331        assertEquals(456, log.callSessions[0].events[1].reasonInfo.extraCode);
332        assertEquals(123, log.callSessions[0].events[1].reasonInfo.reasonCode);
333    }
334
335    // Test write on ims command
336    @Test
337    @SmallTest
338    public void testWriteOnImsCommand() throws Exception {
339        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
340        mMetrics.writeOnImsCommand(mPhone.getPhoneId(), mImsCallSession, 123);
341        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
342        TelephonyLog log = buildProto();
343
344        assertEquals(0, log.events.length);
345        assertEquals(1, log.callSessions.length);
346        assertEquals(0, log.smsSessions.length);
347        assertEquals(2, log.callSessions[0].events.length);
348
349        assertFalse(log.callSessions[0].eventsDropped);
350
351        assertEquals(TelephonyCallSession.Event.Type.IMS_COMMAND,
352                log.callSessions[0].events[1].type);
353
354        assertEquals(123, log.callSessions[0].events[1].imsCommand);
355
356        assertEquals(123, log.callSessions[0].events[1].callIndex);
357    }
358
359    // Test write on ims connection state
360    @Test
361    @SmallTest
362    public void testWriteOnImsConnectionState() throws Exception {
363        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
364        mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
365                ImsConnectionState.State.CONNECTED, mImsReasonInfo);
366        mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
367                ImsConnectionState.State.CONNECTED, mImsReasonInfo);
368        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
369        TelephonyLog log = buildProto();
370
371        assertEquals(1, log.events.length);
372        assertEquals(1, log.callSessions.length);
373        assertEquals(0, log.smsSessions.length);
374        assertEquals(2, log.callSessions[0].events.length);
375        assertFalse(log.eventsDropped);
376        assertEquals(TelephonyEvent.Type.IMS_CONNECTION_STATE_CHANGED, log.events[0].type);
377        assertEquals(ImsConnectionState.State.CONNECTED,
378                log.events[0].imsConnectionState.state);
379        assertEquals(123, log.events[0].imsConnectionState.reasonInfo.reasonCode);
380        assertEquals(456, log.events[0].imsConnectionState.reasonInfo.extraCode);
381        assertEquals("extramessage", log.events[0].imsConnectionState.reasonInfo.extraMessage);
382        assertFalse(log.callSessions[0].eventsDropped);
383        assertEquals(TelephonyCallSession.Event.Type.IMS_CONNECTION_STATE_CHANGED,
384                log.callSessions[0].events[1].type);
385        assertEquals(ImsConnectionState.State.CONNECTED,
386                log.callSessions[0].events[1].imsConnectionState.state);
387    }
388
389    // Test write on setup data call response
390    @Test
391    @SmallTest
392    public void testWriteOnSetupDataCallResponse() throws Exception {
393        SetupDataCallResult result = new SetupDataCallResult();
394        result.status = 5;
395        result.suggestedRetryTime = 6;
396        result.cid = 7;
397        result.active = 8;
398        result.type = "IPV4V6";
399        result.ifname = FAKE_IFNAME;
400        result.addresses = FAKE_ADDRESS;
401        result.dnses = FAKE_DNS;
402        result.gateways = FAKE_GATEWAY;
403        result.pcscf = FAKE_PCSCF_ADDRESS;
404        result.mtu = 1440;
405
406        mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 1, 2,
407                RIL_REQUEST_SETUP_DATA_CALL, result);
408        TelephonyLog log = buildProto();
409
410        assertEquals(1, log.events.length);
411        assertEquals(0, log.callSessions.length);
412        assertEquals(0, log.smsSessions.length);
413        assertFalse(log.eventsDropped);
414
415        TelephonyEvent.RilSetupDataCallResponse respProto = log.events[0].setupDataCallResponse;
416
417        assertEquals(5, respProto.status);
418        assertEquals(6, respProto.suggestedRetryTimeMillis);
419        assertEquals(7, respProto.call.cid);
420        assertEquals(PDP_TYPE_IPV4V6, respProto.call.type);
421        assertEquals(FAKE_IFNAME, respProto.call.iframe);
422    }
423
424    // Test write on deactivate data call response
425    @Test
426    @SmallTest
427    public void testWriteOnDeactivateDataCallResponse() throws Exception {
428        mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 2, 3,
429                RIL_REQUEST_DEACTIVATE_DATA_CALL, null);
430        TelephonyLog log = buildProto();
431
432        assertEquals(1, log.events.length);
433        assertEquals(0, log.callSessions.length);
434        assertEquals(0, log.smsSessions.length);
435        assertFalse(log.eventsDropped);
436
437        assertEquals(TelephonyEvent.Type.DATA_CALL_DEACTIVATE_RESPONSE, log.events[0].type);
438        assertEquals(4, log.events[0].error);
439    }
440
441    // Test write RIL send SMS
442    @Test
443    @SmallTest
444    public void testWriteRilSendSms() throws Exception {
445        mMetrics.writeRilSendSms(mPhone.getPhoneId(), 1, 2, 1);
446        mMetrics.writeRilSendSms(mPhone.getPhoneId(), 4, 5, 2);
447
448        SmsResponse response = new SmsResponse(0, null, 123);
449
450        mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 1, 0, RIL_REQUEST_SEND_SMS,
451                response);
452        response = new SmsResponse(0, null, 456);
453        mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 4, 0, RIL_REQUEST_SEND_SMS,
454                response);
455        TelephonyLog log = buildProto();
456
457        assertEquals(0, log.events.length);
458        assertEquals(0, log.callSessions.length);
459        assertEquals(1, log.smsSessions.length);
460        assertFalse(log.eventsDropped);
461
462        SmsSession.Event[] events = log.smsSessions[0].events;
463        assertEquals(4, events.length);
464        assertEquals(SmsSession.Event.Type.SMS_SEND, events[0].type);
465        assertEquals(1, events[0].rilRequestId);
466        assertEquals(2, events[0].tech);
467        assertEquals(1, events[0].format);
468
469        assertEquals(SmsSession.Event.Type.SMS_SEND, events[1].type);
470        assertEquals(4, events[1].rilRequestId);
471        assertEquals(5, events[1].tech);
472        assertEquals(2, events[1].format);
473
474        assertEquals(SmsSession.Event.Type.SMS_SEND_RESULT, events[2].type);
475        assertEquals(1, events[2].rilRequestId);
476        assertEquals(1, events[2].error);
477        assertEquals(123, events[2].errorCode);
478
479        assertEquals(SmsSession.Event.Type.SMS_SEND_RESULT, events[3].type);
480        assertEquals(4, events[3].rilRequestId);
481        assertEquals(1, events[3].error);
482        assertEquals(456, events[3].errorCode);
483    }
484
485    // Test write phone state
486    @Test
487    @SmallTest
488    public void testWritePhoneState() throws Exception {
489        mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
490        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.OFFHOOK);
491        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
492        TelephonyLog log = buildProto();
493
494        assertEquals(0, log.events.length);
495        assertEquals(1, log.callSessions.length);
496        assertEquals(0, log.smsSessions.length);
497        assertFalse(log.eventsDropped);
498
499        assertEquals(mPhone.getPhoneId(), log.callSessions[0].phoneId);
500        assertEquals(2, log.callSessions[0].events.length);
501        assertEquals(TelephonyCallSession.Event.Type.PHONE_STATE_CHANGED,
502                log.callSessions[0].events[1].type);
503        assertEquals(TelephonyCallSession.Event.PhoneState.STATE_OFFHOOK,
504                log.callSessions[0].events[1].phoneState);
505    }
506
507    // Test write RIL dial and hangup
508    @Test
509    @SmallTest
510    public void testWriteRilDialHangup() throws Exception {
511        doReturn(Call.State.DIALING).when(mConnection).getState();
512        mMetrics.writeRilDial(mPhone.getPhoneId(), mConnection, 2, mUusInfo);
513        doReturn(Call.State.DISCONNECTED).when(mConnection).getState();
514        mMetrics.writeRilHangup(mPhone.getPhoneId(), mConnection, 3);
515        mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
516        TelephonyLog log = buildProto();
517
518        assertEquals(0, log.events.length);
519        assertEquals(1, log.callSessions.length);
520        assertEquals(0, log.smsSessions.length);
521        assertFalse(log.eventsDropped);
522
523        TelephonyCallSession.Event[] events = log.callSessions[0].events;
524
525        assertEquals(2, events.length);
526        assertEquals(TelephonyCallSession.Event.Type.RIL_REQUEST, events[0].type);
527
528        assertEquals(TelephonyCallSession.Event.RilRequest.RIL_REQUEST_DIAL,
529                events[0].rilRequest);
530        RilCall[] calls = events[0].calls;
531        assertEquals(CallState.CALL_DIALING, calls[0].state);
532
533        assertEquals(TelephonyCallSession.Event.RilRequest.RIL_REQUEST_HANGUP,
534                events[1].rilRequest);
535        calls = events[1].calls;
536        assertEquals(3, calls[0].index);
537        assertEquals(CallState.CALL_DISCONNECTED, calls[0].state);
538    }
539
540    // Test write RIL setup data call
541    @Test
542    @SmallTest
543    public void testWriteRilSetupDataCall() throws Exception {
544        mMetrics.writeSetupDataCall(
545                mPhone.getPhoneId(), 14, 3, "apn", "IPV4V6");
546
547        TelephonyLog log = buildProto();
548
549        assertEquals(1, log.events.length);
550        assertEquals(0, log.callSessions.length);
551        assertEquals(0, log.smsSessions.length);
552
553        assertFalse(log.eventsDropped);
554
555
556        assertEquals(TelephonyEvent.Type.DATA_CALL_SETUP, log.events[0].type);
557
558        TelephonyEvent.RilSetupDataCall setupDataCall = log.events[0].setupDataCall;
559
560        assertEquals("apn", setupDataCall.apn);
561
562        assertEquals(14, setupDataCall.rat);
563
564        assertEquals(4, setupDataCall.dataProfile);
565
566        assertEquals(PDP_TYPE_IPV4V6, setupDataCall.type);
567    }
568
569    // Test write service state changed
570    @Test
571    @SmallTest
572    public void testWriteServiceStateChanged() throws Exception {
573        mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
574        mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
575        TelephonyLog log = buildProto();
576
577        assertEquals(1, log.events.length);
578        assertEquals(0, log.callSessions.length);
579        assertEquals(0, log.smsSessions.length);
580
581        assertFalse(log.eventsDropped);
582
583        TelephonyEvent event = log.events[0];
584
585        assertEquals(TelephonyEvent.Type.RIL_SERVICE_STATE_CHANGED, event.type);
586
587        TelephonyServiceState state = event.serviceState;
588
589        assertEquals(RadioAccessTechnology.RAT_LTE, state.voiceRat);
590
591        assertEquals(RadioAccessTechnology.RAT_LTE, state.dataRat);
592
593        assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.voiceRoamingType);
594
595        assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.dataRoamingType);
596
597        assertEquals("voicelong", state.voiceOperator.alphaLong);
598
599        assertEquals("voiceshort", state.voiceOperator.alphaShort);
600
601        assertEquals("123456", state.voiceOperator.numeric);
602
603        assertEquals("datalong", state.dataOperator.alphaLong);
604
605        assertEquals("datashort", state.dataOperator.alphaShort);
606
607        assertEquals("123456", state.dataOperator.numeric);
608    }
609
610    // Test reset scenario
611    @Test
612    @SmallTest
613    public void testReset() throws Exception {
614        mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
615        reset();
616        TelephonyLog log = buildProto();
617
618        assertEquals(1, log.events.length);
619        assertEquals(0, log.callSessions.length);
620        assertEquals(0, log.smsSessions.length);
621
622        assertFalse(log.eventsDropped);
623
624        TelephonyEvent event = log.events[0];
625
626        assertEquals(TelephonyEvent.Type.RIL_SERVICE_STATE_CHANGED, event.type);
627
628        TelephonyServiceState state = event.serviceState;
629
630        assertEquals(RadioAccessTechnology.RAT_LTE, state.voiceRat);
631
632        assertEquals(RadioAccessTechnology.RAT_LTE, state.dataRat);
633
634        assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.voiceRoamingType);
635
636        assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.dataRoamingType);
637
638        assertEquals("voicelong", state.voiceOperator.alphaLong);
639
640        assertEquals("voiceshort", state.voiceOperator.alphaShort);
641
642        assertEquals("123456", state.voiceOperator.numeric);
643
644        assertEquals("datalong", state.dataOperator.alphaLong);
645
646        assertEquals("datashort", state.dataOperator.alphaShort);
647
648        assertEquals("123456", state.dataOperator.numeric);
649    }
650
651    // Test Proto Encoding/Decoding
652    @Test
653    @SmallTest
654    public void testProtoEncodingDecoding() throws Exception {
655        mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
656        TelephonyLog log = buildProto();
657        String encodedString = convertProtoToBase64String(log);
658
659        byte[] decodedString = Base64.decode(encodedString, Base64.DEFAULT);
660        assertArrayEquals(TelephonyProto.TelephonyLog.toByteArray(log), decodedString);
661    }
662
663    // Test write ims capabilities changed
664    @Test
665    @SmallTest
666    public void testWriteOnImsCapabilities() throws Exception {
667        MmTelFeature.MmTelCapabilities caps1 = new MmTelFeature.MmTelCapabilities();
668        caps1.addCapabilities(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE);
669        caps1.addCapabilities(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT);
670        mMetrics.writeOnImsCapabilities(mPhone.getPhoneId(),
671                ImsRegistrationImplBase.REGISTRATION_TECH_LTE, caps1);
672        // The duplicate one should be filtered out.
673        mMetrics.writeOnImsCapabilities(mPhone.getPhoneId(),
674                ImsRegistrationImplBase.REGISTRATION_TECH_LTE, caps1);
675        MmTelFeature.MmTelCapabilities caps2 = new MmTelFeature.MmTelCapabilities();
676        caps2.addCapabilities(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO);
677        caps2.addCapabilities(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT);
678        mMetrics.writeOnImsCapabilities(mPhone.getPhoneId(),
679                ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN, caps2);
680        TelephonyLog log = buildProto();
681
682        assertEquals(2, log.events.length);
683        assertEquals(0, log.callSessions.length);
684        assertEquals(0, log.smsSessions.length);
685
686        TelephonyEvent event = log.events[0];
687
688        assertEquals(TelephonyEvent.Type.IMS_CAPABILITIES_CHANGED, event.type);
689        assertEquals(caps1.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
690                event.imsCapabilities.voiceOverLte);
691        assertEquals(caps1.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
692                event.imsCapabilities.videoOverLte);
693        assertEquals(caps1.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT),
694                event.imsCapabilities.utOverLte);
695        assertEquals(false, event.imsCapabilities.voiceOverWifi);
696        assertEquals(false, event.imsCapabilities.videoOverWifi);
697        assertEquals(false, event.imsCapabilities.utOverWifi);
698
699        event = log.events[1];
700
701        assertEquals(TelephonyEvent.Type.IMS_CAPABILITIES_CHANGED, event.type);
702        assertEquals(caps2.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VOICE),
703                event.imsCapabilities.voiceOverWifi);
704        assertEquals(caps2.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_VIDEO),
705                event.imsCapabilities.videoOverWifi);
706        assertEquals(caps2.isCapable(MmTelFeature.MmTelCapabilities.CAPABILITY_TYPE_UT),
707                event.imsCapabilities.utOverWifi);
708        assertEquals(false, event.imsCapabilities.voiceOverLte);
709        assertEquals(false, event.imsCapabilities.videoOverLte);
710        assertEquals(false, event.imsCapabilities.utOverLte);
711    }
712}
713