text: // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file. See the AUTHORS file for names of contributors.
  
  #include "util/crc32c.h"
  
  #include "base/integral_types.h"
  #include "strings/stringpiece.h"
  #include <gtest/gtest.h>
  
  namespace util {
  namespace crc32c {
  
  class CRC { };
  
  TEST(CRC, StandardResults) {
    // From rfc3720 section B.4.
    uint8 buf[32];
  
    memset(buf, 0, sizeof(buf));
    ASSERT_EQ(0x8a9136aa, Value(buf, sizeof(buf)));
  
    memset(buf, 0xff, sizeof(buf));
    ASSERT_EQ(0x62a8ab43, Value(buf, sizeof(buf)));
  
    for (int i = 0; i < 32; i++) {
      buf[i] = i;
    }
    ASSERT_EQ(0x46dd794e, Value(buf, sizeof(buf)));
  
    for (int i = 0; i < 32; i++) {
      buf[i] = 31 - i;
    }
    ASSERT_EQ(0x113fdb5c, Value(buf, sizeof(buf)));
  
    unsigned char data[48] = {
      0x01, 0xc0, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00,
      0x14, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x04, 0x00,
      0x00, 0x00, 0x00, 0x14,
      0x00, 0x00, 0x00, 0x18,
      0x28, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00,
      0x02, 0x00, 0x00, 0x00,
      0x00, 0x00, 0x00, 0x00,
    };
    ASSERT_EQ(0xd9963a56, Value(reinterpret_cast<uint8*>(data), sizeof(data)));
  }
  
  static uint32_t Value(StringPiece pc) {
    return Value(reinterpret_cast<const uint8*>(pc.data()), pc.size());
  }
  
  TEST(CRC, Values) {
    ASSERT_NE(Value("a"), Value("foo"));
  }
  
  TEST(CRC, Extend) {
    ASSERT_EQ(Value("hello world"),
              Extend(Value("hello "), reinterpret_cast<const uint8*>("world"), 5));
  }
  
  TEST(CRC, Mask) {
    uint32_t crc = Value("foo");
    ASSERT_NE(crc, Mask(crc));
    ASSERT_NE(crc, Mask(Mask(crc)));
    ASSERT_EQ(crc, Unmask(Mask(crc)));
    ASSERT_EQ(crc, Unmask(Unmask(Mask(Mask(crc)))));
  }
  
  }  // namespace crc32c
  }  // namespace util