Commit a01bab2b69d92892c751a6c13bd6a22f5f9d703d

Authored by Stéphane Raimbault
1 parent 53c93ae2

Add a unit test for the bad response from the slave.

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;