10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2011 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony.gsm; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.HandlerThread; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.test.AndroidTestCase; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log; 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport java.nio.charset.Charset; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Test SMS-PP data download to UICC. 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Uses test messages from 3GPP TS 31.124 section 27.22.5. 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class UsimDataDownloadTest extends AndroidTestCase { 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String TAG = "UsimDataDownloadTest"; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville class TestHandlerThread extends HandlerThread { 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private UsimDataDownloadHandler mHandler; 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville TestHandlerThread() { 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super("TestHandlerThread"); 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void onLooperPrepared() { 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville synchronized (this) { 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler = new UsimDataDownloadHandler(mCm); 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville notifyAll(); 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UsimDataDownloadHandler getHandler() { 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville synchronized (this) { 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville while (mHandler == null) { 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville try { 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville wait(); 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } catch (InterruptedException ignored) {} 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mHandler; 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private UsimDataDownloadCommands mCm; 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private TestHandlerThread mHandlerThread; 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville UsimDataDownloadHandler mHandler; 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void setUp() throws Exception { 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.setUp(); 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm = new UsimDataDownloadCommands(mContext); 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandlerThread = new TestHandlerThread(); 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandlerThread.start(); 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler = mHandlerThread.getHandler(); 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Log.d(TAG, "mHandler is constructed"); 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void tearDown() throws Exception { 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandlerThread.quit(); 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.tearDown(); 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SMS-PP Message 3.1.1 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final byte[] SMS_PP_MESSAGE_3_1_1 = { 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Service center address 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x09, (byte) 0x91, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte) 0xf8, 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x04, 0x04, (byte) 0x91, 0x21, 0x43, 0x7f, 0x16, (byte) 0x89, 0x10, 0x10, 0x00, 0x00, 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x00, 0x00, 0x0d, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x67, 0x65, 0x20, 0x31 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville }; 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SMS-PP Download Envelope 3.1.1 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String SMS_PP_ENVELOPE_3_1_1 = "d12d8202838106099111223344556677f88b1c04" 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + "049121437f16891010000000000d546573744d6573736167652031"; 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SMS-PP Message 3.1.5 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final byte[] SMS_PP_MESSAGE_3_1_5 = { 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Service center address 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x09, (byte) 0x91, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte) 0xf8, 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x44, 0x04, (byte) 0x91, 0x21, 0x43, 0x7f, (byte) 0xf6, (byte) 0x89, 0x10, 0x10, 0x00, 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x00, 0x00, 0x00, 0x1e, 0x02, 0x70, 0x00, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x00, 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 0x00, 0x00, (byte) 0xbf, (byte) 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (byte) 0xdc, (byte) 0xdc, (byte) 0xdc, (byte) 0xdc, (byte) 0xdc, (byte) 0xdc, 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville (byte) 0xdc, (byte) 0xdc, (byte) 0xdc, (byte) 0xdc 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville }; 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // SMS-PP Download Envelope 3.1.5 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String SMS_PP_ENVELOPE_3_1_5 = "d13e8202838106099111223344556677f88b2d44" 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + "049121437ff6891010000000001e0270000019000d00000000bfff00000000000100" 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville + "dcdcdcdcdcdcdcdcdcdc"; 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testDataDownloadMessage1() { 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsMessage message = SmsMessage.createFromPdu(SMS_PP_MESSAGE_3_1_1); 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertTrue("message is SMS-PP data download", message.isUsimDataDownload()); 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_1, 0x90, 0x00, ""); 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectAcknowledgeGsmSms(true, 0); 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.assertExpectedMethodsCalled(); 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_1, 0x90, 0x00, "0123456789"); 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectAcknowledgeGsmSmsWithPdu(true, "00077f16050123456789"); 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.assertExpectedMethodsCalled(); 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_1, 0x62, 0xff, "0123456789abcdef"); 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectAcknowledgeGsmSmsWithPdu(false, "00d5077f16080123456789abcdef"); 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.assertExpectedMethodsCalled(); 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testDataDownloadMessage5() { 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville SmsMessage message = SmsMessage.createFromPdu(SMS_PP_MESSAGE_3_1_5); 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertTrue("message is SMS-PP data download", message.isUsimDataDownload()); 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_5, 0x90, 0x00, "9876543210"); 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectAcknowledgeGsmSmsWithPdu(true, "00077ff6059876543210"); 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.assertExpectedMethodsCalled(); 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_5, 0x93, 0x00, ""); 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.expectAcknowledgeGsmSms(false, 0xd4); // SIM toolkit busy 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mCm.assertExpectedMethodsCalled(); 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 145