ScanFilterTest.java revision 685c1758902a42a7beb030d8bbaed3f7ce6f6135
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 0x0b, 0x11, 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[] nonMatchData = new byte[] { 105 0x0b, 0x01, 0x50, 0x64 }; 106 filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData).build(); 107 assertFalse("service data filter fails", filter.matches(mScanResult)); 108 109 byte[] mask = new byte[] { 110 (byte) 0xFF, (byte) 0x00, (byte) 0xFF, (byte) 0xFF }; 111 filter = mFilterBuilder.setServiceData(serviceDataUuid, nonMatchData, mask).build(); 112 assertTrue("partial service data filter fails", filter.matches(mScanResult)); 113 } 114 115 @SmallTest 116 public void testManufacturerSpecificData() { 117 byte[] setManufacturerData = new byte[] { 118 (byte) 0xE0, 0x00, 0x02, 0x15 }; 119 int manufacturerId = 224; 120 ScanFilter filter = 121 mFilterBuilder.setManufacturerData(manufacturerId, setManufacturerData).build(); 122 assertTrue("setManufacturerData filter fails", filter.matches(mScanResult)); 123 124 byte[] nonMatchData = new byte[] { 125 (byte) 0xF0, 0x00, 0x02, 0x15 }; 126 filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData).build(); 127 assertFalse("setManufacturerData filter fails", filter.matches(mScanResult)); 128 129 byte[] mask = new byte[] { 130 (byte) 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF 131 }; 132 filter = mFilterBuilder.setManufacturerData(manufacturerId, nonMatchData, mask).build(); 133 assertTrue("partial setManufacturerData filter fails", filter.matches(mScanResult)); 134 } 135 136 @SmallTest 137 public void testReadWriteParcel() { 138 ScanFilter filter = mFilterBuilder.build(); 139 testReadWriteParcelForFilter(filter); 140 141 filter = mFilterBuilder.setDeviceName("Ped").build(); 142 testReadWriteParcelForFilter(filter); 143 144 filter = mFilterBuilder.setDeviceAddress("11:22:33:44:55:66").build(); 145 testReadWriteParcelForFilter(filter); 146 147 filter = mFilterBuilder.setServiceUuid( 148 ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB")).build(); 149 testReadWriteParcelForFilter(filter); 150 151 filter = mFilterBuilder.setServiceUuid( 152 ParcelUuid.fromString("0000110C-0000-1000-8000-00805F9B34FB"), 153 ParcelUuid.fromString("FFFFFFF0-FFFF-FFFF-FFFF-FFFFFFFFFFFF")).build(); 154 testReadWriteParcelForFilter(filter); 155 156 byte[] setServiceData = new byte[] { 157 0x0b, 0x11, 0x50, 0x64 }; 158 159 ParcelUuid serviceDataUuid = ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB"); 160 filter = mFilterBuilder.setServiceData(serviceDataUuid, setServiceData).build(); 161 testReadWriteParcelForFilter(filter); 162 163 byte[] serviceDataMask = new byte[] { 164 (byte) 0xFF, (byte) 0x00, (byte) 0xFF, (byte) 0xFF }; 165 filter = mFilterBuilder.setServiceData(serviceDataUuid, setServiceData, serviceDataMask) 166 .build(); 167 testReadWriteParcelForFilter(filter); 168 169 byte[] manufacturerData = new byte[] { 170 (byte) 0xE0, 0x00, 0x02, 0x15 }; 171 int manufacturerId = 224; 172 filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData).build(); 173 testReadWriteParcelForFilter(filter); 174 175 byte[] manufacturerDataMask = new byte[] { 176 (byte) 0x00, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF 177 }; 178 filter = mFilterBuilder.setManufacturerData(manufacturerId, manufacturerData, 179 manufacturerDataMask).build(); 180 testReadWriteParcelForFilter(filter); 181 } 182 183 private void testReadWriteParcelForFilter(ScanFilter filter) { 184 Parcel parcel = Parcel.obtain(); 185 filter.writeToParcel(parcel, 0); 186 parcel.setDataPosition(0); 187 ScanFilter filterFromParcel = 188 ScanFilter.CREATOR.createFromParcel(parcel); 189 System.out.println(filterFromParcel); 190 assertEquals(filter, filterFromParcel); 191 } 192} 193