/** * @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 #include "tests/can.h" #include #include #include #include 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); }