2023-10-06 03:13:46 +00:00
|
|
|
#include <cassert>
|
|
|
|
#include <cstring>
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
#include "Arena.h"
|
|
|
|
#include "TLV.h"
|
|
|
|
|
|
|
|
#include "test_fixtures.h"
|
|
|
|
|
|
|
|
|
|
|
|
static uint8_t arena_buffer[ARENA_SIZE];
|
|
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
tlv_test_suite(Arena &backend)
|
|
|
|
{
|
|
|
|
TLV::Record rec1, rec2, rec3, rec4;
|
|
|
|
uint8_t *cursor = NULL;
|
|
|
|
|
2023-10-06 06:08:35 +00:00
|
|
|
TLV::SetRecord(rec1, 1, TEST_STRLEN1, TEST_STR1);
|
|
|
|
TLV::SetRecord(rec2, 2, TEST_STRLEN2, TEST_STR2);
|
|
|
|
TLV::SetRecord(rec3, 1, TEST_STRLEN4, TEST_STR4);
|
2023-10-06 03:13:46 +00:00
|
|
|
rec4.Tag = 1;
|
|
|
|
|
2023-10-06 06:08:35 +00:00
|
|
|
assert(TLV::WriteToMemory(backend, cursor, rec1) != NULL);
|
|
|
|
assert((cursor = TLV::WriteToMemory(backend, cursor, rec2)) != NULL);
|
|
|
|
assert(TLV::WriteToMemory(backend, cursor, rec3) != NULL);
|
2023-10-06 03:13:46 +00:00
|
|
|
cursor = NULL;
|
|
|
|
|
|
|
|
// the cursor should point at the next record,
|
|
|
|
// and rec4 should contain the same data as rec1.
|
2023-10-06 06:08:35 +00:00
|
|
|
cursor = TLV::FindTag(backend, cursor, rec4);
|
2023-10-06 03:13:46 +00:00
|
|
|
assert(cursor != NULL);
|
2023-10-06 06:08:35 +00:00
|
|
|
assert(cursor != backend.Store);
|
2023-10-06 03:13:46 +00:00
|
|
|
assert(cmp_record(rec1, rec4));
|
|
|
|
|
2023-10-06 06:08:35 +00:00
|
|
|
cursor = TLV::FindTag(backend, cursor, rec4);
|
2023-10-06 03:13:46 +00:00
|
|
|
assert(cursor != NULL);
|
|
|
|
assert(cmp_record(rec3, rec4));
|
|
|
|
|
2023-10-06 06:08:35 +00:00
|
|
|
TLV::SetRecord(rec4, 3, TEST_STRLEN3, TEST_STR3);
|
|
|
|
assert(TLV::WriteToMemory(backend, NULL, rec4));
|
2023-10-06 03:13:46 +00:00
|
|
|
|
2023-10-06 03:49:17 +00:00
|
|
|
rec4.Tag = 2;
|
2023-10-06 06:08:35 +00:00
|
|
|
cursor = TLV::FindTag(backend, NULL, rec4);
|
2023-10-06 03:49:17 +00:00
|
|
|
assert(cursor != NULL);
|
|
|
|
|
2023-10-06 06:08:35 +00:00
|
|
|
TLV::DeleteRecord(backend, cursor);
|
2023-10-06 03:49:17 +00:00
|
|
|
assert(cursor[0] == 3);
|
2023-10-06 03:13:46 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
run_suite(Arena &backend, const char *label)
|
|
|
|
{
|
2023-10-06 06:08:35 +00:00
|
|
|
DisplayArena(backend);
|
|
|
|
|
2023-10-06 03:13:46 +00:00
|
|
|
std::cout << "running test suite " << label << ": ";
|
|
|
|
if (!tlv_test_suite(backend)) {
|
|
|
|
std::cout << "FAILED" << std::endl;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
std::cout << "OK" << std::endl;
|
|
|
|
|
|
|
|
std::cout << "\tdestroying arena: ";
|
2023-10-06 06:08:35 +00:00
|
|
|
if (DestroyArena(backend) != 0) {
|
2023-10-06 03:13:46 +00:00
|
|
|
std::cout << "FAILED" << std::endl;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cout << "OK" << std::endl;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
main(int argc, const char *argv[])
|
|
|
|
{
|
|
|
|
Arena arena_static;
|
|
|
|
Arena arena_mem;
|
|
|
|
Arena arena_file;
|
|
|
|
|
2023-10-06 06:08:35 +00:00
|
|
|
std::cout << "TESTPROG: " << argv[0] << std::endl;
|
|
|
|
InitializeArena(arena_static);
|
|
|
|
InitializeArena(arena_mem);
|
|
|
|
InitializeArena(arena_file);
|
2023-10-06 03:13:46 +00:00
|
|
|
|
2023-10-06 06:08:35 +00:00
|
|
|
if (-1 == NewStaticArena(arena_static, arena_buffer, ARENA_SIZE)) {
|
2023-10-06 03:13:46 +00:00
|
|
|
abort();
|
|
|
|
} else if (!run_suite(arena_static, "arena_static")) {
|
|
|
|
abort();
|
|
|
|
}
|
2023-10-06 06:08:35 +00:00
|
|
|
ClearArena(arena_static);
|
2023-10-06 03:13:46 +00:00
|
|
|
|
2023-10-06 06:08:35 +00:00
|
|
|
#if defined(__linux__)
|
|
|
|
if (-1 == CreateArena(arena_file, ARENA_FILE, ARENA_SIZE, 0644)) {
|
2023-10-06 03:13:46 +00:00
|
|
|
abort();
|
|
|
|
} else if (!run_suite(arena_file, "arena_file")) {
|
|
|
|
abort();
|
|
|
|
}
|
2023-10-06 06:08:35 +00:00
|
|
|
#endif
|
2023-10-06 03:13:46 +00:00
|
|
|
|
2023-10-06 06:08:35 +00:00
|
|
|
if (-1 == AllocNewArena(arena_mem, ARENA_SIZE)) {
|
2023-10-06 03:13:46 +00:00
|
|
|
abort();
|
|
|
|
} else if (!run_suite(arena_mem, "arena_mem")) {
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
|
|
|
|
std::cout << "OK" << std::endl;
|
|
|
|
return 0;
|
|
|
|
}
|