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; 2199c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Savilleimport android.telephony.Rlog; 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) { 4222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mHandler = new UsimDataDownloadHandler(mCi); 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 5922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville private UsimDataDownloadCommands mCi; 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(); 6622d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi = new UsimDataDownloadCommands(mContext); 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandlerThread = new TestHandlerThread(); 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandlerThread.start(); 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler = mHandlerThread.getHandler(); 7099c2e1d6749cfad2a8ca94a47857d8c3bfc09454Wink Saville Rlog.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 11422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_1, 0x90, 0x00, ""); 11522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectAcknowledgeGsmSms(true, 0); 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 11722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.assertExpectedMethodsCalled(); 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 11922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_1, 0x90, 0x00, "0123456789"); 12022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectAcknowledgeGsmSmsWithPdu(true, "00077f16050123456789"); 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 12222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.assertExpectedMethodsCalled(); 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 12422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_1, 0x62, 0xff, "0123456789abcdef"); 12522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectAcknowledgeGsmSmsWithPdu(false, "00d5077f16080123456789abcdef"); 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 12722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.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 13422d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_5, 0x90, 0x00, "9876543210"); 13522d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectAcknowledgeGsmSmsWithPdu(true, "00077ff6059876543210"); 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 13722d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.assertExpectedMethodsCalled(); 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 13922d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_5, 0x93, 0x00, ""); 14022d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.expectAcknowledgeGsmSms(false, 0xd4); // SIM toolkit busy 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mHandler.startDataDownload(message); 14222d85a8e3a575a6d01d2c788587971657dfe20c6Wink Saville mCi.assertExpectedMethodsCalled(); 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 145