1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for memmem ----------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker
9*71db0c75SAndroid Build Coastguard Worker #include "src/__support/macros/config.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/string/memmem.h"
11*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
12*71db0c75SAndroid Build Coastguard Worker
13*71db0c75SAndroid Build Coastguard Worker #include "src/string/string_utils.h"
14*71db0c75SAndroid Build Coastguard Worker
15*71db0c75SAndroid Build Coastguard Worker namespace LIBC_NAMESPACE_DECL {
16*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,EmptyHaystackEmptyNeedleReturnsHaystck)17*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, EmptyHaystackEmptyNeedleReturnsHaystck) {
18*71db0c75SAndroid Build Coastguard Worker char *h = nullptr;
19*71db0c75SAndroid Build Coastguard Worker char *n = nullptr;
20*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, 0, n, 0);
21*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<char *>(result), h);
22*71db0c75SAndroid Build Coastguard Worker }
23*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,EmptyHaystackNonEmptyNeedleReturnsNull)24*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, EmptyHaystackNonEmptyNeedleReturnsNull) {
25*71db0c75SAndroid Build Coastguard Worker char *h = nullptr;
26*71db0c75SAndroid Build Coastguard Worker char n[] = {'a', 'b', 'c'};
27*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, 0, n, sizeof(n));
28*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(result, static_cast<void *>(nullptr));
29*71db0c75SAndroid Build Coastguard Worker }
30*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,EmptyNeedleReturnsHaystack)31*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, EmptyNeedleReturnsHaystack) {
32*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'b', 'c'};
33*71db0c75SAndroid Build Coastguard Worker char *n = nullptr;
34*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, 0);
35*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<char *>(result), h + 0);
36*71db0c75SAndroid Build Coastguard Worker }
37*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,ExactMatchReturnsHaystack)38*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, ExactMatchReturnsHaystack) {
39*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'b', 'c'};
40*71db0c75SAndroid Build Coastguard Worker char n[] = {'a', 'b', 'c'};
41*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
42*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<char *>(result), h + 0);
43*71db0c75SAndroid Build Coastguard Worker }
44*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,ReturnFirstMatchOfNeedle)45*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, ReturnFirstMatchOfNeedle) {
46*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'a', 'b', 'c'};
47*71db0c75SAndroid Build Coastguard Worker char n[] = {'a'};
48*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
49*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<char *>(result), h + 0);
50*71db0c75SAndroid Build Coastguard Worker }
51*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,ReturnFirstExactMatchOfNeedle)52*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, ReturnFirstExactMatchOfNeedle) {
53*71db0c75SAndroid Build Coastguard Worker {
54*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'b', 'a', 'c', 'a', 'a'};
55*71db0c75SAndroid Build Coastguard Worker char n[] = {'a', 'a'};
56*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
57*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<char *>(result), h + 4);
58*71db0c75SAndroid Build Coastguard Worker }
59*71db0c75SAndroid Build Coastguard Worker {
60*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'a', 'b', 'a', 'b', 'a'};
61*71db0c75SAndroid Build Coastguard Worker char n[] = {'a', 'b', 'a'};
62*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
63*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<char *>(result), h + 1);
64*71db0c75SAndroid Build Coastguard Worker }
65*71db0c75SAndroid Build Coastguard Worker }
66*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,NullTerminatorDoesNotInterruptMatch)67*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, NullTerminatorDoesNotInterruptMatch) {
68*71db0c75SAndroid Build Coastguard Worker char h[] = {'\0', 'a', 'b'};
69*71db0c75SAndroid Build Coastguard Worker char n[] = {'a', 'b'};
70*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
71*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<char *>(result), h + 1);
72*71db0c75SAndroid Build Coastguard Worker }
73*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,ReturnNullIfNoExactMatch)74*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, ReturnNullIfNoExactMatch) {
75*71db0c75SAndroid Build Coastguard Worker {
76*71db0c75SAndroid Build Coastguard Worker char h[] = {'a'};
77*71db0c75SAndroid Build Coastguard Worker char n[] = {'a', 'a'};
78*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
79*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(result, static_cast<void *>(nullptr));
80*71db0c75SAndroid Build Coastguard Worker }
81*71db0c75SAndroid Build Coastguard Worker {
82*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'A'};
83*71db0c75SAndroid Build Coastguard Worker char n[] = {'a', 'a'};
84*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
85*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(result, static_cast<void *>(nullptr));
86*71db0c75SAndroid Build Coastguard Worker }
87*71db0c75SAndroid Build Coastguard Worker {
88*71db0c75SAndroid Build Coastguard Worker char h[] = {'a'};
89*71db0c75SAndroid Build Coastguard Worker char n[] = {'a', '\0'};
90*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
91*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(result, static_cast<void *>(nullptr));
92*71db0c75SAndroid Build Coastguard Worker }
93*71db0c75SAndroid Build Coastguard Worker {
94*71db0c75SAndroid Build Coastguard Worker char h[] = {'\0'};
95*71db0c75SAndroid Build Coastguard Worker char n[] = {'\0', '\0'};
96*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, sizeof(n));
97*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(result, static_cast<void *>(nullptr));
98*71db0c75SAndroid Build Coastguard Worker }
99*71db0c75SAndroid Build Coastguard Worker }
100*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,ReturnMatchOfSpecifiedNeedleLength)101*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, ReturnMatchOfSpecifiedNeedleLength) {
102*71db0c75SAndroid Build Coastguard Worker {
103*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'b', 'c'};
104*71db0c75SAndroid Build Coastguard Worker char n[] = {'x', 'y', 'z'};
105*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, 0);
106*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<char *>(result), h + 0);
107*71db0c75SAndroid Build Coastguard Worker }
108*71db0c75SAndroid Build Coastguard Worker {
109*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'b', 'c'};
110*71db0c75SAndroid Build Coastguard Worker char n[] = {'b', 'c', 'a'};
111*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, sizeof(h), n, 2);
112*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(static_cast<char *>(result), h + 1);
113*71db0c75SAndroid Build Coastguard Worker }
114*71db0c75SAndroid Build Coastguard Worker }
115*71db0c75SAndroid Build Coastguard Worker
TEST(LlvmLibcMemmemTest,ReturnNullIfInadequateHaystackLength)116*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcMemmemTest, ReturnNullIfInadequateHaystackLength) {
117*71db0c75SAndroid Build Coastguard Worker {
118*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'b', 'c'};
119*71db0c75SAndroid Build Coastguard Worker char n[] = {'c'};
120*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, 2, n, sizeof(n));
121*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(result, static_cast<void *>(nullptr));
122*71db0c75SAndroid Build Coastguard Worker }
123*71db0c75SAndroid Build Coastguard Worker {
124*71db0c75SAndroid Build Coastguard Worker char h[] = {'a', 'b', 'c'};
125*71db0c75SAndroid Build Coastguard Worker char n[] = {'a', 'b', 'c'};
126*71db0c75SAndroid Build Coastguard Worker void *result = LIBC_NAMESPACE::memmem(h, 2, n, sizeof(n));
127*71db0c75SAndroid Build Coastguard Worker ASSERT_EQ(result, static_cast<void *>(nullptr));
128*71db0c75SAndroid Build Coastguard Worker }
129*71db0c75SAndroid Build Coastguard Worker }
130*71db0c75SAndroid Build Coastguard Worker } // namespace LIBC_NAMESPACE_DECL
131