1ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby/*
2ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * Copyright (C) 2011 The Android Open Source Project
3ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby *
4ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * Licensed under the Apache License, Version 2.0 (the "License");
5ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * you may not use this file except in compliance with the License.
6ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * You may obtain a copy of the License at
7ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby *
8ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby *      http://www.apache.org/licenses/LICENSE-2.0
9ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby *
10ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * Unless required by applicable law or agreed to in writing, software
11ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * distributed under the License is distributed on an "AS IS" BASIS,
12ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * See the License for the specific language governing permissions and
14ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * limitations under the License.
15ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby */
16ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
17ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hambypackage com.android.internal.telephony.gsm;
18ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
19ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hambyimport android.os.HandlerThread;
20ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hambyimport android.test.AndroidTestCase;
21ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hambyimport android.util.Log;
22ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
23ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hambyimport java.nio.charset.Charset;
24ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
25ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby/**
26ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * Test SMS-PP data download to UICC.
27ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby * Uses test messages from 3GPP TS 31.124 section 27.22.5.
28ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby */
29ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hambypublic class UsimDataDownloadTest extends AndroidTestCase {
30ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    private static final String TAG = "UsimDataDownloadTest";
31ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
32ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    class TestHandlerThread extends HandlerThread {
33ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        private UsimDataDownloadHandler mHandler;
34ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
35ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        TestHandlerThread() {
36ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            super("TestHandlerThread");
37ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        }
38ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
39ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        @Override
40ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        protected void onLooperPrepared() {
41ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            synchronized (this) {
42ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby                mHandler = new UsimDataDownloadHandler(mCm);
43ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby                notifyAll();
44ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            }
45ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        }
46ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
47ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        UsimDataDownloadHandler getHandler() {
48ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            synchronized (this) {
49ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby                while (mHandler == null) {
50ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby                    try {
51ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby                        wait();
52ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby                    } catch (InterruptedException ignored) {}
53ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby                }
54ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby                return mHandler;
55ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            }
56ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        }
57ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    }
58ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
59ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    private UsimDataDownloadCommands mCm;
60ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    private TestHandlerThread mHandlerThread;
61ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    UsimDataDownloadHandler mHandler;
62ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
63ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    @Override
64ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    protected void setUp() throws Exception {
65ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        super.setUp();
66ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm = new UsimDataDownloadCommands(mContext);
67ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mHandlerThread = new TestHandlerThread();
68ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mHandlerThread.start();
69ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mHandler = mHandlerThread.getHandler();
70ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        Log.d(TAG, "mHandler is constructed");
71ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    }
72ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
73ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    @Override
74ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    protected void tearDown() throws Exception {
75ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mHandlerThread.quit();
76ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        super.tearDown();
77ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    }
78ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
79ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    // SMS-PP Message 3.1.1
80ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    private static final byte[] SMS_PP_MESSAGE_3_1_1 = {
81ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            // Service center address
82ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            0x09, (byte) 0x91, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte) 0xf8,
83ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
84ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            0x04, 0x04, (byte) 0x91, 0x21, 0x43, 0x7f, 0x16, (byte) 0x89, 0x10, 0x10, 0x00, 0x00,
85ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            0x00, 0x00, 0x0d, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61,
86ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            0x67, 0x65, 0x20, 0x31
87ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    };
88ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
89ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    // SMS-PP Download Envelope 3.1.1
90ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    private static final String SMS_PP_ENVELOPE_3_1_1 = "d12d8202838106099111223344556677f88b1c04"
91ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            + "049121437f16891010000000000d546573744d6573736167652031";
92ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
93ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    // SMS-PP Message 3.1.5
94ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    private static final byte[] SMS_PP_MESSAGE_3_1_5 = {
95ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            // Service center address
96ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            0x09, (byte) 0x91, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, (byte) 0xf8,
97ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
98ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            0x44, 0x04, (byte) 0x91, 0x21, 0x43, 0x7f, (byte) 0xf6, (byte) 0x89, 0x10, 0x10, 0x00,
99ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            0x00, 0x00, 0x00, 0x1e, 0x02, 0x70, 0x00, 0x00, 0x19, 0x00, 0x0d, 0x00, 0x00,
100ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            0x00, 0x00, (byte) 0xbf, (byte) 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
101ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            (byte) 0xdc, (byte) 0xdc, (byte) 0xdc, (byte) 0xdc, (byte) 0xdc, (byte) 0xdc,
102ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            (byte) 0xdc, (byte) 0xdc, (byte) 0xdc, (byte) 0xdc
103ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    };
104ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
105ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    // SMS-PP Download Envelope 3.1.5
106ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    private static final String SMS_PP_ENVELOPE_3_1_5 = "d13e8202838106099111223344556677f88b2d44"
107ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            + "049121437ff6891010000000001e0270000019000d00000000bfff00000000000100"
108ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby            + "dcdcdcdcdcdcdcdcdcdc";
109ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
110ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    public void testDataDownloadMessage1() {
111ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        SmsMessage message = SmsMessage.createFromPdu(SMS_PP_MESSAGE_3_1_1);
112ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        assertTrue("message is SMS-PP data download", message.isUsimDataDownload());
113ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
114ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_1, 0x90, 0x00, "");
115ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectAcknowledgeGsmSms(true, 0);
116ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mHandler.startDataDownload(message);
117ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.assertExpectedMethodsCalled();
118ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
119ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_1, 0x90, 0x00, "0123456789");
120ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectAcknowledgeGsmSmsWithPdu(true, "00077f16050123456789");
121ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mHandler.startDataDownload(message);
122ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.assertExpectedMethodsCalled();
123ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
124ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_1, 0x62, 0xff, "0123456789abcdef");
125ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectAcknowledgeGsmSmsWithPdu(false, "00d5077f16080123456789abcdef");
126ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mHandler.startDataDownload(message);
127ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.assertExpectedMethodsCalled();
128ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    }
129ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
130ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    public void testDataDownloadMessage5() {
131ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        SmsMessage message = SmsMessage.createFromPdu(SMS_PP_MESSAGE_3_1_5);
132ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        assertTrue("message is SMS-PP data download", message.isUsimDataDownload());
133ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
134ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_5, 0x90, 0x00, "9876543210");
135ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectAcknowledgeGsmSmsWithPdu(true, "00077ff6059876543210");
136ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mHandler.startDataDownload(message);
137ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.assertExpectedMethodsCalled();
138ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby
139ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectSendEnvelope(SMS_PP_ENVELOPE_3_1_5, 0x93, 0x00, "");
140ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.expectAcknowledgeGsmSms(false, 0xd4);   // SIM toolkit busy
141ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mHandler.startDataDownload(message);
142ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby        mCm.assertExpectedMethodsCalled();
143ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby    }
144ac09d2af145b4d820a34f5e7628bc42e2e211bdbJake Hamby}
145