Feature/zephyr ztest (#118)
* Leverage (older) embedded unit tests into external unit tests build upon copy of Zephyr's ztest library and CMake. * Expand top-level CMake build to run external unit tests. * Expand Zephyr module extension to run external unit tests via west or sanitycheck. Co-authored-by: Gregory Shue <gregory.shue@legrand.us>
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
|
||||
|
||||
get_filename_component(basename ${CMAKE_CURRENT_SOURCE_DIR} NAME)
|
||||
project(test_${basename}
|
||||
VERSION 1.0.0
|
||||
LANGUAGES C)
|
||||
|
||||
|
||||
string(REGEX REPLACE "/bacnet/[a-zA-Z_/-]*$" "" TST_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
set(ZTST_DIR "${TST_DIR}/ztest/src")
|
||||
string(REGEX REPLACE "/test$" "/src" SRC_DIR ${TST_DIR})
|
||||
|
||||
add_compile_definitions(
|
||||
BIG_ENDIAN=0
|
||||
CONFIG_ZTEST=1
|
||||
)
|
||||
|
||||
include_directories(
|
||||
${SRC_DIR}
|
||||
${TST_DIR}/ztest/include
|
||||
)
|
||||
|
||||
add_executable(${PROJECT_NAME}
|
||||
# File(s) under test
|
||||
${SRC_DIR}/bacnet/basic/binding/address.c
|
||||
# Support files and stubs (pathname alphabetical)
|
||||
${SRC_DIR}/bacnet/bacaddr.c
|
||||
${SRC_DIR}/bacnet/bacapp.c
|
||||
${SRC_DIR}/bacnet/bacdcode.c
|
||||
${SRC_DIR}/bacnet/bacdevobjpropref.c
|
||||
${SRC_DIR}/bacnet/bacint.c
|
||||
${SRC_DIR}/bacnet/bacreal.c
|
||||
${SRC_DIR}/bacnet/bacstr.c
|
||||
${SRC_DIR}/bacnet/bactext.c
|
||||
${SRC_DIR}/bacnet/basic/sys/bigend.c
|
||||
${SRC_DIR}/bacnet/datetime.c
|
||||
${SRC_DIR}/bacnet/indtext.c
|
||||
${SRC_DIR}/bacnet/lighting.c
|
||||
# Test and test library files
|
||||
./src/main.c
|
||||
${ZTST_DIR}/ztest_mock.c
|
||||
${ZTST_DIR}/ztest.c
|
||||
)
|
||||
@@ -0,0 +1,202 @@
|
||||
/*
|
||||
* Copyright (c) 2020 Legrand North America, LLC.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*/
|
||||
|
||||
/* @file
|
||||
* @brief test BACnet integer encode/decode APIs
|
||||
*/
|
||||
|
||||
#include <ztest.h>
|
||||
#include <bacnet/bacaddr.h>
|
||||
#include <bacnet/basic/binding/address.h>
|
||||
|
||||
/* we are likely compiling the demo command line tools if print enabled */
|
||||
#if !defined(BACNET_ADDRESS_CACHE_FILE)
|
||||
#if PRINT_ENABLED
|
||||
#define BACNET_ADDRESS_CACHE_FILE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @addtogroup bacnet_tests
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Test
|
||||
*/
|
||||
static void set_address(unsigned index, BACNET_ADDRESS *dest)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < MAX_MAC_LEN; i++) {
|
||||
dest->mac[i] = index;
|
||||
}
|
||||
dest->mac_len = MAX_MAC_LEN;
|
||||
dest->net = 7;
|
||||
dest->len = MAX_MAC_LEN;
|
||||
for (i = 0; i < MAX_MAC_LEN; i++) {
|
||||
dest->adr[i] = index;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0 /* Not used */
|
||||
static void set_file_address(const char *pFilename,
|
||||
uint32_t device_id,
|
||||
BACNET_ADDRESS *dest,
|
||||
uint16_t max_apdu)
|
||||
{
|
||||
unsigned i;
|
||||
FILE *pFile = NULL;
|
||||
|
||||
pFile = fopen(pFilename, "w");
|
||||
|
||||
if (pFile) {
|
||||
fprintf(pFile, "%lu ", (long unsigned int)device_id);
|
||||
for (i = 0; i < dest->mac_len; i++) {
|
||||
fprintf(pFile, "%02x", dest->mac[i]);
|
||||
if ((i + 1) < dest->mac_len) {
|
||||
fprintf(pFile, ":");
|
||||
}
|
||||
}
|
||||
fprintf(pFile, " %hu ", dest->net);
|
||||
if (dest->net) {
|
||||
for (i = 0; i < dest->len; i++) {
|
||||
fprintf(pFile, "%02x", dest->adr[i]);
|
||||
if ((i + 1) < dest->len) {
|
||||
fprintf(pFile, ":");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fprintf(pFile, "0");
|
||||
}
|
||||
fprintf(pFile, " %hu\n", max_apdu);
|
||||
fclose(pFile);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BACNET_ADDRESS_CACHE_FILE
|
||||
static void testAddressFile(void)
|
||||
{
|
||||
#if 0 /* Skip file as Address_Cache_Filename is an internal data structure */
|
||||
BACNET_ADDRESS src = { 0 };
|
||||
uint32_t device_id = 0;
|
||||
unsigned max_apdu = 480;
|
||||
BACNET_ADDRESS test_address = { 0 };
|
||||
unsigned test_max_apdu = 0;
|
||||
|
||||
/* create a fake address */
|
||||
device_id = 55555;
|
||||
src.mac_len = 1;
|
||||
src.mac[0] = 25;
|
||||
src.net = 0;
|
||||
src.adr[0] = 0;
|
||||
max_apdu = 50;
|
||||
set_file_address(Address_Cache_Filename, device_id, &src, max_apdu);
|
||||
/* retrieve it from the file, and see if we can find it */
|
||||
address_file_init(Address_Cache_Filename);
|
||||
zassert_true(
|
||||
address_get_by_device(device_id, &test_max_apdu, &test_address), NULL);
|
||||
zassert_equal(test_max_apdu, max_apdu, NULL);
|
||||
zassert_true(bacnet_address_same(&test_address, &src), NULL);
|
||||
|
||||
/* create a fake address */
|
||||
device_id = 55555;
|
||||
src.mac_len = 6;
|
||||
src.mac[0] = 0xC0;
|
||||
src.mac[1] = 0xA8;
|
||||
src.mac[2] = 0x00;
|
||||
src.mac[3] = 0x18;
|
||||
src.mac[4] = 0xBA;
|
||||
src.mac[5] = 0xC0;
|
||||
src.net = 26001;
|
||||
src.len = 1;
|
||||
src.adr[0] = 25;
|
||||
max_apdu = 50;
|
||||
set_file_address(Address_Cache_Filename, device_id, &src, max_apdu);
|
||||
/* retrieve it from the file, and see if we can find it */
|
||||
address_file_init(Address_Cache_Filename);
|
||||
zassert_true(
|
||||
address_get_by_device(device_id, &test_max_apdu, &test_address), NULL);
|
||||
zassert_equal(test_max_apdu, max_apdu, NULL);
|
||||
zassert_true(bacnet_address_same(&test_address, &src), NULL);
|
||||
#else
|
||||
ztest_test_skip();
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
static void testAddress(void)
|
||||
{
|
||||
unsigned i, count;
|
||||
BACNET_ADDRESS src;
|
||||
uint32_t device_id = 0;
|
||||
unsigned max_apdu = 480;
|
||||
BACNET_ADDRESS test_address;
|
||||
uint32_t test_device_id = 0;
|
||||
unsigned test_max_apdu = 0;
|
||||
|
||||
/* create a fake address database */
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
set_address(i, &src);
|
||||
device_id = i * 255;
|
||||
address_add(device_id, max_apdu, &src);
|
||||
count = address_count();
|
||||
zassert_equal(count, (i + 1), NULL);
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
device_id = i * 255;
|
||||
set_address(i, &src);
|
||||
/* test the lookup by device id */
|
||||
zassert_true(
|
||||
address_get_by_device(device_id, &test_max_apdu, &test_address), NULL);
|
||||
zassert_equal(test_max_apdu, max_apdu, NULL);
|
||||
zassert_true(bacnet_address_same(&test_address, &src), NULL);
|
||||
zassert_true(
|
||||
address_get_by_index(
|
||||
i, &test_device_id, &test_max_apdu, &test_address), NULL);
|
||||
zassert_equal(test_device_id, device_id, NULL);
|
||||
zassert_equal(test_max_apdu, max_apdu, NULL);
|
||||
zassert_true(bacnet_address_same(&test_address, &src), NULL);
|
||||
zassert_equal(address_count(), MAX_ADDRESS_CACHE, NULL);
|
||||
/* test the lookup by MAC */
|
||||
zassert_true(address_get_device_id(&src, &test_device_id), NULL);
|
||||
zassert_equal(test_device_id, device_id, NULL);
|
||||
}
|
||||
|
||||
for (i = 0; i < MAX_ADDRESS_CACHE; i++) {
|
||||
device_id = i * 255;
|
||||
address_remove_device(device_id);
|
||||
zassert_false(
|
||||
address_get_by_device(device_id, &test_max_apdu, &test_address), NULL);
|
||||
count = address_count();
|
||||
zassert_equal(count, (MAX_ADDRESS_CACHE - i - 1), NULL);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
void test_main(void)
|
||||
{
|
||||
#ifdef BACNET_ADDRESS_CACHE_FILE
|
||||
ztest_test_suite(address_tests,
|
||||
ztest_unit_test(testAddressFile),
|
||||
ztest_unit_test(testAddress)
|
||||
);
|
||||
|
||||
ztest_run_test_suite(address_tests);
|
||||
#else
|
||||
ztest_test_suite(address_tests,
|
||||
ztest_unit_test(testAddress)
|
||||
);
|
||||
|
||||
ztest_run_test_suite(address_tests);
|
||||
#endif
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user