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 com.android.nfc.MockLlcpSocket;
202ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
212ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport android.nfc.NdefMessage;
222ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport android.nfc.NdefRecord;
232ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport android.test.AndroidTestCase;
242ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonimport android.util.Log;
252ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
264a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamiltonimport java.io.IOException;
272ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
282ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson/**
292ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson * Tests the SNEP cleint/server interfaces using a mock LLCP socket.
302ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson */
312ef360deaff9f17aa72d5749ceee283cc80897afBen Dodsonpublic class SnepBasicTests extends AndroidTestCase {
322ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    private static final String TAG = "snepBasicTests";
332ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    private static final int MIU = 250;
342ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    private static final int ACCEPTABLE_LENGTH = 2*1024;
352ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
362ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public void testGetSmallNdef() throws IOException {
372ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket clientSocket = new MockLlcpSocket();
382ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket serverSocket = new MockLlcpSocket();
392ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket.bind(clientSocket, serverSocket);
402ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
412ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger client = new SnepMessenger(true, clientSocket, MIU);
422ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger server = new SnepMessenger(false, serverSocket, MIU);
432ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
442ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        new Thread() {
454a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton            @Override
462ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            public void run() {
472ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                try {
482ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    SnepServer.handleRequest(server, mCallback);
492ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                } catch (Exception e) {
502ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    Log.e(TAG, "error getting message", e);
512ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                }
522ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            };
532ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }.start();
542ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
552ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        SnepMessage response = null;
562ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        try {
572ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            client.sendMessage(SnepMessage.getGetRequest(ACCEPTABLE_LENGTH, getSmallNdef()));
582ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            response = client.getMessage();
592ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        } catch (SnepException e) {
602ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            throw new IOException("Failed to retrieve SNEP message", e);
612ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
622ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
632ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertNotNull(response);
642ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertEquals(SnepMessage.RESPONSE_SUCCESS, response.getField());
652ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
662ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
672ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public void testGetLargeNdef() throws IOException {
682ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket clientSocket = new MockLlcpSocket();
692ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket serverSocket = new MockLlcpSocket();
702ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket.bind(clientSocket, serverSocket);
712ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
722ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger client = new SnepMessenger(true, clientSocket, MIU);
732ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger server = new SnepMessenger(false, serverSocket, MIU);
742ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
752ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        new Thread() {
764a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton            @Override
772ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            public void run() {
782ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                try {
792ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    SnepServer.handleRequest(server, mCallback);
802ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                } catch (Exception e) {
812ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    Log.e(TAG, "error getting message", e);
822ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                }
832ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            };
842ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }.start();
852ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
862ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        SnepMessage response = null;
872ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        try {
882ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            client.sendMessage(SnepMessage.getGetRequest(ACCEPTABLE_LENGTH, getNdef(900)));
892ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            response = client.getMessage();
902ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        } catch (SnepException e) {
912ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            throw new IOException("Failed to retrieve SNEP message", e);
922ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
932ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
942ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertNotNull(response);
952ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertEquals(SnepMessage.RESPONSE_SUCCESS, response.getField());
962ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
972ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
982ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public void testGetExcessiveNdef() throws IOException {
992ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket clientSocket = new MockLlcpSocket();
1002ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket serverSocket = new MockLlcpSocket();
1012ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket.bind(clientSocket, serverSocket);
1022ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1032ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger client = new SnepMessenger(true, clientSocket, MIU);
1042ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger server = new SnepMessenger(false, serverSocket, MIU);
1052ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1062ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        new Thread() {
1074a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton            @Override
1082ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            public void run() {
1092ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                try {
1102ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    SnepServer.handleRequest(server, mCallback);
1112ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                } catch (Exception e) {
1122ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    Log.e(TAG, "error getting message", e);
1132ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                }
1142ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            };
1152ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }.start();
1162ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1172ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        SnepMessage response = null;
1182ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        try {
1192ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            client.sendMessage(SnepMessage.getGetRequest(10, getSmallNdef()));
1202ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            response = client.getMessage();
1212ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        } catch (SnepException e) {
1222ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            throw new IOException("Failed to retrieve SNEP message", e);
1232ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
1242ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1252ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertNotNull(response);
1262ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertEquals(SnepMessage.RESPONSE_EXCESS_DATA, response.getField());
1272ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
1282ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1292ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public void testPutSmallNdef() throws IOException {
1302ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket clientSocket = new MockLlcpSocket();
1312ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket serverSocket = new MockLlcpSocket();
1322ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket.bind(clientSocket, serverSocket);
1332ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1342ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger client = new SnepMessenger(true, clientSocket, MIU);
1352ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger server = new SnepMessenger(false, serverSocket, MIU);
1362ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1372ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        new Thread() {
1384a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton            @Override
1392ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            public void run() {
1402ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                try {
1412ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    SnepServer.handleRequest(server, mCallback);
1422ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                } catch (Exception e) {
1432ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    Log.e(TAG, "error getting message", e);
1442ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                }
1452ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            };
1462ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }.start();
1472ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1482ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        SnepMessage response = null;
1492ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        try {
1502ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            client.sendMessage(SnepMessage.getPutRequest(getSmallNdef()));
1512ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            response = client.getMessage();
1522ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        } catch (SnepException e) {
1532ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            throw new IOException("Failed to retrieve SNEP message", e);
1542ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
1552ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1562ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertNotNull(response);
1572ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertEquals(SnepMessage.RESPONSE_SUCCESS, response.getField());
1582ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
1592ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1602ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public void testPutLargeNdef() throws IOException {
1612ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket clientSocket = new MockLlcpSocket();
1622ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket serverSocket = new MockLlcpSocket();
1632ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket.bind(clientSocket, serverSocket);
1642ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1652ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger client = new SnepMessenger(true, clientSocket, MIU);
1662ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger server = new SnepMessenger(false, serverSocket, MIU);
1672ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1682ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        new Thread() {
1694a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton            @Override
1702ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            public void run() {
1712ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                try {
1722ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    SnepServer.handleRequest(server, mCallback);
1732ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                } catch (Exception e) {
1742ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    Log.e(TAG, "error getting message", e);
1752ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                }
1762ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            };
1772ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }.start();
1782ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1792ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        SnepMessage response = null;
1802ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        try {
1812ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            client.sendMessage(SnepMessage.getPutRequest(getNdef(900)));
1822ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            response = client.getMessage();
1832ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        } catch (SnepException e) {
1842ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            throw new IOException("Failed to retrieve SNEP message", e);
1852ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
1862ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1872ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertNotNull(response);
1882ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertEquals(SnepMessage.RESPONSE_SUCCESS, response.getField());
1892ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
1902ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1912ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public void testUnsupportedVersion() throws IOException {
1922ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket clientSocket = new MockLlcpSocket();
1932ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket serverSocket = new MockLlcpSocket();
1942ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket.bind(clientSocket, serverSocket);
1952ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1962ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger client = new SnepMessenger(true, clientSocket, MIU);
1972ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger server = new SnepMessenger(false, serverSocket, MIU);
1982ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
1992ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        new Thread() {
2004a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton            @Override
2012ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            public void run() {
2022ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                try {
2032ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    SnepServer.handleRequest(server, mCallback);
2042ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                } catch (Exception e) {
2052ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    Log.e(TAG, "error getting message", e);
2062ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                }
2072ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            };
2082ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }.start();
2092ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2102ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        SnepMessage response = null;
2112ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        try {
2122ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            NdefMessage ndef = getSmallNdef();
2132ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            SnepMessage request = new SnepMessage(
2142ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    (byte)2, SnepMessage.REQUEST_PUT, ndef.toByteArray().length, 0, ndef);
2152ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            client.sendMessage(request);
2162ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            response = client.getMessage();
2172ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        } catch (SnepException e) {
2182ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            throw new IOException("Failed to retrieve SNEP message", e);
2192ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
2202ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2212ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertNotNull(response);
2222ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertEquals(SnepMessage.RESPONSE_UNSUPPORTED_VERSION, response.getField());
2232ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
2242ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2252ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    public void testDifferentMinorVersion() throws IOException {
2262ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket clientSocket = new MockLlcpSocket();
2272ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket serverSocket = new MockLlcpSocket();
2282ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        MockLlcpSocket.bind(clientSocket, serverSocket);
2292ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2302ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger client = new SnepMessenger(true, clientSocket, MIU);
2312ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        final SnepMessenger server = new SnepMessenger(false, serverSocket, MIU);
2322ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2332ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        new Thread() {
2344a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton            @Override
2352ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            public void run() {
2362ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                try {
2372ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    SnepServer.handleRequest(server, mCallback);
2382ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                } catch (Exception e) {
2392ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    Log.e(TAG, "error getting message", e);
2402ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                }
2412ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            };
2422ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }.start();
2432ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2442ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        byte version = (0xF0 & (SnepMessage.VERSION_MAJOR << 4)) |
2452ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                (0x0F & (SnepMessage.VERSION_MINOR + 1));
2462ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        SnepMessage response = null;
2472ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        try {
2482ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            NdefMessage ndef = getSmallNdef();
2492ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            SnepMessage request = new SnepMessage(
2502ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                    version, SnepMessage.REQUEST_PUT, ndef.toByteArray().length, 0, ndef);
2512ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            client.sendMessage(request);
2522ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            response = client.getMessage();
2532ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        } catch (SnepException e) {
2542ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            throw new IOException("Failed to retrieve SNEP message", e);
2552ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
2562ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2572ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertNotNull(response);
2582ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        assertEquals(SnepMessage.RESPONSE_SUCCESS, response.getField());
2592ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
2602ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2614a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    NdefMessage getSmallNdef() {
2622ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        NdefRecord rec = new NdefRecord(NdefRecord.TNF_ABSOLUTE_URI, NdefRecord.RTD_URI,
2632ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                new byte[0], "http://android.com".getBytes());
2642ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        return new NdefMessage(new NdefRecord[] { rec });
2652ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
2662ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2674a61d3b45e81c0070538f94747a70a49c78f12faJeff Hamilton    NdefMessage getNdef(int size) {
2682ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        StringBuffer string = new StringBuffer(size);
2692ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        for (int i = 0; i < size; i++) {
2702ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            string.append('A' + (i % 26));
2712ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
2722ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        NdefRecord rec = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(),
2732ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                new byte[0], string.toString().getBytes());
2742ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        return new NdefMessage(new NdefRecord[] { rec });
2752ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    }
2762ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2772ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    /**
2782ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson     * A SNEP Server implementation that accepts PUT requests for all ndef
2792ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson     * messages and responds to GET requests with acceptable length greater
2802ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson     * than or equal to 1024.
2812ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson     */
2822ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    final SnepServer.Callback mCallback = new SnepServer.Callback() {
2832ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        private static final int GET_LENGTH = 1024;
2842ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2852ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        @Override
2862ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        public SnepMessage doPut(NdefMessage msg) {
2872ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            return SnepMessage.getSuccessResponse(null);
2882ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
2892ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson
2902ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        @Override
2912ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        public SnepMessage doGet(int acceptableLength, NdefMessage msg) {
2922ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            if (GET_LENGTH <= acceptableLength) {
2932ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                return SnepMessage.getSuccessResponse(getSmallNdef());
2942ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            } else {
2952ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson                return SnepMessage.getMessage(SnepMessage.RESPONSE_EXCESS_DATA);
2962ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson            }
2972ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson        }
2982ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson    };
2992ef360deaff9f17aa72d5749ceee283cc80897afBen Dodson}