1 /* 2 * Copyright (C) 2010 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 17 package com.android.internal.telephony.mockril; 18 19 import android.util.Log; 20 import android.test.InstrumentationTestCase; 21 22 import java.io.IOException; 23 import java.nio.ByteBuffer; 24 25 import com.android.internal.communication.MsgHeader; 26 import com.android.internal.communication.Msg; 27 import com.android.internal.telephony.RilChannel; 28 import com.android.internal.telephony.ril_proto.RilCtrlCmds; 29 import com.android.internal.telephony.ril_proto.RilCmds; 30 31 import com.android.frameworks.telephonytests.TelephonyMockRilTestRunner; 32 import com.google.protobuf.micro.InvalidProtocolBufferMicroException; 33 34 // Test suite for test ril 35 public class MockRilTest extends InstrumentationTestCase { 36 private static final String TAG = "MockRilTest"; 37 38 RilChannel mMockRilChannel; 39 TelephonyMockRilTestRunner mRunner; 40 41 @Override 42 protected void setUp() throws Exception { 43 super.setUp(); 44 mRunner = (TelephonyMockRilTestRunner)getInstrumentation(); 45 mMockRilChannel = mRunner.mMockRilChannel; 46 } 47 48 @Override 49 protected void tearDown() throws Exception { 50 super.tearDown(); 51 } 52 53 static void log(String s) { 54 Log.v(TAG, s); 55 } 56 57 /** 58 * Test Case 1: Test protobuf serialization and deserialization 59 * @throws InvalidProtocolBufferMicroException 60 */ 61 public void testProtobufSerDes() throws InvalidProtocolBufferMicroException { 62 log("testProtobufSerdes E"); 63 64 RilCtrlCmds.CtrlRspRadioState rs = new RilCtrlCmds.CtrlRspRadioState(); 65 assertTrue(String.format("expected rs.state == 0 was %d", rs.getState()), 66 rs.getState() == 0); 67 rs.setState(1); 68 assertTrue(String.format("expected rs.state == 1 was %d", rs.getState()), 69 rs.getState() == 1); 70 71 byte[] rs_ser = rs.toByteArray(); 72 RilCtrlCmds.CtrlRspRadioState rsNew = RilCtrlCmds.CtrlRspRadioState.parseFrom(rs_ser); 73 assertTrue(String.format("expected rsNew.state == 1 was %d", rs.getState()), 74 rs.getState() == 1); 75 76 log("testProtobufSerdes X"); 77 } 78 79 /** 80 * Test case 2: Test echo command works using writeMsg & readMsg 81 */ 82 public void testEchoMsg() throws IOException { 83 log("testEchoMsg E"); 84 85 MsgHeader mh = new MsgHeader(); 86 mh.setCmd(0); 87 mh.setToken(1); 88 mh.setStatus(2); 89 ByteBuffer data = ByteBuffer.allocate(3); 90 data.put((byte)3); 91 data.put((byte)4); 92 data.put((byte)5); 93 Msg.send(mMockRilChannel, mh, data); 94 95 Msg respMsg = Msg.recv(mMockRilChannel); 96 assertTrue(String.format("expected mhd.header.cmd == 0 was %d",respMsg.getCmd()), 97 respMsg.getCmd() == 0); 98 assertTrue(String.format("expected mhd.header.token == 1 was %d",respMsg.getToken()), 99 respMsg.getToken() == 1); 100 assertTrue(String.format("expected mhd.header.status == 2 was %d", respMsg.getStatus()), 101 respMsg.getStatus() == 2); 102 assertTrue(String.format("expected mhd.data[0] == 3 was %d", respMsg.getData(0)), 103 respMsg.getData(0) == 3); 104 assertTrue(String.format("expected mhd.data[1] == 4 was %d", respMsg.getData(1)), 105 respMsg.getData(1) == 4); 106 assertTrue(String.format("expected mhd.data[2] == 5 was %d", respMsg.getData(2)), 107 respMsg.getData(2) == 5); 108 109 log("testEchoMsg X"); 110 } 111 112 /** 113 * Test case 3: Test get as 114 */ 115 public void testGetAs() { 116 log("testGetAs E"); 117 118 // Use a message header as the protobuf data content 119 MsgHeader mh = new MsgHeader(); 120 mh.setCmd(12345); 121 mh.setToken(9876); 122 mh.setStatus(7654); 123 mh.setLengthData(4321); 124 byte[] data = mh.toByteArray(); 125 MsgHeader mhResult = Msg.getAs(MsgHeader.class, data); 126 127 assertTrue(String.format("expected cmd == 12345 was %d", mhResult.getCmd()), 128 mhResult.getCmd() == 12345); 129 assertTrue(String.format("expected token == 9876 was %d", mhResult.getToken()), 130 mhResult.getToken() == 9876); 131 assertTrue(String.format("expected status == 7654 was %d", mhResult.getStatus()), 132 mhResult.getStatus() == 7654); 133 assertTrue(String.format("expected lengthData == 4321 was %d", mhResult.getLengthData()), 134 mhResult.getLengthData() == 4321); 135 136 Msg msg = Msg.obtain(); 137 msg.setData(ByteBuffer.wrap(data)); 138 139 mhResult = msg.getDataAs(MsgHeader.class); 140 141 assertTrue(String.format("expected cmd == 12345 was %d", mhResult.getCmd()), 142 mhResult.getCmd() == 12345); 143 assertTrue(String.format("expected token == 9876 was %d", mhResult.getToken()), 144 mhResult.getToken() == 9876); 145 assertTrue(String.format("expected status == 7654 was %d", mhResult.getStatus()), 146 mhResult.getStatus() == 7654); 147 assertTrue(String.format("expected lengthData == 4321 was %d", mhResult.getLengthData()), 148 mhResult.getLengthData() == 4321); 149 150 log("testGetAs X"); 151 } 152 153 /** 154 * Test case 3: test get radio state 155 */ 156 public void testGetRadioState() throws IOException { 157 log("testGetRadioState E"); 158 159 Msg.send(mMockRilChannel, 1, 9876, 0, null); 160 161 Msg resp = Msg.recv(mMockRilChannel); 162 //resp.printHeader("testGetRadioState"); 163 164 assertTrue(String.format("expected cmd == 1 was %d", resp.getCmd()), 165 resp.getCmd() == 1); 166 assertTrue(String.format("expected token == 9876 was %d", resp.getToken()), 167 resp.getToken() == 9876); 168 assertTrue(String.format("expected status == 0 was %d", resp.getStatus()), 169 resp.getStatus() == 0); 170 171 RilCtrlCmds.CtrlRspRadioState rsp = resp.getDataAs(RilCtrlCmds.CtrlRspRadioState.class); 172 173 int state = rsp.getState(); 174 log("testGetRadioState state=" + state); 175 assertTrue(String.format("expected RadioState >= 0 && RadioState <= 9 was %d", state), 176 ((state >= 0) && (state <= 9))); 177 178 log("testGetRadioState X"); 179 } 180 181 /** 182 * Test case 5: test set radio state 183 */ 184 public void testSetRadioState() throws IOException { 185 log("testSetRadioState E"); 186 187 RilCtrlCmds.CtrlReqRadioState cmdrs = new RilCtrlCmds.CtrlReqRadioState(); 188 assertEquals(0, cmdrs.getState()); 189 190 cmdrs.setState(RilCmds.RADIOSTATE_SIM_NOT_READY); 191 assertEquals(2, cmdrs.getState()); 192 193 Msg.send(mMockRilChannel, RilCtrlCmds.CTRL_CMD_SET_RADIO_STATE, 0, 0, cmdrs); 194 195 Msg resp = Msg.recv(mMockRilChannel); 196 log("get response status :" + resp.getStatus()); 197 log("get response for command: " + resp.getCmd()); 198 log("get command token: " + resp.getToken()); 199 200 RilCtrlCmds.CtrlRspRadioState rsp = resp.getDataAs(RilCtrlCmds.CtrlRspRadioState.class); 201 202 int state = rsp.getState(); 203 log("get response for testSetRadioState: " + state); 204 assertTrue(RilCmds.RADIOSTATE_SIM_NOT_READY == state); 205 } 206 207 /** 208 * Test case 6: test start incoming call and hangup it. 209 */ 210 public void testStartIncomingCallAndHangup() throws IOException { 211 log("testStartIncomingCallAndHangup"); 212 RilCtrlCmds.CtrlReqSetMTCall cmd = new RilCtrlCmds.CtrlReqSetMTCall(); 213 String incomingCall = "6502889108"; 214 // set the MT call 215 cmd.setPhoneNumber(incomingCall); 216 Msg.send(mMockRilChannel, RilCtrlCmds.CTRL_CMD_SET_MT_CALL, 0, 0, cmd); 217 // get response 218 Msg resp = Msg.recv(mMockRilChannel); 219 log("Get response status: " + resp.getStatus()); 220 assertTrue("The ril is not in a proper state to set MT calls.", 221 resp.getStatus() == RilCtrlCmds.CTRL_STATUS_OK); 222 223 // allow the incoming call alerting for some time 224 try { 225 Thread.sleep(5000); 226 } catch (InterruptedException e) {} 227 228 // we are playing a trick to assume the current is 1 229 RilCtrlCmds.CtrlHangupConnRemote hangupCmd = new RilCtrlCmds.CtrlHangupConnRemote(); 230 hangupCmd.setConnectionId(1); 231 hangupCmd.setCallFailCause(16); // normal hangup 232 Msg.send(mMockRilChannel, RilCtrlCmds.CTRL_CMD_HANGUP_CONN_REMOTE, 0, 0, hangupCmd); 233 234 // get response 235 resp = Msg.recv(mMockRilChannel); 236 log("Get response for hangup connection: " + resp.getStatus()); 237 assertTrue("CTRL_CMD_HANGUP_CONN_REMOTE failed", 238 resp.getStatus() == RilCtrlCmds.CTRL_STATUS_OK); 239 } 240 241 /** 242 * Test case 7: test set call transition flag 243 */ 244 public void testSetCallTransitionFlag() throws IOException { 245 log("testSetCallTransitionFlag"); 246 // Set flag to true: 247 RilCtrlCmds.CtrlSetCallTransitionFlag cmd = new RilCtrlCmds.CtrlSetCallTransitionFlag(); 248 cmd.setFlag(true); 249 Msg.send(mMockRilChannel, RilCtrlCmds.CTRL_CMD_SET_CALL_TRANSITION_FLAG, 0, 0, cmd); 250 251 Msg resp = Msg.recv(mMockRilChannel); 252 log("Get response status: " + resp.getStatus()); 253 assertTrue("Set call transition flag failed", 254 resp.getStatus() == RilCtrlCmds.CTRL_STATUS_OK); 255 256 // add a dialing call 257 RilCtrlCmds.CtrlReqAddDialingCall cmdDialCall = new RilCtrlCmds.CtrlReqAddDialingCall(); 258 String phoneNumber = "5102345678"; 259 cmdDialCall.setPhoneNumber(phoneNumber); 260 Msg.send(mMockRilChannel, RilCtrlCmds.CTRL_CMD_ADD_DIALING_CALL, 0, 0, cmdDialCall); 261 resp = Msg.recv(mMockRilChannel); 262 log("Get response status for adding a dialing call: " + resp.getStatus()); 263 assertTrue("add dialing call failed", 264 resp.getStatus() == RilCtrlCmds.CTRL_STATUS_OK); 265 try { 266 Thread.sleep(5000); 267 } catch (InterruptedException e) {} 268 269 // send command to force call state change 270 Msg.send(mMockRilChannel, RilCtrlCmds.CTRL_CMD_SET_CALL_ALERT, 0, 0, null); 271 resp = Msg.recv(mMockRilChannel); 272 log("Get response status: " + resp.getStatus()); 273 assertTrue("Set call alert failed", 274 resp.getStatus() == RilCtrlCmds.CTRL_STATUS_OK); 275 276 try { 277 Thread.sleep(2000); 278 } catch (InterruptedException e) {} 279 280 // send command to force call state change 281 Msg.send(mMockRilChannel, RilCtrlCmds.CTRL_CMD_SET_CALL_ACTIVE, 0, 0, null); 282 resp = Msg.recv(mMockRilChannel); 283 log("Get response status: " + resp.getStatus()); 284 assertTrue("Set call active failed", 285 resp.getStatus() == RilCtrlCmds.CTRL_STATUS_OK); 286 287 // hangup the active all remotely 288 RilCtrlCmds.CtrlHangupConnRemote hangupCmd = new RilCtrlCmds.CtrlHangupConnRemote(); 289 hangupCmd.setConnectionId(1); 290 hangupCmd.setCallFailCause(16); // normal hangup 291 Msg.send(mMockRilChannel, RilCtrlCmds.CTRL_CMD_HANGUP_CONN_REMOTE, 0, 0, hangupCmd); 292 resp = Msg.recv(mMockRilChannel); 293 log("Get response for hangup connection: " + resp.getStatus()); 294 assertTrue("CTRL_CMD_HANGUP_CONN_REMOTE failed", 295 resp.getStatus() == RilCtrlCmds.CTRL_STATUS_OK); 296 297 // set the flag to false 298 cmd.setFlag(false); 299 Msg.send(mMockRilChannel, RilCtrlCmds.CTRL_CMD_SET_CALL_TRANSITION_FLAG, 0, 0, cmd); 300 resp = Msg.recv(mMockRilChannel); 301 assertTrue("Set call transition flag failed", 302 resp.getStatus() == RilCtrlCmds.CTRL_STATUS_OK); 303 } 304 } 305