mirror of
https://github.com/google/pebble.git
synced 2025-03-24 12:39:07 +00:00
220 lines
6.5 KiB
C
220 lines
6.5 KiB
C
/*
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* 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 "fake_gatt_client_operations.h"
|
|
|
|
#include "comm/ble/gatt_client_operations.h"
|
|
|
|
#include "util/list.h"
|
|
|
|
#include "clar_asserts.h"
|
|
|
|
#include <string.h>
|
|
|
|
typedef struct {
|
|
ListNode node;
|
|
BLECharacteristic characteristic;
|
|
GAPLEClient client;
|
|
} Read;
|
|
|
|
static Read *s_read_head;
|
|
|
|
static BTErrno s_read_return_value;
|
|
|
|
BTErrno gatt_client_op_read(BLECharacteristic characteristic,
|
|
GAPLEClient client) {
|
|
if (s_read_return_value != BTErrnoOK) {
|
|
return s_read_return_value;
|
|
}
|
|
Read *read = malloc(sizeof(Read));
|
|
*read = (const Read) {
|
|
.characteristic = characteristic,
|
|
.client = client,
|
|
};
|
|
if (s_read_head) {
|
|
list_append((ListNode *)s_read_head, &read->node);
|
|
} else {
|
|
s_read_head = read;
|
|
}
|
|
return BTErrnoOK;
|
|
}
|
|
|
|
void gatt_client_consume_read_response(uintptr_t object_ref,
|
|
uint8_t value_out[],
|
|
uint16_t value_length,
|
|
GAPLEClient client) {
|
|
}
|
|
|
|
typedef struct {
|
|
ListNode node;
|
|
BLECharacteristic characteristic;
|
|
GAPLEClient client;
|
|
uint8_t *value;
|
|
size_t value_length;
|
|
bool is_response_required;
|
|
} Write;
|
|
|
|
static Write *s_write_head;
|
|
|
|
static BTErrno s_write_return_value;
|
|
|
|
static BTErrno fake_gatt_client_write(BLECharacteristic characteristic,
|
|
const uint8_t *value,
|
|
size_t value_length,
|
|
GAPLEClient client,
|
|
bool is_response_required) {
|
|
if (s_write_return_value != BTErrnoOK) {
|
|
return s_write_return_value;
|
|
}
|
|
Write *write = malloc(sizeof(Write));
|
|
uint8_t *buffer;
|
|
if (value_length) {
|
|
cl_assert(value);
|
|
buffer = malloc(value_length);
|
|
memcpy(buffer, value, value_length);
|
|
} else {
|
|
cl_assert_equal_p(value, NULL);
|
|
buffer = NULL;
|
|
}
|
|
*write = (const Write) {
|
|
.characteristic = characteristic,
|
|
.client = client,
|
|
.is_response_required = is_response_required,
|
|
.value = buffer,
|
|
.value_length = value_length,
|
|
};
|
|
if (s_write_head) {
|
|
list_append((ListNode *)s_write_head, &write->node);
|
|
} else {
|
|
s_write_head = write;
|
|
}
|
|
return BTErrnoOK;
|
|
}
|
|
|
|
BTErrno gatt_client_op_write(BLECharacteristic characteristic,
|
|
const uint8_t *value,
|
|
size_t value_length,
|
|
GAPLEClient client) {
|
|
return fake_gatt_client_write(characteristic, value, value_length, client,
|
|
true /* is_response_required */);
|
|
}
|
|
|
|
BTErrno gatt_client_op_write_without_response(BLECharacteristic characteristic,
|
|
const uint8_t *value,
|
|
size_t value_length,
|
|
GAPLEClient client) {
|
|
return fake_gatt_client_write(characteristic, value, value_length, client,
|
|
false /* is_response_required */);
|
|
}
|
|
|
|
BTErrno gatt_client_op_write_descriptor(BLEDescriptor descriptor,
|
|
const uint8_t *value,
|
|
size_t value_length,
|
|
GAPLEClient client) {
|
|
return BTErrnoOK;
|
|
}
|
|
|
|
BTErrno gatt_client_op_read_descriptor(BLEDescriptor descriptor,
|
|
GAPLEClient client) {
|
|
return BTErrnoOK;
|
|
}
|
|
|
|
BTErrno gatt_client_op_write_descriptor_cccd(BLEDescriptor cccd, const uint16_t *value) {
|
|
return BTErrnoOK;
|
|
}
|
|
|
|
void gatt_client_op_cleanup(GAPLEClient client) {
|
|
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
// Fake Manipulation
|
|
|
|
void fake_gatt_client_op_init(void) {
|
|
s_read_return_value = BTErrnoOK;
|
|
s_write_return_value = BTErrnoOK;
|
|
}
|
|
|
|
void fake_gatt_client_op_deinit(void) {
|
|
Read *read = s_read_head;
|
|
while (read) {
|
|
Read *next = (Read *) read->node.next;
|
|
free(read);
|
|
read = next;
|
|
}
|
|
s_read_head = NULL;
|
|
|
|
fake_gatt_client_op_clear_write_list();
|
|
}
|
|
|
|
void fake_gatt_client_op_set_read_return_value(BTErrno e) {
|
|
s_read_return_value = e;
|
|
}
|
|
|
|
void fake_gatt_client_op_assert_read(BLECharacteristic characteristic,
|
|
GAPLEClient client) {
|
|
if (s_read_head) {
|
|
cl_assert_equal_i(characteristic, s_read_head->characteristic);
|
|
cl_assert_equal_i(client, s_read_head->client);
|
|
} else {
|
|
cl_assert_(false, "No gatt_client_op_read() has happened at all");
|
|
}
|
|
Read *old_head = s_read_head;
|
|
s_read_head = (Read *) list_pop_head(&s_read_head->node);
|
|
free(old_head);
|
|
}
|
|
|
|
void fake_gatt_client_op_set_write_return_value(BTErrno e) {
|
|
s_write_return_value = e;
|
|
}
|
|
|
|
void fake_gatt_client_op_clear_write_list(void) {
|
|
Write *write = s_write_head;
|
|
while (write) {
|
|
Write *next = (Write *) write->node.next;
|
|
free(write->value);
|
|
free(write);
|
|
write = next;
|
|
}
|
|
s_write_head = NULL;
|
|
}
|
|
|
|
void fake_gatt_client_op_assert_no_write(void) {
|
|
cl_assert_equal_p(s_write_head, NULL);
|
|
}
|
|
|
|
static void fake_gatt_client_op_assert_write_failed(void) {
|
|
cl_assert_(false, "No gatt_client_op_write() or "
|
|
"gatt_client_op_write_without_response() has happened at all");
|
|
}
|
|
|
|
void fake_gatt_client_op_assert_write(BLECharacteristic characteristic,
|
|
const uint8_t *value, size_t value_length,
|
|
GAPLEClient client, bool is_response_required) {
|
|
if (s_write_head) {
|
|
cl_assert_equal_i(characteristic, s_write_head->characteristic);
|
|
cl_assert_equal_i(s_write_head->value_length, value_length);
|
|
cl_assert_equal_i(memcmp(value, s_write_head->value, value_length), 0);
|
|
cl_assert_equal_i(client, s_write_head->client);
|
|
cl_assert_equal_b(is_response_required, s_write_head->is_response_required);
|
|
} else {
|
|
fake_gatt_client_op_assert_write_failed();
|
|
}
|
|
Write *old_write = s_write_head;
|
|
s_write_head = (Write *) list_pop_head(&s_write_head->node);
|
|
free(old_write->value);
|
|
free(old_write);
|
|
}
|