1af68c3b8SCheng Wang //===-- Unittests for memcmp ----------------------------------------------===// 2af68c3b8SCheng Wang // 3af68c3b8SCheng Wang // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4af68c3b8SCheng Wang // See https://llvm.org/LICENSE.txt for license information. 5af68c3b8SCheng Wang // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6af68c3b8SCheng Wang // 7af68c3b8SCheng Wang //===----------------------------------------------------------------------===// 8af68c3b8SCheng Wang 93635195eSGuillaume Chatelet #include "memory_utils/memory_check_utils.h" 10*5ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 11af68c3b8SCheng Wang #include "src/string/memcmp.h" 12af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h" 13b3c696fbSGuillaume Chatelet #include "test/UnitTest/TestLogger.h" 14af68c3b8SCheng Wang 15*5ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 163635195eSGuillaume Chatelet 171df0dbfcSMichael Jones TEST(LlvmLibcMemcmpTest, CmpZeroByte) { 18af68c3b8SCheng Wang const char *lhs = "ab"; 192fc19135SCheng Wang const char *rhs = "yz"; 20b6bc9d72SGuillaume Chatelet EXPECT_EQ(LIBC_NAMESPACE::memcmp(lhs, rhs, 0), 0); 21af68c3b8SCheng Wang } 22af68c3b8SCheng Wang 231df0dbfcSMichael Jones TEST(LlvmLibcMemcmpTest, LhsRhsAreTheSame) { 24af68c3b8SCheng Wang const char *lhs = "ab"; 25af68c3b8SCheng Wang const char *rhs = "ab"; 26b6bc9d72SGuillaume Chatelet EXPECT_EQ(LIBC_NAMESPACE::memcmp(lhs, rhs, 2), 0); 27af68c3b8SCheng Wang } 28af68c3b8SCheng Wang 291df0dbfcSMichael Jones TEST(LlvmLibcMemcmpTest, LhsBeforeRhsLexically) { 30af68c3b8SCheng Wang const char *lhs = "ab"; 312fc19135SCheng Wang const char *rhs = "az"; 32b6bc9d72SGuillaume Chatelet EXPECT_LT(LIBC_NAMESPACE::memcmp(lhs, rhs, 2), 0); 33af68c3b8SCheng Wang } 34af68c3b8SCheng Wang 351df0dbfcSMichael Jones TEST(LlvmLibcMemcmpTest, LhsAfterRhsLexically) { 362fc19135SCheng Wang const char *lhs = "az"; 37af68c3b8SCheng Wang const char *rhs = "ab"; 38b6bc9d72SGuillaume Chatelet EXPECT_GT(LIBC_NAMESPACE::memcmp(lhs, rhs, 2), 0); 39af68c3b8SCheng Wang } 40366805eaSAndre Vieira 419ca6e5bbSGuillaume Chatelet TEST(LlvmLibcMemcmpTest, Issue77080) { 429ca6e5bbSGuillaume Chatelet // https://github.com/llvm/llvm-project/issues/77080 439ca6e5bbSGuillaume Chatelet constexpr char lhs[35] = "1.069cd68bbe76eb2143a3284d27ebe220"; 449ca6e5bbSGuillaume Chatelet constexpr char rhs[35] = "1.0500185b5d966a544e2d0fa40701b0f3"; 459ca6e5bbSGuillaume Chatelet ASSERT_GE(LIBC_NAMESPACE::memcmp(lhs, rhs, 34), 1); 469ca6e5bbSGuillaume Chatelet } 479ca6e5bbSGuillaume Chatelet 48298843cdSGuillaume Chatelet // Adapt CheckMemcmp signature to memcmp. 49298843cdSGuillaume Chatelet static inline int Adaptor(cpp::span<char> p1, cpp::span<char> p2, size_t size) { 50b6bc9d72SGuillaume Chatelet return LIBC_NAMESPACE::memcmp(p1.begin(), p2.begin(), size); 513635195eSGuillaume Chatelet } 52366805eaSAndre Vieira 533635195eSGuillaume Chatelet TEST(LlvmLibcMemcmpTest, SizeSweep) { 54298843cdSGuillaume Chatelet static constexpr size_t kMaxSize = 400; 553635195eSGuillaume Chatelet Buffer Buffer1(kMaxSize); 563635195eSGuillaume Chatelet Buffer Buffer2(kMaxSize); 573635195eSGuillaume Chatelet Randomize(Buffer1.span()); 583635195eSGuillaume Chatelet for (size_t size = 0; size < kMaxSize; ++size) { 593635195eSGuillaume Chatelet auto span1 = Buffer1.span().subspan(0, size); 603635195eSGuillaume Chatelet auto span2 = Buffer2.span().subspan(0, size); 61298843cdSGuillaume Chatelet const bool OK = CheckMemcmp<Adaptor>(span1, span2, size); 62b3c696fbSGuillaume Chatelet if (!OK) 63b3c696fbSGuillaume Chatelet testing::tlog << "Failed at size=" << size << '\n'; 64b3c696fbSGuillaume Chatelet ASSERT_TRUE(OK); 65366805eaSAndre Vieira } 66366805eaSAndre Vieira } 673635195eSGuillaume Chatelet 68*5ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 69