summaryrefslogtreecommitdiffstats
path: root/rlz/lib/crc8_unittest.cc
blob: 48892429d9d1471cf6e7c3c44ee7d1e28bef144a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// 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.
//
// Uniitest for data encryption functions.

#include "base/logging.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

#include "rlz/lib/crc8.h"

TEST(Crc8Unittest, TestCrc8) {
  struct Data {
    char string[10];
    // Externally calculated checksums use
    // http://www.zorc.breitbandkatze.de/crc.html
    // with the ATM HEC paramters:
    // CRC-8, Polynomial 0x07, Initial value 0x00, Final XOR value 0x55
    // (direct, don't reverse data byes, don't reverse CRC before final XOR)
    unsigned char external_crc;
    int random_byte;
    unsigned char corrupt_value;
  } data[] = {
    {"Google",    0x01, 2, 0x53},
    {"GOOGLE",    0xA6, 4, 0x11},
    {"My CRC 8!", 0xDC, 0, 0x50},
  };

  unsigned char* bytes;
  unsigned char crc;
  bool matches;
  int length;
  for (size_t i = 0; i < sizeof(data) / sizeof(data[0]); ++i) {
    bytes = reinterpret_cast<unsigned char*>(data[i].string);
    crc = 0;
    matches = false;
    length = strlen(data[i].string);

    // Calculate CRC and compare against external value.
    rlz_lib::Crc8::Generate(bytes, length, &crc);
    EXPECT_TRUE(crc == data[i].external_crc);
    rlz_lib::Crc8::Verify(bytes, length, crc, &matches);
    EXPECT_TRUE(matches);

    // Corrupt string and see if CRC still matches.
    data[i].string[data[i].random_byte] = data[i].corrupt_value;
    rlz_lib::Crc8::Verify(bytes, length, crc, &matches);
    EXPECT_FALSE(matches);
  }
}