12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- // Copyright 2018 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "components/variations/variations_murmur_hash.h"
- #include <limits>
- #include <vector>
- #include "build/build_config.h"
- #include "testing/gtest/include/gtest/gtest.h"
- #include "third_party/smhasher/src/MurmurHash3.h"
- namespace variations {
- namespace internal {
- TEST(VariationsMurmurHashTest, StringToLE32) {
- EXPECT_EQ(std::vector<uint32_t>(),
- VariationsMurmurHash::StringToLE32(""));
- EXPECT_EQ(std::vector<uint32_t>({0x00000061}),
- VariationsMurmurHash::StringToLE32("a"));
- EXPECT_EQ(std::vector<uint32_t>({0x00006261}),
- VariationsMurmurHash::StringToLE32("ab"));
- EXPECT_EQ(std::vector<uint32_t>({0x00636261}),
- VariationsMurmurHash::StringToLE32("abc"));
- EXPECT_EQ(std::vector<uint32_t>({0x64636261}),
- VariationsMurmurHash::StringToLE32("abcd"));
- EXPECT_EQ(std::vector<uint32_t>({0x64636261, 0x00000065}),
- VariationsMurmurHash::StringToLE32("abcde"));
- EXPECT_EQ(std::vector<uint32_t>({0x64636261, 0x00006665}),
- VariationsMurmurHash::StringToLE32("abcdef"));
- }
- // The tests inside this #if compare VariationsMurmurHash to the reference
- // implementation, MurmurHash3_x86_32, which only works on little-endian.
- #if defined(ARCH_CPU_LITTLE_ENDIAN)
- // Compare VariationsMurmurHash::Hash to MurmurHash3_x86_32 for every prefix of
- // |data|, from the empty string to all of |data|.
- TEST(VariationsMurmurHashTest, Hash) {
- // Random bytes generated manually and hard-coded for reproducability
- const std::vector<uint32_t> data({
- 2704264845, 2929902289, 1679431515, 1427187834, 1300338468,
- 576307953, 1209988079, 1918627109, 3926412991, 74087765});
- size_t max_size = data.size() * sizeof(uint32_t);
- for (size_t size = 0; size <= max_size; size++) {
- uint32_t expected;
- MurmurHash3_x86_32(data.data(), size, /*seed=*/0, &expected);
- EXPECT_EQ(expected, VariationsMurmurHash::Hash(data, size))
- << "size=" << size;
- }
- }
- TEST(VariationsMurmurHashTest, Hash16) {
- // Pick some likely edge case values.
- constexpr uint32_t max32 = std::numeric_limits<uint32_t>::max();
- uint32_t seeds[] = {
- 0, max32 / 2 - 1, max32 - 2,
- 1, max32 / 2, max32 - 1,
- 2, max32 / 2 + 1, max32};
- constexpr uint16_t max16 = std::numeric_limits<uint16_t>::max();
- uint16_t data[] = {
- 0, max16 / 2 - 1, max16 - 2,
- 1, max16 / 2, max16 - 1,
- 2, max16 / 2 + 1, max16};
- for (uint32_t seed : seeds) {
- for (uint16_t datum : data) {
- uint32_t expected;
- MurmurHash3_x86_32(&datum, sizeof(datum), seed, &expected);
- EXPECT_EQ(expected, VariationsMurmurHash::Hash16(seed, datum))
- << "seed=" << seed << ", datum=" << datum;
- }
- }
- }
- #endif // defined(ARCH_CPU_LITTLE_ENDIAN)
- } // namespace internal
- } // namespace variations
|