ScanFilterTest.java revision 0462468aaff1089f08d0859e4920f90e4378b66b
1/* 2 * Copyright (C) 2014 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 17package android.bluetooth.le; 18 19import android.bluetooth.BluetoothAdapter; 20import android.bluetooth.BluetoothDevice; 21import android.bluetooth.le.ScanFilter; 22import android.bluetooth.le.ScanRecord; 23import android.os.Parcel; 24import android.os.ParcelUuid; 25import android.test.suitebuilder.annotation.SmallTest; 26 27import junit.framework.TestCase; 28 29/** 30 * Unit test cases for Bluetooth LE scan filters. 31 * <p> 32 * To run this test, use adb shell am instrument -e class 'android.bluetooth.ScanFilterTest' -w 33 * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner' 34 */ 35public class ScanFilterTest extends TestCase { 36 37 private static final String DEVICE_MAC = "01:02:03:04:05:AB"; 38 private ScanResult mScanResult; 39 private ScanFilter.Builder mFilterBuilder; 40 41 @Override 42 protected void setUp() throws Exception { 43 byte[] scanRecord = new byte[] { 44 0x02, 0x01, 0x1a, // advertising flags 45 0x05, 0x02, 0x0b, 0x11, 0x0a, 0x11, // 16 bit service uuids 46 0x04, 0x09, 0x50, 0x65, 0x64, // setName 47 0x02, 0x0A, (byte) 0xec, // tx power level 48 0x05, 0x16, 0x0b, 0x11, 0x50, 0x64, // service data 49 0x05, (byte) 0xff, (byte) 0xe0, 0x00, 0x02, 0x15, // manufacturer specific data 50 0x03, 0x50, 0x01, 0x02, // an unknown data type won't cause trouble 51 }; 52 53 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 54 BluetoothDevice device = adapter.getRemoteDevice(DEVICE_MAC); 55 mScanResult = new ScanResult(device, ScanRecord.parseFromBytes(scanRecord), 56 -10, 1397545200000000L); 57 mFilterBuilder = new ScanFilter.Builder(); 58 } 59 60 @SmallTest 61 public void testsetNameFilter() { 62 ScanFilter filter = mFilterBuilder.setDeviceName("Ped").build(); 63 assertTrue("setName filter fails", filter.matches(mScanResult)); 64 65 filter = mFilterBuilder.setDeviceName("Pem").build(); 66 assertFalse("setName filter fails", filter.matches(mScanResult)); 67 68 } 69 70 @SmallTest 71 public void testDeviceFilter() { 72 ScanFilter filter = mFilterBuilder.setDeviceAddress(DEVICE_MAC).build(); 73 assertTrue("device filter fails", filter.matches(mScanResult)); 74 75 filter = mFilterBuilder.setDeviceAddress("11:22:33:44:55:66").build(); 76 assertFalse("device filter fails", filter.matches(mScanResult)); 77 } 78 79 @SmallTest 80 public void testsetServiceUuidFilter() { 81 ScanFilter filter = mFilterBuilder.setServiceUuid( 82 ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB")).build(); 83 assertTrue("uuid filter fails", filter.matches(mScanResult)); 84 85 filter = mFilterBuilder.setServiceUuid( 86 ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB")).build(); 87 assertFalse("uuid filter fails", filter.matches(mScanResult)); 88 89 filter = mFilterBuilder 90 .setServiceUuid(ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB"), 91 ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")) 92 .build(); 93 assertTrue("uuid filter fails", filter.matches(mScanResult)); 94 } 95 96 @SmallTest 97 public void testsetServiceDataFilter() { 98 byte[] setServiceData = new byte[] { 99 0x50, 0x64 }; 100 ParcelUuid serviceDataUuid = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB"); 101 ScanFilter filter = mFilterBuilder.setServiceData(serviceDataUuid, setServiceData).build(); 102 assertTrue("service data filter fails", filter.matches(mScanResult)); 103 104 byte[] emptyData = new byte[0]; 105 filter = mFilterBuilder.setServiceData(serviceDataUuid, emptyData).build(); 106 assertTrue("service data filter fails", filter.matches(mScanResult)); 107 108 byte[] prefixData = new byte[] { 109 0x50 }; 110 filter = mFilterBuilder.setServiceData(serviceDataUuid, prefixData).build(); 111 assertTrue("service data filter fails", filter.matches(mScanResult)); 112 113 byte[] nonMatchData = new byte[] { 114 0x51, 0x64 }; 115 byte[] mask = new byte[] { 116 (byte) 0x00, (byte) 0xFF }; 117 filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData, mask).build(); 118 assertTrue("partial service data filter fails", filter.matches(mScanResult)); 119 120 filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData).build(); 121 assertFalse("service data filter fails", filter.matches(mScanResult)); 122 } 123 124 @SmallTest 125 public void testManufacturerSpecificData() { 126 byte[] setManufacturerData = new byte[] { 127 0x02, 0x15 }; 128 int manufacturerId = 0xE0; 129 ScanFilter filter = 130 mFilterBuilder.setManufacturerData(manufacturerId, setManufacturerData).build(); 131 assertTrue("manufacturer data filter fails", filter.matches(mScanResult)); 132 133 byte[] emptyData = new byte[0]; 134 filter = mFilterBuilder.setManufacturerData(manufacturerId, emptyData).build(); 135 assertTrue("manufacturer data filter fails", filter.matches(mScanResult)); 136 137 byte[] prefixData = new byte[] { 138 0x02 }; 139 filter = mFilterBuilder.setManufacturerData(manufacturerId, prefixData).build(); 140 assertTrue("manufacturer data filter fails", filter.matches(mScanResult)); 141 142 // Test data mask 143 byte[] nonMatchData = new byte[] { 144 0x02, 0x14 }; 145 filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData).build(); 146 assertFalse("manufacturer data filter fails", filter.matches(mScanResult)); 147 byte[] mask = new byte[] { 148 (byte) 0xFF, (byte) 0x00 149 }; 150 filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData, mask).build(); 151 assertTrue("partial setManufacturerData filter fails", filter.matches(mScanResult)); 152 } 153 154 @SmallTest 155 public void testReadWriteParcel() { 156 ScanFilter filter = mFilterBuilder.build(); 157 testReadWriteParcelForFilter(filter); 158 159 filter = mFilterBuilder.setDeviceName("Ped").build(); 160 testReadWriteParcelForFilter(filter); 161 162 filter = mFilterBuilder.setDeviceAddress("11:22:33:44:55:66").build(); 163 testReadWriteParcelForFilter(filter); 164 165 filter = mFilterBuilder.setServiceUuid( 166 ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB")).build(); 167 testReadWriteParcelForFilter(filter); 168 169 filter = mFilterBuilder.setServiceUuid( 170 ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB"), 171 ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")).build(); 172 testReadWriteParcelForFilter(filter); 173 174 byte[] serviceData = new byte[] { 175 0x50, 0x64 }; 176 177 ParcelUuid serviceDataUuid = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB"); 178 filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData).build(); 179 testReadWriteParcelForFilter(filter); 180 181 filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build(); 182 testReadWriteParcelForFilter(filter); 183 184 byte[] serviceDataMask = new byte[] { 185 (byte) 0xFF, (byte) 0xFF }; 186 filter = mFilterBuilder.setServiceData(serviceDataUuid, serviceData, serviceDataMask) 187 .build(); 188 testReadWriteParcelForFilter(filter); 189 190 byte[] manufacturerData = new byte[] { 191 0x02, 0x15 }; 192 int manufacturerId = 0xE0; 193 filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData).build(); 194 testReadWriteParcelForFilter(filter); 195 196 filter = mFilterBuilder.setServiceData(serviceDataUuid, new byte[0]).build(); 197 testReadWriteParcelForFilter(filter); 198 199 byte[] manufacturerDataMask = new byte[] { 200 (byte) 0xFF, (byte) 0xFF 201 }; 202 filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData, 203 manufacturerDataMask).build(); 204 testReadWriteParcelForFilter(filter); 205 } 206 207 private void testReadWriteParcelForFilter(ScanFilter filter) { 208 Parcel parcel = Parcel.obtain(); 209 filter.writeToParcel(parcel, 0); 210 parcel.setDataPosition(0); 211 ScanFilter filterFromParcel = 212 ScanFilter.CREATOR.createFromParcel(parcel); 213 assertEquals(filter, filterFromParcel); 214 } 215} 216