1311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Copyright 2008 Google Inc.
2311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Author: Lincoln Smith
3311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff//
4311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Licensed under the Apache License, Version 2.0 (the "License");
5311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// you may not use this file except in compliance with the License.
6311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// You may obtain a copy of the License at
7311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff//
8311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff//      http://www.apache.org/licenses/LICENSE-2.0
9311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff//
10311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Unless required by applicable law or agreed to in writing, software
11311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// distributed under the License is distributed on an "AS IS" BASIS,
12311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// See the License for the specific language governing permissions and
14311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// limitations under the License.
15311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
16311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include <config.h>
17311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "vcdecoder_test.h"
1828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff#include <string.h>  // strlen
19311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "checksum.h"
20311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "codetable.h"
21311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "testing.h"
22311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "varint_bigendian.h"
23311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "vcdiff_defs.h"
24311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
25311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace open_vcdiff {
26311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
27311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffDecoderTest::kStandardFileHeader[] = {
28311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0xD6,  // 'V' | 0x80
29311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0xC3,  // 'C' | 0x80
30311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0xC4,  // 'D' | 0x80
31311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // Draft standard version number
32311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00   // Hdr_Indicator: no custom code table, no compression
33311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  };
34311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
35311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffDecoderTest::kInterleavedFileHeader[] = {
36311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0xD6,  // 'V' | 0x80
37311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0xC3,  // 'C' | 0x80
38311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0xC4,  // 'D' | 0x80
39311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'S',   // SDCH version code
40311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00   // Hdr_Indicator: no custom code table, no compression
41311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  };
42311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
43311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffDecoderTest::kDictionary[] =
44311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  "\"Just the place for a Snark!\" the Bellman cried,\n"
45311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  "As he landed his crew with care;\n"
46311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  "Supporting each man on the top of the tide\n"
47311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  "By a finger entwined in his hair.\n";
48311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
49311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffDecoderTest::kExpectedTarget[] =
50311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  "\"Just the place for a Snark! I have said it twice:\n"
51311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  "That alone should encourage the crew.\n"
52311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  "Just the place for a Snark! I have said it thrice:\n"
53311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  "What I tell you three times is true.\"\n";
54311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
55311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffVCDiffDecoderTest::VCDiffDecoderTest() : fuzzer_(0), fuzzed_byte_position_(0) {
56311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  dictionary_ = kDictionary;
57311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  expected_target_ = kExpectedTarget;
58311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
59311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
60311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffvoid VCDiffDecoderTest::SetUp() {
61311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  InitializeDeltaFile();
62311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
63311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
64311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffvoid VCDiffDecoderTest::UseStandardFileHeader() {
65311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_file_header_.assign(kStandardFileHeader,
66311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                            sizeof(kStandardFileHeader));
67311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
68311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
69311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffvoid VCDiffDecoderTest::UseInterleavedFileHeader() {
70311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_file_header_.assign(kInterleavedFileHeader,
71311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                            sizeof(kInterleavedFileHeader));
72311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
73311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
74311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffvoid VCDiffDecoderTest::InitializeDeltaFile() {
75311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_file_ = delta_file_header_ + delta_window_header_ + delta_window_body_;
76311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
77311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
78311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffchar VCDiffDecoderTest::GetByteFromStringLength(const char* s,
79311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                                                int which_byte) {
80311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  char varint_buf[VarintBE<int32_t>::kMaxBytes];
81311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  VarintBE<int32_t>::Encode(static_cast<int32_t>(strlen(s)), varint_buf);
82311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  return varint_buf[which_byte];
83311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
84311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
85311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffvoid VCDiffDecoderTest::AddChecksum(VCDChecksum checksum) {
86311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  int32_t checksum_as_int32 = static_cast<int32_t>(checksum);
87311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_window_header_[0] |= VCD_CHECKSUM;
88311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  VarintBE<int32_t>::AppendToString(checksum_as_int32, &delta_window_header_);
89311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  // Adjust delta window size to include checksum.
90311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  // This method wouldn't work if adding to the length caused the VarintBE
91311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  // value to spill over into another byte.  Luckily, this test data happens
92311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  // not to cause such an overflow.
93311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_window_header_[4] += VarintBE<int32_t>::Length(checksum_as_int32);
94311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
95311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
96311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffvoid VCDiffDecoderTest::ComputeAndAddChecksum() {
97311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  AddChecksum(ComputeAdler32(expected_target_.data(),
98311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                             expected_target_.size()));
99311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
100311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
101311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Write the maximum expressible positive 32-bit VarintBE
102311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// (0x7FFFFFFF) at the given offset in the delta window.
103311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffvoid VCDiffDecoderTest::WriteMaxVarintAtOffset(int offset,
104311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                                               int bytes_to_replace) {
105311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static const char kMaxVarint[] = { 0x87, 0xFF, 0xFF, 0xFF, 0x7F };
106311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_file_.replace(delta_file_header_.size() + offset,
107311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                      bytes_to_replace,
108311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                      kMaxVarint,
109311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                      sizeof(kMaxVarint));
110311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
111311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
112311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Write a negative 32-bit VarintBE (0x80000000) at the given offset
113311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// in the delta window.
114311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffvoid VCDiffDecoderTest::WriteNegativeVarintAtOffset(int offset,
115311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                                                    int bytes_to_replace) {
116311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static const char kNegativeVarint[] = { 0x88, 0x80, 0x80, 0x80, 0x00 };
117311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_file_.replace(delta_file_header_.size() + offset,
118311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                      bytes_to_replace,
119311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                      kNegativeVarint,
120311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                      sizeof(kNegativeVarint));
121311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
122311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
123311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Write a VarintBE that has too many continuation bytes
124311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// at the given offset in the delta window.
125311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffvoid VCDiffDecoderTest::WriteInvalidVarintAtOffset(int offset,
126311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                                                   int bytes_to_replace) {
127311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static const char kInvalidVarint[] = { 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F };
128311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_file_.replace(delta_file_header_.size() + offset,
129311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                      bytes_to_replace,
130311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                      kInvalidVarint,
131311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                      sizeof(kInvalidVarint));
132311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
133311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
134311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffbool VCDiffDecoderTest::FuzzOneByteInDeltaFile() {
135311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static const struct Fuzzer {
136311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    char _and;
137311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    char _or;
138311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    char _xor;
139311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  } fuzzers[] = {
140311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    { 0xff, 0x80, 0x00 },
141311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    { 0xff, 0xff, 0x00 },
142311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    { 0xff, 0x00, 0x80 },
143311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    { 0xff, 0x00, 0xff },
144311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    { 0xff, 0x01, 0x00 },
145311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    { 0x7f, 0x00, 0x00 },
146311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  };
147311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
148311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  for (; fuzzer_ < (sizeof(fuzzers) / sizeof(fuzzers[0])); ++fuzzer_) {
149311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    for (; fuzzed_byte_position_ < delta_file_.size();
150311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff         ++fuzzed_byte_position_) {
151311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      char fuzzed_byte = (((delta_file_[fuzzed_byte_position_]
152311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                             & fuzzers[fuzzer_]._and)
153311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                             | fuzzers[fuzzer_]._or)
154311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                             ^ fuzzers[fuzzer_]._xor);
155311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      if (fuzzed_byte != delta_file_[fuzzed_byte_position_]) {
156311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff        delta_file_[fuzzed_byte_position_] = fuzzed_byte;
157311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff        ++fuzzed_byte_position_;
158311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff        return true;
159311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      }
160311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    }
161311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    fuzzed_byte_position_ = 0;
162311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
163311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  return false;
164311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
165311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
166311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffStandardDecoderTest::kWindowHeader[] = {
167311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    VCD_SOURCE,  // Win_Indicator: take source from dictionary
168311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    FirstByteOfStringLength(kDictionary),  // Source segment size
169311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    SecondByteOfStringLength(kDictionary),
170311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // Source segment position: start of dictionary
171311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x79,  // Length of the delta encoding
172311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    FirstByteOfStringLength(kExpectedTarget),  // Size of the target window
173311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    SecondByteOfStringLength(kExpectedTarget),
174311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // Delta_indicator (no compression)
175311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x64,  // length of data for ADDs and RUNs
176311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x0C,  // length of instructions section
177311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x03  // length of addresses for COPYs
178311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  };
179311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
180311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffStandardDecoderTest::kWindowBody[] = {
181311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for ADDs: 1st section (length 61)
182311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    ' ', 'I', ' ', 'h', 'a', 'v', 'e', ' ', 's', 'a', 'i', 'd', ' ',
183311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'i', 't', ' ', 't', 'w', 'i', 'c', 'e', ':', '\n',
184311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'T', 'h', 'a', 't', ' ',
185311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'a', 'l', 'o', 'n', 'e', ' ', 's', 'h', 'o', 'u', 'l', 'd', ' ',
186311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'e', 'n', 'c', 'o', 'u', 'r', 'a', 'g', 'e', ' ',
187311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    't', 'h', 'e', ' ', 'c', 'r', 'e', 'w', '.', '\n',
188311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for ADDs: 2nd section (length 2)
189311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'h', 'r',
190311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for ADDs: 3rd section (length 9)
191311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'W', 'h', 'a', 't', ' ',
192311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'I', ' ', 't', 'e',
193311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for RUN: 4th section (length 1)
194311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'l',
195311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for ADD: 4th section (length 27)
196311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    ' ', 'y', 'o', 'u', ' ',
197311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    't', 'h', 'r', 'e', 'e', ' ', 't', 'i', 'm', 'e', 's', ' ', 'i', 's', ' ',
198311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    't', 'r', 'u', 'e', '.', '\"', '\n',
199311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Instructions and sizes (length 13)
200311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x13,  // VCD_COPY mode VCD_SELF, size 0
201311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x1C,  // Size of COPY (28)
202311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x01,  // VCD_ADD size 0
203311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x3D,  // Size of ADD (61)
204311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x23,  // VCD_COPY mode VCD_HERE, size 0
205311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x2C,  // Size of COPY (44)
206311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0xCB,  // VCD_ADD size 2 + VCD_COPY mode NEAR(1), size 5
207311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x0A,  // VCD_ADD size 9
208311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // VCD_RUN size 0
209311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x02,  // Size of RUN (2)
210311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x01,  // VCD_ADD size 0
211311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x1B,  // Size of ADD (27)
212311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Addresses for COPYs (length 3)
213311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // Start of dictionary
214311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x58,  // HERE mode address for 2nd copy (27+61 back from here_address)
215311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x2D   // NEAR(1) mode address for 2nd copy (45 after prior address)
216311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  };
217311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
218311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffVCDiffStandardDecoderTest::VCDiffStandardDecoderTest() {
219311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  UseStandardFileHeader();
220311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_window_header_.assign(kWindowHeader, sizeof(kWindowHeader));
221311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_window_body_.assign(kWindowBody, sizeof(kWindowBody));
222311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
223311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
224311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffInterleavedDecoderTest::kWindowHeader[] = {
225311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    VCD_SOURCE,  // Win_Indicator: take source from dictionary
226311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    FirstByteOfStringLength(kDictionary),  // Source segment size
227311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    SecondByteOfStringLength(kDictionary),
228311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // Source segment position: start of dictionary
229311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x79,  // Length of the delta encoding
230311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    FirstByteOfStringLength(kExpectedTarget),  // Size of the target window
231311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    SecondByteOfStringLength(kExpectedTarget),
232311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // Delta_indicator (no compression)
233311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // length of data for ADDs and RUNs (unused)
234311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x73,  // length of interleaved section
235311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00  // length of addresses for COPYs (unused)
236311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  };
237311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
238311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffInterleavedDecoderTest::kWindowBody[] = {
239311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x13,  // VCD_COPY mode VCD_SELF, size 0
240311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x1C,  // Size of COPY (28)
241311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // Address of COPY: Start of dictionary
242311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x01,  // VCD_ADD size 0
243311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x3D,  // Size of ADD (61)
244311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for ADD (length 61)
245311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    ' ', 'I', ' ', 'h', 'a', 'v', 'e', ' ', 's', 'a', 'i', 'd', ' ',
246311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'i', 't', ' ', 't', 'w', 'i', 'c', 'e', ':', '\n',
247311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'T', 'h', 'a', 't', ' ',
248311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'a', 'l', 'o', 'n', 'e', ' ', 's', 'h', 'o', 'u', 'l', 'd', ' ',
249311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'e', 'n', 'c', 'o', 'u', 'r', 'a', 'g', 'e', ' ',
250311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    't', 'h', 'e', ' ', 'c', 'r', 'e', 'w', '.', '\n',
251311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x23,  // VCD_COPY mode VCD_HERE, size 0
252311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x2C,  // Size of COPY (44)
253311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x58,  // HERE mode address (27+61 back from here_address)
254311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0xCB,  // VCD_ADD size 2 + VCD_COPY mode NEAR(1), size 5
255311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for ADDs: 2nd section (length 2)
256311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'h', 'r',
257311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x2D,  // NEAR(1) mode address (45 after prior address)
258311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x0A,  // VCD_ADD size 9
259311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for ADDs: 3rd section (length 9)
260311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'W', 'h', 'a', 't', ' ',
261311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'I', ' ', 't', 'e',
262311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x00,  // VCD_RUN size 0
263311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x02,  // Size of RUN (2)
264311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for RUN: 4th section (length 1)
265311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    'l',
266311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x01,  // VCD_ADD size 0
267311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    0x1B,  // Size of ADD (27)
268311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    // Data for ADD: 4th section (length 27)
269311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    ' ', 'y', 'o', 'u', ' ',
270311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    't', 'h', 'r', 'e', 'e', ' ', 't', 'i', 'm', 'e', 's', ' ', 'i', 's', ' ',
271311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    't', 'r', 'u', 'e', '.', '\"', '\n'
272311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  };
273311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
274311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffVCDiffInterleavedDecoderTest::VCDiffInterleavedDecoderTest() {
275311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  UseInterleavedFileHeader();
276311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_window_header_.assign(kWindowHeader, sizeof(kWindowHeader));
277311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  delta_window_body_.assign(kWindowBody, sizeof(kWindowBody));
278311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
279311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
280311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}  // namespace open_vcdiff
281