Skip to content

Commit b3dfbdf

Browse files
committed
fix: use 16-bit IDs to avoid LR node ID truncation
Transport Service ZIPGW bridge path was narrowing the node IDs from 16-bit to 8-bits. Add a standalong test that uses the flags used to build the Z/IP Gateway and avoid the specific NEW_TEST_T2, as the test would result in different `ZW_SendData_Bridge` object. Use CMock to simplify mocking and to easy eventual new tests. Relates-to: ZGW-3457 Origin: SiliconLabs#47 Signed-off-by: Laudin Molina Troconis <laudin.molinatroconis@silabs.com>
1 parent 4e094e1 commit b3dfbdf

5 files changed

Lines changed: 182 additions & 1 deletion

File tree

libs2/test/CMakeLists.txt

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,74 @@ if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "C51")
7878
endif()
7979
set(CMOCK_RB "${CMOCK_RB_DEFAULT}" CACHE FILEPATH "Path to CMock lib/cmock.rb used by regen_mock_zw_transport_api" FORCE)
8080
endif()
81+
82+
set(CMOCK_RUNTIME_C "${CMOCK_ROOT}/src/cmock.c"
83+
CACHE FILEPATH "Path to CMock runtime cmock.c used by unit tests")
84+
if(NOT EXISTS "${CMOCK_RUNTIME_C}")
85+
message(FATAL_ERROR "CMock runtime source not found: ${CMOCK_RUNTIME_C}")
86+
endif()
87+
88+
set(CMOCK_GEN_DIR "${CMAKE_BINARY_DIR}/cmock_gen")
89+
set(CMOCK_INPUT_DIR "${CMAKE_BINARY_DIR}/cmock-input")
90+
set(CMOCK_INPUT_HEADER "${CMOCK_INPUT_DIR}/ZW_transport_api.h")
91+
set(MOCK_ZW_TRANSPORT_API_C "${CMOCK_GEN_DIR}/MockZW_transport_api.c")
92+
set(MOCK_ZW_TRANSPORT_API_H "${CMOCK_GEN_DIR}/MockZW_transport_api.h")
93+
94+
add_custom_command(
95+
OUTPUT "${CMOCK_INPUT_HEADER}"
96+
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMOCK_INPUT_DIR}"
97+
COMMAND "${CMAKE_C_COMPILER}" -E -P
98+
-DZW_CONTROLLER_BRIDGE
99+
-I"${CMAKE_SOURCE_DIR}/Z-Wave/include"
100+
"${CMAKE_SOURCE_DIR}/Z-Wave/include/ZW_transport_api.h"
101+
-o "${CMOCK_INPUT_HEADER}"
102+
DEPENDS "${CMAKE_SOURCE_DIR}/Z-Wave/include/ZW_transport_api.h"
103+
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
104+
COMMENT "Preprocessing ZW_transport_api.h for CMock generation")
105+
106+
add_custom_command(
107+
OUTPUT "${MOCK_ZW_TRANSPORT_API_C}" "${MOCK_ZW_TRANSPORT_API_H}"
108+
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMOCK_GEN_DIR}"
109+
COMMAND ${CMAKE_COMMAND} -E env ruby "${CMOCK_RB}"
110+
-o"${CMAKE_CURRENT_SOURCE_DIR}/cmock/cmock_config.yml"
111+
"${CMOCK_INPUT_HEADER}"
112+
DEPENDS "${CMOCK_INPUT_HEADER}" "${CMAKE_CURRENT_SOURCE_DIR}/cmock/cmock_config.yml"
113+
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
114+
COMMENT "Generating MockZW_transport_api in build directory")
115+
set_source_files_properties("${MOCK_ZW_TRANSPORT_API_C}" "${MOCK_ZW_TRANSPORT_API_H}" PROPERTIES GENERATED TRUE)
116+
117+
add_custom_target(regen_mock_zw_transport_api
118+
DEPENDS "${MOCK_ZW_TRANSPORT_API_C}" "${MOCK_ZW_TRANSPORT_API_H}")
119+
120+
add_unity_test(NAME test_t2_zipgw_runtime_nodeid FILES
121+
test_t2_zipgw_runtime_nodeid.c
122+
"${CMOCK_RUNTIME_C}"
123+
"${MOCK_ZW_TRANSPORT_API_C}"
124+
${CMAKE_CURRENT_SOURCE_DIR}/../transport_service/transport_service2.c
125+
${CMAKE_CURRENT_SOURCE_DIR}/../transport_service/transport2_fsm.c)
126+
add_dependencies(test_t2_zipgw_runtime_nodeid regen_mock_zw_transport_api)
127+
target_compile_definitions(test_t2_zipgw_runtime_nodeid PRIVATE ZIPGW)
128+
129+
# Explicitly undefine NEW_TEST_T2 here so this regression test follows the
130+
# production TS code path.
131+
target_compile_options(test_t2_zipgw_runtime_nodeid PRIVATE -U NEW_TEST_T2)
132+
# Generated CMock code may reference legacy Unity detail macros that are
133+
# not available in the Unity variant used by this tree.
134+
target_compile_options(test_t2_zipgw_runtime_nodeid PRIVATE
135+
-include "${CMAKE_CURRENT_SOURCE_DIR}/cmock/cmock_legacy_unity_compat.h")
136+
target_include_directories(test_t2_zipgw_runtime_nodeid PRIVATE
137+
${CMAKE_BINARY_DIR}
138+
"${CMOCK_GEN_DIR}"
139+
"${CMOCK_ROOT}/src"
140+
${CMAKE_CURRENT_SOURCE_DIR}/../transport_service/
141+
${CMAKE_CURRENT_SOURCE_DIR}/../include/
142+
${CMAKE_SOURCE_DIR}/src
143+
${CMAKE_SOURCE_DIR}/src/transport
144+
${CMAKE_SOURCE_DIR}/src/utls
145+
${CMAKE_SOURCE_DIR}/contiki/core
146+
${CMAKE_SOURCE_DIR}/contiki/core/sys
147+
${CMAKE_SOURCE_DIR}/contiki/platform/linux
148+
${CMAKE_SOURCE_DIR}/Z-Wave/include)
81149
endif()
82150

83151
add_definitions( -DRANDLEN=64 )

libs2/test/cmock/cmock_config.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
:cmock:
2+
:mock_path: cmock_gen
3+
:plugins:
4+
- :ignore
5+
- :ignore_arg
6+
- :expect
7+
:treat_externs: :include
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#ifndef CMOCK_LEGACY_UNITY_COMPAT_H
2+
#define CMOCK_LEGACY_UNITY_COMPAT_H
3+
4+
#ifndef UNITY_SET_DETAIL
5+
#define UNITY_SET_DETAIL(msg) ((void)(msg))
6+
#endif
7+
8+
#ifndef UNITY_CLR_DETAILS
9+
#define UNITY_CLR_DETAILS() ((void)0)
10+
#endif
11+
12+
#ifndef UNITY_SET_DETAILS
13+
#define UNITY_SET_DETAILS(msg1, msg2) ((void)(msg1), (void)(msg2))
14+
#endif
15+
16+
#endif
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
/* Copyright Silicon Laboratories Inc.
2+
*
3+
* Build Transport Service with ZIPGW and without NEW_TEST_T2, then verify
4+
* that LR node IDs are preserved on the TS -> ZW_SendData_Bridge call path.
5+
*/
6+
7+
#include <stdint.h>
8+
#include <string.h>
9+
10+
#include "unity.h"
11+
#include "MockZW_transport_api.h"
12+
13+
#include "S2.h"
14+
#include "transport_service2.h"
15+
16+
BYTE MyNodeID = 1;
17+
18+
void setUp(void)
19+
{
20+
MockZW_transport_api_Init();
21+
}
22+
23+
void tearDown(void)
24+
{
25+
MockZW_transport_api_Verify();
26+
MockZW_transport_api_Destroy();
27+
}
28+
29+
struct ctimer;
30+
typedef unsigned long clock_time_t;
31+
void ctimer_set(struct ctimer *c, clock_time_t t, void (*f)(void *), void *ptr)
32+
{
33+
(void)c;
34+
(void)t;
35+
(void)f;
36+
(void)ptr;
37+
}
38+
39+
void ctimer_stop(struct ctimer *c)
40+
{
41+
(void)c;
42+
}
43+
44+
clock_time_t clock_time(void)
45+
{
46+
return 0;
47+
}
48+
49+
uint16_t zgw_crc16(uint16_t crc16, uint8_t *data, unsigned long data_len)
50+
{
51+
(void)data;
52+
(void)data_len;
53+
return crc16;
54+
}
55+
56+
static void app_cmd_handler(ts_param_t* p, ZW_APPLICATION_TX_BUFFER *pCmd, uint16_t cmdLength)
57+
{
58+
(void)p;
59+
(void)pCmd;
60+
(void)cmdLength;
61+
}
62+
63+
static void status_cb(uint8_t txStatus, TX_STATUS_TYPE *txStatusReport)
64+
{
65+
(void)txStatus;
66+
(void)txStatusReport;
67+
}
68+
69+
void test_zipgw_ts_preserves_lr_destination_nodeid(void)
70+
{
71+
ts_param_t p;
72+
uint8_t payload[64];
73+
74+
memset(&p, 0, sizeof(p));
75+
memset(payload, 0xAA, sizeof(payload));
76+
77+
p.snode = 0x00ff;
78+
p.dnode = 257;
79+
p.tx_flags = TRANSMIT_OPTION_ACK | TRANSMIT_OPTION_AUTO_ROUTE | TRANSMIT_OPTION_EXPLORE;
80+
81+
ZW_SendData_Bridge_ExpectAndReturn(p.snode, p.dnode, NULL, 0, 0, NULL, 1);
82+
ZW_SendData_Bridge_IgnoreArg_pData();
83+
ZW_SendData_Bridge_IgnoreArg_dataLength();
84+
ZW_SendData_Bridge_IgnoreArg_txOptions();
85+
ZW_SendData_Bridge_IgnoreArg_completedFunc();
86+
87+
ZW_TransportService_Init(app_cmd_handler);
88+
TEST_ASSERT_TRUE_MESSAGE(ZW_TransportService_SendData(&p, payload, sizeof(payload), status_cb),
89+
"ZW_TransportService_SendData returned false");
90+
}

libs2/transport_service/transport_service2.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ typedef void (*ZW_CommandHandler_Callback_t)(ts_param_t* p, ZW_APPLICATION_TX_BU
107107
#endif
108108

109109
#ifndef __C51__
110-
extern uint8_t ZW_SendData_Bridge(uint8_t, uint8_t, uint8_t *, uint8_t, uint8_t, VOID_CALLBACKFUNC(completedFunc)(uint8_t, TX_STATUS_TYPE*));
110+
extern uint8_t ZW_SendData_Bridge(uint16_t, uint16_t, uint8_t *, uint8_t, uint8_t, VOID_CALLBACKFUNC(completedFunc)(uint8_t, TX_STATUS_TYPE*));
111111
#endif /* ifndef __C51__ */
112112

113113
#endif

0 commit comments

Comments
 (0)