122 lines
3.0 KiB
C++
122 lines
3.0 KiB
C++
/**
|
|
* @file tests/can_msg.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 <stdio.h>
|
|
#include "tests/can.h"
|
|
#include <gtest/gtest.h>
|
|
|
|
#include <di/time.h>
|
|
#include <di/buffer.h>
|
|
#include <di/can/msg.h>
|
|
|
|
TEST_CAN_INIT_DECL
|
|
|
|
TEST(can_msg_write, data_bool)
|
|
{
|
|
struct di_can_msg *msg;
|
|
|
|
/* Write true bool */
|
|
msg = di_can_msg_alloc(&can_ctx);
|
|
|
|
ASSERT_EQ(DNOK, di_can_msg_write_data_bool(msg, true));
|
|
ASSERT_EQ(DI_CAN_PTYPE_BOOL, msg->ptype);
|
|
ASSERT_EQ(msg->buf->data, msg->msg);
|
|
ASSERT_EQ(1U, msg->size);
|
|
ASSERT_EQ(1U, msg->buf->data[0]); // First databyte is 1 (true)
|
|
|
|
di_can_send(&msg);
|
|
|
|
/* Write false bool */
|
|
msg = di_can_msg_alloc(&can_ctx);
|
|
|
|
ASSERT_EQ(DNOK, di_can_msg_write_data_bool(msg, false));
|
|
ASSERT_EQ(DI_CAN_PTYPE_BOOL, msg->ptype);
|
|
ASSERT_EQ(msg->buf->data, msg->msg);
|
|
ASSERT_EQ(1U, msg->size);
|
|
ASSERT_EQ(0U, msg->buf->data[0]); // First databyte is 0 (false)
|
|
|
|
di_can_send(&msg);
|
|
}
|
|
|
|
TEST(can_msg_write, data_u8)
|
|
{
|
|
uint8_t inp_data = 0x12;
|
|
uint8_t exp_data[] = { 0x12 };
|
|
struct di_can_msg *msg = di_can_msg_alloc(&can_ctx);
|
|
|
|
ASSERT_EQ(DNOK, di_can_msg_write_data_u8(msg, inp_data));
|
|
ASSERT_EQ(DI_CAN_PTYPE_U8, msg->ptype);
|
|
ASSERT_EQ(msg->buf->data, msg->msg);
|
|
ASSERT_EQ(1U, msg->size);
|
|
ASSERT_EQ(0, memcmp(msg->buf->data, exp_data, sizeof(exp_data)));
|
|
|
|
di_can_send(&msg);
|
|
}
|
|
|
|
TEST(can_msg_write, data_u64)
|
|
{
|
|
uint64_t inp_data = 0xc0cac01acafebabe;
|
|
uint8_t exp_data[] = { 0xc0, 0xca, 0xc0, 0x1a, 0xca, 0xfe, 0xba, 0xbe };
|
|
struct di_can_msg *msg = di_can_msg_alloc(&can_ctx);
|
|
|
|
ASSERT_EQ(DNOK, di_can_msg_write_data_u64(msg, inp_data));
|
|
ASSERT_EQ(DI_CAN_PTYPE_U64, msg->ptype);
|
|
ASSERT_EQ(msg->buf->data, msg->msg);
|
|
ASSERT_EQ(8U, msg->size);
|
|
ASSERT_EQ(0, memcmp(msg->buf->data, exp_data, sizeof(exp_data)));
|
|
|
|
di_can_send(&msg);
|
|
}
|
|
|
|
TEST(can_msg_write, data_string)
|
|
{
|
|
const char *string = "hello-world!";
|
|
struct di_can_msg *msg = di_can_msg_alloc(&can_ctx);
|
|
|
|
ASSERT_EQ(DNOK, di_can_msg_write_data_string(msg, string));
|
|
ASSERT_EQ(DI_CAN_PTYPE_STRING, msg->ptype);
|
|
ASSERT_EQ(msg->buf->data, msg->msg);
|
|
ASSERT_EQ(strlen(string) + 1, msg->size);
|
|
ASSERT_EQ(0, memcmp(msg->buf->data, string, strlen(string) + 1));
|
|
|
|
di_can_send(&msg);
|
|
}
|
|
|
|
TEST(can_msg_write, data_di_errno)
|
|
{
|
|
uint8_t exp_data[] = { 0x00, 0x00, 0x00, DNE_TIMEOUT };
|
|
struct di_can_msg *msg = di_can_msg_alloc(&can_ctx);
|
|
|
|
ASSERT_EQ(DNOK, di_can_msg_write_data_di_errno(msg, DNE_TIMEOUT));
|
|
ASSERT_EQ(DI_CAN_PTYPE_DI_ERRNO, msg->ptype);
|
|
ASSERT_EQ(msg->buf->data, msg->msg);
|
|
ASSERT_EQ(4U, msg->size);
|
|
ASSERT_EQ(0, memcmp(msg->buf->data, exp_data, sizeof(exp_data)));
|
|
|
|
di_can_send(&msg);
|
|
}
|
|
|
|
/**
|
|
* Check if a write with a small buffer results in undefined behaviour
|
|
*/
|
|
TEST(can_msg_write, data_u64_buf_to_small)
|
|
{
|
|
size_t buf_size;
|
|
struct di_can_msg *msg = di_can_msg_alloc(&can_ctx);
|
|
|
|
ASSERT_NE((void *)NULL, msg);
|
|
buf_size = msg->buf->size;
|
|
msg->buf->size = 4;
|
|
|
|
ASSERT_EQ(DNE_NOMEM, di_can_msg_write_data_u64(msg, 1337));
|
|
msg->buf->size = buf_size;
|
|
|
|
di_can_msg_free(&msg);
|
|
}
|