12ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson/* 22ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * Copyright (C) 2011 The Android Open Source Project 32ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * 42ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * Licensed under the Apache License, Version 2.0 (the "License"); 52ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * you may not use this file except in compliance with the License. 62ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * You may obtain a copy of the License at 72ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * 82ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * http://www.apache.org/licenses/LICENSE-2.0 92ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * 102ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * Unless required by applicable law or agreed to in writing, software 112ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * distributed under the License is distributed on an "AS IS" BASIS, 122ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * See the License for the specific language governing permissions and 142ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * limitations under the License. 152ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson */ 162ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 172ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonpackage com.android.nfc.snep; 182ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 192ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport java.io.IOException; 202ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 212ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport com.android.nfc.snep.SnepClient; 222ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport com.android.nfc.snep.SnepMessage; 232ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport com.android.nfc.snep.SnepServer; 242ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 252ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport android.nfc.NdefMessage; 262ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport android.nfc.NdefRecord; 272ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport android.test.AndroidTestCase; 282ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport android.util.Log; 292ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 302ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport java.lang.StringBuffer; 312ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 322ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson/** 332ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * Tests connectivity to a custom SNEP server, using a physical NFC device. 342ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson */ 352ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonpublic class SnepValidationClientTests extends AndroidTestCase { 362ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson private static final String TAG = "nfcTest"; 372ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 382ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson private static final int FRAGMENT_LENGTH = 50; 392ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 402ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson public static final String SERVICE_NAME = SnepValidationServerTests.SERVICE_NAME; 412ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 422ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson public void setUp() { 432ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Waiting for service to restart..."); 442ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson try { 452ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Thread.sleep(8000); 462ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } catch (InterruptedException e) { 472ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 482ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Running test."); 492ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 502ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 512ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson public void testNonFragmented() throws IOException { 522ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson try { 532ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson SnepClient client = getSnepClient(); 542ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson NdefMessage msg = getSmallNdef(); 552ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Connecting to service " + SERVICE_NAME + "..."); 562ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.connect(); 572ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Putting ndef message..."); 582ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.put(msg); 592ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 602ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Getting ndef message..."); 612ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson byte[] responseBytes = client.get(msg).getNdefMessage().toByteArray(); 622ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson int i = 0; 632ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson byte[] msgBytes = msg.toByteArray(); 642ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Done. Checking " + msgBytes.length + " bytes."); 652ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson for (byte b : msgBytes) { 662ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson assertEquals(b, responseBytes[i++]); 672ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 682ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Closing client."); 692ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.close(); 702ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } catch (IOException e) { 712ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Test failed.", e); 722ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson throw e; 732ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 742ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 752ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 762ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson public void testFragmented() throws IOException { 772ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson try { 782ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson SnepClient client = getSnepClient(); 792ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson NdefMessage msg = getLargeNdef(); 802ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Connecting to service " + SERVICE_NAME + "..."); 812ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.connect(); 822ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Putting ndef message of size " + msg.toByteArray().length + "..."); 832ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.put(msg); 842ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 852ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Getting ndef message..."); 862ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson byte[] responseBytes = client.get(msg).getNdefMessage().toByteArray(); 872ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson int i = 0; 882ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson byte[] msgBytes = msg.toByteArray(); 892ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Done. Checking " + msgBytes.length + " bytes."); 902ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson for (byte b : msgBytes) { 912ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson assertEquals(b, responseBytes[i++]); 922ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 932ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.close(); 942ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } catch (IOException e) { 952ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Error running fragmented", e); 962ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson throw e; 972ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 982ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 992ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1002ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson public void testMultipleNdef() throws IOException { 1012ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson try { 1022ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson SnepClient client = getSnepClient(); 1032ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Connecting to service " + SERVICE_NAME + "..."); 1042ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.connect(); 1052ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1062ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson NdefMessage msgA = getSmallNdef(); 1072ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson NdefMessage msgB = getLargeNdef(); 1082ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1092ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Putting ndef message A..."); 1102ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.put(msgA); 1112ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Putting ndef message B..."); 1122ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.put(msgB); 1132ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1142ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson byte[] responseBytes; 1152ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson byte[] msgBytes; 1162ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson int i; 1172ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1182ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Getting ndef message A..."); 1192ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson responseBytes = client.get(msgA).getNdefMessage().toByteArray(); 1202ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson i = 0; 1212ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson msgBytes = msgA.toByteArray(); 1222ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Done. Checking " + msgBytes.length + " bytes."); 1232ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson for (byte b : msgBytes) { 1242ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson assertEquals(b, responseBytes[i++]); 1252ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1262ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1272ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Getting ndef message B..."); 1282ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson responseBytes = client.get(msgB).getNdefMessage().toByteArray(); 1292ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson i = 0; 1302ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson msgBytes = msgB.toByteArray(); 1312ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Done. Checking " + msgBytes.length + " bytes."); 1322ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson for (byte b : msgBytes) { 1332ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson assertEquals(b, responseBytes[i++]); 1342ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1352ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1362ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Closing client."); 1372ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.close(); 1382ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } catch (IOException e) { 1392ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Test failed.", e); 1402ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson throw e; 1412ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1422ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1432ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1442ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson public void testUnavailable() throws IOException { 1452ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson try { 1462ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson SnepClient client = getSnepClient(); 1472ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson NdefMessage msg = getSmallNdef(); 1482ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Connecting to service " + SERVICE_NAME + "..."); 1492ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.connect(); 1502ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1512ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Getting ndef message..."); 1522ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson SnepMessage response = client.get(msg); 1532ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson assertEquals(SnepMessage.RESPONSE_NOT_FOUND, response.getField()); 1542ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Closing client."); 1552ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.close(); 1562ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } catch (IOException e) { 1572ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Test failed.", e); 1582ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson throw e; 1592ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1602ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1612ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1622ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson public void testUndeliverable() throws IOException { 1632ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson try { 1642ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson SnepClient client = new SnepClient(SERVICE_NAME, 100, FRAGMENT_LENGTH); 1652ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson NdefMessage msg = getLargeNdef(); 1662ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Connecting to service " + SERVICE_NAME + "..."); 1672ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.connect(); 1682ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Putting ndef message of size " + msg.toByteArray().length + "..."); 1692ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.put(msg); 1702ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1712ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Getting ndef message..."); 1722ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson SnepMessage response = client.get(msg); 1732ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson assertEquals(SnepMessage.RESPONSE_EXCESS_DATA, response.getField()); 1742ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson client.close(); 1752ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } catch (IOException e) { 1762ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson Log.d(TAG, "Error running fragmented", e); 1772ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson throw e; 1782ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1792ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1802ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1812ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson private NdefMessage getSmallNdef() { 1822ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson NdefRecord rec = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, 1832ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson new byte[] { 'A' }, "http://android.com".getBytes()); 1842ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson return new NdefMessage(new NdefRecord[] { rec }); 1852ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1862ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1872ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson private NdefMessage getLargeNdef() { 1882ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson int size = 500; 1892ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson StringBuffer string = new StringBuffer(size); 1902ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson for (int i = 0; i < size; i++) { 1912ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson string.append('A' + (i % 26)); 1922ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1932ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson NdefRecord rec = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(), 1942ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson new byte[] { 'B' }, string.toString().getBytes()); 1952ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson return new NdefMessage(new NdefRecord[] { rec }); 1962ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 1972ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson 1982ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson private SnepClient getSnepClient() { 1992ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson return new SnepClient(SERVICE_NAME, FRAGMENT_LENGTH); 2002ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson } 2012ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson} 202