Commit fa4f566bf90636cecf5eaae140392683d407b78a

Authored by Stéphane Raimbault
1 parent 1660f894

Unit testing

- Major changes to unit-test-master/slave to add 4 tests
- Use new functions to manipulate bits
- Reduce memory usage (allocate only the required space and use
  uint[8|16]_t pointers)
tests/unit-test-master.c
@@ -24,49 +24,122 @@ @@ -24,49 +24,122 @@
24 24
25 #include <modbus/modbus.h> 25 #include <modbus/modbus.h>
26 26
  27 +#include "unit-test.h"
  28 +
27 /* Tests based on PI-MBUS-300 documentation */ 29 /* Tests based on PI-MBUS-300 documentation */
28 #define SLAVE 0x11 30 #define SLAVE 0x11
29 -#define FIELDS 500  
30 31
31 int main(void) 32 int main(void)
32 { 33 {
33 - int *tab_rq;  
34 - int *tab_rq_bits;  
35 - int *tab_rp; 34 + uint8_t *tab_rp_status;
  35 + uint16_t *tab_rp_registers;
36 modbus_param_t mb_param; 36 modbus_param_t mb_param;
  37 + int i;
  38 + uint8_t value;
  39 + uint16_t address;
  40 + uint16_t nb_points;
37 41
38 /* RTU parity : none, even, odd */ 42 /* RTU parity : none, even, odd */
39 /* modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, "none", 8, 1); */ 43 /* modbus_init_rtu(&mb_param, "/dev/ttyS0", 19200, "none", 8, 1); */
40 44
41 /* TCP */ 45 /* TCP */
42 modbus_init_tcp(&mb_param, "127.0.0.1", 1502); 46 modbus_init_tcp(&mb_param, "127.0.0.1", 1502);
43 - modbus_set_debug(&mb_param, TRUE);  
44 47
45 modbus_connect(&mb_param); 48 modbus_connect(&mb_param);
46 49
47 - /* Allocate and initialize the different memory spaces */  
48 - tab_rq = (int *) malloc(FIELDS * sizeof(int));  
49 - memset(tab_rq, 0, FIELDS * sizeof(int)); 50 + /* Allocate and initialize the memory to store the status */
  51 + nb_points = (UT_COIL_STATUS_NB_POINTS > UT_INPUT_STATUS_NB_POINTS) ?
  52 + UT_COIL_STATUS_NB_POINTS : UT_INPUT_STATUS_NB_POINTS;
  53 + tab_rp_status = (uint8_t *) malloc(nb_points * sizeof(uint8_t));
  54 + memset(tab_rp_status, 0, nb_points * sizeof(uint8_t));
  55 +
  56 + /* Allocate and initialize the memory to store the registers */
  57 + nb_points = (UT_HOLDING_REGISTERS_NB_POINTS > UT_INPUT_REGISTERS_NB_POINTS) ?
  58 + UT_HOLDING_REGISTERS_NB_POINTS : UT_INPUT_REGISTERS_NB_POINTS;
  59 + tab_rp_registers = (uint16_t *) malloc(nb_points * sizeof(uint16_t));
  60 + memset(tab_rp_registers, 0, nb_points * sizeof(uint16_t));
50 61
51 - tab_rq_bits = (int *) malloc(FIELDS * sizeof(int));  
52 - memset(tab_rq_bits, 0, FIELDS * sizeof(int)); 62 + printf("Unit testing\n");
  63 +
  64 + /** COIL STATUS **/
  65 + read_coil_status(&mb_param, SLAVE, UT_COIL_STATUS_ADDRESS,
  66 + UT_COIL_STATUS_NB_POINTS, tab_rp_status);
  67 +
  68 + i = 0;
  69 + address = UT_COIL_STATUS_ADDRESS;
  70 + nb_points = UT_COIL_STATUS_NB_POINTS;
  71 + while (nb_points > 0) {
  72 + int nb_bits = (nb_points > 8) ? 8 : nb_points;
  73 +
  74 + value = get_byte_from_bits(tab_rp_status, i*8, nb_bits);
  75 + if (value != UT_COIL_STATUS_TAB[i]) {
  76 + printf("Coil status: FAILED (%0X != %0X)\n",
  77 + value, UT_COIL_STATUS_TAB[i]);
  78 + goto close;
  79 + }
  80 +
  81 + nb_points -= nb_bits;
  82 + i++;
  83 + }
  84 + printf("Coil status: OK\n");
53 85
54 - tab_rp = (int *) malloc(FIELDS * sizeof(int));  
55 - memset(tab_rp, 0, FIELDS * sizeof(int));  
56 -  
57 - read_coil_status(&mb_param, SLAVE, 0x13, 0x25, tab_rp);  
58 - read_input_status(&mb_param, SLAVE, 0xC4, 0x16, tab_rp);  
59 - read_holding_registers(&mb_param, SLAVE, 0x6B, 3, tab_rp);  
60 - read_input_registers(&mb_param, SLAVE, 0x8, 1, tab_rp);  
61 - force_single_coil(&mb_param, SLAVE, 0xAC, ON);  
62 86
  87 + /** INPUT STATUS **/
  88 + read_input_status(&mb_param, SLAVE, UT_INPUT_STATUS_ADDRESS,
  89 + UT_INPUT_STATUS_NB_POINTS, tab_rp_status);
  90 +
  91 + i = 0;
  92 + address = UT_INPUT_STATUS_ADDRESS;
  93 + nb_points = UT_INPUT_STATUS_NB_POINTS;
  94 + while (nb_points > 0) {
  95 + int nb_bits = (nb_points > 8) ? 8 : nb_points;
  96 +
  97 + value = get_byte_from_bits(tab_rp_status, i*8, nb_bits);
  98 + if (value != UT_INPUT_STATUS_TAB[i]) {
  99 + printf("Input status: FAILED (%0X != %0X)\n",
  100 + value, UT_INPUT_STATUS_TAB[i]);
  101 + goto close;
  102 + }
  103 +
  104 + nb_points -= nb_bits;
  105 + i++;
  106 + }
  107 + printf("Input status: OK\n");
  108 +
  109 + /** HOLDING REGISTERS **/
  110 + read_holding_registers(&mb_param, SLAVE, UT_HOLDING_REGISTERS_ADDRESS,
  111 + UT_HOLDING_REGISTERS_NB_POINTS, tab_rp_registers);
  112 + for (i=0; i < UT_HOLDING_REGISTERS_NB_POINTS; i++) {
  113 + if (tab_rp_registers[i] != UT_HOLDING_REGISTERS_TAB[i]) {
  114 + printf("Holding registers: FAILED (%0X != %0X)\n",
  115 + tab_rp_registers[i], UT_HOLDING_REGISTERS_TAB[i]);
  116 + goto close;
  117 + }
  118 + }
  119 + printf("Holding registers: OK\n");
  120 +
  121 + /** INPUT REGISTERS **/
  122 + read_input_registers(&mb_param, SLAVE, UT_INPUT_REGISTERS_ADDRESS,
  123 + UT_INPUT_REGISTERS_NB_POINTS, tab_rp_registers);
  124 + for (i=0; i < UT_INPUT_REGISTERS_NB_POINTS; i++) {
  125 + if (tab_rp_registers[i] != UT_INPUT_REGISTERS_TAB[i]) {
  126 + printf("Input registers: FAILED (%0X != %0X)\n",
  127 + tab_rp_registers[i], UT_INPUT_REGISTERS_TAB[i]);
  128 + goto close;
  129 + }
  130 + }
  131 + printf("Input registers: OK\n");
  132 +
  133 +close:
63 /* Free the memory */ 134 /* Free the memory */
64 - free(tab_rp);  
65 - free(tab_rq);  
66 - free(tab_rq_bits); 135 + free(tab_rp_status);
  136 + free(tab_rp_registers);
67 137
68 /* Close the connection */ 138 /* Close the connection */
69 modbus_close(&mb_param); 139 modbus_close(&mb_param);
70 140
71 return 0; 141 return 0;
  142 +/*
  143 + force_single_coil(&mb_param, SLAVE, 0xAC, ON);
  144 +*/
72 } 145 }
tests/unit-test-slave.c
@@ -24,12 +24,10 @@ @@ -24,12 +24,10 @@
24 24
25 #include <modbus/modbus.h> 25 #include <modbus/modbus.h>
26 26
  27 +#include "unit-test.h"
  28 +
27 int main(void) 29 int main(void)
28 { 30 {
29 - const int nb_coil_status = 500;  
30 - const int nb_input_status = 500;  
31 - const int nb_input_registers = 500;  
32 - const int nb_holding_registers = 500;  
33 int socket; 31 int socket;
34 modbus_param_t mb_param; 32 modbus_param_t mb_param;
35 modbus_mapping_t mb_mapping; 33 modbus_mapping_t mb_mapping;
@@ -37,59 +35,41 @@ int main(void) @@ -37,59 +35,41 @@ int main(void)
37 int i; 35 int i;
38 36
39 modbus_init_tcp(&mb_param, "127.0.0.1", 1502); 37 modbus_init_tcp(&mb_param, "127.0.0.1", 1502);
40 - modbus_set_debug(&mb_param, TRUE);  
41 38
42 - modbus_mapping_new(&mb_mapping,  
43 - nb_coil_status, nb_input_status,  
44 - nb_input_registers, nb_holding_registers); 39 + ret = modbus_mapping_new(&mb_mapping,
  40 + UT_COIL_STATUS_ADDRESS + UT_COIL_STATUS_NB_POINTS,
  41 + UT_INPUT_STATUS_ADDRESS + UT_INPUT_STATUS_NB_POINTS,
  42 + UT_HOLDING_REGISTERS_ADDRESS + UT_HOLDING_REGISTERS_NB_POINTS,
  43 + UT_INPUT_STATUS_ADDRESS + UT_INPUT_REGISTERS_NB_POINTS);
  44 + if (ret == FALSE) {
  45 + printf("Memory allocation failed\n");
  46 + exit(1);
  47 + }
45 48
46 /* Examples from PI_MODBUS_300.pdf */ 49 /* Examples from PI_MODBUS_300.pdf */
47 50
48 - /* Coil status */  
49 - mb_mapping.tab_coil_status[26] = ON;  
50 - mb_mapping.tab_coil_status[25] = ON;  
51 - mb_mapping.tab_coil_status[24] = OFF;  
52 - mb_mapping.tab_coil_status[23] = OFF;  
53 - mb_mapping.tab_coil_status[22] = ON;  
54 - mb_mapping.tab_coil_status[21] = ON;  
55 - mb_mapping.tab_coil_status[20] = OFF;  
56 - mb_mapping.tab_coil_status[19] = ON;  
57 -  
58 - /* Input status */  
59 - mb_mapping.tab_input_status[203] = ON;  
60 - mb_mapping.tab_input_status[202] = OFF;  
61 - mb_mapping.tab_input_status[201] = ON;  
62 - mb_mapping.tab_input_status[200] = OFF;  
63 - mb_mapping.tab_input_status[199] = ON;  
64 - mb_mapping.tab_input_status[198] = ON;  
65 - mb_mapping.tab_input_status[197] = OFF;  
66 - mb_mapping.tab_input_status[196] = OFF; 51 + /** COIL STATUS **/
  52 + set_bits_from_bytes(mb_mapping.tab_coil_status,
  53 + UT_COIL_STATUS_ADDRESS, UT_COIL_STATUS_NB_POINTS,
  54 + UT_COIL_STATUS_TAB);
67 55
68 - mb_mapping.tab_input_status[211] = ON;  
69 - mb_mapping.tab_input_status[210] = ON;  
70 - mb_mapping.tab_input_status[209] = OFF;  
71 - mb_mapping.tab_input_status[208] = ON;  
72 - mb_mapping.tab_input_status[207] = ON;  
73 - mb_mapping.tab_input_status[206] = OFF;  
74 - mb_mapping.tab_input_status[205] = ON;  
75 - mb_mapping.tab_input_status[204] = ON; 56 + /** INPUT STATUS **/
  57 + set_bits_from_bytes(mb_mapping.tab_input_status,
  58 + UT_INPUT_STATUS_ADDRESS, UT_INPUT_STATUS_NB_POINTS,
  59 + UT_INPUT_STATUS_TAB);
76 60
77 - /* Incomplete byte */  
78 - mb_mapping.tab_input_status[217] = ON;  
79 - mb_mapping.tab_input_status[216] = ON;  
80 - mb_mapping.tab_input_status[215] = OFF;  
81 - mb_mapping.tab_input_status[214] = ON;  
82 - mb_mapping.tab_input_status[213] = OFF;  
83 - mb_mapping.tab_input_status[212] = ON; 61 + /** HOLDING REGISTERS **/
  62 + for (i=0; i < UT_HOLDING_REGISTERS_NB_POINTS; i++) {
  63 + mb_mapping.tab_holding_registers[UT_HOLDING_REGISTERS_ADDRESS+i] =
  64 + UT_HOLDING_REGISTERS_TAB[i];;
  65 + }
84 66
85 - /* Holding registers */  
86 - mb_mapping.tab_holding_registers[107] = 0x022B;  
87 - mb_mapping.tab_holding_registers[108] = 0x0000;  
88 - mb_mapping.tab_holding_registers[109] = 0x0064; 67 + /** INPUT REGISTERS **/
  68 + for (i=0; i < UT_INPUT_REGISTERS_NB_POINTS; i++) {
  69 + mb_mapping.tab_input_registers[UT_INPUT_REGISTERS_ADDRESS+i] =
  70 + UT_INPUT_REGISTERS_TAB[i];;
  71 + }
89 72
90 - /* Input registers */  
91 - mb_mapping.tab_input_registers[8] = 0x000A;  
92 -  
93 socket = modbus_init_listen_tcp(&mb_param); 73 socket = modbus_init_listen_tcp(&mb_param);
94 74
95 i = 0; 75 i = 0;
@@ -98,10 +78,15 @@ int main(void) @@ -98,10 +78,15 @@ int main(void)
98 int query_size; 78 int query_size;
99 79
100 ret = modbus_listen(&mb_param, query, &query_size); 80 ret = modbus_listen(&mb_param, query, &query_size);
101 - if (ret == 0) 81 +
  82 + if (ret == 0) {
102 manage_query(&mb_param, query, query_size, &mb_mapping); 83 manage_query(&mb_param, query, query_size, &mb_mapping);
103 - else 84 + } else if (ret == CONNECTION_CLOSED) {
  85 + /* Connection closed by the client, end of server */
  86 + break;
  87 + } else {
104 printf("Error in modbus_listen (%d)\n", ret); 88 printf("Error in modbus_listen (%d)\n", ret);
  89 + }
105 } 90 }
106 91
107 close(socket); 92 close(socket);
tests/unit-test.h 0 → 100644
  1 +#ifndef _UNIT_TEST_H_
  2 +#define _UNIT_TEST_H_
  3 +
  4 +#include <stdint.h>
  5 +
  6 +const uint16_t UT_COIL_STATUS_ADDRESS = 0x13;
  7 +const uint16_t UT_COIL_STATUS_NB_POINTS = 0x25;
  8 +const uint8_t UT_COIL_STATUS_TAB[] = { 0xCD, 0x6B, 0xB2, 0x0E, 0x1B };
  9 +
  10 +const uint16_t UT_INPUT_STATUS_ADDRESS = 0xC4;
  11 +const uint16_t UT_INPUT_STATUS_NB_POINTS = 0x16;
  12 +const uint8_t UT_INPUT_STATUS_TAB[] = { 0xAC, 0xDB, 0x35 };
  13 +
  14 +const uint16_t UT_HOLDING_REGISTERS_ADDRESS = 0x6B;
  15 +const uint16_t UT_HOLDING_REGISTERS_NB_POINTS = 0x3;
  16 +const uint16_t UT_HOLDING_REGISTERS_TAB[] = { 0x022B, 0x0000, 0x0064 };
  17 +
  18 +const uint16_t UT_INPUT_REGISTERS_ADDRESS = 0x08;
  19 +const uint16_t UT_INPUT_REGISTERS_NB_POINTS = 0x1;
  20 +const uint16_t UT_INPUT_REGISTERS_TAB[] = { 0x000A };
  21 +
  22 +#endif /* _UNIT_TEST_H_ */