mirror of https://github.com/ARMmbed/mbed-os.git
base for ble unittests - BLE instance and mocked clasess (#14191)
* base for ble unittests - BLE instance and mocked clasess * add default ble features to unittests * add stubs * move the files for includes to work * default undefined ble roles to true * add sample unittest * accidental regex in licence removed * template for ble unit tests * rename to template * add readme to unit test folderpull/14211/head
parent
1b7b620528
commit
78b113b16c
|
@ -0,0 +1,142 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ble/BLE.h"
|
||||||
|
#include "GattServerImpl_mock.h"
|
||||||
|
#include "GattClientImpl_mock.h"
|
||||||
|
#include "GapImpl_mock.h"
|
||||||
|
#include "SecurityManagerImpl_mock.h"
|
||||||
|
#include "ble/GattClient.h"
|
||||||
|
#include "ble/GattServer.h"
|
||||||
|
#include "ble/SecurityManager.h"
|
||||||
|
#include "ble/Gap.h"
|
||||||
|
#include "ble_mocks.h"
|
||||||
|
|
||||||
|
namespace ble {
|
||||||
|
|
||||||
|
static GapMock *gap_impl = nullptr;
|
||||||
|
static GattServerMock *gatt_server_impl = nullptr;
|
||||||
|
static GattClientMock *gatt_client_impl = nullptr;
|
||||||
|
static SecurityManagerMock *security_manager_impl = nullptr;
|
||||||
|
|
||||||
|
static Gap *gap = nullptr;
|
||||||
|
static GattServer *gatt_server = nullptr;
|
||||||
|
static GattClient *gatt_client = nullptr;
|
||||||
|
static SecurityManager *security_manager = nullptr;
|
||||||
|
|
||||||
|
GapMock& gap_mock() {
|
||||||
|
return *ble::gap_impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
GattServerMock& gatt_server_mock() {
|
||||||
|
return *ble::gatt_server_impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
GattClientMock& gatt_client_mock() {
|
||||||
|
return *ble::gatt_client_impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
SecurityManagerMock& security_manager_mock() {
|
||||||
|
return *ble::security_manager_impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void reset_mocks() {
|
||||||
|
delete gap;
|
||||||
|
delete gap_impl;
|
||||||
|
delete gatt_server;
|
||||||
|
delete gatt_server_impl;
|
||||||
|
delete gatt_client;
|
||||||
|
delete gatt_client_impl;
|
||||||
|
delete security_manager;
|
||||||
|
delete security_manager_impl;
|
||||||
|
/* mocks */
|
||||||
|
gap_impl = new GapMock();
|
||||||
|
gatt_server_impl = new GattServerMock();
|
||||||
|
gatt_client_impl = new GattClientMock();
|
||||||
|
security_manager_impl = new SecurityManagerMock();
|
||||||
|
/* user APIS */
|
||||||
|
gap = new Gap(gap_impl);
|
||||||
|
gatt_server = new GattServer(gatt_server_impl);
|
||||||
|
gatt_client = new GattClient(gatt_client_impl);
|
||||||
|
security_manager = new SecurityManager(security_manager_impl);
|
||||||
|
}
|
||||||
|
|
||||||
|
class BLEInstanceBase {
|
||||||
|
};
|
||||||
|
|
||||||
|
BLE::BLE(ble::BLEInstanceBase &transport) : transport(transport)
|
||||||
|
{
|
||||||
|
reset_mocks();
|
||||||
|
}
|
||||||
|
|
||||||
|
BLE& BLE::Instance()
|
||||||
|
{
|
||||||
|
static ble::BLEInstanceBase transport;
|
||||||
|
static BLE instance(transport);
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble::Gap &BLE::gap()
|
||||||
|
{
|
||||||
|
return *ble::gap;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble::GattServer &BLE::gattServer()
|
||||||
|
{
|
||||||
|
return *ble::gatt_server;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble::GattClient &BLE::gattClient()
|
||||||
|
{
|
||||||
|
return *ble::gatt_client;
|
||||||
|
}
|
||||||
|
|
||||||
|
ble::SecurityManager &BLE::securityManager()
|
||||||
|
{
|
||||||
|
return *ble::security_manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ble::Gap &BLE::gap() const
|
||||||
|
{
|
||||||
|
auto &self = const_cast<BLE &>(*this);
|
||||||
|
return const_cast<const ble::Gap &>(self.gap());
|
||||||
|
}
|
||||||
|
|
||||||
|
const ble::GattServer &BLE::gattServer() const
|
||||||
|
{
|
||||||
|
auto &self = const_cast<BLE &>(*this);
|
||||||
|
return const_cast<const ble::GattServer &>(self.gattServer());
|
||||||
|
}
|
||||||
|
|
||||||
|
const ble::GattClient &BLE::gattClient() const
|
||||||
|
{
|
||||||
|
auto &self = const_cast<BLE &>(*this);
|
||||||
|
return const_cast<const ble::GattClient &>(self.gattClient());
|
||||||
|
}
|
||||||
|
|
||||||
|
const ble::SecurityManager &BLE::securityManager() const
|
||||||
|
{
|
||||||
|
auto &self = const_cast<BLE &>(*this);
|
||||||
|
return const_cast<const ble::SecurityManager &>(self.securityManager());
|
||||||
|
}
|
||||||
|
|
||||||
|
void BLE::processEvents()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLE_GAPMOCK_H
|
||||||
|
#define BLE_GAPMOCK_H
|
||||||
|
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
#include "source/generic/GapImpl.h"
|
||||||
|
|
||||||
|
class GapMock : public ble::impl::Gap {
|
||||||
|
public:
|
||||||
|
GapMock() {};
|
||||||
|
GapMock(const GapMock&) = delete;
|
||||||
|
GapMock& operator=(const GapMock&) = delete;
|
||||||
|
virtual ~GapMock() {};
|
||||||
|
|
||||||
|
MOCK_METHOD0(reset, ble_error_t());
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif //BLE_GAPMOCK_H
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLE_GATTCLIENTMOCK_H
|
||||||
|
#define BLE_GATTCLIENTMOCK_H
|
||||||
|
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
#include "source/generic/GattClientImpl.h"
|
||||||
|
|
||||||
|
class GattClientMock : public ble::impl::GattClient {
|
||||||
|
public:
|
||||||
|
GattClientMock() {};
|
||||||
|
GattClientMock(const GattClientMock&) = delete;
|
||||||
|
GattClientMock& operator=(const GattClientMock&) = delete;
|
||||||
|
virtual ~GattClientMock() {};
|
||||||
|
|
||||||
|
MOCK_METHOD0(reset, ble_error_t());
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif //BLE_GATTCLIENTMOCK_H
|
|
@ -0,0 +1,34 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLE_GATTSERVERMOCK_H
|
||||||
|
#define BLE_GATTSERVERMOCK_H
|
||||||
|
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
#include "source/GattServerImpl.h"
|
||||||
|
|
||||||
|
class GattServerMock : public ble::impl::GattServer {
|
||||||
|
public:
|
||||||
|
GattServerMock() {};
|
||||||
|
GattServerMock(const GattServerMock&) = delete;
|
||||||
|
GattServerMock& operator=(const GattServerMock&) = delete;
|
||||||
|
virtual ~GattServerMock() {};
|
||||||
|
|
||||||
|
MOCK_METHOD1(reset, ble_error_t(ble::GattServer*));
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //BLE_GATTSERVERMOCK_H
|
|
@ -0,0 +1,36 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SECURITYMANAGERMOCK_H
|
||||||
|
#define SECURITYMANAGERMOCK_H
|
||||||
|
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
#include "source/generic/SecurityManagerImpl.h"
|
||||||
|
|
||||||
|
class SecurityManagerMock : public ble::impl::SecurityManager {
|
||||||
|
public:
|
||||||
|
SecurityManagerMock() {};
|
||||||
|
SecurityManagerMock(const GattServerMock&) = delete;
|
||||||
|
SecurityManagerMock& operator=(const GattServerMock&) = delete;
|
||||||
|
virtual ~SecurityManagerMock() {};
|
||||||
|
|
||||||
|
MOCK_METHOD0(reset, ble_error_t());
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif //SECURITYMANAGERMOCK_H
|
|
@ -0,0 +1,42 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLE_MOCKS_H
|
||||||
|
#define BLE_MOCKS_H
|
||||||
|
|
||||||
|
#include "GattServerImpl_mock.h"
|
||||||
|
#include "GattClientImpl_mock.h"
|
||||||
|
#include "GapImpl_mock.h"
|
||||||
|
#include "SecurityManagerImpl_mock.h"
|
||||||
|
|
||||||
|
/***
|
||||||
|
* You must use reset_mocks() at the end of the test. To access mocks use:
|
||||||
|
* gap_mock(), gatt_server_mock(), gatt_client_mock(), security_manager_mock().
|
||||||
|
* All functions are in namespace ble.
|
||||||
|
*/
|
||||||
|
namespace ble {
|
||||||
|
|
||||||
|
void reset_mocks();
|
||||||
|
|
||||||
|
GapMock& gap_mock();
|
||||||
|
GattServerMock& gatt_server_mock();
|
||||||
|
GattClientMock& gatt_client_mock();
|
||||||
|
SecurityManagerMock& security_manager_mock();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // BLE_MOCKS_H
|
|
@ -0,0 +1,137 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLE_GATTSERVERSTUB_H
|
||||||
|
#define BLE_GATTSERVERSTUB_H
|
||||||
|
|
||||||
|
#include "ble/GattServer.h"
|
||||||
|
#include "FEATURE_BLE/source/generic/GattServerEvents.h"
|
||||||
|
#include "ble/Gap.h"
|
||||||
|
|
||||||
|
namespace ble {
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
class GattServer {
|
||||||
|
public:
|
||||||
|
GattServer() {};
|
||||||
|
GattServer(const GattServer&) = delete;
|
||||||
|
GattServer& operator=(const GattServer&) = delete;
|
||||||
|
virtual ~GattServer() {};
|
||||||
|
|
||||||
|
using EventHandler = ble::GattServer::EventHandler;
|
||||||
|
using DataSentCallback_t = ble::GattServer::DataSentCallback_t ;
|
||||||
|
using DataSentCallbackChain_t = ble::GattServer::DataSentCallbackChain_t ;
|
||||||
|
using DataWrittenCallback_t = ble::GattServer::DataWrittenCallback_t ;
|
||||||
|
using DataWrittenCallbackChain_t = ble::GattServer::DataWrittenCallbackChain_t ;
|
||||||
|
using DataReadCallback_t = ble::GattServer::DataReadCallback_t;
|
||||||
|
using DataReadCallbackChain_t = ble::GattServer::DataReadCallbackChain_t;
|
||||||
|
using GattServerShutdownCallback_t = ble::GattServer::GattServerShutdownCallback_t;
|
||||||
|
using GattServerShutdownCallbackChain_t = ble::GattServer::GattServerShutdownCallbackChain_t;
|
||||||
|
using EventCallback_t = ble::GattServer::EventCallback_t;
|
||||||
|
|
||||||
|
virtual void setEventHandler(EventHandler *handler) { };
|
||||||
|
|
||||||
|
virtual ble_error_t reset(ble::GattServer* server) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t addService(GattService &service) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t read(
|
||||||
|
GattAttribute::Handle_t attributeHandle,
|
||||||
|
uint8_t buffer[],
|
||||||
|
uint16_t *lengthP
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t read(
|
||||||
|
ble::connection_handle_t connectionHandle,
|
||||||
|
GattAttribute::Handle_t attributeHandle,
|
||||||
|
uint8_t *buffer,
|
||||||
|
uint16_t *lengthP
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t write(
|
||||||
|
GattAttribute::Handle_t attributeHandle,
|
||||||
|
const uint8_t *value,
|
||||||
|
uint16_t size,
|
||||||
|
bool localOnly = false
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t write(
|
||||||
|
ble::connection_handle_t connectionHandle,
|
||||||
|
GattAttribute::Handle_t attributeHandle,
|
||||||
|
const uint8_t *value,
|
||||||
|
uint16_t size,
|
||||||
|
bool localOnly = false
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t areUpdatesEnabled(
|
||||||
|
const GattCharacteristic &characteristic,
|
||||||
|
bool *enabledP
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t areUpdatesEnabled(
|
||||||
|
ble::connection_handle_t connectionHandle,
|
||||||
|
const GattCharacteristic &characteristic,
|
||||||
|
bool *enabledP
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble::Gap::PreferredConnectionParams_t getPreferredConnectionParams() {
|
||||||
|
ble::Gap::PreferredConnectionParams_t params = {0}; return params;
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual void setPreferredConnectionParams(const ble::Gap::PreferredConnectionParams_t ¶ms) { };
|
||||||
|
|
||||||
|
virtual bool isOnDataReadAvailable() const { return true; };
|
||||||
|
|
||||||
|
virtual void onDataSent(const DataSentCallback_t &callback) { };
|
||||||
|
|
||||||
|
virtual DataSentCallbackChain_t &onDataSent() { static DataSentCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
virtual void onDataWritten(const DataWrittenCallback_t &callback) { };
|
||||||
|
|
||||||
|
virtual DataWrittenCallbackChain_t &onDataWritten() { static DataWrittenCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
virtual ble_error_t onDataRead(const DataReadCallback_t &callback) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual DataReadCallbackChain_t &onDataRead() { static DataReadCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
virtual void onShutdown(const GattServerShutdownCallback_t &callback) { };
|
||||||
|
|
||||||
|
virtual GattServerShutdownCallbackChain_t &onShutdown() { static GattServerShutdownCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
virtual void onUpdatesEnabled(EventCallback_t callback) { };
|
||||||
|
|
||||||
|
virtual void onUpdatesDisabled(EventCallback_t callback) { };
|
||||||
|
|
||||||
|
virtual void onConfirmationReceived(EventCallback_t callback) { };
|
||||||
|
|
||||||
|
virtual void handleDataWrittenEvent(const GattWriteCallbackParams *params) { };
|
||||||
|
|
||||||
|
virtual void handleDataReadEvent(const GattReadCallbackParams *params) { };
|
||||||
|
|
||||||
|
virtual void handleEvent(
|
||||||
|
GattServerEvents::gattEvent_e type,
|
||||||
|
ble::connection_handle_t connHandle,
|
||||||
|
GattAttribute::Handle_t attributeHandle
|
||||||
|
) { };
|
||||||
|
|
||||||
|
virtual void handleDataSentEvent(unsigned count) { };
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //BLE_GATTSERVERSTUB_H
|
|
@ -0,0 +1,317 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLE_GAPSTUB_H
|
||||||
|
#define BLE_GAPSTUB_H
|
||||||
|
|
||||||
|
namespace ble {
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
class Gap {
|
||||||
|
public:
|
||||||
|
Gap() {};
|
||||||
|
Gap(const Gap&) = delete;
|
||||||
|
Gap& operator=(const Gap&) = delete;
|
||||||
|
virtual ~Gap() {};
|
||||||
|
|
||||||
|
using EventHandler = ::ble::Gap::EventHandler;
|
||||||
|
using GapShutdownCallback_t = ::ble::Gap::GapShutdownCallback_t;
|
||||||
|
using GapShutdownCallbackChain_t = ::ble::Gap::GapShutdownCallbackChain_t ;
|
||||||
|
using PreferredConnectionParams_t = ::ble::Gap::PreferredConnectionParams_t ;
|
||||||
|
|
||||||
|
#if BLE_FEATURE_PRIVACY
|
||||||
|
#if BLE_ROLE_BROADCASTER
|
||||||
|
static const peripheral_privacy_configuration_t default_peripheral_privacy_configuration;
|
||||||
|
#endif // BLE_ROLE_BROADCASTER
|
||||||
|
|
||||||
|
#if BLE_ROLE_OBSERVER
|
||||||
|
/**
|
||||||
|
* Default peripheral privacy configuration.
|
||||||
|
*/
|
||||||
|
static const central_privacy_configuration_t default_central_privacy_configuration;
|
||||||
|
#endif // BLE_ROLE_OBSERVER
|
||||||
|
#endif // BLE_FEATURE_PRIVACY
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void setEventHandler(EventHandler *handler) { };
|
||||||
|
|
||||||
|
virtual bool isFeatureSupported(controller_supported_features_t feature) { return true; };
|
||||||
|
|
||||||
|
/* advertising */
|
||||||
|
#if BLE_ROLE_BROADCASTER
|
||||||
|
|
||||||
|
virtual uint8_t getMaxAdvertisingSetNumber() { return 1; };
|
||||||
|
|
||||||
|
virtual uint16_t getMaxAdvertisingDataLength() { return 23; };
|
||||||
|
|
||||||
|
virtual uint16_t getMaxConnectableAdvertisingDataLength() { return 21; };
|
||||||
|
|
||||||
|
virtual uint16_t getMaxActiveSetAdvertisingDataLength() { return 21; };
|
||||||
|
|
||||||
|
#if BLE_FEATURE_EXTENDED_ADVERTISING
|
||||||
|
|
||||||
|
virtual ble_error_t createAdvertisingSet(
|
||||||
|
advertising_handle_t *handle,
|
||||||
|
const AdvertisingParameters ¶meters
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t destroyAdvertisingSet(advertising_handle_t handle) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#endif // BLE_FEATURE_EXTENDED_ADVERTISING
|
||||||
|
|
||||||
|
virtual ble_error_t setAdvertisingParameters(
|
||||||
|
advertising_handle_t handle,
|
||||||
|
const AdvertisingParameters ¶ms
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setAdvertisingPayload(
|
||||||
|
advertising_handle_t handle,
|
||||||
|
mbed::Span<const uint8_t> payload
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setAdvertisingScanResponse(
|
||||||
|
advertising_handle_t handle,
|
||||||
|
mbed::Span<const uint8_t> response
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t startAdvertising(
|
||||||
|
advertising_handle_t handle,
|
||||||
|
adv_duration_t maxDuration = adv_duration_t::forever(),
|
||||||
|
uint8_t maxEvents = 0
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t stopAdvertising(advertising_handle_t handle) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual bool isAdvertisingActive(advertising_handle_t handle) { return true; };
|
||||||
|
|
||||||
|
#endif // BLE_ROLE_BROADCASTER
|
||||||
|
|
||||||
|
#if BLE_ROLE_BROADCASTER
|
||||||
|
#if BLE_FEATURE_PERIODIC_ADVERTISING
|
||||||
|
|
||||||
|
virtual ble_error_t setPeriodicAdvertisingParameters(
|
||||||
|
advertising_handle_t handle,
|
||||||
|
periodic_interval_t periodicAdvertisingIntervalMin,
|
||||||
|
periodic_interval_t periodicAdvertisingIntervalMax,
|
||||||
|
bool advertiseTxPower = true
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setPeriodicAdvertisingPayload(
|
||||||
|
advertising_handle_t handle,
|
||||||
|
mbed::Span<const uint8_t> payload
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t startPeriodicAdvertising(advertising_handle_t handle) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t stopPeriodicAdvertising(advertising_handle_t handle) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual bool isPeriodicAdvertisingActive(advertising_handle_t handle) { return true; };
|
||||||
|
|
||||||
|
#endif // BLE_ROLE_BROADCASTER
|
||||||
|
#endif // BLE_FEATURE_PERIODIC_ADVERTISING
|
||||||
|
|
||||||
|
/* scanning */
|
||||||
|
#if BLE_ROLE_OBSERVER
|
||||||
|
|
||||||
|
virtual ble_error_t setScanParameters(const ScanParameters ¶ms) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t startScan(
|
||||||
|
scan_duration_t duration = scan_duration_t::forever(),
|
||||||
|
duplicates_filter_t filtering = duplicates_filter_t::DISABLE,
|
||||||
|
scan_period_t period = scan_period_t(0)
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t initiate_scan() { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t stopScan() { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#endif // BLE_ROLE_OBSERVER
|
||||||
|
|
||||||
|
#if BLE_ROLE_OBSERVER
|
||||||
|
#if BLE_FEATURE_PERIODIC_ADVERTISING
|
||||||
|
|
||||||
|
virtual ble_error_t createSync(
|
||||||
|
peer_address_type_t peerAddressType,
|
||||||
|
const address_t &peerAddress,
|
||||||
|
uint8_t sid,
|
||||||
|
slave_latency_t maxPacketSkip,
|
||||||
|
sync_timeout_t timeout
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t createSync(
|
||||||
|
slave_latency_t maxPacketSkip,
|
||||||
|
sync_timeout_t timeout
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t cancelCreateSync() { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t terminateSync(periodic_sync_handle_t handle) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t addDeviceToPeriodicAdvertiserList(
|
||||||
|
peer_address_type_t peerAddressType,
|
||||||
|
const address_t &peerAddress,
|
||||||
|
advertising_sid_t sid
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t removeDeviceFromPeriodicAdvertiserList(
|
||||||
|
peer_address_type_t peerAddressType,
|
||||||
|
const address_t &peerAddress,
|
||||||
|
advertising_sid_t sid
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t clearPeriodicAdvertiserList() { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
uint8_t getMaxPeriodicAdvertiserListSize() { return 1; };
|
||||||
|
|
||||||
|
#endif // BLE_ROLE_OBSERVER
|
||||||
|
#endif // BLE_FEATURE_PERIODIC_ADVERTISING
|
||||||
|
|
||||||
|
#if BLE_ROLE_CENTRAL
|
||||||
|
|
||||||
|
virtual ble_error_t connect(
|
||||||
|
peer_address_type_t peerAddressType,
|
||||||
|
const address_t &peerAddress,
|
||||||
|
const ConnectionParameters &connectionParams
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t cancelConnect() { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#endif // BLE_ROLE_CENTRAL
|
||||||
|
|
||||||
|
#if BLE_FEATURE_CONNECTABLE
|
||||||
|
|
||||||
|
virtual ble_error_t updateConnectionParameters(
|
||||||
|
connection_handle_t connectionHandle,
|
||||||
|
conn_interval_t minConnectionInterval,
|
||||||
|
conn_interval_t maxConnectionInterval,
|
||||||
|
slave_latency_t slaveLatency,
|
||||||
|
supervision_timeout_t supervision_timeout,
|
||||||
|
conn_event_length_t minConnectionEventLength = conn_event_length_t(0),
|
||||||
|
conn_event_length_t maxConnectionEventLength = conn_event_length_t(0)
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t manageConnectionParametersUpdateRequest(
|
||||||
|
bool userManageConnectionUpdateRequest
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t acceptConnectionParametersUpdate(
|
||||||
|
connection_handle_t connectionHandle,
|
||||||
|
conn_interval_t minConnectionInterval,
|
||||||
|
conn_interval_t maxConnectionInterval,
|
||||||
|
slave_latency_t slaveLatency,
|
||||||
|
supervision_timeout_t supervision_timeout,
|
||||||
|
conn_event_length_t minConnectionEventLength = conn_event_length_t(0),
|
||||||
|
conn_event_length_t maxConnectionEventLength = conn_event_length_t(0)
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t rejectConnectionParametersUpdate(
|
||||||
|
connection_handle_t connectionHandle
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t disconnect(
|
||||||
|
connection_handle_t connectionHandle,
|
||||||
|
local_disconnection_reason_t reason
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#endif // BLE_FEATURE_CONNECTABLE
|
||||||
|
#if BLE_FEATURE_PHY_MANAGEMENT
|
||||||
|
|
||||||
|
virtual ble_error_t readPhy(connection_handle_t connection) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setPreferredPhys(
|
||||||
|
const phy_set_t *txPhys,
|
||||||
|
const phy_set_t *rxPhys
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setPhy(
|
||||||
|
connection_handle_t connection,
|
||||||
|
const phy_set_t *txPhys,
|
||||||
|
const phy_set_t *rxPhys,
|
||||||
|
coded_symbol_per_bit_t codedSymbol
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#endif // BLE_FEATURE_PHY_MANAGEMENT
|
||||||
|
|
||||||
|
#if BLE_FEATURE_PRIVACY
|
||||||
|
|
||||||
|
virtual ble_error_t enablePrivacy(bool enable) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#if BLE_ROLE_BROADCASTER
|
||||||
|
|
||||||
|
virtual ble_error_t setPeripheralPrivacyConfiguration(
|
||||||
|
const peripheral_privacy_configuration_t *configuration
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t getPeripheralPrivacyConfiguration(
|
||||||
|
peripheral_privacy_configuration_t *configuration
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#endif // BLE_ROLE_BROADCASTER
|
||||||
|
|
||||||
|
#if BLE_ROLE_OBSERVER
|
||||||
|
|
||||||
|
virtual ble_error_t setCentralPrivacyConfiguration(
|
||||||
|
const central_privacy_configuration_t *configuration
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t getCentralPrivacyConfiguration(
|
||||||
|
central_privacy_configuration_t *configuration
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#endif // BLE_ROLE_OBSERVER
|
||||||
|
#endif // BLE_FEATURE_PRIVACY
|
||||||
|
|
||||||
|
#if BLE_FEATURE_WHITELIST
|
||||||
|
|
||||||
|
virtual uint8_t getMaxWhitelistSize() const { return 1; };
|
||||||
|
|
||||||
|
virtual ble_error_t getWhitelist(whitelist_t &whitelist) const { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setWhitelist(const whitelist_t &whitelist) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#endif // BLE_FEATURE_WHITELIST
|
||||||
|
|
||||||
|
virtual ble_error_t getAddress(
|
||||||
|
own_address_type_t &typeP,
|
||||||
|
address_t &address
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
static ble_error_t getRandomAddressType(
|
||||||
|
ble::address_t address,
|
||||||
|
ble::random_address_type_t *addressType
|
||||||
|
) { return BLE_ERROR_NONE;};
|
||||||
|
|
||||||
|
virtual ble_error_t reset() { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual void onShutdown(const GapShutdownCallback_t &callback) { };
|
||||||
|
|
||||||
|
virtual GapShutdownCallbackChain_t &onShutdown() { static GapShutdownCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
/*
|
||||||
|
* API reserved for the controller driver to set the random static address.
|
||||||
|
* Setting a new random static address while the controller is operating is
|
||||||
|
* forbidden by the Bluetooth specification.
|
||||||
|
*/
|
||||||
|
virtual ble_error_t setRandomStaticAddress(const ble::address_t &address) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble::address_t getRandomStaticAddress() { return ble::address_t(); };
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //BLE_GAPSTUB_H
|
|
@ -0,0 +1,134 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BLE_GATTCLIENTSTUB_H
|
||||||
|
#define BLE_GATTCLIENTSTUB_H
|
||||||
|
|
||||||
|
#include "events/EventQueue.h"
|
||||||
|
#include "events/mbed_events.h"
|
||||||
|
|
||||||
|
namespace ble {
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
class GattClient {
|
||||||
|
public:
|
||||||
|
using EventHandler = ble::GattClient::EventHandler;
|
||||||
|
using WriteOp_t = ble::GattClient::WriteOp_t;
|
||||||
|
using HVXCallback_t = ble::GattClient::HVXCallback_t ;
|
||||||
|
using GattClientShutdownCallback_t = ble::GattClient::GattClientShutdownCallback_t ;
|
||||||
|
using GattClientShutdownCallbackChain_t = ble::GattClient::GattClientShutdownCallbackChain_t ;
|
||||||
|
using HVXCallbackChain_t = ble::GattClient::HVXCallbackChain_t ;
|
||||||
|
using ReadCallbackChain_t = ble::GattClient::ReadCallbackChain_t ;
|
||||||
|
using WriteCallbackChain_t = ble::GattClient::WriteCallbackChain_t ;
|
||||||
|
|
||||||
|
GattClient() {};
|
||||||
|
GattClient(const GattClient&) = delete;
|
||||||
|
GattClient& operator=(const GattClient&) = delete;
|
||||||
|
virtual ~GattClient() {};
|
||||||
|
|
||||||
|
virtual void setEventHandler(EventHandler *handler) { };
|
||||||
|
|
||||||
|
virtual ble_error_t launchServiceDiscovery(
|
||||||
|
ble::connection_handle_t connectionHandle,
|
||||||
|
ServiceDiscovery::ServiceCallback_t sc = nullptr,
|
||||||
|
ServiceDiscovery::CharacteristicCallback_t cc = nullptr,
|
||||||
|
const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN),
|
||||||
|
const UUID &matchingCharacteristicUUIDIn = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t discoverServices(
|
||||||
|
ble::connection_handle_t connectionHandle,
|
||||||
|
ServiceDiscovery::ServiceCallback_t callback,
|
||||||
|
const UUID &matchingServiceUUID = UUID::ShortUUIDBytes_t(BLE_UUID_UNKNOWN)
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t discoverServices(
|
||||||
|
ble::connection_handle_t connectionHandle,
|
||||||
|
ServiceDiscovery::ServiceCallback_t callback,
|
||||||
|
GattAttribute::Handle_t startHandle,
|
||||||
|
GattAttribute::Handle_t endHandle
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual bool isServiceDiscoveryActive(void) const { return true; };
|
||||||
|
|
||||||
|
virtual void terminateServiceDiscovery(void) { };
|
||||||
|
|
||||||
|
virtual ble_error_t read(
|
||||||
|
ble::connection_handle_t connHandle,
|
||||||
|
GattAttribute::Handle_t attributeHandle,
|
||||||
|
uint16_t offset
|
||||||
|
) const { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t write(
|
||||||
|
GattClient::WriteOp_t cmd,
|
||||||
|
ble::connection_handle_t connHandle,
|
||||||
|
GattAttribute::Handle_t attributeHandle,
|
||||||
|
size_t length,
|
||||||
|
const uint8_t *value
|
||||||
|
) const { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
/* Event callback handlers. */
|
||||||
|
|
||||||
|
virtual void onDataRead(ReadCallback_t callback) { };
|
||||||
|
|
||||||
|
virtual ReadCallbackChain_t &onDataRead() { static ReadCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
virtual void onDataWritten(WriteCallback_t callback) { };
|
||||||
|
|
||||||
|
virtual WriteCallbackChain_t &onDataWritten() { static WriteCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
virtual void onServiceDiscoveryTermination(
|
||||||
|
ServiceDiscovery::TerminationCallback_t callback
|
||||||
|
) { };
|
||||||
|
|
||||||
|
virtual ble_error_t discoverCharacteristicDescriptors(
|
||||||
|
const DiscoveredCharacteristic &characteristic,
|
||||||
|
const CharacteristicDescriptorDiscovery::DiscoveryCallback_t &discoveryCallback,
|
||||||
|
const CharacteristicDescriptorDiscovery::TerminationCallback_t &terminationCallback
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual bool isCharacteristicDescriptorDiscoveryActive(
|
||||||
|
const DiscoveredCharacteristic &characteristic
|
||||||
|
) const { return true; };
|
||||||
|
|
||||||
|
virtual void terminateCharacteristicDescriptorDiscovery(
|
||||||
|
const DiscoveredCharacteristic &characteristic
|
||||||
|
) { };
|
||||||
|
|
||||||
|
virtual ble_error_t negotiateAttMtu(ble::connection_handle_t connection) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual void onHVX(HVXCallback_t callback) { };
|
||||||
|
|
||||||
|
virtual void onShutdown(const GattClientShutdownCallback_t &callback) { };
|
||||||
|
|
||||||
|
virtual GattClientShutdownCallbackChain_t &onShutdown() { static GattClientShutdownCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
virtual HVXCallbackChain_t &onHVX() { static HVXCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
virtual ble_error_t reset(void) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual void processReadResponse(const GattReadCallbackParams *params) { };
|
||||||
|
|
||||||
|
virtual void processWriteResponse(const GattWriteCallbackParams *params) { };
|
||||||
|
|
||||||
|
virtual void processHVXEvent(const GattHVXCallbackParams *params) { };
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //BLE_GATTCLIENTSTUB_H
|
|
@ -0,0 +1,186 @@
|
||||||
|
/* mbed Microcontroller Library
|
||||||
|
* Copyright (c) 2020 ARM Limited
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SECURITYMANAGERSTUB_H
|
||||||
|
#define SECURITYMANAGERSTUB_H
|
||||||
|
|
||||||
|
namespace ble {
|
||||||
|
namespace impl {
|
||||||
|
|
||||||
|
class SecurityManager {
|
||||||
|
public:
|
||||||
|
SecurityManager() {};
|
||||||
|
SecurityManager(const SecurityManager&) = delete;
|
||||||
|
SecurityManager& operator=(const SecurityManager&) = delete;
|
||||||
|
virtual ~SecurityManager() {};
|
||||||
|
|
||||||
|
using SecurityIOCapabilities_t = ble::SecurityManager::SecurityIOCapabilities_t;
|
||||||
|
using SecurityMode_t = ble::SecurityManager::SecurityMode_t;
|
||||||
|
using SecurityManagerShutdownCallback_t = ble::SecurityManager::SecurityManagerShutdownCallback_t;
|
||||||
|
using SecurityManagerShutdownCallbackChain_t = ble::SecurityManager::SecurityManagerShutdownCallbackChain_t;
|
||||||
|
using EventHandler = ble::SecurityManager::EventHandler;
|
||||||
|
using Passkey_t = ble::SecurityManager::Passkey_t ;
|
||||||
|
|
||||||
|
static auto constexpr IO_CAPS_NONE = ble::SecurityManager::IO_CAPS_NONE;
|
||||||
|
|
||||||
|
virtual ble_error_t init(
|
||||||
|
bool enableBonding = true,
|
||||||
|
bool requireMITM = true,
|
||||||
|
SecurityIOCapabilities_t iocaps = IO_CAPS_NONE,
|
||||||
|
const Passkey_t passkey = nullptr,
|
||||||
|
bool signing = true,
|
||||||
|
const char *dbFilepath = nullptr
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setDatabaseFilepath(const char *dbFilepath = nullptr) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t reset() { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t preserveBondingStateOnReset(bool enable) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// List management
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual ble_error_t purgeAllBondingState() { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t generateWhitelistFromBondTable(::ble::whitelist_t *whitelist) const { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Pairing
|
||||||
|
//
|
||||||
|
|
||||||
|
#if BLE_ROLE_CENTRAL
|
||||||
|
virtual ble_error_t requestPairing(ble::connection_handle_t connectionHandle) { return BLE_ERROR_NONE; };
|
||||||
|
#endif // BLE_ROLE_CENTRAL
|
||||||
|
|
||||||
|
#if BLE_ROLE_PERIPHERAL
|
||||||
|
virtual ble_error_t acceptPairingRequest(ble::connection_handle_t connectionHandle) { return BLE_ERROR_NONE; };
|
||||||
|
#endif // BLE_ROLE_PERIPHERAL
|
||||||
|
|
||||||
|
virtual ble_error_t cancelPairingRequest(ble::connection_handle_t connectionHandle) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setPairingRequestAuthorisation(bool required = true) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t getPeerIdentity(ble::connection_handle_t connectionHandle) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Feature support
|
||||||
|
//
|
||||||
|
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||||
|
virtual ble_error_t allowLegacyPairing(bool allow = true) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t getSecureConnectionsSupport(bool *enabled) { return BLE_ERROR_NONE; };
|
||||||
|
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Security settings
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual ble_error_t setIoCapability(SecurityIOCapabilities_t iocaps) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setDisplayPasskey(const Passkey_t passkey) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setLinkSecurity(ble::connection_handle_t connectionHandle, SecurityMode_t securityMode) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setKeypressNotification(bool enabled = true) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#if BLE_FEATURE_SIGNING
|
||||||
|
|
||||||
|
virtual ble_error_t enableSigning(ble::connection_handle_t connectionHandle, bool enabled = true) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
#endif // BLE_FEATURE_SIGNING
|
||||||
|
|
||||||
|
virtual ble_error_t setHintFutureRoleReversal(bool enable = true) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Encryption
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual ble_error_t getLinkEncryption(ble::connection_handle_t connectionHandle, ble::link_encryption_t *encryption) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setLinkEncryption(ble::connection_handle_t connectionHandle, ble::link_encryption_t encryption) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setEncryptionKeyRequirements(uint8_t minimumByteSize, uint8_t maximumByteSize) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t getEncryptionKeySize(
|
||||||
|
connection_handle_t connectionHandle,
|
||||||
|
uint8_t *size
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Authentication
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual ble_error_t requestAuthentication(ble::connection_handle_t connectionHandle) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// MITM
|
||||||
|
//
|
||||||
|
|
||||||
|
virtual ble_error_t generateOOB(const ble::address_t *address) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t setOOBDataUsage(ble::connection_handle_t connectionHandle, bool useOOB, bool OOBProvidesMITM = true) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t passkeyEntered(ble::connection_handle_t connectionHandle, Passkey_t passkey) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t legacyPairingOobReceived(const ble::address_t *address, const ble::oob_tk_t *tk) { return BLE_ERROR_NONE; };
|
||||||
|
#if BLE_FEATURE_SECURE_CONNECTIONS
|
||||||
|
virtual ble_error_t confirmationEntered(ble::connection_handle_t connectionHandle, bool confirmation) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t sendKeypressNotification(ble::connection_handle_t connectionHandle, ble::Keypress_t keypress) { return BLE_ERROR_NONE; };
|
||||||
|
|
||||||
|
virtual ble_error_t oobReceived(
|
||||||
|
const ble::address_t *address,
|
||||||
|
const ble::oob_lesc_value_t *random,
|
||||||
|
const ble::oob_confirm_t *confirm
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
#endif // BLE_FEATURE_SECURE_CONNECTIONS
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Keys
|
||||||
|
//
|
||||||
|
#if BLE_FEATURE_SIGNING
|
||||||
|
virtual ble_error_t getSigningKey(ble::connection_handle_t connectionHandle, bool authenticated) { return BLE_ERROR_NONE; };
|
||||||
|
#endif // BLE_FEATURE_SIGNING
|
||||||
|
////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Privacy
|
||||||
|
//
|
||||||
|
|
||||||
|
#if BLE_FEATURE_PRIVACY
|
||||||
|
virtual ble_error_t setPrivateAddressTimeout(
|
||||||
|
uint16_t timeout_in_seconds
|
||||||
|
) { return BLE_ERROR_NONE; };
|
||||||
|
#endif // BLE_FEATURE_PRIVACY
|
||||||
|
|
||||||
|
/* Event callback handlers. */
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void onShutdown(const SecurityManagerShutdownCallback_t &callback) { };
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void onShutdown(T *objPtr, void (T::*memberPtr)(const SecurityManager *)) { };
|
||||||
|
|
||||||
|
virtual SecurityManagerShutdownCallbackChain_t &onShutdown() { static SecurityManagerShutdownCallbackChain_t chain; return chain; };
|
||||||
|
|
||||||
|
virtual void setSecurityManagerEventHandler(EventHandler *handler) { };
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //SECURITYMANAGERSTUB_H
|
|
@ -19,6 +19,49 @@
|
||||||
#ifndef MBED_BLE_ROLES_H__
|
#ifndef MBED_BLE_ROLES_H__
|
||||||
#define MBED_BLE_ROLES_H__
|
#define MBED_BLE_ROLES_H__
|
||||||
|
|
||||||
|
#if !defined(BLE_ROLE_OBSERVER)
|
||||||
|
#define BLE_ROLE_OBSERVER 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_ROLE_BROADCASTER)
|
||||||
|
#define BLE_ROLE_BROADCASTER 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_ROLE_CENTRAL)
|
||||||
|
#define BLE_ROLE_CENTRAL 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_ROLE_PERIPHERAL)
|
||||||
|
#define BLE_ROLE_PERIPHERAL 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_GATT_CLIENT)
|
||||||
|
#define BLE_FEATURE_GATT_CLIENT 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_GATT_SERVER)
|
||||||
|
#define BLE_FEATURE_GATT_SERVER 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_SECURITY)
|
||||||
|
#define BLE_FEATURE_SECURITY 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_SECURE_CONNECTIONS)
|
||||||
|
#define BLE_FEATURE_SECURE_CONNECTIONS 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_SIGNING)
|
||||||
|
#define BLE_FEATURE_SIGNING 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_WHITELIST)
|
||||||
|
#define BLE_FEATURE_WHITELIST 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_PRIVACY)
|
||||||
|
#define BLE_FEATURE_PRIVACY 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_PHY_MANAGEMENT)
|
||||||
|
#define BLE_FEATURE_PHY_MANAGEMENT 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_EXTENDED_ADVERTISING)
|
||||||
|
#define BLE_FEATURE_EXTENDED_ADVERTISING 1
|
||||||
|
#endif
|
||||||
|
#if !defined(BLE_FEATURE_PERIODIC_ADVERTISING)
|
||||||
|
#define BLE_FEATURE_PERIODIC_ADVERTISING 1
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !(BLE_ROLE_OBSERVER) && !(BLE_ROLE_BROADCASTER)
|
#if !(BLE_ROLE_OBSERVER) && !(BLE_ROLE_BROADCASTER)
|
||||||
#error "BLE requires at least one role 'BROADCASTER' or 'OBSERVER' to be enabled"
|
#error "BLE requires at least one role 'BROADCASTER' or 'OBSERVER' to be enabled"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
# BLE unit testing
|
||||||
|
|
||||||
|
The [ble_template](./ble_template) contains a template you can use as a starting point for writing unit tests
|
||||||
|
for you application or library that uses the BLE API.
|
||||||
|
|
||||||
|
Copy the template into another directory (must be under UNITTESTS) and add your tests to the cpp file.
|
||||||
|
|
||||||
|
Please refer to [Mbed OS BLE introduction](https://os.mbed.com/docs/latest/apis/ble.html) for details.
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020, Arm Limited and affiliates.
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#include "ble/BLE.h"
|
||||||
|
#include "ble/Gap.h"
|
||||||
|
#include "ble/GattServer.h"
|
||||||
|
#include "ble/GattClient.h"
|
||||||
|
#include "ble/SecurityManager.h"
|
||||||
|
|
||||||
|
#include "ble_mocks.h"
|
||||||
|
|
||||||
|
/* This test does not test anything, you may use it as a template for your unit tests.
|
||||||
|
* It shows all the elements you need to use mocks for all the ble APIS. */
|
||||||
|
|
||||||
|
class TestBLE : public testing::Test {
|
||||||
|
protected:
|
||||||
|
void SetUp()
|
||||||
|
{
|
||||||
|
ble = &BLE::Instance();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TearDown()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BLE* ble;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(TestBLE, reset)
|
||||||
|
{
|
||||||
|
/* these are the user facing APIs */
|
||||||
|
Gap &gap = ble->gap();
|
||||||
|
GattClient &client = ble->gattClient();
|
||||||
|
GattServer &server = ble->gattServer();
|
||||||
|
SecurityManager &sm = ble->securityManager();
|
||||||
|
|
||||||
|
/* they in turn call the implementations which are mocked and can have expectations set on them */
|
||||||
|
EXPECT_CALL(ble::gap_mock(), reset());
|
||||||
|
EXPECT_CALL(ble::gatt_client_mock(), reset());
|
||||||
|
EXPECT_CALL(ble::gatt_server_mock(), reset(&server)); /* this reset contains pointer to user API */
|
||||||
|
EXPECT_CALL(ble::security_manager_mock(), reset());
|
||||||
|
|
||||||
|
/* calls are made on real APIs but will fulfill expectations on the mocks as that's what they call in the end */
|
||||||
|
gap.reset();
|
||||||
|
client.reset();
|
||||||
|
server.reset();
|
||||||
|
sm.reset();
|
||||||
|
|
||||||
|
/* remember you must call this at the end of the test if you have any expectations set */
|
||||||
|
ble::reset_mocks();
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
####################
|
||||||
|
# UNIT TESTS
|
||||||
|
####################
|
||||||
|
|
||||||
|
# Add test specific include paths
|
||||||
|
set(unittest-includes ${unittest-includes}
|
||||||
|
../connectivity/FEATURE_BLE/include/ble
|
||||||
|
../connectivity/FEATURE_BLE/include
|
||||||
|
../connectivity
|
||||||
|
)
|
||||||
|
|
||||||
|
# Source files
|
||||||
|
set(unittest-sources
|
||||||
|
../connectivity/FEATURE_BLE/source/gap/AdvertisingDataBuilder.cpp
|
||||||
|
../connectivity/FEATURE_BLE/source/gap/AdvertisingParameters.cpp
|
||||||
|
../connectivity/FEATURE_BLE/source/gap/ConnectionParameters.cpp
|
||||||
|
../connectivity/FEATURE_BLE/source/gatt/DiscoveredCharacteristic.cpp
|
||||||
|
../connectivity/FEATURE_BLE/source/Gap.cpp
|
||||||
|
../connectivity/FEATURE_BLE/source/GattClient.cpp
|
||||||
|
../connectivity/FEATURE_BLE/source/GattServer.cpp
|
||||||
|
../connectivity/FEATURE_BLE/source/SecurityManager.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test files
|
||||||
|
set(unittest-test-sources
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/ble.cpp
|
||||||
|
stubs/BLE.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
set(unittest-test-flags
|
||||||
|
-DMBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE=115200
|
||||||
|
)
|
Loading…
Reference in New Issue