326 lines
11 KiB
C++
326 lines
11 KiB
C++
/**
|
|
* @file tests/can_msg_recv.cpp
|
|
* @brief CAN message unit test
|
|
* @date Sep 30, 2015
|
|
* @author jjacobs
|
|
* @copyright 2015 Dual Inventive Technology Centre B.V.
|
|
*
|
|
* CAN Message unit test
|
|
*/
|
|
#include "tests/can.h"
|
|
#include <gtest/gtest.h>
|
|
#include <di/can.h>
|
|
|
|
TEST_CAN_INIT_DECL
|
|
|
|
/**
|
|
* Check if the initial can_msg_recv state is correct
|
|
*/
|
|
TEST(can_msg_recv, init) {
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
}
|
|
|
|
/**
|
|
* Test message receive counter reset
|
|
*/
|
|
TEST(can_msg_recv, reset) {
|
|
can_ctx.msg.recv.any_cnt = 4;
|
|
can_ctx.msg.recv.raw_cnt = 1;
|
|
can_ctx.msg.recv.rpc_cnt = 1;
|
|
can_ctx.msg.recv.net_cnt = 1;
|
|
can_ctx.msg.recv.log_cnt = 1;
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
}
|
|
|
|
/**
|
|
* Test message receive counter increment
|
|
*/
|
|
TEST(can_msg_recv, incr) {
|
|
/* One RAW message */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_RAW);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
|
|
/* One RPC message */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_RPC);
|
|
ASSERT_EQ(2U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
|
|
/* One NET message */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_NET);
|
|
ASSERT_EQ(3U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
|
|
/* One LOG message */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_LOG);
|
|
ASSERT_EQ(4U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.log_cnt);
|
|
|
|
/* One ANY message this is invalid */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_ANY);
|
|
ASSERT_EQ(4U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.log_cnt);
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
}
|
|
|
|
/**
|
|
* Test message receive counter increment overflow protection
|
|
*/
|
|
TEST(can_msg_recv, incr_overflow) {
|
|
can_ctx.msg.recv.any_cnt = SIZE_MAX;
|
|
can_ctx.msg.recv.raw_cnt = SIZE_MAX;
|
|
can_ctx.msg.recv.rpc_cnt = 0;
|
|
can_ctx.msg.recv.net_cnt = 0;
|
|
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_RAW);
|
|
|
|
ASSERT_EQ(SIZE_MAX, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(SIZE_MAX, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_RPC);
|
|
ASSERT_EQ(SIZE_MAX, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(SIZE_MAX, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
}
|
|
|
|
/**
|
|
* Test message receive counter decrement
|
|
*/
|
|
TEST(can_msg_recv, decr) {
|
|
can_ctx.msg.recv.any_cnt = 3;
|
|
can_ctx.msg.recv.raw_cnt = 1;
|
|
can_ctx.msg.recv.rpc_cnt = 1;
|
|
can_ctx.msg.recv.net_cnt = 1;
|
|
|
|
/* One ANY message, this is invalid */
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_ANY);
|
|
ASSERT_EQ(3U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.net_cnt);
|
|
|
|
/* One RAW message */
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_RAW);
|
|
ASSERT_EQ(2U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.net_cnt);
|
|
|
|
/* One RPC message */
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_RPC);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.net_cnt);
|
|
|
|
/* One NET message */
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_NET);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
}
|
|
|
|
/**
|
|
* Test message receive counter decrement underflow protection
|
|
*/
|
|
TEST(can_msg_recv, decr_underflow) {
|
|
can_ctx.msg.recv.any_cnt = 0;
|
|
can_ctx.msg.recv.raw_cnt = 0;
|
|
can_ctx.msg.recv.rpc_cnt = 0;
|
|
can_ctx.msg.recv.net_cnt = 0;
|
|
can_ctx.msg.recv.log_cnt = 0;
|
|
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_RAW);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_RPC);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_NET);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_LOG);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
|
|
can_ctx.msg.recv.any_cnt = 1;
|
|
can_ctx.msg.recv.raw_cnt = 1;
|
|
can_ctx.msg.recv.rpc_cnt = 0;
|
|
can_ctx.msg.recv.net_cnt = 0;
|
|
can_ctx.msg.recv.log_cnt = 0;
|
|
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_RPC);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.any_cnt);
|
|
ASSERT_EQ(1U, can_ctx.msg.recv.raw_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.rpc_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.net_cnt);
|
|
ASSERT_EQ(0U, can_ctx.msg.recv.log_cnt);
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
}
|
|
|
|
/**
|
|
* Test message receive ready flag
|
|
*/
|
|
TEST(can_msg_recv, is_ready) {
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
|
|
/* RAW */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_RAW);
|
|
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
|
|
/* RPC */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_RPC);
|
|
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
|
|
/* NET */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_NET);
|
|
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_LOG));
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
|
|
/* LOG */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_LOG);
|
|
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_LOG));
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
|
|
/* Combined RAW + RPC + NET */
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_RAW);
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_RPC);
|
|
di_can_msg_recv_incr(&can_ctx, DI_CAN_MSGTYPE_NET);
|
|
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
|
|
/* Decr NET */
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_NET);
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
|
|
/* Decr RPC */
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_RPC);
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_TRUE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_LOG));
|
|
|
|
/* Decr RAW */
|
|
di_can_msg_recv_decr(&can_ctx, DI_CAN_MSGTYPE_RAW);
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
ASSERT_FALSE(di_can_msg_recv_is_ready(&can_ctx, DI_CAN_MSGTYPE_LOG));
|
|
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
}
|
|
|
|
/**
|
|
* Test
|
|
*/
|
|
TEST(can_msg_recv, test_blocking_api) {
|
|
di_can_msg_recv_reset(&can_ctx);
|
|
|
|
di_can_msg_recv_set_timeout(&can_ctx, 1);
|
|
di_can_msg_recv_set_blocking(&can_ctx, true);
|
|
|
|
/* Make sure all semaphores are taken */
|
|
di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_ANY);
|
|
di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_RAW);
|
|
di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_RPC);
|
|
di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_NET);
|
|
di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_LOG);
|
|
|
|
ASSERT_EQ(DNE_TIMEOUT, di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_ANY));
|
|
ASSERT_EQ(DNE_TIMEOUT, di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_RAW));
|
|
ASSERT_EQ(DNE_TIMEOUT, di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_RPC));
|
|
ASSERT_EQ(DNE_TIMEOUT, di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_NET));
|
|
ASSERT_EQ(DNE_TIMEOUT, di_can_msg_recv_wait(&can_ctx, DI_CAN_MSGTYPE_LOG));
|
|
|
|
di_can_msg_recv_set_timeout(&can_ctx, 0);
|
|
di_can_msg_recv_set_blocking(&can_ctx, false);
|
|
}
|