Commit a01bab2b69d92892c751a6c13bd6a22f5f9d703d
1 parent
53c93ae2
Add a unit test for the bad response from the slave.
Showing
3 changed files
with
30 additions
and
0 deletions
tests/unit-test-master.c
| @@ -398,6 +398,24 @@ int main(void) | @@ -398,6 +398,24 @@ int main(void) | ||
| 398 | printf("FAILED\n"); | 398 | printf("FAILED\n"); |
| 399 | } | 399 | } |
| 400 | 400 | ||
| 401 | + /* BAD RESPONSE */ | ||
| 402 | + | ||
| 403 | + /* Allocate only the required space */ | ||
| 404 | + uint16_t *tab_rp_registers_bad = (uint16_t *) malloc( | ||
| 405 | + UT_HOLDING_REGISTERS_NB_POINTS_SPECIAL * sizeof(uint16_t)); | ||
| 406 | + printf("1/1 read_holding_registers: "); | ||
| 407 | + ret = read_holding_registers(&mb_param, | ||
| 408 | + SLAVE, UT_HOLDING_REGISTERS_ADDRESS, | ||
| 409 | + UT_HOLDING_REGISTERS_NB_POINTS_SPECIAL, | ||
| 410 | + tab_rp_registers_bad); | ||
| 411 | + if (ret > 0) { | ||
| 412 | + /* Error not detected */ | ||
| 413 | + printf("FAILED\n"); | ||
| 414 | + } else { | ||
| 415 | + printf("OK\n"); | ||
| 416 | + } | ||
| 417 | + free(tab_rp_registers_bad); | ||
| 418 | + | ||
| 401 | close: | 419 | close: |
| 402 | /* Free the memory */ | 420 | /* Free the memory */ |
| 403 | free(tab_rp_status); | 421 | free(tab_rp_status); |
tests/unit-test-slave.c
| @@ -67,6 +67,14 @@ int main(void) | @@ -67,6 +67,14 @@ int main(void) | ||
| 67 | 67 | ||
| 68 | ret = modbus_listen(&mb_param, query, &query_size); | 68 | ret = modbus_listen(&mb_param, query, &query_size); |
| 69 | if (ret == 0) { | 69 | if (ret == 0) { |
| 70 | + if (((query[HEADER_LENGTH_TCP + 4] << 8) + query[HEADER_LENGTH_TCP + 5]) | ||
| 71 | + == UT_HOLDING_REGISTERS_NB_POINTS_SPECIAL) { | ||
| 72 | + /* Change the number of values (offset | ||
| 73 | + TCP = 6) */ | ||
| 74 | + query[HEADER_LENGTH_TCP + 4] = 0; | ||
| 75 | + query[HEADER_LENGTH_TCP + 5] = UT_HOLDING_REGISTERS_NB_POINTS; | ||
| 76 | + } | ||
| 77 | + | ||
| 70 | modbus_manage_query(&mb_param, query, query_size, &mb_mapping); | 78 | modbus_manage_query(&mb_param, query, query_size, &mb_mapping); |
| 71 | } else if (ret == CONNECTION_CLOSED) { | 79 | } else if (ret == CONNECTION_CLOSED) { |
| 72 | /* Connection closed by the client, end of server */ | 80 | /* Connection closed by the client, end of server */ |
tests/unit-test.h
| @@ -31,6 +31,10 @@ const uint8_t UT_INPUT_STATUS_TAB[] = { 0xAC, 0xDB, 0x35 }; | @@ -31,6 +31,10 @@ const uint8_t UT_INPUT_STATUS_TAB[] = { 0xAC, 0xDB, 0x35 }; | ||
| 31 | const uint16_t UT_HOLDING_REGISTERS_ADDRESS = 0x6B; | 31 | const uint16_t UT_HOLDING_REGISTERS_ADDRESS = 0x6B; |
| 32 | const uint16_t UT_HOLDING_REGISTERS_NB_POINTS = 0x3; | 32 | const uint16_t UT_HOLDING_REGISTERS_NB_POINTS = 0x3; |
| 33 | const uint16_t UT_HOLDING_REGISTERS_TAB[] = { 0x022B, 0x0000, 0x0064 }; | 33 | const uint16_t UT_HOLDING_REGISTERS_TAB[] = { 0x022B, 0x0000, 0x0064 }; |
| 34 | +/* If the following value is used, a bad response is sent. | ||
| 35 | + It's better to test with a lower value than | ||
| 36 | + UT_HOLDING_REGISTERS_NB_POINTS to try to raise a segfault. */ | ||
| 37 | +const uint16_t UT_HOLDING_REGISTERS_NB_POINTS_SPECIAL = 0x2; | ||
| 34 | 38 | ||
| 35 | const uint16_t UT_INPUT_REGISTERS_ADDRESS = 0x08; | 39 | const uint16_t UT_INPUT_REGISTERS_ADDRESS = 0x08; |
| 36 | const uint16_t UT_INPUT_REGISTERS_NB_POINTS = 0x1; | 40 | const uint16_t UT_INPUT_REGISTERS_NB_POINTS = 0x1; |