diff options
author | David Robillard <d@drobilla.net> | 2023-04-09 11:54:11 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2023-04-16 22:17:56 -0400 |
commit | a6cd7dd91d93015ec118286b868c3fd43133f3ac (patch) | |
tree | b10d88ca099c0d0986c2e48ccca62023a0ac1614 /test/test_writer.c | |
parent | 1d8cdcef2cc4aaf2e45cfab01a390d6eab56d525 (diff) | |
download | serd-a6cd7dd91d93015ec118286b868c3fd43133f3ac.tar.gz serd-a6cd7dd91d93015ec118286b868c3fd43133f3ac.tar.bz2 serd-a6cd7dd91d93015ec118286b868c3fd43133f3ac.zip |
Gracefully handle errors when writing text
Diffstat (limited to 'test/test_writer.c')
-rw-r--r-- | test/test_writer.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/test/test_writer.c b/test/test_writer.c index 356dbfcb..d236d7e6 100644 --- a/test/test_writer.c +++ b/test/test_writer.c @@ -84,16 +84,82 @@ test_writer_cleanup(void) // Finish writing without terminating nodes assert(!(st = serd_writer_finish(writer))); + // Set the base to an empty URI + assert(!(st = serd_writer_set_base_uri(writer, NULL))); + // Free (which could leak if the writer doesn't clean up the stack properly) serd_writer_free(writer); serd_env_free(env); } +static void +test_strict_write(void) +{ + const char* const path = "serd_strict_write_test.ttl"; + FILE* const fd = fopen(path, "wb"); + assert(fd); + + SerdEnv* const env = serd_env_new(NULL); + SerdWriter* const writer = serd_writer_new( + SERD_TURTLE, (SerdStyle)SERD_STYLE_STRICT, env, NULL, null_sink, fd); + + assert(writer); + + const uint8_t bad_str[] = {0xFF, 0x90, 'h', 'i', 0}; + + SerdNode s = serd_node_from_string(SERD_URI, USTR("http://example.org/s")); + SerdNode p = serd_node_from_string(SERD_URI, USTR("http://example.org/p")); + + SerdNode bad_lit = serd_node_from_string(SERD_LITERAL, bad_str); + SerdNode bad_uri = serd_node_from_string(SERD_URI, bad_str); + + assert(serd_writer_write_statement( + writer, 0, NULL, &s, &p, &bad_lit, NULL, NULL) == SERD_ERR_BAD_TEXT); + + assert(serd_writer_write_statement( + writer, 0, NULL, &s, &p, &bad_uri, NULL, NULL) == SERD_ERR_BAD_TEXT); + + serd_writer_free(writer); + serd_env_free(env); + fclose(fd); +} + +// Produce a write error without setting errno +static size_t +error_sink(const void* const buf, const size_t len, void* const stream) +{ + (void)buf; + (void)len; + (void)stream; + return 0U; +} + +static void +test_write_error(void) +{ + SerdEnv* const env = serd_env_new(NULL); + SerdWriter* writer = NULL; + SerdStatus st = SERD_SUCCESS; + + SerdNode u = serd_node_from_string(SERD_URI, USTR("http://example.com/u")); + + writer = + serd_writer_new(SERD_TURTLE, (SerdStyle)0, env, NULL, error_sink, NULL); + assert(writer); + st = serd_writer_write_statement(writer, 0U, NULL, &u, &u, &u, NULL, NULL); + assert(st == SERD_ERR_BAD_WRITE); + serd_writer_free(writer); + + serd_env_free(env); +} + int main(void) { test_write_long_literal(); test_writer_cleanup(); + test_strict_write(); + test_write_error(); return 0; } |