aboutsummaryrefslogtreecommitdiff
path: root/test/string_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'test/string_test.c')
-rw-r--r--test/string_test.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/test/string_test.c b/test/string_test.c
index 991aa578a26e..c3079b449838 100644
--- a/test/string_test.c
+++ b/test/string_test.c
@@ -217,6 +217,22 @@ static void test_short_indef_string(void **_CBOR_UNUSED(_state)) {
assert_null(string);
}
+static void test_invalid_utf(void **_CBOR_UNUSED(_state)) {
+ /* 0x60 + 1 | 0xC5 (invalid unfinished 2B codepoint) */
+ unsigned char string_data[] = {0x61, 0xC5};
+ string = cbor_load(string_data, 2, &res);
+
+ assert_non_null(string);
+ assert_true(cbor_typeof(string) == CBOR_TYPE_STRING);
+ assert_true(cbor_isa_string(string));
+ assert_size_equal(cbor_string_length(string), 1);
+ assert_size_equal(cbor_string_codepoint_count(string), 0);
+ assert_true(cbor_string_is_definite(string));
+ assert_true(res.read == 2);
+
+ cbor_decref(&string);
+}
+
static void test_inline_creation(void **_CBOR_UNUSED(_state)) {
string = cbor_build_string("Hello!");
assert_memory_equal(cbor_string_handle(string), "Hello!", strlen("Hello!"));
@@ -275,6 +291,53 @@ static void test_add_chunk_reallocation_overflow(void **_CBOR_UNUSED(_state)) {
cbor_decref(&string);
}
+static void test_set_handle(void **_CBOR_UNUSED(_state)) {
+ string = cbor_new_definite_string();
+ char *test_string = "Hello";
+ unsigned char *string_data = malloc(strlen(test_string));
+ memcpy(string_data, test_string, strlen(test_string));
+ assert_ptr_not_equal(string_data, NULL);
+ cbor_string_set_handle(string, string_data, strlen(test_string));
+
+ assert_ptr_equal(cbor_string_handle(string), string_data);
+ assert_size_equal(cbor_string_length(string), 5);
+ assert_size_equal(cbor_string_codepoint_count(string), 5);
+
+ cbor_decref(&string);
+}
+
+static void test_set_handle_multibyte_codepoint(void **_CBOR_UNUSED(_state)) {
+ string = cbor_new_definite_string();
+ // "Štěstíčko" in UTF-8
+ char *test_string = "\xc5\xa0t\xc4\x9bst\xc3\xad\xc4\x8dko";
+ unsigned char *string_data = malloc(strlen(test_string));
+ memcpy(string_data, test_string, strlen(test_string));
+ assert_ptr_not_equal(string_data, NULL);
+ cbor_string_set_handle(string, string_data, strlen(test_string));
+
+ assert_ptr_equal(cbor_string_handle(string), string_data);
+ assert_size_equal(cbor_string_length(string), 13);
+ assert_size_equal(cbor_string_codepoint_count(string), 9);
+
+ cbor_decref(&string);
+}
+
+static void test_set_handle_invalid_utf(void **_CBOR_UNUSED(_state)) {
+ string = cbor_new_definite_string();
+ // Invalid multi-byte character (missing the second byte).
+ char *test_string = "Test: \xc5";
+ unsigned char *string_data = malloc(strlen(test_string));
+ memcpy(string_data, test_string, strlen(test_string));
+ assert_ptr_not_equal(string_data, NULL);
+ cbor_string_set_handle(string, string_data, strlen(test_string));
+
+ assert_ptr_equal(cbor_string_handle(string), string_data);
+ assert_size_equal(cbor_string_length(string), 7);
+ assert_size_equal(cbor_string_codepoint_count(string), 0);
+
+ cbor_decref(&string);
+}
+
int main(void) {
const struct CMUnitTest tests[] = {
cmocka_unit_test(test_empty_string),
@@ -285,10 +348,14 @@ int main(void) {
cmocka_unit_test(test_int32_string),
cmocka_unit_test(test_int64_string),
cmocka_unit_test(test_short_indef_string),
+ cmocka_unit_test(test_invalid_utf),
cmocka_unit_test(test_inline_creation),
cmocka_unit_test(test_string_creation),
cmocka_unit_test(test_string_add_chunk),
cmocka_unit_test(test_add_chunk_reallocation_overflow),
+ cmocka_unit_test(test_set_handle),
+ cmocka_unit_test(test_set_handle_multibyte_codepoint),
+ cmocka_unit_test(test_set_handle_invalid_utf),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}