Home | History | Annotate | Download | only in le
      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 
     17 package android.bluetooth.le;
     18 
     19 import android.bluetooth.BluetoothAdapter;
     20 import android.bluetooth.BluetoothDevice;
     21 import android.bluetooth.le.ScanFilter;
     22 import android.bluetooth.le.ScanRecord;
     23 import android.os.Parcel;
     24 import android.os.ParcelUuid;
     25 import android.test.suitebuilder.annotation.SmallTest;
     26 
     27 import 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  */
     35 public 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