1*db8a88feSMichael Jones //===-- Unittests for memccpy ---------------------------------------------===// 2*db8a88feSMichael Jones // 3*db8a88feSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*db8a88feSMichael Jones // See https://llvm.org/LICENSE.txt for license information. 5*db8a88feSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*db8a88feSMichael Jones // 7*db8a88feSMichael Jones //===----------------------------------------------------------------------===// 8*db8a88feSMichael Jones 9*db8a88feSMichael Jones #include "src/string/memccpy.h" 10*db8a88feSMichael Jones #include "utils/CPP/ArrayRef.h" 11*db8a88feSMichael Jones #include "utils/UnitTest/Test.h" 12*db8a88feSMichael Jones #include <stddef.h> // For size_t. 13*db8a88feSMichael Jones 14*db8a88feSMichael Jones class LlvmLibcMemccpyTest : public __llvm_libc::testing::Test { 15*db8a88feSMichael Jones public: 16*db8a88feSMichael Jones void check_memccpy(__llvm_libc::cpp::MutableArrayRef<char> dst, 17*db8a88feSMichael Jones const __llvm_libc::cpp::ArrayRef<char> src, int end, 18*db8a88feSMichael Jones size_t count, 19*db8a88feSMichael Jones const __llvm_libc::cpp::ArrayRef<char> expected, 20*db8a88feSMichael Jones size_t expectedCopied, bool shouldReturnNull = false) { 21*db8a88feSMichael Jones // Making sure we don't overflow buffer. 22*db8a88feSMichael Jones ASSERT_GE(dst.size(), count); 23*db8a88feSMichael Jones // Making sure memccpy returns dst. 24*db8a88feSMichael Jones void *result = __llvm_libc::memccpy(dst.data(), src.data(), end, count); 25*db8a88feSMichael Jones 26*db8a88feSMichael Jones if (shouldReturnNull) { 27*db8a88feSMichael Jones ASSERT_EQ(result, static_cast<void *>(nullptr)); 28*db8a88feSMichael Jones } else { 29*db8a88feSMichael Jones ASSERT_EQ(result, static_cast<void *>(dst.data() + expectedCopied)); 30*db8a88feSMichael Jones } 31*db8a88feSMichael Jones 32*db8a88feSMichael Jones // Expected must be of the same size as dst. 33*db8a88feSMichael Jones ASSERT_EQ(dst.size(), expected.size()); 34*db8a88feSMichael Jones // Expected and dst are the same. 35*db8a88feSMichael Jones for (size_t i = 0; i < expected.size(); ++i) 36*db8a88feSMichael Jones ASSERT_EQ(expected[i], dst[i]); 37*db8a88feSMichael Jones } 38*db8a88feSMichael Jones }; 39*db8a88feSMichael Jones 40*db8a88feSMichael Jones TEST_F(LlvmLibcMemccpyTest, UntouchedUnrelatedEnd) { 41*db8a88feSMichael Jones char dst[] = {'a', 'b'}; 42*db8a88feSMichael Jones const char src[] = {'x', '\0'}; 43*db8a88feSMichael Jones const char expected[] = {'a', 'b'}; 44*db8a88feSMichael Jones check_memccpy(dst, src, 'z', 0, expected, 0, true); 45*db8a88feSMichael Jones } 46*db8a88feSMichael Jones 47*db8a88feSMichael Jones TEST_F(LlvmLibcMemccpyTest, UntouchedStartsWithEnd) { 48*db8a88feSMichael Jones char dst[] = {'a', 'b'}; 49*db8a88feSMichael Jones const char src[] = {'x', '\0'}; 50*db8a88feSMichael Jones const char expected[] = {'a', 'b'}; 51*db8a88feSMichael Jones check_memccpy(dst, src, 'x', 0, expected, 0, true); 52*db8a88feSMichael Jones } 53*db8a88feSMichael Jones 54*db8a88feSMichael Jones TEST_F(LlvmLibcMemccpyTest, CopyOneUnrelatedEnd) { 55*db8a88feSMichael Jones char dst[] = {'a', 'b'}; 56*db8a88feSMichael Jones const char src[] = {'x', 'y'}; 57*db8a88feSMichael Jones const char expected[] = {'x', 'b'}; 58*db8a88feSMichael Jones check_memccpy(dst, src, 'z', 1, expected, 1, true); 59*db8a88feSMichael Jones } 60*db8a88feSMichael Jones 61*db8a88feSMichael Jones TEST_F(LlvmLibcMemccpyTest, CopyOneStartsWithEnd) { 62*db8a88feSMichael Jones char dst[] = {'a', 'b'}; 63*db8a88feSMichael Jones const char src[] = {'x', 'y'}; 64*db8a88feSMichael Jones const char expected[] = {'x', 'b'}; 65*db8a88feSMichael Jones check_memccpy(dst, src, 'x', 1, expected, 1); 66*db8a88feSMichael Jones } 67*db8a88feSMichael Jones 68*db8a88feSMichael Jones TEST_F(LlvmLibcMemccpyTest, CopyTwoUnrelatedEnd) { 69*db8a88feSMichael Jones char dst[] = {'a', 'b'}; 70*db8a88feSMichael Jones const char src[] = {'x', 'y'}; 71*db8a88feSMichael Jones const char expected[] = {'x', 'y'}; 72*db8a88feSMichael Jones check_memccpy(dst, src, 'z', 2, expected, 2, true); 73*db8a88feSMichael Jones } 74*db8a88feSMichael Jones 75*db8a88feSMichael Jones TEST_F(LlvmLibcMemccpyTest, CopyTwoStartsWithEnd) { 76*db8a88feSMichael Jones char dst[] = {'a', 'b'}; 77*db8a88feSMichael Jones const char src[] = {'x', 'y'}; 78*db8a88feSMichael Jones const char expected[] = {'x', 'b'}; 79*db8a88feSMichael Jones check_memccpy(dst, src, 'x', 2, expected, 1); 80*db8a88feSMichael Jones } 81