node-ble
Version:
Bluetooth Low Energy (BLE) library written with pure Node.js (no bindings) - baked by Bluez via DBus
173 lines (129 loc) • 5.3 kB
JavaScript
/* global test, describe, expect, jest */
jest.mock('../src/BusHelper')
jest.mock('../src/Device')
const dbus = Symbol('dbus')
const Adapter = require('../src/Adapter')
const Device = require('../src/Device')
test('serializeUUID', () => {
expect(Adapter.serializeUUID('00:00:00:00:00:00')).toEqual('dev_00_00_00_00_00_00')
expect(Adapter.serializeUUID('aa:BB:cc:DD:ee:FF')).toEqual('dev_AA_BB_CC_DD_EE_FF')
})
test('deserializeUUID', () => {
expect(Adapter.deserializeUUID('dev_00_00_00_00_00_00')).toEqual('00:00:00:00:00:00')
})
test('props', async () => {
const adapter = new Adapter(dbus, 'hci0')
adapter.helper.prop.mockImplementation((value) => Promise.resolve(({
Address: '00:00:00:00:00:00',
AddressType: 'public',
Name: '_name_',
Alias: '_alias_',
Powered: true,
Discovering: true
}[value])))
await expect(adapter.getAddress()).resolves.toEqual('00:00:00:00:00:00')
await expect(adapter.getAddressType()).resolves.toEqual('public')
await expect(adapter.getName()).resolves.toEqual('_name_')
await expect(adapter.getAlias()).resolves.toEqual('_alias_')
await expect(adapter.isPowered()).resolves.toEqual(true)
await expect(adapter.isDiscovering()).resolves.toEqual(true)
await expect(adapter.toString()).resolves.toEqual('_name_ [00:00:00:00:00:00]')
})
test('discovering methods', async () => {
const adapter = new Adapter(dbus, 'hci0')
let isDiscovering
adapter.helper.prop.mockImplementation(() => Promise.resolve(isDiscovering))
isDiscovering = false
await expect(adapter.startDiscovery()).resolves.toBeUndefined()
expect(adapter.helper.callMethod).toHaveBeenLastCalledWith('StartDiscovery')
await expect(adapter.stopDiscovery()).rejects.toThrow('No discovery started')
expect(adapter.helper.callMethod).toHaveBeenCalledTimes(2)
adapter.helper.callMethod.mockClear()
isDiscovering = true
await expect(adapter.stopDiscovery()).resolves.toBeUndefined()
expect(adapter.helper.callMethod).toHaveBeenLastCalledWith('StopDiscovery')
await expect(adapter.startDiscovery()).rejects.toThrow('Discovery already in progress')
expect(adapter.helper.callMethod).toHaveBeenCalledTimes(1)
})
test('devices', async () => {
const adapter = new Adapter(dbus, 'hci0')
adapter.helper.children.mockResolvedValueOnce([
'dev_11_11_11_11_11_11',
'dev_22_22_22_22_22_22',
'dev_33_33_33_33_33_33'
])
await expect(adapter.devices()).resolves.toEqual([
'11:11:11:11:11:11',
'22:22:22:22:22:22',
'33:33:33:33:33:33'
])
})
test('getDevice', async () => {
const adapter = new Adapter(dbus, 'hci0')
adapter.helper.children.mockResolvedValue([
'dev_11_11_11_11_11_11',
'dev_22_22_22_22_22_22',
'dev_33_33_33_33_33_33'
])
await expect(adapter.getDevice('00:00:00:00:00:00')).rejects.toThrow('Device not found')
await expect(adapter.getDevice('11:11:11:11:11:11')).resolves.toBeInstanceOf(Device)
expect(Device).toHaveBeenCalledWith(dbus, 'hci0', 'dev_11_11_11_11_11_11')
})
describe('waitDevice', () => {
test('immediately found', async () => {
const adapter = new Adapter(dbus, 'hci0')
adapter.helper.children.mockResolvedValue([
'dev_11_11_11_11_11_11',
'dev_22_22_22_22_22_22',
'dev_33_33_33_33_33_33'
])
await expect(adapter.waitDevice('11:11:11:11:11:11')).resolves.toBeInstanceOf(Device)
})
test('found after a while', async () => {
jest.useFakeTimers()
const adapter = new Adapter(dbus, 'hci0')
adapter.helper.children.mockResolvedValueOnce([])
adapter.helper.children.mockResolvedValueOnce([])
adapter.helper.children.mockResolvedValueOnce([])
adapter.helper.children.mockResolvedValueOnce([
'dev_11_11_11_11_11_11',
'dev_22_22_22_22_22_22',
'dev_33_33_33_33_33_33'
])
const res = expect(adapter.waitDevice('22:22:22:22:22:22', 90 * 1000, 500)).resolves.toBeInstanceOf(Device)
jest.advanceTimersByTime(2000)
expect(adapter.helper.children).toHaveBeenCalledTimes(4)
return res
})
test('fail for timeout', async () => {
jest.useFakeTimers()
const adapter = new Adapter(dbus, 'hci0')
adapter.helper.children.mockResolvedValue([
'dev_11_11_11_11_11_11',
'dev_22_22_22_22_22_22',
'dev_33_33_33_33_33_33'
])
const res = expect(adapter.waitDevice('44:44:44:44:44:44', 2 * 1000, 500)).rejects.toThrow()
jest.advanceTimersByTime(2000)
expect(adapter.helper.children).toHaveBeenCalledTimes(4)
return res
})
test('clear intervals and timeouts after fail', async () => {
jest.useFakeTimers()
const adapter = new Adapter(dbus, 'hci0')
adapter.helper.children.mockResolvedValue([
'dev_11_11_11_11_11_11',
'dev_22_22_22_22_22_22',
'dev_33_33_33_33_33_33'
])
const timeout = 500
const discoveryInterval = 100
const spyClearInterval = jest.spyOn(global, 'clearInterval')
const spyClearTimeout = jest.spyOn(global, 'clearTimeout')
const waitDevicePromise = adapter.waitDevice('44:44:44:44:44:44', timeout, discoveryInterval)
jest.advanceTimersByTime(timeout)
await expect(waitDevicePromise).rejects.toThrow('operation timed out')
expect(spyClearInterval).toHaveBeenCalled()
expect(spyClearTimeout).toHaveBeenCalled()
})
})