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