src.dualinventive.com/jjacobs/dinetrpcll-sniffer/libdi/tests/can_msg_write.cpp

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);
}