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