| /* |
| * Copyright (c) 2020 Demant |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| * |
| * Run this test from zephyr directory as: |
| * |
| * ./scripts/twister --coverage -p native_posix -v -T tests/bluetooth/ctrl_isoal/ |
| * |
| */ |
| |
| #include <string.h> |
| #include <zephyr/types.h> |
| #include <ztest.h> |
| #include <ztest_error_hook.h> |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| /* Include the DUT */ |
| #include "ll_sw/isoal.c" |
| |
| /* #define DEBUG_TEST (1) */ |
| /* #define DEBUG_TRACE (1) */ |
| |
| |
| #define TEST_RX_PDU_PAYLAOD_MAX (40) |
| #define TEST_RX_PDU_SIZE (TEST_RX_PDU_PAYLAOD_MAX + 2) |
| |
| #define TEST_RX_SDU_FRAG_PAYLOAD_MAX (100) |
| |
| #define LLID_TO_STR(llid) (llid == PDU_BIS_LLID_COMPLETE_END ? "COMPLETE_END" : \ |
| (llid == PDU_BIS_LLID_START_CONTINUE ? "START_CONT" : \ |
| (llid == PDU_BIS_LLID_FRAMED ? "FRAMED" : \ |
| (llid == PDU_BIS_LLID_CTRL ? "CTRL" : "?????")))) |
| |
| #define DU_ERR_TO_STR(err) (err == 1 ? "Bit Errors" : \ |
| (err == 2 ? "Data Lost" : \ |
| (err == 0 ? "OK" : "Undefined!"))) |
| |
| #define STATE_TO_STR(s) (s == BT_ISO_SINGLE ? "SINGLE" : \ |
| (s == BT_ISO_START ? "START" : \ |
| (s == BT_ISO_CONT ? "CONT" : \ |
| (s == BT_ISO_END ? "END" : "???")))) |
| |
| #define ROLE_TO_STR(s) (s == BT_ROLE_BROADCAST ? "Broadcast" : \ |
| (role == BT_CONN_ROLE_PERIPHERAL ? "Peripheral" : \ |
| (role == BT_CONN_ROLE_CENTRAL ? "Central" : "Undefined"))) |
| |
| #define FSM_TO_STR(s) (s == ISOAL_START ? "START" : \ |
| (s == ISOAL_CONTINUE ? "CONTINUE" : \ |
| (s == ISOAL_ERR_SPOOL ? "ERR SPOOL" : "???"))) |
| |
| |
| struct rx_pdu_meta_buffer { |
| struct isoal_pdu_rx pdu_meta; |
| struct node_rx_iso_meta meta; |
| uint8_t pdu[TEST_RX_PDU_SIZE]; |
| }; |
| |
| struct rx_sdu_frag_buffer { |
| uint16_t write_loc; |
| uint8_t sdu[TEST_RX_SDU_FRAG_PAYLOAD_MAX]; |
| }; |
| |
| /** |
| * Intializes a RX PDU buffer |
| * @param[in] buf Pointer to buffer structure |
| */ |
| static void init_rx_pdu_buffer(struct rx_pdu_meta_buffer *buf) |
| { |
| memset(buf, 0, sizeof(struct rx_pdu_meta_buffer)); |
| buf->pdu_meta.meta = &buf->meta; |
| buf->pdu_meta.pdu = (struct pdu_iso *) &buf->pdu[0]; |
| } |
| |
| /** |
| * Initializes a RX SDU buffer |
| * @param[in] buf Pointer to buffer structure |
| */ |
| static void init_rx_sdu_buffer(struct rx_sdu_frag_buffer *buf) |
| { |
| memset(buf, 0, sizeof(struct rx_sdu_frag_buffer)); |
| } |
| |
| #if defined(DEBUG_TEST) |
| /** |
| * Print contents of PDU |
| * @param[in] pdu_meta Pointer to PDU structure including meta information |
| */ |
| static void debug_print_rx_pdu(struct isoal_pdu_rx *pdu_meta) |
| { |
| zassert_not_null(pdu_meta, ""); |
| |
| PRINT("PDU %04d (%10d) : %12s [%10s] %03d: ", |
| (uint32_t) pdu_meta->meta->payload_number, |
| (uint32_t) pdu_meta->meta->timestamp, |
| LLID_TO_STR(pdu_meta->pdu->ll_id), |
| DU_ERR_TO_STR(pdu_meta->meta->status), |
| pdu_meta->pdu->length); |
| |
| for (int i = 0; i < pdu_meta->pdu->length; i++) { |
| PRINT("%02x ", pdu_meta->pdu->payload[i]); |
| } |
| |
| PRINT("\n"); |
| } |
| |
| /** |
| * Print contents of RX SDU |
| * @param[in] sink_ctx Sink context provided when SDU is emitted |
| * @param[in] buf SDU data buffer pointer |
| */ |
| static void debug_print_rx_sdu(const struct isoal_sink *sink_ctx, uint8_t *buf) |
| { |
| zassert_not_null(sink_ctx, ""); |
| zassert_not_null(buf, ""); |
| |
| uint16_t len = sink_ctx->sdu_production.sdu_written; |
| |
| PRINT("\n"); |
| PRINT("SDU %04d (%10d) : %12s [%10s] %03d: ", |
| sink_ctx->sdu_production.sdu.seqn, |
| sink_ctx->sdu_production.sdu.timestamp, |
| STATE_TO_STR(sink_ctx->sdu_production.sdu_state), |
| DU_ERR_TO_STR(sink_ctx->sdu_production.sdu.status), |
| len); |
| for (int i = 0; i < len; i++) { |
| PRINT("%02x ", buf[i]); |
| } |
| PRINT("\n"); |
| PRINT("\n"); |
| } |
| #else /* DEBUG_TEST */ |
| static void debug_print_rx_pdu(struct isoal_pdu_rx *pdu_meta) {} |
| static void debug_print_rx_sdu(const struct isoal_sink *sink_ctx, uint8_t *buf) {} |
| #endif /* DEBUG_TEST */ |
| |
| #if defined(DEBUG_TRACE) |
| /** |
| * Print function trace |
| * @param func Function name |
| * @param status Status |
| */ |
| static void debug_trace_func_call(const uint8_t *func, const uint8_t *status) |
| { |
| PRINT("\n"); |
| PRINT("%s :: %s\n", func, status); |
| } |
| #else /* DEBUG_TRACE */ |
| static void debug_trace_func_call(const uint8_t *func, const uint8_t *status) {} |
| #endif /* DEBUG_TRACE */ |
| |
| /** |
| * Creates an unframed PDU fragment according to provided parameters |
| * @param[in] llid LLID as Start / Continue or Complete / End |
| * @param[in] dataptr Test data to fill PDU payload |
| * @param[in] length Length of PDU payload |
| * @param[in] payload_number Payload number (Meta Information) |
| * @param[in] timestamp PDU reception Time (Meta Information) |
| * @param[in] status PDU data validity |
| * @param[out] pdu_meta PDU buffer including meta structure |
| */ |
| static void create_unframed_pdu(uint8_t llid, |
| uint8_t *dataptr, |
| uint8_t length, |
| uint64_t payload_number, |
| uint32_t timestamp, |
| uint8_t status, |
| struct isoal_pdu_rx *pdu_meta) |
| { |
| zassert_not_null(pdu_meta, ""); |
| zassert_not_null(pdu_meta->meta, ""); |
| zassert_not_null(pdu_meta->pdu, ""); |
| |
| memset(pdu_meta->meta, 0, sizeof(*pdu_meta->meta)); |
| memset(pdu_meta->pdu, 0, sizeof(*pdu_meta->pdu)); |
| |
| pdu_meta->meta->payload_number = payload_number; |
| pdu_meta->meta->timestamp = timestamp; |
| pdu_meta->meta->status = status; |
| |
| pdu_meta->pdu->ll_id = llid; |
| pdu_meta->pdu->length = length; |
| memcpy(pdu_meta->pdu->payload, dataptr, length); |
| |
| debug_print_rx_pdu(pdu_meta); |
| } |
| |
| /** |
| * Insert a new segment in the given PDU |
| * @param[In] sc !Start / Continuation bit |
| * @param[In] cmplt Complete bit |
| * @param[In] time_offset Time Offset (us) |
| * @param[In] dataptr Pointer to data to fill in segment |
| * @param[In] length Length of data |
| * @param[In/Out] pdu_meta PDU structure including meta information |
| * @return PDU data location index |
| */ |
| static uint16_t insert_segment(bool sc, bool cmplt, uint32_t time_offset, uint8_t *dataptr, |
| uint8_t length, struct isoal_pdu_rx *pdu_meta) |
| { |
| struct pdu_iso_sdu_sh seg_hdr; |
| uint16_t pdu_payload_size; |
| uint8_t hdr_write_size; |
| uint16_t pdu_data_loc; |
| |
| pdu_payload_size = pdu_meta->pdu->length + length + PDU_ISO_SEG_HDR_SIZE + |
| (sc ? 0 : PDU_ISO_SEG_TIMEOFFSET_SIZE); |
| hdr_write_size = PDU_ISO_SEG_HDR_SIZE + (sc ? 0 : PDU_ISO_SEG_TIMEOFFSET_SIZE); |
| memset(&seg_hdr, 0, sizeof(seg_hdr)); |
| |
| zassert_true(pdu_payload_size <= TEST_RX_PDU_PAYLAOD_MAX, "pdu_payload_size (%d)", |
| pdu_payload_size); |
| |
| seg_hdr.sc = sc; |
| seg_hdr.cmplt = cmplt; |
| seg_hdr.length = length + (sc ? 0 : PDU_ISO_SEG_TIMEOFFSET_SIZE); |
| |
| if (!sc) { |
| seg_hdr.timeoffset = time_offset; |
| } |
| |
| memcpy(&pdu_meta->pdu->payload[pdu_meta->pdu->length], &seg_hdr, hdr_write_size); |
| pdu_meta->pdu->length += hdr_write_size; |
| |
| memcpy(&pdu_meta->pdu->payload[pdu_meta->pdu->length], dataptr, length); |
| pdu_data_loc = pdu_meta->pdu->length; |
| pdu_meta->pdu->length += length; |
| |
| debug_print_rx_pdu(pdu_meta); |
| |
| return pdu_data_loc; |
| } |
| |
| /** |
| * Create and fill in base information for a framed PDU |
| * @param[In] payload_number Payload number (Meta Information) |
| * @param[In] timestamp Adjusted RX time stamp (CIS anchorpoint) |
| * @param[In] status PDU error status |
| * @param[In/Out] pdu_meta PDU structure including meta information |
| */ |
| static void create_framed_pdu_base(uint64_t payload_number, uint32_t timestamp, uint8_t status, |
| struct isoal_pdu_rx *pdu_meta) |
| { |
| zassert_not_null(pdu_meta, ""); |
| zassert_not_null(pdu_meta->meta, ""); |
| zassert_not_null(pdu_meta->pdu, ""); |
| |
| memset(pdu_meta->meta, 0, sizeof(*pdu_meta->meta)); |
| memset(pdu_meta->pdu, 0, sizeof(*pdu_meta->pdu)); |
| |
| pdu_meta->meta->payload_number = payload_number; |
| pdu_meta->meta->timestamp = timestamp; |
| pdu_meta->meta->status = status; |
| |
| pdu_meta->pdu->ll_id = PDU_BIS_LLID_FRAMED; |
| pdu_meta->pdu->length = 0; |
| |
| debug_print_rx_pdu(pdu_meta); |
| } |
| |
| /** |
| * Adds a single SDU framed segment to the given PDU |
| * @param[In] dataptr Pointer to data to fill in segment |
| * @param[In] length Length of data |
| * @param[In] time_offset Time offset |
| * @param[In/Out] pdu_meta PDU structure including meta information |
| * @return PDU data location index |
| */ |
| static uint16_t add_framed_pdu_single(uint8_t *dataptr, uint8_t length, uint32_t time_offset, |
| struct isoal_pdu_rx *pdu_meta) |
| { |
| zassert_not_null(pdu_meta, ""); |
| zassert_not_null(pdu_meta->meta, ""); |
| zassert_not_null(pdu_meta->pdu, ""); |
| |
| return insert_segment(false, true, time_offset, dataptr, length, pdu_meta); |
| } |
| |
| /** |
| * Adds a starting SDU framed segment to the given PDU |
| * @param[In] dataptr Pointer to data to fill in segment |
| * @param[In] length Length of data |
| * @param[In] time_offset Time offset |
| * @param[In/Out] pdu_meta PDU structure including meta information |
| * @return PDU data location index |
| */ |
| static uint16_t add_framed_pdu_start(uint8_t *dataptr, uint8_t length, uint32_t time_offset, |
| struct isoal_pdu_rx *pdu_meta) |
| { |
| zassert_not_null(pdu_meta, ""); |
| zassert_not_null(pdu_meta->meta, ""); |
| zassert_not_null(pdu_meta->pdu, ""); |
| |
| return insert_segment(false, false, time_offset, dataptr, length, pdu_meta); |
| } |
| |
| /** |
| * Adds a continuation SDU framed segment to the given PDU |
| * @param[In] dataptr Pointer to data to fill in segment |
| * @param[In] length Length of data |
| * @param[In/Out] pdu_meta PDU structure including meta information |
| * @return PDU data location index |
| */ |
| static uint16_t add_framed_pdu_cont(uint8_t *dataptr, uint8_t length, struct isoal_pdu_rx *pdu_meta) |
| { |
| zassert_not_null(pdu_meta, ""); |
| zassert_not_null(pdu_meta->meta, ""); |
| zassert_not_null(pdu_meta->pdu, ""); |
| |
| return insert_segment(true, false, 0, dataptr, length, pdu_meta); |
| } |
| |
| /** |
| * Adds an end SDU framed segment to the given PDU |
| * @param[In] dataptr Pointer to data to fill in segment |
| * @param[In] length Length of data |
| * @param[In/Out] pdu_meta PDU structure including meta information |
| * @return PDU data location index |
| */ |
| static uint16_t add_framed_pdu_end(uint8_t *dataptr, uint8_t length, struct isoal_pdu_rx *pdu_meta) |
| { |
| zassert_not_null(pdu_meta, ""); |
| zassert_not_null(pdu_meta->meta, ""); |
| zassert_not_null(pdu_meta->pdu, ""); |
| |
| return insert_segment(true, true, 0, dataptr, length, pdu_meta); |
| } |
| |
| /** |
| * Callback test fixture to be provided for RX sink creation. Allocates a new |
| * SDU buffer. |
| * @param[in] sink_ctx Sink context provided by ISO-AL |
| * @param[in] valid_pdu PDU currently being reassembled |
| * @param[out] sdu_buffer SDU buffer information return structure |
| * @return Status of operation |
| */ |
| static isoal_status_t sink_sdu_alloc_test(const struct isoal_sink *sink_ctx, |
| const struct isoal_pdu_rx *valid_pdu, |
| struct isoal_sdu_buffer *sdu_buffer) |
| { |
| debug_trace_func_call(__func__, "IN"); |
| |
| ztest_check_expected_value(sink_ctx); |
| ztest_check_expected_value(valid_pdu); |
| /* Return SDU buffer details as provided by the test */ |
| ztest_copy_return_data(sdu_buffer, sizeof(*sdu_buffer)); |
| |
| return ztest_get_return_value(); |
| } |
| |
| /** |
| * Callback test fixture to be provided for RX sink creation. Emits provided |
| * SDU in buffer |
| * @param[in] sink_ctx Sink context provided by ISO-AL |
| * @param[in] valid_sdu SDU buffer and details of SDU to be emitted |
| * @return Status of operation |
| */ |
| static isoal_status_t sink_sdu_emit_test(const struct isoal_sink *sink_ctx, |
| const struct isoal_sdu_produced *valid_sdu) |
| { |
| debug_trace_func_call(__func__, "IN"); |
| |
| debug_print_rx_sdu(sink_ctx, ((struct rx_sdu_frag_buffer *)valid_sdu->contents.dbuf)->sdu); |
| |
| ztest_check_expected_value(sink_ctx); |
| ztest_check_expected_value(sink_ctx->sdu_production.sdu_state); |
| ztest_check_expected_value(sink_ctx->sdu_production.sdu_written); |
| ztest_check_expected_value(valid_sdu->status); |
| ztest_check_expected_value(valid_sdu->timestamp); |
| ztest_check_expected_value(valid_sdu->seqn); |
| ztest_check_expected_value(valid_sdu->contents.dbuf); |
| ztest_check_expected_value(valid_sdu->contents.size); |
| |
| return ztest_get_return_value(); |
| } |
| |
| /** |
| * Callback test fixture to be provided for RX sink creation. Writes provided |
| * data into target SDU buffer. |
| * @param dbuf SDU buffer (Includes current write location field) |
| * @param pdu_payload Current PDU being reassembled by ISO-AL |
| * @param consume_len Length of data to transfer |
| * @return Status of the operation |
| */ |
| static isoal_status_t sink_sdu_write_test(void *dbuf, |
| const uint8_t *pdu_payload, |
| const size_t consume_len) |
| { |
| debug_trace_func_call(__func__, "IN"); |
| |
| #if defined(DEBUG_TEST) |
| zassert_not_null(dbuf, ""); |
| zassert_not_null(pdu_payload, ""); |
| |
| struct rx_sdu_frag_buffer *rx_sdu_frag_buf; |
| |
| rx_sdu_frag_buf = (struct rx_sdu_frag_buffer *)dbuf; |
| memcpy(&rx_sdu_frag_buf->sdu[rx_sdu_frag_buf->write_loc], pdu_payload, consume_len); |
| rx_sdu_frag_buf->write_loc += consume_len; |
| #endif |
| |
| ztest_check_expected_value(dbuf); |
| ztest_check_expected_value(pdu_payload); |
| ztest_check_expected_value(consume_len); |
| |
| return ztest_get_return_value(); |
| } |
| |
| /** |
| * Cacluate RX latency based on role and framing |
| * @param role Peripheral / Central / Broadcast |
| * @param framed PDU framing (Framed / Unframed) |
| * @param flush_timeout FT |
| * @param sdu_interval SDU Interval (us) |
| * @param iso_interval_int ISO Interval (Integer multiple of 1250us) |
| * @param stream_sync_delay CIS / BIS sync delay |
| * @param group_sync_delay CIG / BIG sync delay |
| * @return Latency (signed) |
| */ |
| static int32_t calc_rx_latency_by_role(uint8_t role, |
| uint8_t framed, |
| uint8_t flush_timeout, |
| uint32_t sdu_interval, |
| uint16_t iso_interval_int, |
| uint32_t stream_sync_delay, |
| uint32_t group_sync_delay) |
| { |
| int32_t latency; |
| uint32_t iso_interval; |
| |
| latency = 0; |
| iso_interval = iso_interval_int * CONN_INT_UNIT_US; |
| |
| switch (role) { |
| case BT_CONN_ROLE_PERIPHERAL: |
| if (framed) { |
| latency = stream_sync_delay + sdu_interval + (flush_timeout * iso_interval); |
| } else { |
| latency = stream_sync_delay + ((flush_timeout - 1) * iso_interval); |
| } |
| break; |
| |
| case BT_CONN_ROLE_CENTRAL: |
| if (framed) { |
| latency = stream_sync_delay - group_sync_delay; |
| } else { |
| latency = stream_sync_delay - group_sync_delay - |
| (((iso_interval / sdu_interval) - 1) * iso_interval); |
| } |
| break; |
| |
| case BT_ROLE_BROADCAST: |
| if (framed) { |
| latency = group_sync_delay + sdu_interval + iso_interval; |
| } else { |
| latency = group_sync_delay; |
| } |
| break; |
| |
| default: |
| zassert_unreachable("Invalid role!"); |
| break; |
| } |
| |
| #if defined(DEBUG_TEST) |
| PRINT("Latency %s calculated %dus.\n", framed ? "framed" : "unframed", latency); |
| PRINT("\tFT %d\n\tISO Interval %dus\n\tSDU Interval %dus\n\tStream Sync Delay %dus\n" |
| "\tGroup Sync Delay %dus\n\n", |
| flush_timeout, iso_interval, sdu_interval, stream_sync_delay, group_sync_delay); |
| #endif |
| |
| return latency; |
| } |
| |
| /** |
| * Basic setup of a single sink for any RX test |
| * @param handle Stream handle |
| * @param role Peripheral / Central / Broadcast |
| * @param framed PDU framing |
| * @param burst_number BN |
| * @param flush_timeout FT |
| * @param sdu_interval SDU Interval (us) |
| * @param iso_interval_int ISO Interval (integer multiple of 1250us) |
| * @param stream_sync_delay CIS / BIS sync delay |
| * @param group_sync_delay CIG / BIG sync delay |
| * @return Newly created sink handle |
| */ |
| static isoal_sink_handle_t basic_rx_test_setup(uint16_t handle, |
| uint8_t role, |
| uint8_t framed, |
| uint8_t burst_number, |
| uint8_t flush_timeout, |
| uint32_t sdu_interval, |
| uint16_t iso_interval_int, |
| uint32_t stream_sync_delay, |
| uint32_t group_sync_delay) |
| { |
| isoal_sink_handle_t sink_hdl; |
| isoal_status_t err; |
| |
| ztest_set_assert_valid(false); |
| |
| err = isoal_init(); |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| err = isoal_reset(); |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Create a sink based on global parameters */ |
| err = isoal_sink_create(handle, role, framed, |
| burst_number, flush_timeout, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay, |
| sink_sdu_alloc_test, sink_sdu_emit_test, sink_sdu_write_test, |
| &sink_hdl); |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Enable newly created sink */ |
| isoal_sink_enable(sink_hdl); |
| |
| return sink_hdl; |
| } |
| |
| /** |
| * Initialize the given test data buffer with a ramp pattern |
| * @param buf Test data buffer pointer |
| * @param size Length of test data |
| */ |
| static void init_test_data_buffer(uint8_t *buf, uint16_t size) |
| { |
| zassert_not_null(buf, ""); |
| |
| for (uint16_t i = 0; i < size; i++) { |
| buf[i] = (uint8_t)(i & 0x00FF); |
| } |
| } |
| |
| /** |
| * Test Suite : RX basic test |
| * |
| * Test creating and destroying sinks upto the maximum with randomized |
| * configuration parameters. |
| */ |
| ZTEST(test_rx_basics, test_sink_create_destroy) |
| { |
| isoal_sink_handle_t sink_hdl[CONFIG_BT_CTLR_ISOAL_SINKS]; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| uint8_t sdu_interval_int; |
| uint8_t iso_interval_int; |
| uint8_t flush_timeout; |
| uint32_t iso_interval; |
| uint32_t sdu_interval; |
| uint8_t burst_number; |
| uint8_t pdus_per_sdu; |
| isoal_status_t res; |
| uint16_t handle; |
| int32_t latency; |
| bool framed; |
| |
| res = isoal_init(); |
| zassert_equal(res, ISOAL_STATUS_OK, "res=0x%02x", res); |
| |
| res = isoal_reset(); |
| zassert_equal(res, ISOAL_STATUS_OK, "res=0x%02x", res); |
| |
| for (int role = 0; role <= 3; role++) { |
| /* 0 Central |
| * 1 Peripheral |
| * 2 Broadcast |
| * 3 Undefined |
| */ |
| handle = 0x8000; |
| burst_number = 0; |
| flush_timeout = 1; |
| framed = false; |
| sdu_interval_int = 1; |
| iso_interval_int = 1; |
| iso_interval = iso_interval_int * CONN_INT_UNIT_US; |
| sdu_interval = sdu_interval_int * CONN_INT_UNIT_US; |
| stream_sync_delay = iso_interval - 200; |
| group_sync_delay = iso_interval - 50; |
| latency = 0; |
| |
| ztest_set_assert_valid(false); |
| |
| for (int i = 0; i < CONFIG_BT_CTLR_ISOAL_SINKS; i++) { |
| res = ISOAL_STATUS_ERR_UNSPECIFIED; |
| sink_hdl[i] = 0xFF; |
| |
| pdus_per_sdu = (burst_number * sdu_interval) / iso_interval; |
| |
| switch (role) { |
| case BT_CONN_ROLE_PERIPHERAL: |
| case BT_CONN_ROLE_CENTRAL: |
| case BT_ROLE_BROADCAST: |
| latency = calc_rx_latency_by_role(role, framed, |
| flush_timeout, sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| break; |
| |
| default: |
| ztest_set_assert_valid(true); |
| break; |
| } |
| |
| res = isoal_sink_create(handle, |
| role, |
| framed, |
| burst_number, |
| flush_timeout, |
| sdu_interval, |
| iso_interval_int, |
| stream_sync_delay, |
| group_sync_delay, |
| sink_sdu_alloc_test, |
| sink_sdu_emit_test, |
| sink_sdu_write_test, |
| &sink_hdl[i]); |
| |
| zassert_equal(isoal_global.sink_allocated[sink_hdl[i]], |
| ISOAL_ALLOC_STATE_TAKEN, ""); |
| |
| zassert_equal(isoal_global.sink_state[sink_hdl[i]].session.pdus_per_sdu, |
| pdus_per_sdu, |
| "%s pdus_per_sdu %d should be %d for:\n\tBN %d\n\tFT %d\n" |
| "\tISO Interval %dus\n\tSDU Interval %dus\n" |
| "\tStream Sync Delay %dus\n\tGroup Sync Delay %dus", |
| (framed ? "Framed" : "Unframed"), |
| isoal_global.sink_state[sink_hdl[i]].session.pdus_per_sdu, |
| pdus_per_sdu, |
| burst_number, flush_timeout, iso_interval, sdu_interval, |
| stream_sync_delay, group_sync_delay); |
| |
| if (framed) { |
| zassert_equal(isoal_global.sink_state[sink_hdl[i]]. |
| session.latency_framed, latency, |
| "%s latency framed %d should be %d", ROLE_TO_STR(role), |
| isoal_global.sink_state[sink_hdl[i]].session.latency_framed, |
| latency); |
| } else { |
| zassert_equal(isoal_global.sink_state[sink_hdl[i]]. |
| session.latency_unframed, latency, |
| "%s latency unframed %d should be %d", ROLE_TO_STR(role), |
| isoal_global.sink_state[sink_hdl[i]]. |
| session.latency_unframed, latency); |
| } |
| |
| zassert_equal(res, ISOAL_STATUS_OK, |
| "Sink %d in role %s creation failed!", |
| i, ROLE_TO_STR(role)); |
| |
| framed = !framed; |
| burst_number++; |
| flush_timeout = (flush_timeout % 3) + 1; |
| sdu_interval_int++; |
| iso_interval_int = iso_interval_int * sdu_interval_int; |
| sdu_interval = (sdu_interval_int * CONN_INT_UNIT_US) - (framed ? 100 : 0); |
| iso_interval = iso_interval_int * CONN_INT_UNIT_US; |
| stream_sync_delay = iso_interval - (200 * i); |
| group_sync_delay = iso_interval - 50; |
| } |
| |
| /* Destroy in order */ |
| for (int i = 0; i < CONFIG_BT_CTLR_ISOAL_SINKS; i++) { |
| isoal_sink_destroy(sink_hdl[i]); |
| |
| zassert_equal(isoal_global.sink_allocated[sink_hdl[i]], |
| ISOAL_ALLOC_STATE_FREE, "Sink destruction failed!"); |
| |
| zassert_equal(isoal_global.sink_state[sink_hdl[i]].sdu_production.mode, |
| ISOAL_PRODUCTION_MODE_DISABLED, "Sink disable failed!"); |
| } |
| } |
| } |
| |
| /** |
| * Test Suite : RX basic test |
| * |
| * Test error return on exceeding the maximum number of sinks available. |
| */ |
| ZTEST(test_rx_basics, test_sink_create_err) |
| { |
| isoal_sink_handle_t sink_hdl[CONFIG_BT_CTLR_ISOAL_SINKS+1]; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| uint8_t iso_interval_int; |
| uint8_t flush_timeout; |
| uint32_t sdu_interval; |
| uint8_t burst_number; |
| isoal_status_t res; |
| uint16_t handle; |
| uint8_t role; |
| bool framed; |
| |
| handle = 0x8000; |
| role = BT_CONN_ROLE_PERIPHERAL; |
| burst_number = 1; |
| flush_timeout = 1; |
| framed = false; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| stream_sync_delay = CONN_INT_UNIT_US - 200; |
| group_sync_delay = CONN_INT_UNIT_US - 50; |
| |
| res = isoal_init(); |
| zassert_equal(res, ISOAL_STATUS_OK, "res=0x%02x", res); |
| |
| res = isoal_reset(); |
| zassert_equal(res, ISOAL_STATUS_OK, "res=0x%02x", res); |
| |
| for (int i = 0; i < CONFIG_BT_CTLR_ISOAL_SINKS; i++) { |
| res = isoal_sink_create(handle, |
| role, |
| framed, |
| burst_number, |
| flush_timeout, |
| sdu_interval, |
| iso_interval_int, |
| stream_sync_delay, |
| group_sync_delay, |
| sink_sdu_alloc_test, |
| sink_sdu_emit_test, |
| sink_sdu_write_test, |
| &sink_hdl[i]); |
| |
| zassert_equal(res, ISOAL_STATUS_OK, |
| "Sink %d in role %s creation failed!", |
| i, ROLE_TO_STR(role)); |
| } |
| |
| res = isoal_sink_create(handle, |
| role, |
| framed, |
| burst_number, |
| flush_timeout, |
| sdu_interval, |
| iso_interval_int, |
| stream_sync_delay, |
| group_sync_delay, |
| sink_sdu_alloc_test, |
| sink_sdu_emit_test, |
| sink_sdu_write_test, |
| &sink_hdl[CONFIG_BT_CTLR_ISOAL_SINKS]); |
| |
| zassert_equal(res, ISOAL_STATUS_ERR_SINK_ALLOC, |
| "Sink creation did not return error as expected!"); |
| } |
| |
| /** |
| * Test Suite : RX basic test |
| * |
| * Test assertion when attempting to retrieve sink params for an invalid sink |
| * handle. |
| */ |
| ZTEST(test_rx_basics, test_sink_invalid_ref) |
| { |
| ztest_set_assert_valid(true); |
| |
| isoal_get_sink_param_ref(99); |
| |
| ztest_set_assert_valid(false); |
| } |
| |
| /** |
| * Test Suite : RX basic test |
| * |
| * Test error return when receiving PDUs for a disabled sink. |
| */ |
| ZTEST(test_rx_basics, test_sink_disable) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 1; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| latency = |
| payload_number = 2000; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 23; |
| sdu_size = 0; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* Disable the sink */ |
| isoal_sink_disable(sink_hdl); |
| |
| /* Send SDU in a single PDU */ |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of a single valid RX PDU into an SDU. |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_single_pdu) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 1; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| latency = |
| payload_number = 2000; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 23; |
| sdu_size = 23; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* Send SDU in a single PDU */ |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should be emitted as it is complete */ |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* No padding PDUs expected, so to waiting for start fragment */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of two valid RX PDU into a single SDU. |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_dbl_pdu) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 2; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 2000; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* Send PDU with start fragment */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* Next state should wait for continuation or end */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| /* Send PDU with end fragment */ |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* As two PDUs per SDU, no padding is expected */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of three SDUs where the end of the first two were not seen |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_dbl_split) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[53]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US/2; |
| BN = 4; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* SDU 1 - PDU 1 -----------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 53); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 2000; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* SDU 1 - PDU 2 -----------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU emitted with errors as end fragment was not seen */ |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| /* SDU 2 - PDU 3 -----------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| payload_number++; |
| seqn++; |
| pdu_timestamp += 200; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* SDU 2 - PDU 4 */ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU emitted with errors as end fragment was not seen */ |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| /* SDU 3 - PDU 5 -----------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| payload_number++; |
| seqn++; |
| pdu_timestamp = 9249 + CONN_INT_UNIT_US; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* Expecting padding PDU as PDUs per SDU is 2 */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of one SDUs in five fragments |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_multi_split) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[53]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 5; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 53); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 2000; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 5 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of one SDUs sent in one PDU when the SDU fragment size is |
| * small, resulting in multiple SDU fragments released during reassembly |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_long_pdu_short_sdu) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[40]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 1; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 40); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = 20; |
| payload_number = 2000; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 40; |
| sdu_size = 20; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* SDU 1 */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, 20); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_START); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| /* SDU 2 */ |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| sdu_size = 20; |
| |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2+20]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, 20); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_END); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of two SDUs where the end fragment of the first was not seen |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_dbl_pdu_prem) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 1; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 2000; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| payload_number++; |
| seqn++; |
| pdu_timestamp += 200; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of SDUs with PDU errors |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_single_pdu_err) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 1; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 2000; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| payload_number++; |
| seqn++; |
| pdu_timestamp = 9249 + CONN_INT_UNIT_US; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_LOST_DATA, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_LOST_DATA); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of SDUs where PDUs are not in sequence |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_seq_err) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[43]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 43); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 2000; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 Not transferred to ISO-AL ------------------------------------*/ |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_LOST_DATA); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* PDU count will not have reached 3 as one PDU was not received, so |
| * last_pdu will not be set and the state should remain in Error |
| * Spooling. |
| */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| payload_number++; |
| seqn++; |
| pdu_timestamp = 9249 + CONN_INT_UNIT_US; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* Detecting the transition from an end fragment to a start fragment |
| * should have triggered the monitoring code to pull the state machine |
| * out of Eroor spooling and directly into the start of a new SDU. As |
| * this was not an end fragment, the next state should be continue. |
| */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of SDUs where PDUs are not in sequence with errors |
| * Tests error prioritization |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_seq_pdu_err) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[43]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 43); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 Not transferred to ISO-AL ------------------------------------*/ |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| /* PDU status ISOAL_PDU_STATUS_ERRORS */ |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* Lost data should be higher priority */ |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_LOST_DATA); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* PDU count will not have reached 3 as one PDU was not received, so |
| * last_pdu will not be set and the state should remain in Error |
| * Spooling. |
| */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| payload_number++; |
| seqn++; |
| pdu_timestamp = 9249 + CONN_INT_UNIT_US; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* Detecting the transition from an end fragment to a start fragment |
| * should have triggered the monitoring code to pull the state machine |
| * out of Eroor spooling and directly into the start of a new SDU. As |
| * this was not an end fragment, the next state should be continue. |
| */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 5 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* Expecting padding so state should be Error Spooling */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of SDUs where valid PDUs are followed by padding |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_padding) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[43]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 4; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 43); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| /* Expecting padding PDUs so should be in Error Spool state */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| |
| /* PDU padding 1 */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| /* PDU padding 2 */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of SDUs with padding where the end was not seen |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_padding_no_end) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[33]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 33); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| |
| /* PDU padding 1 */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| /* PDU padding 2 */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU emitted with errors as end fragment was not seen */ |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of a SDU where there is an error in the first PDU followed |
| * by valid padding PDUs |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_padding_error1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[13]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 13); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| |
| /* PDU padding 1 */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| /* PDU padding 2 */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of a SDU where the second PDU is corrupted and appears to |
| * be a padding PDU |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_padding_error2) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[13]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 13); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| |
| /* PDU with errors that appears as padding */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| /* PDU padding 1 */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of a SDU where only the padding PDU has errors |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_padding_error3) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| |
| /* PDU padding with errors */ |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of a zero length SDU |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_zero_len_packet) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[13]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 1; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 13); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 0; |
| sdu_size = 0; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_COMPLETE_END, |
| &testdata[testdata_indx], (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests reassembly of a SDU in two PDUs where the end was not seen and BN is |
| * two which should return to FSM start after reassembly |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_dbl_pdu_no_end) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 2; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests assertion on receiving a PDU with an invalid LLID without errors as |
| * the first PDU of the SDU |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_dbl_pdu_invalid_llid1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[13]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 2; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 13); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* Invalid LLID - Valid PDU*/ |
| create_unframed_pdu(PDU_BIS_LLID_FRAMED, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* expecting an assertion */ |
| ztest_set_assert_valid(true); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| ztest_set_assert_valid(false); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests assertion on receiving a PDU with an invalid LLID without errors as |
| * the second PDU of the SDU |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_dbl_pdu_invalid_llid2) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 2; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| /* Invalid LLID - Valid PDU */ |
| create_unframed_pdu(PDU_BIS_LLID_FRAMED, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Expecting an assertion */ |
| ztest_set_assert_valid(true); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| ztest_set_assert_valid(false); |
| } |
| |
| /** |
| * Test Suite : RX unframed PDU reassembly |
| * |
| * Tests receiving a PDU with an invalid LLID with errors. This should not |
| * result in a assertion as it could happen if a RX reaches it's flush timeout. |
| */ |
| ZTEST(test_rx_unframed, test_rx_unframed_dbl_pdu_invalid_llid2_pdu_err) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint64_t payload_number; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = CONN_INT_UNIT_US; |
| BN = 2; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, false, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| false, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_unframed_pdu(PDU_BIS_LLID_START_CONTINUE, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| /* Invalid LLID - Valid PDU */ |
| create_unframed_pdu(PDU_BIS_LLID_FRAMED, &testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, &rx_pdu_meta_buf.pdu[2]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU emitted with errors */ |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from a single segmented PDU |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_single_pdu_single_sdu) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[23]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 23); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 23; |
| sdu_size = 23; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from three segmented PDUs |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_single_sdu) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[33]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 33); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_cont(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[2] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[2]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of two SDUs from three segmented PDUs |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_dbl_sdu) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf[2]; |
| struct isoal_sdu_buffer sdu_buffer[2]; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size[2]; |
| uint8_t iso_interval_int; |
| uint32_t sdu_timestamp[2]; |
| uint16_t pdu_data_loc[5]; |
| isoal_sdu_cnt_t seqn[2]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| uint8_t testdata[46]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[1]); |
| init_test_data_buffer(testdata, 46); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer[0].dbuf = &rx_sdu_frag_buf[0]; |
| sdu_buffer[1].dbuf = &rx_sdu_frag_buf[1]; |
| sdu_buffer[0].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| sdu_buffer[1].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size[0] = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[0]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size[0] += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[1] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[1] = seqn[0] + 1; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size[1] = 13; |
| |
| pdu_data_loc[2] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* SDU 1 */ |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[0]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, 10); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| /* SDU 2 */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[1]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[1]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[2]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU 2 should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size[1] += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[1]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[3]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[1].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[1].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a zero length SDU |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_zero_length_sdu) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf[3]; |
| struct isoal_sdu_buffer sdu_buffer[3]; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size[3]; |
| uint8_t iso_interval_int; |
| uint32_t sdu_timestamp[3]; |
| uint16_t pdu_data_loc[5]; |
| isoal_sdu_cnt_t seqn[3]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| uint8_t testdata[46]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[1]); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[2]); |
| init_test_data_buffer(testdata, 46); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer[0].dbuf = &rx_sdu_frag_buf[0]; |
| sdu_buffer[1].dbuf = &rx_sdu_frag_buf[1]; |
| sdu_buffer[2].dbuf = &rx_sdu_frag_buf[2]; |
| sdu_buffer[0].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| sdu_buffer[1].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| sdu_buffer[2].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size[0] = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[0]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size[0] += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[1] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[1] = seqn[0] + 1; |
| testdata_indx = testdata_size; |
| sdu_size[1] = 0; |
| |
| /* Zero length SDU */ |
| pdu_data_loc[2] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[2] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[2] = seqn[1] + 1; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size[2] = 10; |
| |
| pdu_data_loc[3] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* SDU 1 */ |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[0]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, 10); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| /* SDU 2 */ |
| /* Zero length SDU */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[1]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[1].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[1].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| /* SDU 3 */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[2]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[2]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[3]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU 2 should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size[2] += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[2]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[3]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[2]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[2]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[2]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[2].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[2].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from a single segmented PDU followed by |
| * padding |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_dbl_pdu_dbl_sdu_padding) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[33]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 33); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| /* Padding PDU */ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* SDU should not be allocated */ |
| |
| /* SDU should not be written */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn++; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from a single segmented PDU with errors, |
| * followed by a valid PDU |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_dbl_pdu_dbl_sdu_pdu_err1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[33]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 33); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = 0; |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 23; |
| sdu_size = 0; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* PDU with errors */ |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn++; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from a single segmented PDU with errors, |
| * followed by a valid PDU |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_dbl_pdu_dbl_sdu_pdu_err2) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[33]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 33); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = 0; |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 23; |
| sdu_size = 0; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* PDU with errors */ |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_LOST_DATA, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_LOST_DATA); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn++; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from a single segmented PDU with errors, |
| * followed by a valid PDU |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_dbl_pdu_dbl_sdu_seq_err1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[33]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 33); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| /* Not transferred to the ISO-AL */ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| /* ISO-AL has no concept of time and is unable to detect than an SDU |
| * has been lost. Sequence number does not increment. |
| * seqn = seqn; |
| */ |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn++; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size = 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from three segmented PDUs with errors |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_single_sdu_pdu_err1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[46]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 46); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = 0; |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 0; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* PDU with errors */ |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_cont(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[2] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn++; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[3]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from three segmented PDUs with errors |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_single_sdu_pdu_err2) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[46]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 46); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* PDU with errors */ |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_cont(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[2] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn++; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[3]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from three segmented PDUs with errors |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_single_sdu_pdu_err3) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[46]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 46); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* PDU with errors */ |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_cont(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[2] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn++; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[3]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from three segmented PDUs with errors |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_single_sdu_seq_err1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[46]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 46); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* PDU with errors */ |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| /* PDU not transferred to the ISO-AL */ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[2] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_LOST_DATA); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn++; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[3]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from three segmented PDUs with errors |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_single_sdu_pdu_seq_err1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[46]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 46); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* PDU with errors */ |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| /* PDU not transferred to the ISO-AL */ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[2] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_LOST_DATA); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn++; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[3]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of two SDUs from three segmented PDUs |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_dbl_sdu_pdu_err1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf[2]; |
| struct isoal_sdu_buffer sdu_buffer[2]; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size[2]; |
| uint8_t iso_interval_int; |
| uint32_t sdu_timestamp[2]; |
| uint16_t pdu_data_loc[5]; |
| isoal_sdu_cnt_t seqn[2]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| uint8_t testdata[63]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[1]); |
| init_test_data_buffer(testdata, 63); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer[0].dbuf = &rx_sdu_frag_buf[0]; |
| sdu_buffer[1].dbuf = &rx_sdu_frag_buf[1]; |
| sdu_buffer[0].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| sdu_buffer[1].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp[0] = 0; |
| seqn[0] = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size[0] = 0; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| /* PDU with errors */ |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size[0] += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[1] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[1] = seqn[0] + 1; |
| testdata_indx = testdata_size; |
| testdata_size += 17; |
| sdu_size[1] = 17; |
| |
| pdu_data_loc[2] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* SDU 1 */ |
| /* SDU should not be written to */ |
| |
| /* SDU shold not be emitted */ |
| |
| /* SDU 2 */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[1]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[1]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[2]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU 2 should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size[1] += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[1]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[3]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[1].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[1].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| |
| payload_number++; |
| pdu_timestamp = 9249 + (iso_interval_int * CONN_INT_UNIT_US); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = seqn[1] + 1; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size[0] = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[4] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[4]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of two SDUs from three segmented PDUs |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_dbl_sdu_pdu_err2) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf[2]; |
| struct isoal_sdu_buffer sdu_buffer[2]; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size[2]; |
| uint8_t iso_interval_int; |
| uint32_t sdu_timestamp[2]; |
| uint16_t pdu_data_loc[5]; |
| isoal_sdu_cnt_t seqn[2]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| uint8_t testdata[63]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[1]); |
| init_test_data_buffer(testdata, 63); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer[0].dbuf = &rx_sdu_frag_buf[0]; |
| sdu_buffer[1].dbuf = &rx_sdu_frag_buf[1]; |
| sdu_buffer[0].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| sdu_buffer[1].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size[0] = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[0]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| /* PDU with errors */ |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[1] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[1] = seqn[0]; |
| testdata_indx = testdata_size; |
| testdata_size += 17; |
| sdu_size[1] = 0; |
| |
| pdu_data_loc[2] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* SDU 1 */ |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| /* SDU 2 */ |
| /* Should not be allocated */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| |
| payload_number++; |
| pdu_timestamp = 9249 + (iso_interval_int * CONN_INT_UNIT_US); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = seqn[1] + 1; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size[0] = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[4] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[4]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of two SDUs from three segmented PDUs |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_dbl_sdu_pdu_err3) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf[2]; |
| struct isoal_sdu_buffer sdu_buffer[2]; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size[2]; |
| uint8_t iso_interval_int; |
| uint32_t sdu_timestamp[2]; |
| uint16_t pdu_data_loc[5]; |
| isoal_sdu_cnt_t seqn[2]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| uint8_t testdata[63]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[1]); |
| init_test_data_buffer(testdata, 63); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer[0].dbuf = &rx_sdu_frag_buf[0]; |
| sdu_buffer[1].dbuf = &rx_sdu_frag_buf[1]; |
| sdu_buffer[0].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| sdu_buffer[1].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size[0] = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[0]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| sdu_size[0] += 10; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[1] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[1] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[1] = seqn[0] + 1; |
| testdata_indx = testdata_size; |
| testdata_size += 17; |
| sdu_size[1] = 17; |
| |
| pdu_data_loc[2] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* SDU 1 */ |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[0]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, 10); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| /* SDU 2 */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[1]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[1]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[2]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU 2 should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| /* SDU size does not change */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_ERRORS); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[1]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[1].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[1].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| |
| payload_number++; |
| pdu_timestamp = 9249 + (iso_interval_int * CONN_INT_UNIT_US); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = seqn[1] + 1; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size[0] = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[4] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[4]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of two SDUs from three segmented PDUs with errors |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_dbl_sdu_seq_err1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf[2]; |
| struct isoal_sdu_buffer sdu_buffer[2]; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size[2]; |
| uint8_t iso_interval_int; |
| uint32_t sdu_timestamp[2]; |
| uint16_t pdu_data_loc[5]; |
| isoal_sdu_cnt_t seqn[2]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| uint8_t testdata[63]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[1]); |
| init_test_data_buffer(testdata, 63); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer[0].dbuf = &rx_sdu_frag_buf[0]; |
| sdu_buffer[1].dbuf = &rx_sdu_frag_buf[1]; |
| sdu_buffer[0].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| sdu_buffer[1].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size[0] = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[0]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| /* No change in SDU 1 size */ |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[1] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| /* ISO-AL has no concept of time and is unable to detect than an SDU |
| * has been lost. Sequence number does not increment. |
| */ |
| seqn[1] = seqn[0]; |
| testdata_indx = testdata_size; |
| testdata_size += 17; |
| sdu_size[1] = 0; |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| /* SDU size does not change */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU 1 emitted with errors, SDU 2 lost */ |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_LOST_DATA); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| |
| payload_number++; |
| pdu_timestamp = 9249 + (iso_interval_int * CONN_INT_UNIT_US); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = seqn[1] + 1; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size[0] = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[4] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[4]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of two SDUs from three segmented PDUs with errors |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_trppl_pdu_dbl_sdu_pdu_seq_err1) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf[2]; |
| struct isoal_sdu_buffer sdu_buffer[2]; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size[2]; |
| uint8_t iso_interval_int; |
| uint32_t sdu_timestamp[2]; |
| uint16_t pdu_data_loc[5]; |
| isoal_sdu_cnt_t seqn[2]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| uint8_t testdata[63]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[1]); |
| init_test_data_buffer(testdata, 63); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer[0].dbuf = &rx_sdu_frag_buf[0]; |
| sdu_buffer[1].dbuf = &rx_sdu_frag_buf[1]; |
| sdu_buffer[0].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| sdu_buffer[1].size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size[0] = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf[0]); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| /* SDU should not be emitted */ |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_CONTINUE, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_CONTINUE)); |
| |
| /* PDU 2 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| /* No change in SDU 1 size */ |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[1] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| /* ISO-AL has no concept of time and is unable to detect than an SDU |
| * has been lost. Sequence number does not increment. |
| */ |
| seqn[1] = seqn[0]; |
| testdata_indx = testdata_size; |
| testdata_size += 17; |
| sdu_size[1] = 0; |
| |
| /* PDU 3 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| |
| payload_number++; |
| pdu_timestamp += 200; |
| testdata_indx = testdata_size; |
| testdata_size += 10; |
| /* SDU size does not change */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_ERRORS, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[3] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| /* Should not allocate a new SDU */ |
| |
| /* SDU should not be written to */ |
| |
| /* SDU 1 emitted with errors, SDU 2 lost */ |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_LOST_DATA); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_ERR_SPOOL, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_ERR_SPOOL)); |
| |
| /* PDU 4 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf[0]); |
| |
| payload_number++; |
| pdu_timestamp = 9249 + (iso_interval_int * CONN_INT_UNIT_US); |
| |
| sdu_timeoffset = sdu_timeoffset - sdu_interval > 0 ? sdu_timeoffset - sdu_interval : |
| sdu_timeoffset + (iso_interval_int * CONN_INT_UNIT_US) - sdu_interval; |
| sdu_timestamp[0] = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn[0] = seqn[1] + 1; |
| testdata_indx = testdata_size; |
| testdata_size += 13; |
| sdu_size[0] = 13; |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[4] = add_framed_pdu_single(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer[0]); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[4]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn[0]); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer[0].dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer[0].size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| /** |
| * Test Suite : RX framed PDU recombination |
| * |
| * Tests recombination of a single SDU from a single segmented PDU which is |
| * invalid as it contains multiple segments from the same SDU. |
| */ |
| ZTEST(test_rx_framed, test_rx_framed_single_invalid_pdu_single_sdu) |
| { |
| struct rx_pdu_meta_buffer rx_pdu_meta_buf; |
| struct rx_sdu_frag_buffer rx_sdu_frag_buf; |
| struct isoal_sdu_buffer sdu_buffer; |
| isoal_sink_handle_t sink_hdl; |
| uint32_t stream_sync_delay; |
| uint32_t group_sync_delay; |
| isoal_sdu_len_t sdu_size; |
| uint8_t iso_interval_int; |
| uint16_t pdu_data_loc[5]; |
| uint64_t payload_number; |
| uint32_t sdu_timeoffset; |
| uint32_t pdu_timestamp; |
| uint32_t sdu_timestamp; |
| uint16_t testdata_indx; |
| uint16_t testdata_size; |
| uint32_t sdu_interval; |
| isoal_sdu_cnt_t seqn; |
| uint8_t testdata[25]; |
| isoal_status_t err; |
| uint32_t latency; |
| uint8_t role; |
| uint8_t BN; |
| uint8_t FT; |
| |
| /* Settings */ |
| role = BT_CONN_ROLE_PERIPHERAL; |
| iso_interval_int = 1; |
| sdu_interval = ((iso_interval_int * CONN_INT_UNIT_US) / 3) + 5; |
| BN = 3; |
| FT = 1; |
| stream_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 200; |
| group_sync_delay = (iso_interval_int * CONN_INT_UNIT_US) - 50; |
| |
| /* PDU 1 -------------------------------------------------------------*/ |
| init_rx_pdu_buffer(&rx_pdu_meta_buf); |
| init_rx_sdu_buffer(&rx_sdu_frag_buf); |
| init_test_data_buffer(testdata, 25); |
| memset(pdu_data_loc, 0, sizeof(pdu_data_loc)); |
| |
| sdu_buffer.dbuf = &rx_sdu_frag_buf; |
| sdu_buffer.size = TEST_RX_SDU_FRAG_PAYLOAD_MAX; |
| payload_number = 1000 * BN; |
| pdu_timestamp = 9249; |
| latency = calc_rx_latency_by_role(role, true, FT, |
| sdu_interval, iso_interval_int, |
| stream_sync_delay, group_sync_delay); |
| sdu_timeoffset = group_sync_delay - 50; |
| sdu_timestamp = (uint32_t)((int64_t)pdu_timestamp + latency - sdu_timeoffset); |
| seqn = 1; |
| testdata_indx = 0; |
| testdata_size = 13; |
| sdu_size = 13; |
| |
| sink_hdl = basic_rx_test_setup(0xADAD, /* Handle */ |
| role, /* Role */ |
| true, /* Framed */ |
| BN, /* BN */ |
| FT, /* FT */ |
| sdu_interval, /* SDU Interval */ |
| iso_interval_int, /* ISO Interval */ |
| stream_sync_delay, /* Stream Sync Delay */ |
| group_sync_delay); /* Group Sync Delay */ |
| |
| create_framed_pdu_base(payload_number, pdu_timestamp, ISOAL_PDU_STATUS_VALID, |
| &rx_pdu_meta_buf.pdu_meta); |
| pdu_data_loc[0] = add_framed_pdu_start(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| sdu_timeoffset, &rx_pdu_meta_buf.pdu_meta); |
| |
| testdata_indx = testdata_size; |
| testdata_size += 5; |
| sdu_size += 5; |
| |
| pdu_data_loc[1] = add_framed_pdu_cont(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| testdata_indx = testdata_size; |
| testdata_size += 7; |
| sdu_size += 7; |
| |
| pdu_data_loc[2] = add_framed_pdu_end(&testdata[testdata_indx], |
| (testdata_size - testdata_indx), |
| &rx_pdu_meta_buf.pdu_meta); |
| |
| /* Test recombine (Black Box) */ |
| ztest_expect_value(sink_sdu_alloc_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_alloc_test, valid_pdu, &rx_pdu_meta_buf.pdu_meta); |
| ztest_return_data(sink_sdu_alloc_test, sdu_buffer, &sdu_buffer); |
| ztest_returns_value(sink_sdu_alloc_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[0]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, 13); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[1]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, 5); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_write_test, dbuf, &rx_sdu_frag_buf); |
| ztest_expect_value(sink_sdu_write_test, pdu_payload, |
| &rx_pdu_meta_buf.pdu[2+pdu_data_loc[2]]); |
| ztest_expect_value(sink_sdu_write_test, consume_len, (testdata_size - testdata_indx)); |
| ztest_returns_value(sink_sdu_write_test, ISOAL_STATUS_OK); |
| |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx, &isoal_global.sink_state[sink_hdl]); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_state, BT_ISO_SINGLE); |
| ztest_expect_value(sink_sdu_emit_test, sink_ctx->sdu_production.sdu_written, sdu_size); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->status, ISOAL_SDU_STATUS_VALID); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->timestamp, sdu_timestamp); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->seqn, seqn); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.dbuf, sdu_buffer.dbuf); |
| ztest_expect_value(sink_sdu_emit_test, valid_sdu->contents.size, sdu_buffer.size); |
| ztest_returns_value(sink_sdu_emit_test, ISOAL_STATUS_OK); |
| |
| |
| err = isoal_rx_pdu_recombine(sink_hdl, &rx_pdu_meta_buf.pdu_meta); |
| |
| zassert_equal(err, ISOAL_STATUS_OK, "err=0x%02x", err); |
| |
| /* Test recombine (White Box) */ |
| zassert_equal(isoal_global.sink_state[sink_hdl].sdu_production.fsm, ISOAL_START, |
| "FSM state %s should be %s!", |
| FSM_TO_STR(isoal_global.sink_state[sink_hdl].sdu_production.fsm), |
| FSM_TO_STR(ISOAL_START)); |
| } |
| |
| ZTEST_SUITE(test_rx_basics, NULL, NULL, NULL, NULL, NULL); |
| ZTEST_SUITE(test_rx_unframed, NULL, NULL, NULL, NULL, NULL); |
| ZTEST_SUITE(test_rx_framed, NULL, NULL, NULL, NULL, NULL); |
| |
| void test_main(void) |
| { |
| ztest_run_test_suite(test_rx_basics); |
| ztest_run_test_suite(test_rx_unframed); |
| ztest_run_test_suite(test_rx_framed); |
| } |