package org.altbeacon.beacon.service;
import org.altbeacon.beacon.Beacon;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.List;
import dalvik.annotation.TestTargetClass;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNotEquals;
@RunWith(RobolectricTestRunner.class)
@Config(sdk = 18)
public class ExtraDataBeaconTrackerTest {
Beacon getManufacturerBeacon() {
return new Beacon.Builder().setId1("1")
.setBluetoothAddress("01:02:03:04:05:06")
.build();
}
Beacon getGattBeacon() {
return new Beacon.Builder().setId1("1")
.setBluetoothAddress("01:02:03:04:05:06")
.setServiceUuid(1234)
.build();
}
Beacon getGattBeaconUpdate() {
return new Beacon.Builder().setId1("1")
.setBluetoothAddress("01:02:03:04:05:06")
.setServiceUuid(1234)
.setRssi(-50)
.setDataFields(getDataFields())
.build();
}
List<Long> getDataFields() {
List<Long> list = new ArrayList<Long>();
list.add(1l);
list.add(2l);
return list;
}
List<Long> getDataFields2() {
List<Long> list = new ArrayList<Long>();
list.add(3l);
list.add(4l);
return list;
}
Beacon getGattBeaconExtraData() {
return new Beacon.Builder()
.setBluetoothAddress("01:02:03:04:05:06")
.setServiceUuid(1234)
.setDataFields(getDataFields())
.build();
}
Beacon getGattBeaconExtraData2() {
return new Beacon.Builder()
.setBluetoothAddress("01:02:03:04:05:06")
.setServiceUuid(1234)
.setDataFields(getDataFields2())
.build();
}
Beacon getMultiFrameBeacon() {
return new Beacon.Builder().setId1("1")
.setBluetoothAddress("01:02:03:04:05:06")
.setServiceUuid(1234)
.setMultiFrameBeacon(true)
.build();
}
Beacon getMultiFrameBeaconUpdateDifferentServiceUUID() {
return new Beacon.Builder()
.setBluetoothAddress("01:02:03:04:05:06")
.setServiceUuid(5678)
.setRssi(-50)
.setDataFields(getDataFields())
.setMultiFrameBeacon(true)
.build();
}
@Before
public void before() {
// All logging will go to Stderr. Expand System.err section of test report to see log
org.robolectric.shadows.ShadowLog.stream = System.err;
}
@Test
public void trackingManufacturerBeaconReturnsSelf() {
Beacon beacon = getManufacturerBeacon();
ExtraDataBeaconTracker tracker = new ExtraDataBeaconTracker();
Beacon trackedBeacon = tracker.track(beacon);
assertEquals("Returns itself", trackedBeacon, beacon);
}
@Test
public void gattBeaconExtraDataIsNotReturned() {
Beacon extraDataBeacon = getGattBeaconExtraData();
ExtraDataBeaconTracker tracker = new ExtraDataBeaconTracker();
Beacon trackedBeacon = tracker.track(extraDataBeacon);
assertNull("trackedBeacon should be null", trackedBeacon);
}
@Test
public void gattBeaconExtraDataGetUpdated() {
Beacon beacon = getGattBeacon();
Beacon extraDataBeacon = getGattBeaconExtraData();
Beacon extraDataBeacon2 = getGattBeaconExtraData2();
ExtraDataBeaconTracker tracker = new ExtraDataBeaconTracker();
tracker.track(beacon);
tracker.track(extraDataBeacon);
tracker.track(extraDataBeacon2);
Beacon trackedBeacon = tracker.track(beacon);
assertEquals("extra data is updated", extraDataBeacon2.getDataFields(), trackedBeacon.getExtraDataFields());
}
@Test
public void gattBeaconExtraDataAreNotOverwritten() {
Beacon beacon = getGattBeacon();
Beacon extraDataBeacon = getGattBeaconExtraData();
ExtraDataBeaconTracker tracker = new ExtraDataBeaconTracker();
tracker.track(beacon);
tracker.track(extraDataBeacon);
Beacon trackedBeacon = tracker.track(beacon);
assertEquals("extra data should not be overwritten", extraDataBeacon.getDataFields(), trackedBeacon.getExtraDataFields());
}
@Test
public void gattBeaconFieldsGetUpdated() {
Beacon beacon = getGattBeacon();
Beacon beaconUpdate = getGattBeaconUpdate();
Beacon extraDataBeacon = getGattBeaconExtraData();
ExtraDataBeaconTracker tracker = new ExtraDataBeaconTracker();
tracker.track(beacon);
Beacon trackedBeacon = tracker.track(beaconUpdate);
assertEquals("rssi should be updated", beaconUpdate.getRssi(), trackedBeacon.getRssi());
assertEquals("data fields should be updated", beaconUpdate.getDataFields(), trackedBeacon.getDataFields());
}
@Test
public void multiFrameBeaconDifferentServiceUUIDFieldsNotUpdated() {
Beacon beacon = getMultiFrameBeacon();
Beacon beaconUpdate = getMultiFrameBeaconUpdateDifferentServiceUUID();
ExtraDataBeaconTracker tracker = new ExtraDataBeaconTracker();
tracker.track(beacon);
tracker.track(beaconUpdate);
Beacon trackedBeacon = tracker.track(beacon);
assertNotEquals("rssi should NOT be updated", beaconUpdate.getRssi(), trackedBeacon.getRssi());
assertNotEquals("data fields should NOT be updated", beaconUpdate.getDataFields(), trackedBeacon.getExtraDataFields());
}
@Test
public void multiFrameBeaconProgramaticParserAssociationDifferentServiceUUIDFieldsGetUpdated() {
Beacon beacon = getMultiFrameBeacon();
Beacon beaconUpdate = getMultiFrameBeaconUpdateDifferentServiceUUID();
ExtraDataBeaconTracker tracker = new ExtraDataBeaconTracker(false);
tracker.track(beacon);
tracker.track(beaconUpdate);
Beacon trackedBeacon = tracker.track(beacon);
assertEquals("rssi should be updated", beaconUpdate.getRssi(), trackedBeacon.getRssi());
assertEquals("data fields should be updated", beaconUpdate.getDataFields(), trackedBeacon.getExtraDataFields());
}
}