/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.internal.telephony.metrics;
import android.telephony.ServiceState;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Base64;
import com.android.ims.ImsConfig;
import com.android.ims.ImsReasonInfo;
import com.android.ims.internal.ImsCallSession;
import com.android.internal.telephony.Call;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.SmsResponse;
import com.android.internal.telephony.TelephonyProto;
import com.android.internal.telephony.TelephonyProto.ImsConnectionState;
import com.android.internal.telephony.TelephonyProto.SmsSession;
import com.android.internal.telephony.TelephonyProto.RadioAccessTechnology;
import com.android.internal.telephony.TelephonyProto.TelephonyCallSession;
import com.android.internal.telephony.TelephonyProto.TelephonyCallSession.Event.CallState;
import com.android.internal.telephony.TelephonyProto.TelephonyCallSession.Event.ImsCommand;
import com.android.internal.telephony.TelephonyProto.TelephonyEvent;
import com.android.internal.telephony.TelephonyProto.TelephonyLog;
import com.android.internal.telephony.TelephonyProto.TelephonyServiceState;
import com.android.internal.telephony.TelephonyProto.TelephonyServiceState.RoamingType;
import com.android.internal.telephony.TelephonyTest;
import com.android.internal.telephony.UUSInfo;
import com.android.internal.telephony.dataconnection.DataCallResponse;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import java.lang.reflect.Method;
import static android.telephony.ServiceState.RIL_RADIO_TECHNOLOGY_LTE;
import static android.telephony.ServiceState.ROAMING_TYPE_DOMESTIC;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_DEACTIVATE_DATA_CALL;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SEND_SMS;
import static com.android.internal.telephony.RILConstants.RIL_REQUEST_SETUP_DATA_CALL;
import static com.android.internal.telephony.TelephonyProto.PdpType.PDP_TYPE_IPV4V6;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;
public class TelephonyMetricsTest extends TelephonyTest {
@Mock
private ImsCallSession mImsCallSession;
@Mock
private ImsReasonInfo mImsReasonInfo;
@Mock
private ServiceState mServiceState;
private TelephonyMetrics mMetrics;
private UUSInfo mUusInfo;
@Before
public void setUp() throws Exception {
super.setUp(getClass().getSimpleName());
mMetrics = new TelephonyMetrics();
mUusInfo = new UUSInfo(1, 2, new byte[]{1, 2});
doReturn("123").when(mImsCallSession).getCallId();
doReturn("extramessage").when(mImsReasonInfo).getExtraMessage();
doReturn(123).when(mImsReasonInfo).getCode();
doReturn(456).when(mImsReasonInfo).getExtraCode();
doReturn(ROAMING_TYPE_DOMESTIC).when(mServiceState).getVoiceRoamingType();
doReturn(ROAMING_TYPE_DOMESTIC).when(mServiceState).getDataRoamingType();
doReturn("voiceshort").when(mServiceState).getVoiceOperatorAlphaShort();
doReturn("voicelong").when(mServiceState).getVoiceOperatorAlphaLong();
doReturn("datashort").when(mServiceState).getDataOperatorAlphaShort();
doReturn("datalong").when(mServiceState).getDataOperatorAlphaLong();
doReturn("123456").when(mServiceState).getVoiceOperatorNumeric();
doReturn("123456").when(mServiceState).getDataOperatorNumeric();
doReturn(RIL_RADIO_TECHNOLOGY_LTE).when(mServiceState).getRilVoiceRadioTechnology();
doReturn(RIL_RADIO_TECHNOLOGY_LTE).when(mServiceState).getRilDataRadioTechnology();
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
private TelephonyLog buildProto() throws Exception {
Method method = TelephonyMetrics.class.getDeclaredMethod("buildProto");
method.setAccessible(true);
return (TelephonyLog) method.invoke(mMetrics);
}
private void reset() throws Exception {
Method method = TelephonyMetrics.class.getDeclaredMethod("reset");
method.setAccessible(true);
method.invoke(mMetrics);
}
private String convertProtoToBase64String(TelephonyLog log) throws Exception {
Class[] cArgs = new Class[1];
cArgs[0] = TelephonyLog.class;
Method method = TelephonyMetrics.class.getDeclaredMethod("convertProtoToBase64String",
cArgs);
method.setAccessible(true);
return (String) method.invoke(null, log);
}
@Test
@SmallTest
public void testEventDropped() throws Exception {
for (int i = 0; i < 1001; i++) {
mMetrics.writeDataStallEvent(mPhone.getPhoneId(), i);
}
TelephonyLog log = buildProto();
assertEquals(1000, log.events.length);
assertEquals(0, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.hasEventsDropped());
assertTrue(log.getEventsDropped());
assertEquals(1, log.events[0].getDataStallAction());
}
// Test write data stall event
@Test
@SmallTest
public void testWriteDataStallEvent() throws Exception {
mMetrics.writeDataStallEvent(mPhone.getPhoneId(), 3);
TelephonyLog log = buildProto();
assertEquals(1, log.events.length);
assertEquals(0, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.events[0].hasPhoneId());
assertEquals(mPhone.getPhoneId(), log.events[0].getPhoneId());
assertEquals(3, log.events[0].getDataStallAction());
}
// Test write on IMS call start
@Test
@SmallTest
public void testWriteOnImsCallStart() throws Exception {
mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
TelephonyLog log = buildProto();
assertEquals(0, log.events.length);
assertEquals(1, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.callSessions[0].hasPhoneId());
assertEquals(mPhone.getPhoneId(), log.callSessions[0].getPhoneId());
assertTrue(log.callSessions[0].hasEventsDropped());
assertFalse(log.callSessions[0].getEventsDropped());
assertTrue(log.callSessions[0].hasStartTimeMinutes());
assertEquals(1, log.callSessions[0].events.length);
assertTrue(log.callSessions[0].events[0].hasCallIndex());
assertEquals(123, log.callSessions[0].events[0].getCallIndex());
assertTrue(log.callSessions[0].events[0].hasImsCommand());
assertEquals(ImsCommand.IMS_CMD_START, log.callSessions[0].events[0].getImsCommand());
}
// Test write ims call state
@Test
@SmallTest
public void testWriteImsCallState() throws Exception {
mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
mMetrics.writeImsCallState(mPhone.getPhoneId(), mImsCallSession, Call.State.ACTIVE);
mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
TelephonyLog log = buildProto();
assertEquals(0, log.events.length);
assertEquals(1, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertEquals(2, log.callSessions[0].events.length);
assertTrue(log.callSessions[0].hasEventsDropped());
assertFalse(log.callSessions[0].getEventsDropped());
assertTrue(log.callSessions[0].events[1].hasCallIndex());
assertEquals(123, log.callSessions[0].events[1].getCallIndex());
assertTrue(log.callSessions[0].events[1].hasCallState());
assertEquals(CallState.CALL_ACTIVE, log.callSessions[0].events[1].getCallState());
}
// Test write ims set feature value
@Test
@SmallTest
public void testWriteImsSetFeatureValue() throws Exception {
mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
mMetrics.writeImsSetFeatureValue(mPhone.getPhoneId(),
ImsConfig.FeatureConstants.FEATURE_TYPE_VOICE_OVER_LTE, 0, 1, 0);
mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
TelephonyLog log = buildProto();
assertEquals(1, log.events.length);
assertEquals(1, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertEquals(2, log.callSessions[0].events.length);
assertTrue(log.callSessions[0].hasEventsDropped());
assertFalse(log.callSessions[0].getEventsDropped());
assertTrue(log.callSessions[0].events[1].settings.hasIsEnhanced4GLteModeEnabled());
assertTrue(log.callSessions[0].events[1].settings.getIsEnhanced4GLteModeEnabled());
}
// Test write on ims call handover event
@Test
@SmallTest
public void testWriteOnImsCallHandoverEvent() throws Exception {
mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
mMetrics.writeOnImsCallHandoverEvent(mPhone.getPhoneId(),
TelephonyCallSession.Event.Type.IMS_CALL_HANDOVER, mImsCallSession, 5, 6,
mImsReasonInfo);
mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
TelephonyLog log = buildProto();
assertEquals(0, log.events.length);
assertEquals(1, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertEquals(2, log.callSessions[0].events.length);
assertTrue(log.callSessions[0].hasEventsDropped());
assertFalse(log.callSessions[0].getEventsDropped());
assertTrue(log.callSessions[0].events[1].hasType());
assertEquals(TelephonyCallSession.Event.Type.IMS_CALL_HANDOVER,
log.callSessions[0].events[1].getType());
assertTrue(log.callSessions[0].events[1].hasCallIndex());
assertEquals(123, log.callSessions[0].events[1].getCallIndex());
assertTrue(log.callSessions[0].events[1].hasSrcAccessTech());
assertEquals(5, log.callSessions[0].events[1].getSrcAccessTech());
assertTrue(log.callSessions[0].events[1].hasTargetAccessTech());
assertEquals(6, log.callSessions[0].events[1].getTargetAccessTech());
assertTrue(log.callSessions[0].events[1].reasonInfo.hasExtraMessage());
assertEquals("extramessage", log.callSessions[0].events[1].reasonInfo.getExtraMessage());
assertTrue(log.callSessions[0].events[1].reasonInfo.hasExtraCode());
assertEquals(456, log.callSessions[0].events[1].reasonInfo.getExtraCode());
assertTrue(log.callSessions[0].events[1].reasonInfo.hasReasonCode());
assertEquals(123, log.callSessions[0].events[1].reasonInfo.getReasonCode());
}
// Test write on ims command
@Test
@SmallTest
public void testWriteOnImsCommand() throws Exception {
mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
mMetrics.writeOnImsCommand(mPhone.getPhoneId(), mImsCallSession, 123);
mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
TelephonyLog log = buildProto();
assertEquals(0, log.events.length);
assertEquals(1, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertEquals(2, log.callSessions[0].events.length);
assertTrue(log.callSessions[0].hasEventsDropped());
assertFalse(log.callSessions[0].getEventsDropped());
assertTrue(log.callSessions[0].events[1].hasType());
assertEquals(TelephonyCallSession.Event.Type.IMS_COMMAND,
log.callSessions[0].events[1].getType());
assertTrue(log.callSessions[0].events[1].hasImsCommand());
assertEquals(123, log.callSessions[0].events[1].getImsCommand());
assertTrue(log.callSessions[0].events[1].hasCallIndex());
assertEquals(123, log.callSessions[0].events[1].getCallIndex());
}
// Test write on ims connection state
@Test
@SmallTest
public void testWriteOnImsConnectionState() throws Exception {
mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
mMetrics.writeOnImsConnectionState(mPhone.getPhoneId(),
ImsConnectionState.State.CONNECTED, mImsReasonInfo);
mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
TelephonyLog log = buildProto();
assertEquals(1, log.events.length);
assertEquals(1, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertEquals(2, log.callSessions[0].events.length);
assertTrue(log.hasEventsDropped());
assertFalse(log.getEventsDropped());
assertTrue(log.events[0].hasType());
assertEquals(TelephonyEvent.Type.IMS_CONNECTION_STATE_CHANGED, log.events[0].getType());
assertTrue(log.events[0].imsConnectionState.hasState());
assertEquals(ImsConnectionState.State.CONNECTED,
log.events[0].imsConnectionState.getState());
assertTrue(log.events[0].imsConnectionState.reasonInfo.hasReasonCode());
assertEquals(123, log.events[0].imsConnectionState.reasonInfo.getReasonCode());
assertTrue(log.events[0].imsConnectionState.reasonInfo.hasExtraCode());
assertEquals(456, log.events[0].imsConnectionState.reasonInfo.getExtraCode());
assertTrue(log.events[0].imsConnectionState.reasonInfo.hasExtraMessage());
assertEquals("extramessage", log.events[0].imsConnectionState.reasonInfo.getExtraMessage());
assertTrue(log.callSessions[0].hasEventsDropped());
assertFalse(log.callSessions[0].getEventsDropped());
assertTrue(log.callSessions[0].events[1].hasType());
assertEquals(TelephonyCallSession.Event.Type.IMS_CONNECTION_STATE_CHANGED,
log.callSessions[0].events[1].getType());
assertTrue(log.callSessions[0].events[1].imsConnectionState.hasState());
assertEquals(ImsConnectionState.State.CONNECTED,
log.callSessions[0].events[1].imsConnectionState.getState());
}
// Test write on setup data call response
@Test
@SmallTest
public void testWriteOnSetupDataCallResponse() throws Exception {
DataCallResponse response = new DataCallResponse();
response.status = 5;
response.suggestedRetryTime = 6;
response.cid = 7;
response.active = 8;
response.type = "IPV4V6";
response.ifname = "ifname";
mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 1, 2,
RIL_REQUEST_SETUP_DATA_CALL, response);
TelephonyLog log = buildProto();
assertEquals(1, log.events.length);
assertEquals(0, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.hasEventsDropped());
assertFalse(log.getEventsDropped());
TelephonyEvent.RilSetupDataCallResponse respProto = log.events[0].setupDataCallResponse;
assertTrue(respProto.hasStatus());
assertEquals(5, respProto.getStatus());
assertTrue(respProto.hasSuggestedRetryTimeMillis());
assertEquals(6, respProto.getSuggestedRetryTimeMillis());
assertTrue(respProto.call.hasCid());
assertEquals(7, respProto.call.getCid());
assertTrue(respProto.call.hasType());
assertEquals(PDP_TYPE_IPV4V6, respProto.call.getType());
assertTrue(respProto.call.hasIframe());
assertEquals("ifname", respProto.call.getIframe());
}
// Test write on deactivate data call response
@Test
@SmallTest
public void testWriteOnDeactivateDataCallResponse() throws Exception {
mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 2, 3,
RIL_REQUEST_DEACTIVATE_DATA_CALL, null);
TelephonyLog log = buildProto();
assertEquals(1, log.events.length);
assertEquals(0, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.hasEventsDropped());
assertFalse(log.getEventsDropped());
assertTrue(log.events[0].hasType());
assertEquals(TelephonyEvent.Type.DATA_CALL_DEACTIVATE_RESPONSE, log.events[0].getType());
assertTrue(log.events[0].hasError());
assertEquals(4, log.events[0].getError());
}
// Test write RIL send SMS
@Test
@SmallTest
public void testWriteRilSendSms() throws Exception {
mMetrics.writeRilSendSms(mPhone.getPhoneId(), 1, 2, 1);
mMetrics.writeRilSendSms(mPhone.getPhoneId(), 4, 5, 2);
SmsResponse response = new SmsResponse(0, null, 123);
mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 1, 0, RIL_REQUEST_SEND_SMS,
response);
response = new SmsResponse(0, null, 456);
mMetrics.writeOnRilSolicitedResponse(mPhone.getPhoneId(), 4, 0, RIL_REQUEST_SEND_SMS,
response);
TelephonyLog log = buildProto();
assertEquals(0, log.events.length);
assertEquals(0, log.callSessions.length);
assertEquals(1, log.smsSessions.length);
assertTrue(log.hasEventsDropped());
assertFalse(log.getEventsDropped());
SmsSession.Event[] events = log.smsSessions[0].events;
assertEquals(4, events.length);
assertTrue(events[0].hasType());
assertEquals(SmsSession.Event.Type.SMS_SEND, events[0].getType());
assertTrue(events[0].hasRilRequestId());
assertEquals(1, events[0].getRilRequestId());
assertTrue(events[0].hasTech());
assertEquals(2, events[0].getTech());
assertTrue(events[0].hasFormat());
assertEquals(1, events[0].getFormat());
assertTrue(events[1].hasType());
assertEquals(SmsSession.Event.Type.SMS_SEND, events[1].getType());
assertTrue(events[1].hasRilRequestId());
assertEquals(4, events[1].getRilRequestId());
assertTrue(events[1].hasTech());
assertEquals(5, events[1].getTech());
assertTrue(events[1].hasFormat());
assertEquals(2, events[1].getFormat());
assertTrue(events[2].hasType());
assertEquals(SmsSession.Event.Type.SMS_SEND_RESULT, events[2].getType());
assertTrue(events[2].hasRilRequestId());
assertEquals(1, events[2].getRilRequestId());
assertTrue(events[2].hasError());
assertEquals(0, events[2].getError());
assertTrue(events[2].hasErrorCode());
assertEquals(123, events[2].getErrorCode());
assertTrue(events[3].hasType());
assertEquals(SmsSession.Event.Type.SMS_SEND_RESULT, events[3].getType());
assertTrue(events[3].hasRilRequestId());
assertEquals(4, events[3].getRilRequestId());
assertTrue(events[3].hasError());
assertEquals(0, events[3].getError());
assertTrue(events[3].hasErrorCode());
assertEquals(456, events[3].getErrorCode());
}
// Test write phone state
@Test
@SmallTest
public void testWritePhoneState() throws Exception {
mMetrics.writeOnImsCallStart(mPhone.getPhoneId(), mImsCallSession);
mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.OFFHOOK);
mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
TelephonyLog log = buildProto();
assertEquals(0, log.events.length);
assertEquals(1, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.hasEventsDropped());
assertFalse(log.getEventsDropped());
assertTrue(log.callSessions[0].hasPhoneId());
assertEquals(mPhone.getPhoneId(), log.callSessions[0].getPhoneId());
assertEquals(2, log.callSessions[0].events.length);
assertTrue(log.callSessions[0].events[1].hasType());
assertEquals(TelephonyCallSession.Event.Type.PHONE_STATE_CHANGED,
log.callSessions[0].events[1].getType());
assertTrue(log.callSessions[0].events[1].hasPhoneState());
assertEquals(TelephonyCallSession.Event.PhoneState.STATE_OFFHOOK,
log.callSessions[0].events[1].getPhoneState());
}
// Test write RIL dial and hangup
@Test
@SmallTest
public void testWriteRilDialHangup() throws Exception {
mMetrics.writeRilDial(mPhone.getPhoneId(), 1, 2, mUusInfo);
mMetrics.writeRilHangup(mPhone.getPhoneId(), 2, 3);
mMetrics.writePhoneState(mPhone.getPhoneId(), PhoneConstants.State.IDLE);
TelephonyLog log = buildProto();
assertEquals(0, log.events.length);
assertEquals(1, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.hasEventsDropped());
assertFalse(log.getEventsDropped());
TelephonyCallSession.Event[] events = log.callSessions[0].events;
assertEquals(2, events.length);
assertTrue(events[0].hasType());
assertEquals(TelephonyCallSession.Event.Type.RIL_REQUEST, events[0].getType());
assertTrue(events[0].hasRilRequest());
assertEquals(TelephonyCallSession.Event.RilRequest.RIL_REQUEST_DIAL,
events[0].getRilRequest());
assertTrue(events[0].hasRilRequestId());
assertEquals(1, events[0].getRilRequestId());
assertTrue(events[1].hasType());
assertEquals(TelephonyCallSession.Event.Type.RIL_REQUEST, events[1].getType());
assertTrue(events[1].hasRilRequest());
assertEquals(TelephonyCallSession.Event.RilRequest.RIL_REQUEST_HANGUP,
events[1].getRilRequest());
assertTrue(events[1].hasCallIndex());
assertEquals(3, events[1].getCallIndex());
}
// Test write RIL setup data call
@Test
@SmallTest
public void testWriteRilSetupDataCall() throws Exception {
mMetrics.writeRilSetupDataCall(
mPhone.getPhoneId(), 1, 14, 3, "apn", 0, "IPV4V6");
TelephonyLog log = buildProto();
assertEquals(1, log.events.length);
assertEquals(0, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.hasEventsDropped());
assertFalse(log.getEventsDropped());
assertTrue(log.events[0].hasType());
assertEquals(TelephonyEvent.Type.DATA_CALL_SETUP, log.events[0].getType());
TelephonyEvent.RilSetupDataCall setupDataCall = log.events[0].setupDataCall;
assertTrue(setupDataCall.hasApn());
assertEquals("apn", setupDataCall.getApn());
assertTrue(setupDataCall.hasRat());
assertEquals(14, setupDataCall.getRat());
assertTrue(setupDataCall.hasDataProfile());
assertEquals(4, setupDataCall.getDataProfile());
assertTrue(setupDataCall.hasType());
assertEquals(PDP_TYPE_IPV4V6, setupDataCall.getType());
}
// Test write service state changed
@Test
@SmallTest
public void testWriteServiceStateChanged() throws Exception {
mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
TelephonyLog log = buildProto();
assertEquals(1, log.events.length);
assertEquals(0, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.hasEventsDropped());
assertFalse(log.getEventsDropped());
TelephonyEvent event = log.events[0];
assertTrue(event.hasType());
assertEquals(TelephonyEvent.Type.RIL_SERVICE_STATE_CHANGED, event.getType());
TelephonyServiceState state = event.serviceState;
assertTrue(state.hasVoiceRat());
assertEquals(RadioAccessTechnology.RAT_LTE, state.getVoiceRat());
assertTrue(state.hasDataRat());
assertEquals(RadioAccessTechnology.RAT_LTE, state.getDataRat());
assertTrue(state.hasVoiceRoamingType());
assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.getVoiceRoamingType());
assertTrue(state.hasDataRoamingType());
assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.getDataRoamingType());
assertTrue(state.voiceOperator.hasAlphaLong());
assertEquals("voicelong", state.voiceOperator.getAlphaLong());
assertTrue(state.voiceOperator.hasAlphaShort());
assertEquals("voiceshort", state.voiceOperator.getAlphaShort());
assertTrue(state.voiceOperator.hasNumeric());
assertEquals("123456", state.voiceOperator.getNumeric());
assertTrue(state.dataOperator.hasAlphaLong());
assertEquals("datalong", state.dataOperator.getAlphaLong());
assertTrue(state.dataOperator.hasAlphaShort());
assertEquals("datashort", state.dataOperator.getAlphaShort());
assertTrue(state.dataOperator.hasNumeric());
assertEquals("123456", state.dataOperator.getNumeric());
}
// Test reset scenario
@Test
@SmallTest
public void testReset() throws Exception {
mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
reset();
TelephonyLog log = buildProto();
assertEquals(1, log.events.length);
assertEquals(0, log.callSessions.length);
assertEquals(0, log.smsSessions.length);
assertTrue(log.hasEventsDropped());
assertFalse(log.getEventsDropped());
TelephonyEvent event = log.events[0];
assertTrue(event.hasType());
assertEquals(TelephonyEvent.Type.RIL_SERVICE_STATE_CHANGED, event.getType());
TelephonyServiceState state = event.serviceState;
assertTrue(state.hasVoiceRat());
assertEquals(RadioAccessTechnology.RAT_LTE, state.getVoiceRat());
assertTrue(state.hasDataRat());
assertEquals(RadioAccessTechnology.RAT_LTE, state.getDataRat());
assertTrue(state.hasVoiceRoamingType());
assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.getVoiceRoamingType());
assertTrue(state.hasDataRoamingType());
assertEquals(RoamingType.ROAMING_TYPE_DOMESTIC, state.getDataRoamingType());
assertTrue(state.voiceOperator.hasAlphaLong());
assertEquals("voicelong", state.voiceOperator.getAlphaLong());
assertTrue(state.voiceOperator.hasAlphaShort());
assertEquals("voiceshort", state.voiceOperator.getAlphaShort());
assertTrue(state.voiceOperator.hasNumeric());
assertEquals("123456", state.voiceOperator.getNumeric());
assertTrue(state.dataOperator.hasAlphaLong());
assertEquals("datalong", state.dataOperator.getAlphaLong());
assertTrue(state.dataOperator.hasAlphaShort());
assertEquals("datashort", state.dataOperator.getAlphaShort());
assertTrue(state.dataOperator.hasNumeric());
assertEquals("123456", state.dataOperator.getNumeric());
}
// Test Proto Encoding/Decoding
@Test
@SmallTest
public void testProtoEncodingDecoding() throws Exception {
mMetrics.writeServiceStateChanged(mPhone.getPhoneId(), mServiceState);
TelephonyLog log = buildProto();
String encodedString = convertProtoToBase64String(log);
byte[] decodedString = Base64.decode(encodedString, Base64.DEFAULT);
assertArrayEquals(TelephonyProto.TelephonyLog.toByteArray(log), decodedString);
}
}