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}