nanoMODBUS/tests/modbusino_tests.c
Valerio De Benedetto 4605782fc7 Changes
2022-01-20 13:02:23 +01:00

114 lines
3.3 KiB
C

#include "modbusino_tests.h"
#include "modbusino.h"
#include <assert.h>
#include <stdio.h>
#include <string.h>
void test_server_create(mbsn_transport transport) {
mbsn_t mbsn;
mbsn_error err;
mbsn_transport_conf transport_conf_empty = {.transport = transport,
.read_byte = read_byte_empty,
.write_byte = write_byte_empty};
should("create a modbus server");
reset(mbsn);
err = mbsn_server_create(&mbsn, TEST_SERVER_ADDR, transport_conf_empty, (mbsn_callbacks){});
check(err);
should("check parameters and fail to create a modbus server");
reset(mbsn);
err = mbsn_server_create(NULL, TEST_SERVER_ADDR, transport_conf_empty, (mbsn_callbacks){});
expect(err == MBSN_ERROR_INVALID_ARGUMENT);
reset(mbsn);
err = mbsn_server_create(&mbsn, 0, transport_conf_empty, (mbsn_callbacks){});
expect(err == MBSN_ERROR_INVALID_ARGUMENT);
reset(mbsn);
mbsn_transport_conf t = transport_conf_empty;
t.transport = 3;
err = mbsn_server_create(&mbsn, 0, t, (mbsn_callbacks){});
expect(err == MBSN_ERROR_INVALID_ARGUMENT);
reset(mbsn);
t = transport_conf_empty;
t.read_byte = NULL;
err = mbsn_server_create(&mbsn, 0, t, (mbsn_callbacks){});
expect(err == MBSN_ERROR_INVALID_ARGUMENT);
reset(mbsn);
t = transport_conf_empty;
t.write_byte = NULL;
err = mbsn_server_create(&mbsn, 0, t, (mbsn_callbacks){});
expect(err == MBSN_ERROR_INVALID_ARGUMENT);
};
void test_server_receive_base(mbsn_transport transport) {
mbsn_t mbsn;
mbsn_error err;
mbsn_transport_conf transport_conf;
should("honor read_timeout and return normally");
reset(mbsn);
transport_conf.transport = transport;
transport_conf.read_byte = read_byte_timeout_1s;
transport_conf.write_byte = write_byte_empty;
const int32_t read_timeout_ms = 250;
err = mbsn_server_create(&mbsn, TEST_SERVER_ADDR, transport_conf, (mbsn_callbacks){});
check(err);
mbsn_set_read_timeout(&mbsn, read_timeout_ms);
mbsn_set_byte_timeout(&mbsn, -1);
const int polls = 5;
for (int i = 0; i < polls; i++) {
uint64_t start = now_ms();
err = mbsn_server_receive(&mbsn);
check(err);
uint64_t diff = now_ms() - start;
assert(diff >= read_timeout_ms);
}
should("honor byte_timeout and return MBSN_ERROR_TIMEOUT");
reset(mbsn);
transport_conf.transport = transport;
transport_conf.read_byte = read_byte_timeout_third;
transport_conf.write_byte = write_byte_empty;
const int32_t byte_timeout_ms = 250;
err = mbsn_server_create(&mbsn, TEST_SERVER_ADDR, transport_conf, (mbsn_callbacks){});
check(err);
mbsn_set_read_timeout(&mbsn, 1000);
mbsn_set_byte_timeout(&mbsn, byte_timeout_ms);
err = mbsn_server_receive(&mbsn);
expect(err == MBSN_ERROR_TIMEOUT);
}
int main() {
should("create a RTU modbus server");
test(test_server_create(MBSN_TRANSPORT_TCP));
should("create a TCP modbus server");
test(test_server_create(MBSN_TRANSPORT_TCP));
should("receive no messages as RTU server without failing");
test(test_server_receive_base(MBSN_TRANSPORT_RTU));
should("receive no messages as TCP server without failing");
test(test_server_receive_base(MBSN_TRANSPORT_TCP));
return 0;
}