1314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly/*
2314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly * Copyright (C) 2011 The Android Open Source Project
3314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly *
4314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
5314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly * you may not use this file except in compliance with the License.
6314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly * You may obtain a copy of the License at
7314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly *
8314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
9314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly *
10314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly * Unless required by applicable law or agreed to in writing, software
11314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
12314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly * See the License for the specific language governing permissions and
14314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly * limitations under the License.
15314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly */
16314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
1709588f64a280b98eefc22d05fd5ff7916ba9203eNick Pellypackage com.android.nfc_extras.tests;
18314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
19314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellyimport android.content.Context;
20314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellyimport android.nfc.NfcAdapter;
21314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellyimport android.test.InstrumentationTestCase;
22314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellyimport android.util.Log;
23314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
24314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellyimport com.android.nfc_extras.NfcAdapterExtras;
25314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellyimport com.android.nfc_extras.NfcAdapterExtras.CardEmulationRoute;
26314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellyimport com.android.nfc_extras.NfcExecutionEnvironment;
27314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
28314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellyimport java.io.IOException;
29314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellyimport java.util.Arrays;
30314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
31314252360b3e5e50e45f49800bea5a487e4c8872Nick Pellypublic class BasicNfcEeTest extends InstrumentationTestCase {
32314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    private Context mContext;
33314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    private NfcAdapterExtras mAdapterExtras;
34314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    private NfcExecutionEnvironment mEe;
35314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
36314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    public static final byte[] SELECT_CARD_MANAGER_COMMAND = new byte[] {
37314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        (byte)0x00, (byte)0xA4, (byte)0x04, (byte)0x00,  // command
38314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        (byte)0x08,  // data length
39314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        (byte)0xA0, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x03, (byte)0x00, (byte)0x00,
40314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        (byte)0x00,  // card manager AID
41314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        (byte)0x00  // trailer
42314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    };
43314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
44314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    public static final byte[] SELECT_CARD_MANAGER_RESPONSE = new byte[] {
45314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        (byte)0x90, (byte)0x00,
46314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    };
47314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
48314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    @Override
49314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    protected void setUp() throws Exception {
50314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        super.setUp();
5109588f64a280b98eefc22d05fd5ff7916ba9203eNick Pelly        mContext = getInstrumentation().getTargetContext();
52314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        mAdapterExtras = NfcAdapterExtras.get(NfcAdapter.getDefaultAdapter(mContext));
53314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        mEe = mAdapterExtras.getEmbeddedExecutionEnvironment();
54314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    }
55314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
56314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    public void testSendCardManagerApdu() throws IOException {
57314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        mEe.open();
58314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
59314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        try {
60314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            byte[] out = mEe.transceive(SELECT_CARD_MANAGER_COMMAND);
61314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            assertTrue(out.length >= SELECT_CARD_MANAGER_RESPONSE.length);
62314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            byte[] trailing = Arrays.copyOfRange(out,
63314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                    out.length - SELECT_CARD_MANAGER_RESPONSE.length,
64314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                    out.length);
65314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            assertByteArrayEquals(SELECT_CARD_MANAGER_RESPONSE, trailing);
66314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
67314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        } finally {
68314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            mEe.close();
69314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        }
70314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
71314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    }
72314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
73314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    public void testSendCardManagerApduMultiple() throws IOException {
74314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        for (int i=0; i<10; i++) {
75314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            try {
76314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            mEe.open();
77314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
78314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            try {
79314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                byte[] out = mEe.transceive(SELECT_CARD_MANAGER_COMMAND);
80314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                byte[] trailing = Arrays.copyOfRange(out,
81314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                        out.length - SELECT_CARD_MANAGER_RESPONSE.length,
82314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                        out.length);
83314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
84314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            } finally {
85314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                try {Thread.sleep(1000);} catch (InterruptedException e) {}
86314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                mEe.close();
87314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            }
88314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            } catch (IOException e) {}
89314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        }
90314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
91314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        testSendCardManagerApdu();
92314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
93314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    }
94314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
95314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    public void testEnableEe() {
96314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        mAdapterExtras.setCardEmulationRoute(
97314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                new CardEmulationRoute(CardEmulationRoute.ROUTE_ON_WHEN_SCREEN_ON, mEe));
98314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        CardEmulationRoute newRoute = mAdapterExtras.getCardEmulationRoute();
99314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        assertEquals(CardEmulationRoute.ROUTE_ON_WHEN_SCREEN_ON, newRoute.route);
100314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        assertEquals(mEe, newRoute.nfcEe);
101314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    }
102314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
103314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    public void testDisableEe() {
104314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        mAdapterExtras.setCardEmulationRoute(
105314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly                new CardEmulationRoute(CardEmulationRoute.ROUTE_OFF, null));
106314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        CardEmulationRoute newRoute = mAdapterExtras.getCardEmulationRoute();
107314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        assertEquals(CardEmulationRoute.ROUTE_OFF, newRoute.route);
108314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        assertNull(newRoute.nfcEe);
109314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    }
110314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly
111314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    private static void assertByteArrayEquals(byte[] b1, byte[] b2) {
112314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        assertEquals(b1.length, b2.length);
113314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        for (int i = 0; i < b1.length; i++) {
114314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly            assertEquals(b1[i], b2[i]);
115314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly        }
116314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly    }
117314252360b3e5e50e45f49800bea5a487e4c8872Nick Pelly}
118