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.dataconnection; 18 19import android.net.LinkProperties; 20import android.os.AsyncResult; 21import android.os.Handler; 22import android.os.HandlerThread; 23import android.test.suitebuilder.annotation.SmallTest; 24 25import com.android.internal.telephony.DctConstants; 26import com.android.internal.telephony.TelephonyTest; 27import com.android.internal.telephony.dataconnection.DataConnection.ConnectionParams; 28import com.android.internal.telephony.dataconnection.DataConnection.UpdateLinkPropertyResult; 29import com.android.internal.util.IState; 30import com.android.internal.util.StateMachine; 31 32import org.junit.After; 33import org.junit.Before; 34import org.junit.Test; 35import org.mockito.Mock; 36 37import java.lang.reflect.Method; 38import java.util.ArrayList; 39import java.util.HashMap; 40 41import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; 42import static org.junit.Assert.assertEquals; 43import static org.junit.Assert.fail; 44import static org.mockito.Mockito.any; 45import static org.mockito.Mockito.doReturn; 46import static org.mockito.Mockito.eq; 47import static org.mockito.Mockito.times; 48import static org.mockito.Mockito.verify; 49 50public class DcControllerTest extends TelephonyTest { 51 52 private static final int DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT = 1; 53 private static final int EVENT_DATA_STATE_CHANGED = 0x00040007; 54 55 @Mock 56 DataConnection mDc; 57 @Mock 58 HashMap<ApnContext, ConnectionParams> mApnContexts; 59 60 UpdateLinkPropertyResult mResult; 61 62 private DcController mDcc; 63 private DcControllerTestHandler mDcControllerTestHandler; 64 65 private class DcControllerTestHandler extends HandlerThread { 66 67 private DcControllerTestHandler(String name) { 68 super(name); 69 } 70 71 private Handler mHandler; 72 73 @Override 74 public void onLooperPrepared() { 75 mHandler = new Handler(); 76 mDcc = DcController.makeDcc(mPhone, mDcTracker, mHandler); 77 setReady(true); 78 } 79 } 80 81 private IState getCurrentState() { 82 try { 83 Method method = StateMachine.class.getDeclaredMethod("getCurrentState"); 84 method.setAccessible(true); 85 return (IState) method.invoke(mDcc); 86 } catch (Exception e) { 87 fail(e.toString()); 88 return null; 89 } 90 } 91 92 @Before 93 public void setUp() throws Exception { 94 super.setUp(getClass().getSimpleName()); 95 96 doReturn("fake.action_detached").when(mPhone).getActionDetached(); 97 mDc.mApnContexts = mApnContexts; 98 doReturn(1).when(mApnContexts).size(); 99 100 LinkProperties lp = new LinkProperties(); 101 mResult = new UpdateLinkPropertyResult(lp); 102 doReturn(mResult).when(mDc).updateLinkProperty(any(DataCallResponse.class)); 103 104 mDcControllerTestHandler = new DcControllerTestHandler(TAG); 105 mDcControllerTestHandler.start(); 106 waitUntilReady(); 107 } 108 109 @After 110 public void tearDown() throws Exception { 111 mDcControllerTestHandler.quitSafely(); 112 super.tearDown(); 113 } 114 115 @Test 116 @SmallTest 117 public void testDataDormant() { 118 assertEquals("DccDefaultState", getCurrentState().getName()); 119 ArrayList<DataCallResponse> l = new ArrayList<DataCallResponse>(); 120 DataCallResponse dcResponse = DcTrackerTest.createDataCallResponse(); 121 dcResponse.active = DATA_CONNECTION_ACTIVE_PH_LINK_DORMANT; 122 l.add(dcResponse); 123 124 mDc.mCid = 1; 125 mDcc.addActiveDcByCid(mDc); 126 127 mDcc.sendMessage(EVENT_DATA_STATE_CHANGED, new AsyncResult(null, l, null)); 128 waitForMs(100); 129 130 verify(mDcTracker, times(1)).sendStopNetStatPoll(eq(DctConstants.Activity.DORMANT)); 131 } 132}