208 lines
9.4 KiB
C
208 lines
9.4 KiB
C
#include <data.h>
|
|
#include <it2s-asn/etsi-its-v2/cam/EI2_CAM.h>
|
|
#include <it2s-asn/etsi-its-v2/denm/EI2_DENM.h>
|
|
#include <metadata.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
#include <unity.h>
|
|
|
|
void setUp(void) {
|
|
// set stuff up here
|
|
}
|
|
|
|
void tearDown(void) {
|
|
// clean stuff up here
|
|
}
|
|
|
|
static void testDataSingle(void) {
|
|
int rv = 0;
|
|
ldm_data_storage_t storage;
|
|
ldm_data_storage_init(&storage);
|
|
|
|
EI2_CAM_t* cam = calloc(1, sizeof(*cam));
|
|
asn_random_fill(&asn_DEF_EI2_CAM, (void**)&cam, 1000);
|
|
uint32_t id = ldm_data_storage_add(&storage, ldm_data_type_CAM, cam);
|
|
TEST_ASSERT_MESSAGE(id != 0, "Data object was not added to the database");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].count == 1, "Data object count is not correct");
|
|
|
|
ldm_data_type_t type;
|
|
rv = ldm_data_storage_get_type(&storage, id, &type);
|
|
TEST_ASSERT_MESSAGE(rv == 0, "Data object type was not retrieved correctly");
|
|
TEST_ASSERT_MESSAGE(type == ldm_data_type_CAM, "Data object type is not correct");
|
|
|
|
void* array[10];
|
|
uint32_t count = ldm_data_storage_query(&storage, ldm_data_type_CAM, NULL, NULL, array, 10);
|
|
TEST_ASSERT_MESSAGE(count == 1, "Data object count is not correct");
|
|
TEST_ASSERT_MESSAGE(array[0] != NULL, "Received data object is NULL");
|
|
TEST_ASSERT_MESSAGE(array[0] != cam, "Query does not copy the object");
|
|
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_CAM, cam);
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_CAM, array[0]);
|
|
|
|
cam = calloc(1, sizeof(*cam));
|
|
asn_random_fill(&asn_DEF_EI2_CAM, (void**)&cam, 1000);
|
|
rv = ldm_data_storage_update(&storage, id, ldm_data_type_CAM, cam);
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_CAM, cam);
|
|
TEST_ASSERT_MESSAGE(rv == 0, "Data object was not updated in the database");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].count == 1, "Data object count is not correct");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].head != NULL, "List head is not valid");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].tail != NULL, "List tail is not valid");
|
|
|
|
rv = ldm_data_storage_delete(&storage, id);
|
|
TEST_ASSERT_MESSAGE(rv == 0, "Data object was not deleted from the database");
|
|
|
|
rv = ldm_data_storage_delete(&storage, id);
|
|
TEST_ASSERT_MESSAGE(rv == 1, "Data object was not deleted from the database");
|
|
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].count == 0, "Data object count is not correct");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].head == NULL, "Data object list is not correct");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].tail == NULL, "Data object list is not correct");
|
|
|
|
count = ldm_data_storage_query(&storage, ldm_data_type_CAM, NULL, NULL, array, 10);
|
|
TEST_ASSERT_MESSAGE(count == 0, "Data object count is not correct");
|
|
|
|
ldm_data_storage_exit(&storage);
|
|
}
|
|
|
|
static void testDataMultiple(void) {
|
|
int rv = 0;
|
|
ldm_data_storage_t storage;
|
|
ldm_data_storage_init(&storage);
|
|
|
|
uint32_t cam_ids[ldm_data_storage_map_size * 3] = {0};
|
|
for (uint32_t i = 0; i < ldm_data_storage_map_size * 3; i++) {
|
|
EI2_CAM_t* cam = calloc(1, sizeof(*cam));
|
|
asn_random_fill(&asn_DEF_EI2_CAM, (void**)&cam, 1000);
|
|
cam_ids[i] = ldm_data_storage_add(&storage, ldm_data_type_CAM, cam);
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_CAM, cam);
|
|
TEST_ASSERT_MESSAGE(cam_ids[i] != 0, "Data object was not added to the database");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].count == i + 1, "Data object count is not correct");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].head != NULL, "List head is not valid");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].tail != NULL, "List tail is not valid");
|
|
}
|
|
|
|
uint32_t denm_ids[ldm_data_storage_map_size * 3] = {0};
|
|
for (uint32_t i = 0; i < ldm_data_storage_map_size * 3; i++) {
|
|
EI2_DENM_t* denm = calloc(1, sizeof(*denm));
|
|
asn_random_fill(&asn_DEF_EI2_DENM, (void**)&denm, 1000);
|
|
denm_ids[i] = ldm_data_storage_add(&storage, ldm_data_type_DENM, denm);
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_DENM, denm);
|
|
TEST_ASSERT_MESSAGE(denm_ids[i] != 0, "Data object was not added to the database");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_DENM].count == i + 1, "DENM Data object count is not correct");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_DENM].head != NULL, "DENM List head is not valid");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_DENM].tail != NULL, "DENM List tail is not valid");
|
|
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].count == ldm_data_storage_map_size * 3,
|
|
"CAM Data object count is not correct");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].head != NULL, "CAM List head is not valid");
|
|
TEST_ASSERT_MESSAGE(storage.lists[ldm_data_type_CAM].tail != NULL, "CAM List tail is not valid");
|
|
}
|
|
|
|
for (uint32_t i = 0; i < ldm_data_storage_map_size * 3; i++) {
|
|
for (uint32_t j = i + 1; j < ldm_data_storage_map_size * 3; j++) {
|
|
TEST_ASSERT_MESSAGE(cam_ids[i] != cam_ids[j], "Data object id's should not be the same");
|
|
TEST_ASSERT_MESSAGE(denm_ids[i] != denm_ids[j], "Data object id's should not be the same");
|
|
}
|
|
}
|
|
|
|
void* array[ldm_data_storage_map_size * 4];
|
|
uint32_t count = ldm_data_storage_query(&storage, ldm_data_type_CAM, NULL, NULL, array, ldm_data_storage_map_size * 4);
|
|
TEST_ASSERT_MESSAGE(count == ldm_data_storage_map_size * 3, "Data object count is not correct");
|
|
for (uint32_t i = 0; i < ldm_data_storage_map_size * 3; i++) {
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_CAM, array[i]);
|
|
}
|
|
|
|
count = ldm_data_storage_query(&storage, ldm_data_type_DENM, NULL, NULL, array, ldm_data_storage_map_size * 4);
|
|
TEST_ASSERT_MESSAGE(count == ldm_data_storage_map_size * 3, "Data object count is not correct");
|
|
for (uint32_t i = 0; i < ldm_data_storage_map_size * 3; i++) {
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_DENM, array[i]);
|
|
}
|
|
|
|
EI2_DENM_t* denm = calloc(1, sizeof(*denm));
|
|
rv = ldm_data_storage_update(&storage, cam_ids[0], ldm_data_type_DENM, denm);
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_DENM, denm);
|
|
TEST_ASSERT_MESSAGE(rv == 2, "Data object updated with inconsistent type");
|
|
|
|
// update 10 random CAM and DENM objects
|
|
for (int _ = 0; _ < 10; ++_) {
|
|
uint32_t rid = rand() % (ldm_data_storage_map_size * 3);
|
|
EI2_CAM_t* cam = calloc(1, sizeof(*cam));
|
|
asn_random_fill(&asn_DEF_EI2_CAM, (void**)&cam, 1000);
|
|
rv = ldm_data_storage_update(&storage, cam_ids[rid], ldm_data_type_CAM, cam);
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_CAM, cam);
|
|
TEST_ASSERT_MESSAGE(rv == 0, "Data object was not updated in the database");
|
|
|
|
rid = rand() % (ldm_data_storage_map_size * 3);
|
|
EI2_DENM_t* denm = calloc(1, sizeof(*denm));
|
|
asn_random_fill(&asn_DEF_EI2_DENM, (void**)&denm, 1000);
|
|
rv = ldm_data_storage_update(&storage, denm_ids[rid], ldm_data_type_DENM, denm);
|
|
ASN_STRUCT_FREE(asn_DEF_EI2_DENM, denm);
|
|
TEST_ASSERT_MESSAGE(rv == 0, "Data object was not updated in the database");
|
|
}
|
|
|
|
uint32_t deleted = 0;
|
|
for (uint32_t i = 0; i < ldm_data_storage_map_size * 3; i++) {
|
|
uint32_t rid = rand() % (ldm_data_storage_map_size * 3);
|
|
while (cam_ids[rid] == 0) {
|
|
++rid;
|
|
if (rid >= ldm_data_storage_map_size * 3) {
|
|
rid = 0;
|
|
}
|
|
}
|
|
|
|
ldm_data_type_t type;
|
|
rv = ldm_data_storage_get_type(&storage, cam_ids[rid], &type);
|
|
TEST_ASSERT_MESSAGE(rv == 0, "Data Object type was not retrieved correctly");
|
|
TEST_ASSERT_MESSAGE(type == ldm_data_type_CAM, "Data Object type is not correct");
|
|
|
|
rv = ldm_data_storage_delete(&storage, cam_ids[rid]);
|
|
char msg[100];
|
|
sprintf(msg, "CAM Data object was not deleted from the database. Deleted %d", deleted);
|
|
TEST_ASSERT_MESSAGE(rv == 0, msg);
|
|
cam_ids[rid] = 0;
|
|
deleted++;
|
|
}
|
|
|
|
for (uint32_t i = 0; i < ldm_data_storage_map_size * 3; i++) {
|
|
uint32_t rid = rand() % (ldm_data_storage_map_size * 3);
|
|
while (denm_ids[rid] == 0) {
|
|
++rid;
|
|
if (rid >= ldm_data_storage_map_size * 3) {
|
|
rid = 0;
|
|
}
|
|
}
|
|
|
|
ldm_data_type_t type;
|
|
rv = ldm_data_storage_get_type(&storage, denm_ids[rid], &type);
|
|
TEST_ASSERT_MESSAGE(rv == 0, "Data Object type was not retrieved correctly");
|
|
TEST_ASSERT_MESSAGE(type == ldm_data_type_DENM, "Data Object type is not correct");
|
|
|
|
rv = ldm_data_storage_delete(&storage, denm_ids[rid]);
|
|
TEST_ASSERT_MESSAGE(rv == 0, "DENM Data object was not deleted from the database");
|
|
denm_ids[rid] = 0;
|
|
}
|
|
|
|
for (int type = 0; type < ldm_data_type_total; ++type) {
|
|
TEST_ASSERT_MESSAGE(storage.lists[type].count == 0, "Data object count is not correct");
|
|
TEST_ASSERT_MESSAGE(storage.lists[type].head == NULL, "Data object list is not correct");
|
|
TEST_ASSERT_MESSAGE(storage.lists[type].tail == NULL, "Data object list is not correct");
|
|
}
|
|
for (int i = 0; i < ldm_data_storage_map_size; ++i) {
|
|
TEST_ASSERT_MESSAGE(storage.map.array[i] == NULL, "Data object map is not correct");
|
|
}
|
|
|
|
ldm_data_storage_exit(&storage);
|
|
}
|
|
|
|
int main(void) {
|
|
// seed rand
|
|
struct timespec ts;
|
|
clock_gettime(CLOCK_MONOTONIC, &ts);
|
|
srand(ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
|
|
|
|
UNITY_BEGIN();
|
|
RUN_TEST(testDataSingle);
|
|
RUN_TEST(testDataMultiple);
|
|
return UNITY_END();
|
|
}
|