| // Copyright (c) 2012 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 "base/metrics/bucket_ranges.h" |
| |
| #include "starboard/types.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| namespace { |
| |
| TEST(BucketRangesTest, NormalSetup) { |
| BucketRanges ranges(5); |
| ASSERT_EQ(5u, ranges.size()); |
| ASSERT_EQ(4u, ranges.bucket_count()); |
| |
| for (int i = 0; i < 5; ++i) { |
| EXPECT_EQ(0, ranges.range(i)); |
| } |
| EXPECT_EQ(0u, ranges.checksum()); |
| |
| ranges.set_range(3, 100); |
| EXPECT_EQ(100, ranges.range(3)); |
| } |
| |
| TEST(BucketRangesTest, Equals) { |
| // Compare empty ranges. |
| BucketRanges ranges1(3); |
| BucketRanges ranges2(3); |
| BucketRanges ranges3(5); |
| |
| EXPECT_TRUE(ranges1.Equals(&ranges2)); |
| EXPECT_FALSE(ranges1.Equals(&ranges3)); |
| EXPECT_FALSE(ranges2.Equals(&ranges3)); |
| |
| // Compare full filled ranges. |
| ranges1.set_range(0, 0); |
| ranges1.set_range(1, 1); |
| ranges1.set_range(2, 2); |
| ranges1.set_checksum(100); |
| ranges2.set_range(0, 0); |
| ranges2.set_range(1, 1); |
| ranges2.set_range(2, 2); |
| ranges2.set_checksum(100); |
| |
| EXPECT_TRUE(ranges1.Equals(&ranges2)); |
| |
| // Checksum does not match. |
| ranges1.set_checksum(99); |
| EXPECT_FALSE(ranges1.Equals(&ranges2)); |
| ranges1.set_checksum(100); |
| |
| // Range does not match. |
| ranges1.set_range(1, 3); |
| EXPECT_FALSE(ranges1.Equals(&ranges2)); |
| } |
| |
| TEST(BucketRangesTest, Checksum) { |
| BucketRanges ranges(3); |
| ranges.set_range(0, 0); |
| ranges.set_range(1, 1); |
| ranges.set_range(2, 2); |
| |
| ranges.ResetChecksum(); |
| EXPECT_EQ(289217253u, ranges.checksum()); |
| |
| ranges.set_range(2, 3); |
| EXPECT_FALSE(ranges.HasValidChecksum()); |
| |
| ranges.ResetChecksum(); |
| EXPECT_EQ(2843835776u, ranges.checksum()); |
| EXPECT_TRUE(ranges.HasValidChecksum()); |
| } |
| |
| // Table was generated similarly to sample code for CRC-32 given on: |
| // http://www.w3.org/TR/PNG/#D-CRCAppendix. |
| TEST(BucketRangesTest, Crc32TableTest) { |
| for (int i = 0; i < 256; ++i) { |
| uint32_t checksum = i; |
| for (int j = 0; j < 8; ++j) { |
| const uint32_t kReversedPolynomial = 0xedb88320L; |
| if (checksum & 1) |
| checksum = kReversedPolynomial ^ (checksum >> 1); |
| else |
| checksum >>= 1; |
| } |
| EXPECT_EQ(kCrcTable[i], checksum); |
| } |
| } |
| |
| } // namespace |
| } // namespace base |