diff --git a/src/bacnet/basic/object/objects.c b/src/bacnet/basic/object/objects.c index afc3f5d5..ed7f47d0 100644 --- a/src/bacnet/basic/object/objects.c +++ b/src/bacnet/basic/object/objects.c @@ -57,6 +57,11 @@ int objects_device_count(void) return Keylist_Count(Device_List); } +uint32_t objects_device_id(int index) +{ + return Keylist_Key(Device_List, index); +} + OBJECT_DEVICE_T *objects_device_data(int index) { objects_init(); @@ -74,6 +79,7 @@ OBJECT_DEVICE_T *objects_device_new(uint32_t device_instance) OBJECT_DEVICE_T *pDevice = NULL; KEY key = device_instance; + objects_init(); if (Device_List) { /* does this device already exist? */ pDevice = Keylist_Data(Device_List, key); @@ -87,10 +93,6 @@ OBJECT_DEVICE_T *objects_device_new(uint32_t device_instance) pDevice->Object_Type = OBJECT_DEVICE; pDevice->Object_List = Keylist_Create(); Keylist_Data_Add(Device_List, key, pDevice); - } else { - fprintf(stderr, - "Objects: Unable to allocate device %lu buffer\n", - (unsigned long)device_instance); } } } @@ -103,11 +105,10 @@ OBJECT_DEVICE_T *objects_device_delete(int index) OBJECT_DEVICE_T *pDevice = NULL; BACNET_OBJECT_ID *pObject; + objects_init(); if (Device_List) { pDevice = Keylist_Data_Delete_By_Index(Device_List, index); if (pDevice) { - fprintf(stderr, "Objects: removing device %lu", - (unsigned long)pDevice->Object_Identifier.instance); if (pDevice->Object_List) { do { pObject = @@ -125,75 +126,3 @@ OBJECT_DEVICE_T *objects_device_delete(int index) return pDevice; } -#ifdef TEST -#include -#include - -#include "ctest.h" - -/* test the object creation and deletion */ -void testBACnetObjectsCompare( - Test *pTest, OBJECT_DEVICE_T *pDevice, uint32_t device_id) -{ - ct_test(pTest, pDevice != NULL); - if (pDevice) { - ct_test(pTest, pDevice->Object_List != NULL); - ct_test(pTest, pDevice->Object_Identifier.instance == device_id); - ct_test(pTest, pDevice->Object_Identifier.type == OBJECT_DEVICE); - ct_test(pTest, pDevice->Object_Type == OBJECT_DEVICE); - } -} - -void testBACnetObjects(Test *pTest) -{ - uint32_t device_id = 0; - unsigned test_point = 0; - const unsigned max_test_points = 20; - OBJECT_DEVICE_T *pDevice; - - for (test_point = 0; test_point < max_test_points; test_point++) { - device_id = test_point * (BACNET_MAX_INSTANCE / max_test_points); - pDevice = objects_device_new(device_id); - testBACnetObjectsCompare(pTest, pDevice, device_id); - pDevice = objects_device_by_instance(device_id); - testBACnetObjectsCompare(pTest, pDevice, device_id); - } - ct_test(pTest, max_test_points == objects_device_count()); - for (test_point = 0; test_point < max_test_points; test_point++) { - device_id = test_point * (BACNET_MAX_INSTANCE / max_test_points); - pDevice = objects_device_by_instance(device_id); - testBACnetObjectsCompare(pTest, pDevice, device_id); - } - for (test_point = 0; test_point < max_test_points; test_point++) { - device_id = test_point * (BACNET_MAX_INSTANCE / max_test_points); - pDevice = objects_device_data(test_point); - testBACnetObjectsCompare( - pTest, pDevice, Keylist_Key(Device_List, test_point)); - } - for (test_point = 0; test_point < max_test_points; test_point++) { - pDevice = objects_device_delete(0); - } -} - -#ifdef TEST_OBJECT_LIST -int main(void) -{ - Test *pTest; - bool rc; - - pTest = ct_create("BACnet Objects", NULL); - - /* individual tests */ - rc = ct_addTestFunction(pTest, testBACnetObjects); - assert(rc); - - ct_setStream(pTest, stdout); - ct_run(pTest); - (void)ct_report(pTest); - - ct_destroy(pTest); - - return 0; -} -#endif -#endif diff --git a/src/bacnet/basic/object/objects.h b/src/bacnet/basic/object/objects.h index 290dc140..01d763a8 100644 --- a/src/bacnet/basic/object/objects.h +++ b/src/bacnet/basic/object/objects.h @@ -21,35 +21,17 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *********************************************************************/ -#ifndef OBJECTS_H -#define OBJECTS_H +#ifndef BACNET_OBJECTS_H +#define BACNET_OBJECTS_H #include #include #include +#include "bacnet/bacnet_stack_exports.h" #include "bacnet/bacdef.h" #include "bacnet/bacstr.h" #include "bacnet/bacenum.h" -typedef union BACnetScale_t { - float Float; - int32_t Integer; -} BACNET_SCALE_T; - -/* structures to hold the data gotten by ReadProperty from the device */ -typedef struct object_accumulator_t { - BACNET_OBJECT_ID Object_Identifier; - BACNET_CHARACTER_STRING Object_Name; - BACNET_OBJECT_TYPE Object_Type; - uint32_t Present_Value; - BACNET_STATUS_FLAGS Status_Flags; - BACNET_EVENT_STATE Event_State; - bool Out_Of_Service; - BACNET_SCALE_T Scale; - BACNET_ENGINEERING_UNITS Units; - uint32_t Max_Pres_Value; -} OBJECT_ACCUMULATOR_T; - typedef struct object_device_t { BACNET_OBJECT_ID Object_Identifier; BACNET_CHARACTER_STRING Object_Name; @@ -74,5 +56,34 @@ typedef struct object_device_t { uint32_t Database_Revision; } OBJECT_DEVICE_T; +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + BACNET_STACK_EXPORT + OBJECT_DEVICE_T *objects_device_delete(int index); + + BACNET_STACK_EXPORT + OBJECT_DEVICE_T *objects_device_new(uint32_t device_instance); + + BACNET_STACK_EXPORT + OBJECT_DEVICE_T *objects_device_by_instance(uint32_t device_instance); + + BACNET_STACK_EXPORT + OBJECT_DEVICE_T *objects_device_data(int index); + + BACNET_STACK_EXPORT + int objects_device_count(void); + + BACNET_STACK_EXPORT + uint32_t objects_device_id(int index); + + BACNET_STACK_EXPORT + void objects_init(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ #endif + diff --git a/test/Makefile b/test/Makefile index 5da6a689..5c690ac6 100644 --- a/test/Makefile +++ b/test/Makefile @@ -6,7 +6,7 @@ all: abort address arf awf bvlc bvlc6 bacapp bacdcode bacerror bacint bacstr \ cov crc datetime dcc event filename fifo getevent iam ihave \ indtext keylist key lighting lso memcopy npdu proplist ptransfer \ rd reject ringbuf rp rpm sbuf timesync vmac \ - bbmd bbmd6 \ + bbmd bbmd6 objects \ whohas whois wp clean: logfile @@ -171,6 +171,11 @@ npdu: logfile npdu.mak ( ./npdu >> ${LOGFILE} ) $(MAKE) -s -f npdu.mak clean +objects: logfile bacnet/basic/object/objects/Makefile + $(MAKE) -s -C bacnet/basic/object/objects/ clean all + ( ./bacnet/basic/object/objects/unittest >> ${LOGFILE} ) + $(MAKE) -s -C bacnet/basic/object/objects/ clean + proplist: logfile proplist.mak $(MAKE) -s -f proplist.mak clean all ( ./proplist >> ${LOGFILE} ) diff --git a/test/objects.mak b/test/bacnet/basic/object/objects/Makefile similarity index 62% rename from test/objects.mak rename to test/bacnet/basic/object/objects/Makefile index cfaf4d1d..bab34bdc 100644 --- a/test/objects.mak +++ b/test/bacnet/basic/object/objects/Makefile @@ -1,17 +1,19 @@ #Makefile to build test case CC = gcc -SRC_DIR = ../src -INCLUDES = -I$(SRC_DIR) -I. -DEFINES = -DBIG_ENDIAN=0 -DTEST -DTEST_OBJECT_LIST +SRC_DIR = ../../../../../src +TEST_DIR = ../../../../../test +INCLUDES = -I$(SRC_DIR) -I$(TEST_DIR) +DEFINES = -DBIG_ENDIAN=0 -DDEBUG_ENABLED=0 CFLAGS = -Wall $(INCLUDES) $(DEFINES) -g -SRCS = $(SRC_DIR)/bacnet/basic/object/objects.c \ +SRCS = main.c \ + $(SRC_DIR)/bacnet/basic/object/objects.c \ $(SRC_DIR)/bacnet/basic/sys/keylist.c \ $(SRC_DIR)/bacnet/basic/sys/key.c \ - ctest.c + $(TEST_DIR)/ctest.c -TARGET_NAME = objects +TARGET_NAME = unittest ifeq ($(OS),Windows_NT) TARGET_EXT = .exe else @@ -34,10 +36,9 @@ depend: ${CC} -MM ${CFLAGS} *.c >> .depend clean: - rm -rf core ${TARGET} $(OBJS) *.bak *.1 *.ini + rm -rf ${TARGET} $(OBJS) -test: +test: ${TARGET} ./${TARGET} include: .depend - diff --git a/test/bacnet/basic/object/objects/main.c b/test/bacnet/basic/object/objects/main.c new file mode 100644 index 00000000..1f302c78 --- /dev/null +++ b/test/bacnet/basic/object/objects/main.c @@ -0,0 +1,100 @@ +/** + * @file + * @author Steve Karg + * @date April 2020 + * @brief Test file for a basic BBMD for BVLC IPv4 handler + * + * @section LICENSE + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#include +#include +#include +#include +#include +#include "bacnet/basic/sys/keylist.h" +#include "bacnet/basic/object/objects.h" +#include "ctest.h" + +/* test the object creation and deletion */ +void testBACnetObjectsCompare( + Test *pTest, OBJECT_DEVICE_T *pDevice, uint32_t device_id) +{ + ct_test(pTest, pDevice != NULL); + if (pDevice) { + ct_test(pTest, pDevice->Object_List != NULL); + ct_test(pTest, pDevice->Object_Identifier.instance == device_id); + ct_test(pTest, pDevice->Object_Identifier.type == OBJECT_DEVICE); + ct_test(pTest, pDevice->Object_Type == OBJECT_DEVICE); + } +} + +void testBACnetObjects(Test *pTest) +{ + uint32_t device_id = 0; + unsigned test_point = 0; + const unsigned max_test_points = 20; + OBJECT_DEVICE_T *pDevice; + + for (test_point = 0; test_point < max_test_points; test_point++) { + device_id = test_point * (BACNET_MAX_INSTANCE / max_test_points); + pDevice = objects_device_new(device_id); + testBACnetObjectsCompare(pTest, pDevice, device_id); + pDevice = objects_device_by_instance(device_id); + testBACnetObjectsCompare(pTest, pDevice, device_id); + } + ct_test(pTest, max_test_points == objects_device_count()); + for (test_point = 0; test_point < max_test_points; test_point++) { + device_id = test_point * (BACNET_MAX_INSTANCE / max_test_points); + pDevice = objects_device_by_instance(device_id); + testBACnetObjectsCompare(pTest, pDevice, device_id); + } + for (test_point = 0; test_point < max_test_points; test_point++) { + device_id = test_point * (BACNET_MAX_INSTANCE / max_test_points); + pDevice = objects_device_data(test_point); + testBACnetObjectsCompare( + pTest, pDevice, objects_device_id(test_point)); + } + for (test_point = 0; test_point < max_test_points; test_point++) { + pDevice = objects_device_delete(0); + } +} + +int main(void) +{ + Test *pTest; + bool rc; + + pTest = ct_create("BACnet Objects", NULL); + + /* individual tests */ + rc = ct_addTestFunction(pTest, testBACnetObjects); + assert(rc); + + ct_setStream(pTest, stdout); + ct_run(pTest); + (void)ct_report(pTest); + + ct_destroy(pTest); + + return 0; +} +