summaryrefslogtreecommitdiff
path: root/tests/string_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/string_test.cpp')
-rw-r--r--tests/string_test.cpp67
1 files changed, 59 insertions, 8 deletions
diff --git a/tests/string_test.cpp b/tests/string_test.cpp
index 0ed0598f6..22be85241 100644
--- a/tests/string_test.cpp
+++ b/tests/string_test.cpp
@@ -64,6 +64,11 @@ TEST(STRING_TEST, strerror) {
ASSERT_STREQ("Unknown error 134", strerror(EHWPOISON + 1));
}
+TEST(STRING_TEST, strerror_l) {
+ // bionic just forwards to strerror(3).
+ ASSERT_STREQ("Success", strerror_l(0, LC_GLOBAL_LOCALE));
+}
+
#if defined(__BIONIC__)
static void* ConcurrentStrErrorFn(void*) {
bool equal = (strcmp("Unknown error 2002", strerror(2002)) == 0);
@@ -1538,13 +1543,31 @@ TEST(STRING_TEST, memmem_strstr_empty_needle) {
}
TEST(STRING_TEST, memmem_smoke) {
- const char haystack[] = "big\0daddy\0giant\0haystacks";
- ASSERT_EQ(haystack, memmem(haystack, sizeof(haystack), "", 0));
- ASSERT_EQ(haystack + 3, memmem(haystack, sizeof(haystack), "", 1));
+ const char haystack[] = "big\0daddy/giant\0haystacks!";
+
+ // The current memmem() implementation has special cases for needles of
+ // lengths 0, 1, 2, 3, and 4, plus a long needle case. We test matches at the
+ // beginning, middle, and end of the haystack.
+
+ ASSERT_EQ(haystack + 0, memmem(haystack, sizeof(haystack), "", 0));
+
ASSERT_EQ(haystack + 0, memmem(haystack, sizeof(haystack), "b", 1));
- ASSERT_EQ(haystack + 1, memmem(haystack, sizeof(haystack), "i", 1));
- ASSERT_EQ(haystack + 4, memmem(haystack, sizeof(haystack), "da", 2));
- ASSERT_EQ(haystack + 8, memmem(haystack, sizeof(haystack), "y\0g", 3));
+ ASSERT_EQ(haystack + 0, memmem(haystack, sizeof(haystack), "bi", 2));
+ ASSERT_EQ(haystack + 0, memmem(haystack, sizeof(haystack), "big", 3));
+ ASSERT_EQ(haystack + 0, memmem(haystack, sizeof(haystack), "big\0", 4));
+ ASSERT_EQ(haystack + 0, memmem(haystack, sizeof(haystack), "big\0d", 5));
+
+ ASSERT_EQ(haystack + 2, memmem(haystack, sizeof(haystack), "g", 1));
+ ASSERT_EQ(haystack + 10, memmem(haystack, sizeof(haystack), "gi", 2));
+ ASSERT_EQ(haystack + 10, memmem(haystack, sizeof(haystack), "gia", 3));
+ ASSERT_EQ(haystack + 10, memmem(haystack, sizeof(haystack), "gian", 4));
+ ASSERT_EQ(haystack + 10, memmem(haystack, sizeof(haystack), "giant", 5));
+
+ ASSERT_EQ(haystack + 25, memmem(haystack, sizeof(haystack), "!", 1));
+ ASSERT_EQ(haystack + 24, memmem(haystack, sizeof(haystack), "s!", 2));
+ ASSERT_EQ(haystack + 23, memmem(haystack, sizeof(haystack), "ks!", 3));
+ ASSERT_EQ(haystack + 22, memmem(haystack, sizeof(haystack), "cks!", 4));
+ ASSERT_EQ(haystack + 21, memmem(haystack, sizeof(haystack), "acks!", 5));
}
TEST(STRING_TEST, strstr_smoke) {
@@ -1589,16 +1612,44 @@ TEST(STRING_TEST, strcoll_smoke) {
ASSERT_TRUE(strcoll("aac", "aab") > 0);
}
+TEST(STRING_TEST, strcoll_l_smoke) {
+ // bionic just forwards to strcoll(3).
+ ASSERT_TRUE(strcoll_l("aab", "aac", LC_GLOBAL_LOCALE) < 0);
+ ASSERT_TRUE(strcoll_l("aab", "aab", LC_GLOBAL_LOCALE) == 0);
+ ASSERT_TRUE(strcoll_l("aac", "aab", LC_GLOBAL_LOCALE) > 0);
+}
+
TEST(STRING_TEST, strxfrm_smoke) {
const char* src1 = "aab";
char dst1[16] = {};
- ASSERT_GT(strxfrm(dst1, src1, sizeof(dst1)), 0U);
+ // Dry run.
+ ASSERT_EQ(strxfrm(dst1, src1, 0), 3U);
+ ASSERT_STREQ(dst1, "");
+ // Really do it.
+ ASSERT_EQ(strxfrm(dst1, src1, sizeof(dst1)), 3U);
+
const char* src2 = "aac";
char dst2[16] = {};
- ASSERT_GT(strxfrm(dst2, src2, sizeof(dst2)), 0U);
+ // Dry run.
+ ASSERT_EQ(strxfrm(dst2, src2, 0), 3U);
+ ASSERT_STREQ(dst2, "");
+ // Really do it.
+ ASSERT_EQ(strxfrm(dst2, src2, sizeof(dst2)), 3U);
+
+ // The "transform" of two different strings should cause different outputs.
ASSERT_TRUE(strcmp(dst1, dst2) < 0);
}
+TEST(STRING_TEST, strxfrm_l_smoke) {
+ // bionic just forwards to strxfrm(3), so this is a subset of the
+ // strxfrm test.
+ const char* src1 = "aab";
+ char dst1[16] = {};
+ ASSERT_EQ(strxfrm_l(dst1, src1, 0, LC_GLOBAL_LOCALE), 3U);
+ ASSERT_STREQ(dst1, "");
+ ASSERT_EQ(strxfrm_l(dst1, src1, sizeof(dst1), LC_GLOBAL_LOCALE), 3U);
+}
+
TEST(STRING_TEST, memccpy_smoke) {
char dst[32];