aboutsummaryrefslogtreecommitdiffstats
path: root/test/test_nodes.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_nodes.c')
-rw-r--r--test/test_nodes.c131
1 files changed, 109 insertions, 22 deletions
diff --git a/test/test_nodes.c b/test/test_nodes.c
index c841acc4..2cdfbc3c 100644
--- a/test/test_nodes.c
+++ b/test/test_nodes.c
@@ -16,6 +16,7 @@
#undef NDEBUG
+#include "failing_allocator.h"
#include "serd/serd.h"
#include <assert.h>
@@ -26,10 +27,64 @@
#define NS_XSD "http://www.w3.org/2001/XMLSchema#"
static void
+test_new_failed_alloc(void)
+{
+ SerdFailingAllocator allocator = serd_failing_allocator();
+
+ // Successfully allocate a node set to count the number of allocations
+ SerdNodes* nodes = serd_nodes_new(&allocator.base);
+ assert(nodes);
+
+ // Test that each allocation failing is handled gracefully
+ const size_t n_new_allocs = allocator.n_allocations;
+ for (size_t i = 0; i < n_new_allocs; ++i) {
+ allocator.n_remaining = i;
+ assert(!serd_nodes_new(&allocator.base));
+ }
+
+ serd_nodes_free(nodes);
+}
+
+static void
+test_intern_failed_alloc(void)
+{
+ SerdFailingAllocator allocator = serd_failing_allocator();
+
+ SerdNode* const node = serd_new_string(&allocator.base, SERD_STRING("node"));
+
+ // Successfully intern a node to count the number of allocations
+ SerdNodes* nodes = serd_nodes_new(&allocator.base);
+ const SerdNode* interned1 = serd_nodes_intern(nodes, node);
+ assert(serd_node_equals(node, interned1));
+ assert(serd_nodes_size(nodes) == 1u);
+
+ const size_t n_new_allocs = allocator.n_allocations;
+ serd_nodes_free(nodes);
+
+ // Test that each allocation failing is handled gracefully
+ for (size_t i = 0; i < n_new_allocs; ++i) {
+ allocator.n_remaining = i;
+
+ if ((nodes = serd_nodes_new(&allocator.base))) {
+ const SerdNode* interned2 = serd_nodes_intern(nodes, node);
+ if (interned2) {
+ assert(serd_node_equals(node, interned2));
+ assert(serd_nodes_size(nodes) == 1u);
+ }
+ serd_nodes_free(nodes);
+ }
+ }
+
+ serd_node_free(&allocator.base, node);
+}
+
+static void
test_intern(void)
{
- SerdNodes* nodes = serd_nodes_new();
- SerdNode* node = serd_new_string(SERD_STRING("node"));
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* nodes = serd_nodes_new(allocator);
+ SerdNode* node = serd_new_string(NULL, SERD_STRING("node"));
assert(serd_nodes_size(nodes) == 0u);
assert(!serd_nodes_intern(nodes, NULL));
@@ -43,7 +98,7 @@ test_intern(void)
assert(interned1 == interned2);
assert(serd_nodes_size(nodes) == 1u);
- serd_node_free(node);
+ serd_node_free(NULL, node);
serd_nodes_free(nodes);
}
@@ -52,7 +107,9 @@ test_string(void)
{
static const SerdStringView string = SERD_STRING("string");
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const node = serd_nodes_string(nodes, string);
assert(node);
@@ -68,7 +125,9 @@ test_string(void)
static void
test_invalid_literal(void)
{
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
assert(!serd_nodes_literal(nodes,
SERD_STRING("double meta"),
@@ -94,7 +153,9 @@ test_plain_literal(void)
static const SerdStringView string = SERD_STRING("string");
static const SerdStringView language = SERD_STRING("en");
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const node =
serd_nodes_literal(nodes, string, SERD_HAS_LANGUAGE, language);
@@ -137,7 +198,9 @@ test_typed_literal(void)
static const SerdStringView string = SERD_STRING("string");
static const SerdStringView datatype = SERD_STRING("http://example.org/Type");
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const node =
serd_nodes_literal(nodes, string, SERD_HAS_DATATYPE, datatype);
@@ -165,7 +228,9 @@ test_typed_literal(void)
static void
test_boolean(void)
{
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const false1 = serd_nodes_boolean(nodes, false);
const SerdNode* const false2 = serd_nodes_boolean(nodes, false);
@@ -195,7 +260,9 @@ test_boolean(void)
static void
test_decimal(void)
{
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const a = serd_nodes_decimal(nodes, -12.3456789);
const SerdNode* const b = serd_nodes_decimal(nodes, -12.3456789);
@@ -214,7 +281,9 @@ test_decimal(void)
static void
test_double(void)
{
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const a = serd_nodes_double(nodes, -1.2E3);
const SerdNode* const b = serd_nodes_double(nodes, -1.2E3);
@@ -230,7 +299,9 @@ test_double(void)
static void
test_float(void)
{
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const a = serd_nodes_float(nodes, -1.2E3f);
const SerdNode* const b = serd_nodes_float(nodes, -1.2E3f);
@@ -246,7 +317,9 @@ test_float(void)
static void
test_integer(void)
{
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const a =
serd_nodes_integer(nodes, -1234567890, SERD_EMPTY_STRING());
@@ -271,7 +344,9 @@ test_base64(void)
{
static const char data[] = {'f', 'o', 'o', 'b', 'a', 'r'};
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const a =
serd_nodes_base64(nodes, &data, sizeof(data), SERD_EMPTY_STRING());
@@ -308,7 +383,9 @@ test_uri(void)
{
static const SerdStringView string = SERD_STRING("http://example.org/");
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const node = serd_nodes_uri(nodes, string);
assert(node);
@@ -326,7 +403,9 @@ test_parsed_uri(void)
{
static const SerdStringView string = SERD_STRING("http://example.org/");
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdURIView uri = serd_parse_uri(string.buf);
const SerdNode* const node = serd_nodes_parsed_uri(nodes, uri);
@@ -354,7 +433,9 @@ test_blank(void)
{
static const SerdStringView string = SERD_STRING("b42");
- SerdNodes* const nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* const nodes = serd_nodes_new(allocator);
const SerdNode* const node = serd_nodes_blank(nodes, string);
assert(node);
@@ -370,7 +451,9 @@ test_blank(void)
static void
test_deref(void)
{
- SerdNodes* nodes = serd_nodes_new();
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* nodes = serd_nodes_new(allocator);
const SerdNode* original = serd_nodes_string(nodes, SERD_STRING("node"));
const SerdNode* another = serd_nodes_string(nodes, SERD_STRING("node"));
@@ -397,9 +480,9 @@ test_deref(void)
assert(!strcmp(serd_node_string(imposter), "node"));
// Check that dereferencing some random unknown node doesn't crash
- SerdNode* unmanaged = serd_new_string(SERD_STRING("unmanaged"));
+ SerdNode* unmanaged = serd_new_string(NULL, SERD_STRING("unmanaged"));
serd_nodes_deref(nodes, unmanaged);
- serd_node_free(unmanaged);
+ serd_node_free(NULL, unmanaged);
serd_nodes_deref(nodes, NULL);
serd_nodes_deref(nodes, imposter);
@@ -410,8 +493,10 @@ test_deref(void)
static void
test_get(void)
{
- SerdNodes* nodes = serd_nodes_new();
- SerdNode* node = serd_new_string(SERD_STRING("node"));
+ SerdAllocator* const allocator = serd_default_allocator();
+
+ SerdNodes* nodes = serd_nodes_new(allocator);
+ SerdNode* node = serd_new_string(NULL, SERD_STRING("node"));
assert(!serd_nodes_get(nodes, NULL));
assert(!serd_nodes_get(nodes, node));
@@ -420,13 +505,15 @@ test_get(void)
assert(serd_node_equals(node, interned1));
assert(serd_nodes_get(nodes, node) == interned1);
- serd_node_free(node);
+ serd_node_free(NULL, node);
serd_nodes_free(nodes);
}
int
main(void)
{
+ test_new_failed_alloc();
+ test_intern_failed_alloc();
test_intern();
test_string();
test_invalid_literal();