10a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// Copyright 2008 Google Inc.
20a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// Author: Lincoln Smith
30a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath//
40a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// Licensed under the Apache License, Version 2.0 (the "License");
50a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// you may not use this file except in compliance with the License.
60a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// You may obtain a copy of the License at
70a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath//
80a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath//      http://www.apache.org/licenses/LICENSE-2.0
90a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath//
100a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// Unless required by applicable law or agreed to in writing, software
110a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// distributed under the License is distributed on an "AS IS" BASIS,
120a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// See the License for the specific language governing permissions and
140a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// limitations under the License.
150a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
160a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath#include <config.h>
170a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath#include "vcdecoder_test.h"
180a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath#include <string.h>  // strlen
190a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath#include "checksum.h"
200a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath#include "codetable.h"
210a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath#include "testing.h"
220a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath#include "varint_bigendian.h"
230a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath#include "vcdiff_defs.h"
240a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
250a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathnamespace open_vcdiff {
260a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
270a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathconst char VCDiffDecoderTest::kStandardFileHeader[] = {
280a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0xD6,  // 'V' | 0x80
290a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0xC3,  // 'C' | 0x80
300a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0xC4,  // 'D' | 0x80
310a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // Draft standard version number
320a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00   // Hdr_Indicator: no custom code table, no compression
330a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  };
340a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
350a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathconst char VCDiffDecoderTest::kInterleavedFileHeader[] = {
360a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0xD6,  // 'V' | 0x80
370a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0xC3,  // 'C' | 0x80
380a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0xC4,  // 'D' | 0x80
390a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'S',   // SDCH version code
400a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00   // Hdr_Indicator: no custom code table, no compression
410a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  };
420a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
430a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathconst char VCDiffDecoderTest::kDictionary[] =
440a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  "\"Just the place for a Snark!\" the Bellman cried,\n"
450a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  "As he landed his crew with care;\n"
460a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  "Supporting each man on the top of the tide\n"
470a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  "By a finger entwined in his hair.\n";
480a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
490a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathconst char VCDiffDecoderTest::kExpectedTarget[] =
500a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  "\"Just the place for a Snark! I have said it twice:\n"
510a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  "That alone should encourage the crew.\n"
520a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  "Just the place for a Snark! I have said it thrice:\n"
530a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  "What I tell you three times is true.\"\n";
540a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
550a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan KamathVCDiffDecoderTest::VCDiffDecoderTest() : fuzzer_(0), fuzzed_byte_position_(0) {
560a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  dictionary_ = kDictionary;
570a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  expected_target_ = kExpectedTarget;
580a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
590a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
600a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathvoid VCDiffDecoderTest::SetUp() {
610a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  InitializeDeltaFile();
620a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
630a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
640a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathvoid VCDiffDecoderTest::UseStandardFileHeader() {
650a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_file_header_.assign(kStandardFileHeader,
660a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                            sizeof(kStandardFileHeader));
670a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
680a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
690a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathvoid VCDiffDecoderTest::UseInterleavedFileHeader() {
700a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_file_header_.assign(kInterleavedFileHeader,
710a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                            sizeof(kInterleavedFileHeader));
720a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
730a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
740a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathvoid VCDiffDecoderTest::InitializeDeltaFile() {
750a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_file_ = delta_file_header_ + delta_window_header_ + delta_window_body_;
760a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
770a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
780a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathchar VCDiffDecoderTest::GetByteFromStringLength(const char* s,
790a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                                                int which_byte) {
800a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  char varint_buf[VarintBE<int32_t>::kMaxBytes];
810a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  VarintBE<int32_t>::Encode(static_cast<int32_t>(strlen(s)), varint_buf);
820a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  return varint_buf[which_byte];
830a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
840a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
850a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathvoid VCDiffDecoderTest::AddChecksum(VCDChecksum checksum) {
860a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  int32_t checksum_as_int32 = static_cast<int32_t>(checksum);
870a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_window_header_[0] |= VCD_CHECKSUM;
880a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  VarintBE<int32_t>::AppendToString(checksum_as_int32, &delta_window_header_);
890a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  // Adjust delta window size to include checksum.
900a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  // This method wouldn't work if adding to the length caused the VarintBE
910a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  // value to spill over into another byte.  Luckily, this test data happens
920a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  // not to cause such an overflow.
930a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_window_header_[4] += VarintBE<int32_t>::Length(checksum_as_int32);
940a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
950a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
960a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathvoid VCDiffDecoderTest::ComputeAndAddChecksum() {
970a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  AddChecksum(ComputeAdler32(expected_target_.data(),
980a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                             expected_target_.size()));
990a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
1000a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
1010a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// Write the maximum expressible positive 32-bit VarintBE
1020a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// (0x7FFFFFFF) at the given offset in the delta window.
1030a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathvoid VCDiffDecoderTest::WriteMaxVarintAtOffset(int offset,
1040a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                                               int bytes_to_replace) {
1050a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  static const char kMaxVarint[] = { 0x87, 0xFF, 0xFF, 0xFF, 0x7F };
1060a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_file_.replace(delta_file_header_.size() + offset,
1070a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                      bytes_to_replace,
1080a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                      kMaxVarint,
1090a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                      sizeof(kMaxVarint));
1100a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
1110a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
1120a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// Write a negative 32-bit VarintBE (0x80000000) at the given offset
1130a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// in the delta window.
1140a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathvoid VCDiffDecoderTest::WriteNegativeVarintAtOffset(int offset,
1150a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                                                    int bytes_to_replace) {
1160a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  static const char kNegativeVarint[] = { 0x88, 0x80, 0x80, 0x80, 0x00 };
1170a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_file_.replace(delta_file_header_.size() + offset,
1180a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                      bytes_to_replace,
1190a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                      kNegativeVarint,
1200a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                      sizeof(kNegativeVarint));
1210a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
1220a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
1230a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// Write a VarintBE that has too many continuation bytes
1240a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath// at the given offset in the delta window.
1250a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathvoid VCDiffDecoderTest::WriteInvalidVarintAtOffset(int offset,
1260a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                                                   int bytes_to_replace) {
1270a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  static const char kInvalidVarint[] = { 0x87, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F };
1280a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_file_.replace(delta_file_header_.size() + offset,
1290a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                      bytes_to_replace,
1300a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                      kInvalidVarint,
1310a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                      sizeof(kInvalidVarint));
1320a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
1330a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
1340a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathbool VCDiffDecoderTest::FuzzOneByteInDeltaFile() {
1350a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  static const struct Fuzzer {
1360a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    char _and;
1370a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    char _or;
1380a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    char _xor;
1390a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  } fuzzers[] = {
1400a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    { 0xff, 0x80, 0x00 },
1410a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    { 0xff, 0xff, 0x00 },
1420a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    { 0xff, 0x00, 0x80 },
1430a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    { 0xff, 0x00, 0xff },
1440a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    { 0xff, 0x01, 0x00 },
1450a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    { 0x7f, 0x00, 0x00 },
1460a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  };
1470a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
1480a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  for (; fuzzer_ < (sizeof(fuzzers) / sizeof(fuzzers[0])); ++fuzzer_) {
1490a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    for (; fuzzed_byte_position_ < delta_file_.size();
1500a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath         ++fuzzed_byte_position_) {
1510a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath      char fuzzed_byte = (((delta_file_[fuzzed_byte_position_]
1520a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                             & fuzzers[fuzzer_]._and)
1530a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                             | fuzzers[fuzzer_]._or)
1540a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath                             ^ fuzzers[fuzzer_]._xor);
1550a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath      if (fuzzed_byte != delta_file_[fuzzed_byte_position_]) {
1560a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath        delta_file_[fuzzed_byte_position_] = fuzzed_byte;
1570a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath        ++fuzzed_byte_position_;
1580a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath        return true;
1590a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath      }
1600a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    }
1610a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    fuzzed_byte_position_ = 0;
1620a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  }
1630a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  return false;
1640a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
1650a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
1660a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathconst char VCDiffStandardDecoderTest::kWindowHeader[] = {
1670a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    VCD_SOURCE,  // Win_Indicator: take source from dictionary
1680a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    FirstByteOfStringLength(kDictionary),  // Source segment size
1690a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    SecondByteOfStringLength(kDictionary),
1700a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // Source segment position: start of dictionary
1710a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x79,  // Length of the delta encoding
1720a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    FirstByteOfStringLength(kExpectedTarget),  // Size of the target window
1730a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    SecondByteOfStringLength(kExpectedTarget),
1740a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // Delta_indicator (no compression)
1750a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x64,  // length of data for ADDs and RUNs
1760a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x0C,  // length of instructions section
1770a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x03  // length of addresses for COPYs
1780a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  };
1790a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
1800a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathconst char VCDiffStandardDecoderTest::kWindowBody[] = {
1810a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for ADDs: 1st section (length 61)
1820a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    ' ', 'I', ' ', 'h', 'a', 'v', 'e', ' ', 's', 'a', 'i', 'd', ' ',
1830a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'i', 't', ' ', 't', 'w', 'i', 'c', 'e', ':', '\n',
1840a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'T', 'h', 'a', 't', ' ',
1850a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'a', 'l', 'o', 'n', 'e', ' ', 's', 'h', 'o', 'u', 'l', 'd', ' ',
1860a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'e', 'n', 'c', 'o', 'u', 'r', 'a', 'g', 'e', ' ',
1870a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    't', 'h', 'e', ' ', 'c', 'r', 'e', 'w', '.', '\n',
1880a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for ADDs: 2nd section (length 2)
1890a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'h', 'r',
1900a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for ADDs: 3rd section (length 9)
1910a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'W', 'h', 'a', 't', ' ',
1920a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'I', ' ', 't', 'e',
1930a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for RUN: 4th section (length 1)
1940a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'l',
1950a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for ADD: 4th section (length 27)
1960a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    ' ', 'y', 'o', 'u', ' ',
1970a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    't', 'h', 'r', 'e', 'e', ' ', 't', 'i', 'm', 'e', 's', ' ', 'i', 's', ' ',
1980a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    't', 'r', 'u', 'e', '.', '\"', '\n',
1990a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Instructions and sizes (length 13)
2000a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x13,  // VCD_COPY mode VCD_SELF, size 0
2010a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x1C,  // Size of COPY (28)
2020a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x01,  // VCD_ADD size 0
2030a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x3D,  // Size of ADD (61)
2040a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x23,  // VCD_COPY mode VCD_HERE, size 0
2050a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x2C,  // Size of COPY (44)
2060a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0xCB,  // VCD_ADD size 2 + VCD_COPY mode NEAR(1), size 5
2070a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x0A,  // VCD_ADD size 9
2080a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // VCD_RUN size 0
2090a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x02,  // Size of RUN (2)
2100a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x01,  // VCD_ADD size 0
2110a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x1B,  // Size of ADD (27)
2120a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Addresses for COPYs (length 3)
2130a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // Start of dictionary
2140a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x58,  // HERE mode address for 2nd copy (27+61 back from here_address)
2150a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x2D   // NEAR(1) mode address for 2nd copy (45 after prior address)
2160a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  };
2170a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
2180a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan KamathVCDiffStandardDecoderTest::VCDiffStandardDecoderTest() {
2190a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  UseStandardFileHeader();
2200a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_window_header_.assign(kWindowHeader, sizeof(kWindowHeader));
2210a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_window_body_.assign(kWindowBody, sizeof(kWindowBody));
2220a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
2230a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
2240a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathconst char VCDiffInterleavedDecoderTest::kWindowHeader[] = {
2250a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    VCD_SOURCE,  // Win_Indicator: take source from dictionary
2260a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    FirstByteOfStringLength(kDictionary),  // Source segment size
2270a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    SecondByteOfStringLength(kDictionary),
2280a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // Source segment position: start of dictionary
2290a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x79,  // Length of the delta encoding
2300a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    FirstByteOfStringLength(kExpectedTarget),  // Size of the target window
2310a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    SecondByteOfStringLength(kExpectedTarget),
2320a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // Delta_indicator (no compression)
2330a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // length of data for ADDs and RUNs (unused)
2340a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x73,  // length of interleaved section
2350a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00  // length of addresses for COPYs (unused)
2360a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  };
2370a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
2380a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamathconst char VCDiffInterleavedDecoderTest::kWindowBody[] = {
2390a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x13,  // VCD_COPY mode VCD_SELF, size 0
2400a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x1C,  // Size of COPY (28)
2410a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // Address of COPY: Start of dictionary
2420a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x01,  // VCD_ADD size 0
2430a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x3D,  // Size of ADD (61)
2440a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for ADD (length 61)
2450a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    ' ', 'I', ' ', 'h', 'a', 'v', 'e', ' ', 's', 'a', 'i', 'd', ' ',
2460a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'i', 't', ' ', 't', 'w', 'i', 'c', 'e', ':', '\n',
2470a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'T', 'h', 'a', 't', ' ',
2480a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'a', 'l', 'o', 'n', 'e', ' ', 's', 'h', 'o', 'u', 'l', 'd', ' ',
2490a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'e', 'n', 'c', 'o', 'u', 'r', 'a', 'g', 'e', ' ',
2500a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    't', 'h', 'e', ' ', 'c', 'r', 'e', 'w', '.', '\n',
2510a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x23,  // VCD_COPY mode VCD_HERE, size 0
2520a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x2C,  // Size of COPY (44)
2530a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x58,  // HERE mode address (27+61 back from here_address)
2540a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0xCB,  // VCD_ADD size 2 + VCD_COPY mode NEAR(1), size 5
2550a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for ADDs: 2nd section (length 2)
2560a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'h', 'r',
2570a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x2D,  // NEAR(1) mode address (45 after prior address)
2580a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x0A,  // VCD_ADD size 9
2590a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for ADDs: 3rd section (length 9)
2600a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'W', 'h', 'a', 't', ' ',
2610a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'I', ' ', 't', 'e',
2620a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x00,  // VCD_RUN size 0
2630a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x02,  // Size of RUN (2)
2640a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for RUN: 4th section (length 1)
2650a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    'l',
2660a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x01,  // VCD_ADD size 0
2670a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    0x1B,  // Size of ADD (27)
2680a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    // Data for ADD: 4th section (length 27)
2690a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    ' ', 'y', 'o', 'u', ' ',
2700a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    't', 'h', 'r', 'e', 'e', ' ', 't', 'i', 'm', 'e', 's', ' ', 'i', 's', ' ',
2710a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath    't', 'r', 'u', 'e', '.', '\"', '\n'
2720a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  };
2730a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
2740a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan KamathVCDiffInterleavedDecoderTest::VCDiffInterleavedDecoderTest() {
2750a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  UseInterleavedFileHeader();
2760a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_window_header_.assign(kWindowHeader, sizeof(kWindowHeader));
2770a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath  delta_window_body_.assign(kWindowBody, sizeof(kWindowBody));
2780a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}
2790a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath
2800a58c5c2f73e5047b36f12b5f12b12d6f2a9f69dNarayan Kamath}  // namespace open_vcdiff
281