// Copyright 2022 The Abseil Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // https://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "absl/crc/internal/crc_memcpy.h" #include <cstddef> #include <cstdint> #include <cstring> #include <limits> #include <memory> #include <string> #include <utility> #include "gtest/gtest.h" #include "absl/crc/crc32c.h" #include "absl/memory/memory.h" #include "absl/random/distributions.h" #include "absl/random/random.h" #include "absl/strings/str_cat.h" #include "absl/strings/string_view.h" namespace { enum CrcEngine { … }; // Correctness tests: // - Every source/destination byte alignment 0-15, every size 0-511 bytes // - Arbitrarily aligned source, large size template <size_t max_size> class CrcMemcpyTest : public testing::Test { … }; // Small test is slightly larger 4096 bytes to allow coverage of the "large" // copy function. The minimum size to exercise all code paths in that function // would be around 256 consecutive tests (getting every possible tail value // and 0-2 small copy loops after the main block), so testing from 4096-4500 // will cover all of those code paths multiple times. CrcSmallTest; CrcLargeTest; // Parametrize the small test so that it can be done with all configurations. template <typename ParamsT> class EngineParamTestTemplate : public CrcSmallTest, public ::testing::WithParamInterface<ParamsT> { … }; struct TestParams { … }; EngineParamTest; // SmallCorrectness is designed to exercise every possible set of code paths // in the memcpy code, not including the loop. TEST_P(EngineParamTest, SmallCorrectnessCheckSourceAlignment) { … } TEST_P(EngineParamTest, SmallCorrectnessCheckDestAlignment) { … } INSTANTIATE_TEST_SUITE_P(…); } // namespace