|
| 1 | +#include "wpc_test.hpp" |
| 2 | + |
| 3 | +class WpcCddApiTest : public WpcTest |
| 4 | +{ |
| 5 | +public: |
| 6 | + static void SetUpTestSuite() |
| 7 | + { |
| 8 | + ASSERT_NO_FATAL_FAILURE(WpcTest::SetUpTestSuite()); |
| 9 | + |
| 10 | + // Stack should be stopped for factory reset, and it's not needed to be |
| 11 | + // started for these tests. |
| 12 | + const auto res = WPC_stop_stack(); |
| 13 | + ASSERT_TRUE(APP_RES_OK == res || APP_RES_STACK_ALREADY_STOPPED == res); |
| 14 | + ASSERT_EQ(APP_RES_OK, WPC_do_factory_reset()); |
| 15 | + } |
| 16 | + |
| 17 | +protected: |
| 18 | + void SetUp() override |
| 19 | + { |
| 20 | + ASSERT_EQ(APP_RES_OK, WPC_set_role(APP_ROLE_SINK)); |
| 21 | + } |
| 22 | + |
| 23 | + void TearDown() override |
| 24 | + { |
| 25 | + ASSERT_EQ(APP_RES_OK, WPC_do_factory_reset()); |
| 26 | + } |
| 27 | + |
| 28 | + struct __attribute__((__packed__)) CddScratchpadDataItem |
| 29 | + { |
| 30 | + uint8_t seq; |
| 31 | + uint16_t crc; |
| 32 | + uint8_t action; |
| 33 | + uint8_t param; |
| 34 | + }; |
| 35 | + |
| 36 | +#define STACK_PROFILE ISM_24 |
| 37 | +#if STACK_PROFILE == ISM_24 |
| 38 | + const static uint16_t CDD_DIAG_INTERVAL_EP = 0xF7FF; |
| 39 | + const static uint16_t CDD_APP_CONFIG_EP = 0xF9FF; |
| 40 | + const static uint16_t CDD_SCRATCHPAD_DATA_EP = 0xFAFA; |
| 41 | +#elif STACK_PROFILE == DECT_NR |
| 42 | + const static uint16_t CDD_DIAG_INTERVAL_EP = 0xA029; |
| 43 | + const static uint16_t CDD_APP_CONFIG_EP = 0x4004; |
| 44 | + const static uint16_t CDD_SCRATCHPAD_DATA_EP = 0x4002; |
| 45 | +#endif |
| 46 | +}; |
| 47 | + |
| 48 | + |
| 49 | +TEST_F(WpcCddApiTest, testReadingAppConfigAndDiagWithCddApi) |
| 50 | +{ |
| 51 | + const uint8_t TEST_CONFIG[] = { 0x11, 0x22, 0x33, 0x44, 0x55 }; |
| 52 | + const uint16_t TEST_DIAG_INTERVAL_SECONDS = 600; |
| 53 | + const uint8_t EXPECTED_RAW_DIAG_INTERVAL = 12; |
| 54 | + |
| 55 | + ASSERT_EQ(APP_RES_OK, |
| 56 | + WPC_set_app_config_data(1, TEST_DIAG_INTERVAL_SECONDS, TEST_CONFIG, sizeof(TEST_CONFIG))); |
| 57 | + |
| 58 | + uint8_t app_config_size = 0; |
| 59 | + ASSERT_EQ(APP_RES_OK, WPC_get_app_config_data_size(&app_config_size)); |
| 60 | + ASSERT_GT(app_config_size, 0); |
| 61 | + |
| 62 | + { |
| 63 | + uint8_t payload[UINT8_MAX] = { 0 }; |
| 64 | + uint8_t payload_size = 0; |
| 65 | + ASSERT_EQ(APP_RES_OK, WPC_get_config_data_item(CDD_APP_CONFIG_EP, payload, &payload_size)); |
| 66 | + ASSERT_EQ(app_config_size, payload_size); |
| 67 | + ASSERT_EQ_ARRAY(TEST_CONFIG, payload, sizeof(TEST_CONFIG)); |
| 68 | + } |
| 69 | + |
| 70 | + { |
| 71 | + uint8_t payload[UINT8_MAX] = { 0 }; |
| 72 | + uint8_t payload_size = 0; |
| 73 | + ASSERT_EQ(APP_RES_OK, WPC_get_config_data_item(CDD_DIAG_INTERVAL_EP, payload, &payload_size)); |
| 74 | + ASSERT_EQ(1, payload_size); |
| 75 | + ASSERT_EQ(EXPECTED_RAW_DIAG_INTERVAL, payload[0]); |
| 76 | + } |
| 77 | +} |
| 78 | + |
| 79 | +TEST_F(WpcCddApiTest, testWritingAppConfigAndDiagWithCddApi) |
| 80 | +{ |
| 81 | + uint8_t app_config_size = 0; |
| 82 | + ASSERT_EQ(APP_RES_OK, WPC_get_app_config_data_size(&app_config_size)); |
| 83 | + ASSERT_GT(app_config_size, 0); |
| 84 | + |
| 85 | + const uint8_t TEST_CONFIG[UINT8_MAX] = { 0xDD, 0xAB, 0xCD, 0x99, 0x42 }; |
| 86 | + ASSERT_GE(sizeof(TEST_CONFIG), app_config_size); |
| 87 | + const uint8_t RAW_DIAG_INTERVAL = 10; |
| 88 | + const uint16_t EXPECTED_DIAG_INTERVAL_SECONDS = 120; |
| 89 | + |
| 90 | + const uint8_t PAYLOAD[] = { RAW_DIAG_INTERVAL }; |
| 91 | + ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(CDD_DIAG_INTERVAL_EP, PAYLOAD, sizeof(PAYLOAD))); |
| 92 | + |
| 93 | + ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(CDD_APP_CONFIG_EP, TEST_CONFIG, app_config_size)); |
| 94 | + |
| 95 | + uint8_t seq = 0; |
| 96 | + uint16_t interval = 0; |
| 97 | + uint8_t config[UINT8_MAX] = { 0 }; |
| 98 | + ASSERT_EQ(APP_RES_OK, WPC_get_app_config_data(&seq, &interval, config, sizeof(config))); |
| 99 | + ASSERT_EQ(EXPECTED_DIAG_INTERVAL_SECONDS, interval); |
| 100 | + ASSERT_EQ_ARRAY(TEST_CONFIG, config, app_config_size); |
| 101 | +} |
| 102 | + |
| 103 | +TEST_F(WpcCddApiTest, testReadingScratchpatTargetWithCddApi) |
| 104 | +{ |
| 105 | + const uint8_t TEST_SEQ = 53; |
| 106 | + const uint16_t TEST_CRC = 0xABCD; |
| 107 | + const uint8_t TEST_ACTION = 3; |
| 108 | + const uint8_t TEST_PARAM = 0x4A; |
| 109 | + |
| 110 | + ASSERT_EQ(APP_RES_OK, WPC_write_target_scratchpad(TEST_SEQ, TEST_CRC, TEST_ACTION, TEST_PARAM)); |
| 111 | + |
| 112 | + uint8_t payload[255] = {0}; |
| 113 | + uint8_t payload_size = 0; |
| 114 | + ASSERT_EQ(APP_RES_OK, WPC_get_config_data_item(CDD_SCRATCHPAD_DATA_EP, payload, &payload_size)); |
| 115 | + ASSERT_EQ(sizeof(CddScratchpadDataItem), payload_size); |
| 116 | + CddScratchpadDataItem* scratchpad_data = (CddScratchpadDataItem*) payload; |
| 117 | + ASSERT_EQ(TEST_SEQ, scratchpad_data->seq); |
| 118 | + ASSERT_EQ(TEST_CRC, scratchpad_data->crc); |
| 119 | + ASSERT_EQ(TEST_ACTION, scratchpad_data->action); |
| 120 | + ASSERT_EQ(TEST_PARAM, scratchpad_data->param); |
| 121 | +} |
| 122 | + |
| 123 | +TEST_F(WpcCddApiTest, testWritingScratchpatTargetWithCddApi) |
| 124 | +{ |
| 125 | + const CddScratchpadDataItem SCRATCHPAD_DATA = { |
| 126 | + .seq = 71, |
| 127 | + .crc = 0xFEEB, |
| 128 | + .action = 3, |
| 129 | + .param = 0xC2 |
| 130 | + }; |
| 131 | + |
| 132 | + ASSERT_EQ(APP_RES_OK, |
| 133 | + WPC_set_config_data_item(CDD_SCRATCHPAD_DATA_EP, |
| 134 | + (uint8_t const*) &SCRATCHPAD_DATA, |
| 135 | + sizeof(SCRATCHPAD_DATA))); |
| 136 | + |
| 137 | + uint8_t seq = 0; |
| 138 | + uint16_t crc = 0; |
| 139 | + uint8_t action = 0; |
| 140 | + uint8_t param = 0; |
| 141 | + ASSERT_EQ(APP_RES_OK, WPC_read_target_scratchpad(&seq, &crc, &action, ¶m)); |
| 142 | + ASSERT_EQ(SCRATCHPAD_DATA.seq, seq); |
| 143 | + ASSERT_EQ(SCRATCHPAD_DATA.crc, crc); |
| 144 | + ASSERT_EQ(SCRATCHPAD_DATA.action, action); |
| 145 | + ASSERT_EQ(SCRATCHPAD_DATA.param, param); |
| 146 | +} |
| 147 | + |
| 148 | +TEST_F(WpcCddApiTest, testWritingInvalidScratchpatTargetWithCddApi) |
| 149 | +{ |
| 150 | + const CddScratchpadDataItem SCRATCHPAD_DATA = { |
| 151 | + .seq = 71, |
| 152 | + .crc = 0xFEEB, |
| 153 | + .action = 250, // Invalid value |
| 154 | + .param = 0xC2 |
| 155 | + }; |
| 156 | + |
| 157 | + ASSERT_EQ(APP_RES_DATA_ERROR, |
| 158 | + WPC_set_config_data_item(CDD_SCRATCHPAD_DATA_EP, |
| 159 | + (uint8_t const*) &SCRATCHPAD_DATA, |
| 160 | + sizeof(SCRATCHPAD_DATA))); |
| 161 | +} |
| 162 | + |
| 163 | +TEST_F(WpcCddApiTest, testWritingInvalidDiagIntervalWithCddApi) |
| 164 | +{ |
| 165 | + const uint8_t TEST_DIAG_INTERVAL[] = { 0xFE }; |
| 166 | + ASSERT_EQ(APP_RES_DATA_ERROR, |
| 167 | + WPC_set_config_data_item(CDD_DIAG_INTERVAL_EP, TEST_DIAG_INTERVAL, 1)); |
| 168 | +} |
| 169 | + |
| 170 | +TEST_F(WpcCddApiTest, testWritingInvalidScratchpadTargetSizeWithCddApi) |
| 171 | +{ |
| 172 | + const uint8_t TEST_PAYLOAD[10] = { 0 }; |
| 173 | + ASSERT_EQ(APP_RES_DATA_ERROR, |
| 174 | + WPC_set_config_data_item(CDD_SCRATCHPAD_DATA_EP, TEST_PAYLOAD, sizeof(TEST_PAYLOAD))); |
| 175 | +} |
| 176 | + |
| 177 | +TEST_F(WpcCddApiTest, testWritingInvalidDiagIntervalSizeWithCddApi) |
| 178 | +{ |
| 179 | + const uint8_t TEST_PAYLOAD[10] = { 0 }; |
| 180 | + ASSERT_EQ(APP_RES_DATA_ERROR, |
| 181 | + WPC_set_config_data_item(CDD_DIAG_INTERVAL_EP, TEST_PAYLOAD, sizeof(TEST_PAYLOAD))); |
| 182 | +} |
| 183 | + |
| 184 | +TEST_F(WpcCddApiTest, testWritingInvalidAppConfigDataWithCddApi) |
| 185 | +{ |
| 186 | + // App config data contents can be anything, but the size should be correct |
| 187 | + |
| 188 | + uint8_t app_config_size = 0; |
| 189 | + ASSERT_EQ(APP_RES_OK, WPC_get_app_config_data_size(&app_config_size)); |
| 190 | + ASSERT_GT(app_config_size, 2); |
| 191 | + const uint8_t INVALID_APP_CONFIG_SIZE = app_config_size - 1; |
| 192 | + |
| 193 | + const uint8_t PAYLOAD[UINT8_MAX] = { 0 }; |
| 194 | + ASSERT_EQ(APP_RES_DATA_ERROR, WPC_set_config_data_item(CDD_APP_CONFIG_EP, PAYLOAD, INVALID_APP_CONFIG_SIZE)); |
| 195 | +} |
| 196 | + |
| 197 | +TEST_F(WpcCddApiTest, settingItemShouldFailOnNonSinkNode) |
| 198 | +{ |
| 199 | + ASSERT_EQ(APP_RES_OK, WPC_set_role(APP_ROLE_HEADNODE)); |
| 200 | + |
| 201 | + const uint8_t PAYLOAD[] = { 0xAA, 0xBB }; |
| 202 | + ASSERT_EQ(APP_RES_NOT_A_SINK, WPC_set_config_data_item(100, PAYLOAD, sizeof(PAYLOAD))); |
| 203 | +} |
| 204 | + |
| 205 | +TEST_F(WpcCddApiTest, gettingItemShouldWorkOnNonSinkNode) |
| 206 | +{ |
| 207 | + const uint8_t TEST_PAYLOAD[] = { 0x55, 0x11, 0xFA }; |
| 208 | + const uint16_t TEST_EP = 0x100; |
| 209 | + |
| 210 | + ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(TEST_EP, TEST_PAYLOAD, sizeof(TEST_PAYLOAD))); |
| 211 | + |
| 212 | + ASSERT_EQ(APP_RES_OK, WPC_set_role(APP_ROLE_HEADNODE)); |
| 213 | + |
| 214 | + uint8_t payload[UINT8_MAX] = { 0 }; |
| 215 | + uint8_t payload_size = 0; |
| 216 | + ASSERT_EQ(APP_RES_OK, WPC_get_config_data_item(TEST_EP, payload, &payload_size)); |
| 217 | + ASSERT_EQ(sizeof(TEST_PAYLOAD), payload_size); |
| 218 | + ASSERT_EQ_ARRAY(TEST_PAYLOAD, payload, payload_size); |
| 219 | +} |
| 220 | + |
| 221 | +TEST_F(WpcCddApiTest, testSettingAndDeletingOptionalItem) |
| 222 | +{ |
| 223 | + const uint8_t TEST_PAYLOAD[] = { 0xF1, 0xD0, 0xA9, 0xB4 }; |
| 224 | + const uint16_t TEST_EP = 0x100; |
| 225 | + |
| 226 | + ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(TEST_EP, TEST_PAYLOAD, sizeof(TEST_PAYLOAD))); |
| 227 | + |
| 228 | + { |
| 229 | + uint8_t payload[UINT8_MAX] = { 0 }; |
| 230 | + uint8_t payload_size = 0; |
| 231 | + ASSERT_EQ(APP_RES_OK, WPC_get_config_data_item(TEST_EP, payload, &payload_size)); |
| 232 | + ASSERT_EQ(sizeof(TEST_PAYLOAD), payload_size); |
| 233 | + ASSERT_EQ_ARRAY(TEST_PAYLOAD, payload, payload_size); |
| 234 | + } |
| 235 | + |
| 236 | + ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(TEST_EP, NULL, 0)); |
| 237 | + |
| 238 | + { |
| 239 | + uint8_t payload[UINT8_MAX] = { 0 }; |
| 240 | + uint8_t payload_size = 0; |
| 241 | + ASSERT_EQ(APP_RES_INVALID_VALUE, WPC_get_config_data_item(TEST_EP, payload, &payload_size)); |
| 242 | + } |
| 243 | +} |
| 244 | + |
| 245 | +TEST_F(WpcCddApiTest, settingTooLargePayloadShouldFail) |
| 246 | +{ |
| 247 | + const uint8_t TEST_PAYLOAD[250] = { 0 }; |
| 248 | + ASSERT_EQ(APP_RES_INTERNAL_ERROR, WPC_set_config_data_item(100, TEST_PAYLOAD, sizeof(TEST_PAYLOAD))); |
| 249 | +} |
| 250 | + |
| 251 | +TEST_F(WpcCddApiTest, testReplacingOptionalItem) |
| 252 | +{ |
| 253 | + const uint16_t TEST_EP = 0x100; |
| 254 | + const uint8_t TEST_PAYLOAD_1[] = { 0xA1, 0xB1, 0xC1, 0xD1 }; |
| 255 | + const uint8_t TEST_PAYLOAD_2[] = { 0xA0, 0xB0 }; |
| 256 | + |
| 257 | + ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(TEST_EP, TEST_PAYLOAD_1, sizeof(TEST_PAYLOAD_1))); |
| 258 | + ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(TEST_EP, TEST_PAYLOAD_2, sizeof(TEST_PAYLOAD_2))); |
| 259 | + |
| 260 | + uint8_t payload[UINT8_MAX] = { 0 }; |
| 261 | + uint8_t payload_size = 0; |
| 262 | + ASSERT_EQ(APP_RES_OK, WPC_get_config_data_item(TEST_EP, payload, &payload_size)); |
| 263 | + ASSERT_EQ(sizeof(TEST_PAYLOAD_2), payload_size); |
| 264 | + ASSERT_EQ_ARRAY(TEST_PAYLOAD_2, payload, payload_size); |
| 265 | +} |
| 266 | + |
| 267 | +TEST_F(WpcCddApiTest, gettingNonExistingEndpointShouldFail) |
| 268 | +{ |
| 269 | + const uint16_t TEST_EP = 0xE999; |
| 270 | + |
| 271 | + uint8_t payload[UINT8_MAX] = { 0 }; |
| 272 | + uint8_t payload_size = 0; |
| 273 | + ASSERT_EQ(APP_RES_INVALID_VALUE, WPC_get_config_data_item(TEST_EP, payload, &payload_size)); |
| 274 | +} |
| 275 | + |
| 276 | +TEST_F(WpcCddApiTest, factoryResetShouldRemoveOptionalItems) |
| 277 | +{ |
| 278 | + const uint8_t TEST_PAYLOAD[] = { 0xAA, 0xBB }; |
| 279 | + const uint16_t TEST_EP = 0x100; |
| 280 | + |
| 281 | + ASSERT_EQ(APP_RES_OK, WPC_set_config_data_item(TEST_EP, TEST_PAYLOAD, sizeof(TEST_PAYLOAD))); |
| 282 | + |
| 283 | + ASSERT_EQ(APP_RES_OK, WPC_do_factory_reset()); |
| 284 | + |
| 285 | + uint8_t payload[UINT8_MAX] = { 0 }; |
| 286 | + uint8_t payload_size = 0; |
| 287 | + ASSERT_EQ(APP_RES_INVALID_VALUE, WPC_get_config_data_item(TEST_EP, payload, &payload_size)); |
| 288 | + ASSERT_EQ(0, payload_size); |
| 289 | +} |
| 290 | + |
| 291 | +TEST_F(WpcCddApiTest, settingTooManyOptionalItemsShouldFail) |
| 292 | +{ |
| 293 | + const uint16_t MAX_ATTEMPTS = 50; |
| 294 | + uint16_t detected_max_item_count = 0; |
| 295 | + for (uint16_t ep = 1; ep <= MAX_ATTEMPTS; ep++) |
| 296 | + { |
| 297 | + const uint8_t TEST_PAYLOAD[] = { 0x43 }; |
| 298 | + const app_res_e res = WPC_set_config_data_item(ep, TEST_PAYLOAD, sizeof(TEST_PAYLOAD)); |
| 299 | + if (APP_RES_OK == res) { |
| 300 | + detected_max_item_count++; |
| 301 | + } else if (APP_RES_OUT_OF_MEMORY == res) { |
| 302 | + break; |
| 303 | + } else { |
| 304 | + FAIL() << "Unexpected error occured"; |
| 305 | + } |
| 306 | + } |
| 307 | + |
| 308 | + ASSERT_LT(detected_max_item_count, MAX_ATTEMPTS); |
| 309 | + ASSERT_GT(detected_max_item_count, 0); |
| 310 | +} |
| 311 | + |
0 commit comments