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