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