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