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