1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.nfc.snep;
18 
19 import java.io.IOException;
20 
21 import com.android.nfc.snep.SnepClient;
22 import com.android.nfc.snep.SnepMessage;
23 import com.android.nfc.snep.SnepServer;
24 
25 import android.nfc.NdefMessage;
26 import android.nfc.NdefRecord;
27 import android.test.AndroidTestCase;
28 import android.util.Log;
29 
30 import java.lang.StringBuffer;
31 
32 /**
33  * Tests connectivity to a custom SNEP server, using a physical NFC device.
34  */
35 public class SnepValidationClientTests extends AndroidTestCase {
36     private static final String TAG = "nfcTest";
37 
38     private static final int FRAGMENT_LENGTH = 50;
39 
40     public static final String SERVICE_NAME = SnepValidationServerTests.SERVICE_NAME;
41 
setUp()42     public void setUp() {
43         Log.d(TAG, "Waiting for service to restart...");
44         try {
45             Thread.sleep(8000);
46         } catch (InterruptedException e) {
47         }
48         Log.d(TAG, "Running test.");
49     }
50 
testNonFragmented()51     public void testNonFragmented() throws IOException {
52         try {
53             SnepClient client = getSnepClient();
54             NdefMessage msg = getSmallNdef();
55             Log.d(TAG, "Connecting to service " + SERVICE_NAME + "...");
56             client.connect();
57             Log.d(TAG, "Putting ndef message...");
58             client.put(msg);
59 
60             Log.d(TAG, "Getting ndef message...");
61             byte[] responseBytes = client.get(msg).getNdefMessage().toByteArray();
62             int i = 0;
63             byte[] msgBytes = msg.toByteArray();
64             Log.d(TAG, "Done. Checking " + msgBytes.length + " bytes.");
65             for (byte b : msgBytes) {
66                 assertEquals(b, responseBytes[i++]);
67             }
68             Log.d(TAG, "Closing client.");
69             client.close();
70         } catch (IOException e) {
71             Log.d(TAG, "Test failed.", e);
72             throw e;
73         }
74     }
75 
testFragmented()76     public void testFragmented() throws IOException {
77         try {
78             SnepClient client = getSnepClient();
79             NdefMessage msg = getLargeNdef();
80             Log.d(TAG, "Connecting to service " + SERVICE_NAME + "...");
81             client.connect();
82             Log.d(TAG, "Putting ndef message of size " + msg.toByteArray().length + "...");
83             client.put(msg);
84 
85             Log.d(TAG, "Getting ndef message...");
86             byte[] responseBytes = client.get(msg).getNdefMessage().toByteArray();
87             int i = 0;
88             byte[] msgBytes = msg.toByteArray();
89             Log.d(TAG, "Done. Checking " + msgBytes.length + " bytes.");
90             for (byte b : msgBytes) {
91                 assertEquals(b, responseBytes[i++]);
92             }
93             client.close();
94         } catch (IOException e) {
95             Log.d(TAG, "Error running fragmented", e);
96             throw e;
97         }
98     }
99 
testMultipleNdef()100     public void testMultipleNdef() throws IOException {
101         try {
102             SnepClient client = getSnepClient();
103             Log.d(TAG, "Connecting to service " + SERVICE_NAME + "...");
104             client.connect();
105 
106             NdefMessage msgA = getSmallNdef();
107             NdefMessage msgB = getLargeNdef();
108 
109             Log.d(TAG, "Putting ndef message A...");
110             client.put(msgA);
111             Log.d(TAG, "Putting ndef message B...");
112             client.put(msgB);
113 
114             byte[] responseBytes;
115             byte[] msgBytes;
116             int i;
117 
118             Log.d(TAG, "Getting ndef message A...");
119             responseBytes = client.get(msgA).getNdefMessage().toByteArray();
120             i = 0;
121             msgBytes = msgA.toByteArray();
122             Log.d(TAG, "Done. Checking " + msgBytes.length + " bytes.");
123             for (byte b : msgBytes) {
124                 assertEquals(b, responseBytes[i++]);
125             }
126 
127             Log.d(TAG, "Getting ndef message B...");
128             responseBytes = client.get(msgB).getNdefMessage().toByteArray();
129             i = 0;
130             msgBytes = msgB.toByteArray();
131             Log.d(TAG, "Done. Checking " + msgBytes.length + " bytes.");
132             for (byte b : msgBytes) {
133                 assertEquals(b, responseBytes[i++]);
134             }
135 
136             Log.d(TAG, "Closing client.");
137             client.close();
138         } catch (IOException e) {
139             Log.d(TAG, "Test failed.", e);
140             throw e;
141         }
142     }
143 
testUnavailable()144     public void testUnavailable() throws IOException {
145         try {
146             SnepClient client = getSnepClient();
147             NdefMessage msg = getSmallNdef();
148             Log.d(TAG, "Connecting to service " + SERVICE_NAME + "...");
149             client.connect();
150 
151             Log.d(TAG, "Getting ndef message...");
152             SnepMessage response = client.get(msg);
153             assertEquals(SnepMessage.RESPONSE_NOT_FOUND, response.getField());
154             Log.d(TAG, "Closing client.");
155             client.close();
156         } catch (IOException e) {
157             Log.d(TAG, "Test failed.", e);
158             throw e;
159         }
160     }
161 
testUndeliverable()162     public void testUndeliverable() throws IOException {
163         try {
164             SnepClient client = new SnepClient(SERVICE_NAME, 100, FRAGMENT_LENGTH);
165             NdefMessage msg = getLargeNdef();
166             Log.d(TAG, "Connecting to service " + SERVICE_NAME + "...");
167             client.connect();
168             Log.d(TAG, "Putting ndef message of size " + msg.toByteArray().length + "...");
169             client.put(msg);
170 
171             Log.d(TAG, "Getting ndef message...");
172             SnepMessage response = client.get(msg);
173             assertEquals(SnepMessage.RESPONSE_EXCESS_DATA, response.getField());
174             client.close();
175         } catch (IOException e) {
176             Log.d(TAG, "Error running fragmented", e);
177             throw e;
178         }
179     }
180 
getSmallNdef()181     private NdefMessage getSmallNdef() {
182         NdefRecord rec = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI,
183                 new byte[] { 'A' }, "http://android.com".getBytes());
184         return new NdefMessage(new NdefRecord[] { rec });
185     }
186 
getLargeNdef()187     private NdefMessage getLargeNdef() {
188         int size = 500;
189         StringBuffer string = new StringBuffer(size);
190         for (int i = 0; i < size; i++) {
191             string.append('A' + (i % 26));
192         }
193         NdefRecord rec = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, "text/plain".getBytes(),
194                 new byte[] { 'B' }, string.toString().getBytes());
195         return new NdefMessage(new NdefRecord[] { rec });
196     }
197 
getSnepClient()198     private SnepClient getSnepClient() {
199         return new SnepClient(SERVICE_NAME, FRAGMENT_LENGTH);
200     }
201 }
202