correctly handle invalid utf-8
This commit is contained in:
@@ -20,6 +20,24 @@ static void test_string_cloning(void) {
|
||||
tc_string_free(s);
|
||||
}
|
||||
|
||||
// creating cloned strings with invalid utf-8 does not crash
|
||||
// ..but content is NULL and content_and_len returns the value
|
||||
static void test_string_cloning_invalid_utf8(void) {
|
||||
TCString *s = tc_string_clone("\xf0\x28\x8c\x28");
|
||||
TEST_ASSERT_NOT_NULL(s);
|
||||
|
||||
// NOTE: this is not one of the cases where invalid UTF-8 results in NULL,
|
||||
// but that may change.
|
||||
|
||||
size_t len;
|
||||
const char *buf = tc_string_content_with_len(s, &len);
|
||||
TEST_ASSERT_NOT_NULL(buf);
|
||||
TEST_ASSERT_EQUAL(4, len);
|
||||
TEST_ASSERT_EQUAL_MEMORY("\xf0\x28\x8c\x28", buf, len);
|
||||
|
||||
tc_string_free(s);
|
||||
}
|
||||
|
||||
// borrowed strings echo back their content
|
||||
static void test_string_borrowed_strings_echo(void) {
|
||||
TCString *s = tc_string_borrow("abcdef");
|
||||
@@ -54,7 +72,8 @@ static void test_string_cloned_strings_echo(void) {
|
||||
tc_string_free(s);
|
||||
}
|
||||
|
||||
// tc_string_content returns NULL for strings containing embedded NULs
|
||||
// tc_clone_with_len can have NULs, and tc_string_content returns NULL for
|
||||
// strings containing embedded NULs
|
||||
static void test_string_content_null_for_embedded_nuls(void) {
|
||||
TCString *s = tc_string_clone_with_len("ab\0de", 5);
|
||||
TEST_ASSERT_NOT_NULL(s);
|
||||
@@ -69,13 +88,31 @@ static void test_string_content_null_for_embedded_nuls(void) {
|
||||
tc_string_free(s);
|
||||
}
|
||||
|
||||
// tc_string_clone_with_len will accept invalid utf-8, but then tc_string_content
|
||||
// returns NULL.
|
||||
static void test_string_clone_with_len_invalid_utf8(void) {
|
||||
TCString *s = tc_string_clone_with_len("\xf0\x28\x8c\x28", 4);
|
||||
TEST_ASSERT_NOT_NULL(s);
|
||||
|
||||
TEST_ASSERT_NULL(tc_string_content(s));
|
||||
|
||||
size_t len;
|
||||
const char *buf = tc_string_content_with_len(s, &len);
|
||||
TEST_ASSERT_NOT_NULL(buf);
|
||||
TEST_ASSERT_EQUAL(4, len);
|
||||
TEST_ASSERT_EQUAL_MEMORY("\xf0\x28\x8c\x28", buf, len);
|
||||
tc_string_free(s);
|
||||
}
|
||||
|
||||
int string_tests(void) {
|
||||
UNITY_BEGIN();
|
||||
// each test case above should be named here, in order.
|
||||
RUN_TEST(test_string_creation);
|
||||
RUN_TEST(test_string_cloning);
|
||||
RUN_TEST(test_string_cloning_invalid_utf8);
|
||||
RUN_TEST(test_string_borrowed_strings_echo);
|
||||
RUN_TEST(test_string_cloned_strings_echo);
|
||||
RUN_TEST(test_string_content_null_for_embedded_nuls);
|
||||
RUN_TEST(test_string_clone_with_len_invalid_utf8);
|
||||
return UNITY_END();
|
||||
}
|
||||
|
||||
@@ -52,6 +52,12 @@ static void test_uuid_bad_utf8(void) {
|
||||
TEST_ASSERT_FALSE(tc_uuid_from_str(tc_string_borrow(ustr), &u));
|
||||
}
|
||||
|
||||
// converting a string with embedded NUL fails as expected
|
||||
static void test_uuid_embedded_nul(void) {
|
||||
TCUuid u;
|
||||
TEST_ASSERT_FALSE(tc_uuid_from_str(tc_string_clone_with_len("ab\0de", 5), &u));
|
||||
}
|
||||
|
||||
int uuid_tests(void) {
|
||||
UNITY_BEGIN();
|
||||
// each test case above should be named here, in order.
|
||||
@@ -61,5 +67,6 @@ int uuid_tests(void) {
|
||||
RUN_TEST(test_uuid_to_str);
|
||||
RUN_TEST(test_uuid_invalid_string_fails);
|
||||
RUN_TEST(test_uuid_bad_utf8);
|
||||
RUN_TEST(test_uuid_embedded_nul);
|
||||
return UNITY_END();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user