Commit fa4f566bf90636cecf5eaae140392683d407b78a
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)
Showing
3 changed files
with
152 additions
and
72 deletions
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_ */ |