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 "google/vcdecoder.h" 18311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include <string> 19311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "codetable.h" 20311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "testing.h" 21311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "vcdecoder_test.h" 22311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "vcdiff_defs.h" // VCD_SOURCE 23311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 24311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace open_vcdiff { 25311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace { 26311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 27311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Use the interleaved file header with the standard encoding. Should work. 28311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass VCDiffDecoderInterleavedAllowedButNotUsed 29311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff : public VCDiffStandardDecoderTest { 30311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff public: 31311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffDecoderInterleavedAllowedButNotUsed() { 32311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff UseInterleavedFileHeader(); 33311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 34311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual ~VCDiffDecoderInterleavedAllowedButNotUsed() { } 35311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}; 36311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 37311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffDecoderInterleavedAllowedButNotUsed, Decode) { 38311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 39311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 40311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 41311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 42311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 43732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 44311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 45311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 46311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffDecoderInterleavedAllowedButNotUsed, DecodeWithChecksum) { 47311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ComputeAndAddChecksum(); 48311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 49311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 50311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 51311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 52311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 53311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 54732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 55311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 56311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 57311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VCDiffDecoderInterleavedAllowedButNotUsed 58311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffDecoderInterleavedAllowedButNotUsedByteByByte; 59311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 60311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffDecoderInterleavedAllowedButNotUsedByteByByte, Decode) { 61311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 62311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 63311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 64311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 65311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 66732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 67311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 68311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 69311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffDecoderInterleavedAllowedButNotUsedByteByByte, 70311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff DecodeWithChecksum) { 71311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ComputeAndAddChecksum(); 72311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 73311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 74311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 75311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 76311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 77311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 78732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 79311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 80311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 81311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Use the standard file header with the interleaved encoding. Should fail. 82311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass VCDiffDecoderInterleavedUsedButNotSupported 83311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff : public VCDiffInterleavedDecoderTest { 84311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff public: 85311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffDecoderInterleavedUsedButNotSupported() { 86311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff UseStandardFileHeader(); 87311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 88311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual ~VCDiffDecoderInterleavedUsedButNotSupported() { } 89311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}; 90311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 91311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffDecoderInterleavedUsedButNotSupported, DecodeShouldFail) { 92311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 93311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 94311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 95311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 96311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 97311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 98311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 99311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffDecoderInterleavedUsedButNotSupported, 100311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff DecodeByteByByteShouldFail) { 101311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 102311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 103311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 104311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 105311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 106311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 107311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 108311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 109311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 110311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 111311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 112311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 113311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 114311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Divides up the standard encoding into eight separate delta file windows. 115311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Each delta instruction appears in its own window. 116311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass VCDiffStandardWindowDecoderTest : public VCDiffDecoderTest { 117311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff protected: 11828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff static const size_t kWindow2Size = 61; 11928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 120311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffStandardWindowDecoderTest(); 121311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual ~VCDiffStandardWindowDecoderTest() {} 122311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 123311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff private: 124311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kWindowBody[]; 125311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}; 126311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 12728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffconst size_t VCDiffStandardWindowDecoderTest::kWindow2Size; 12828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 129311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffStandardWindowDecoderTest::kWindowBody[] = { 130311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 1: 131311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_SOURCE, // Win_Indicator: take source from dictionary 132311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kDictionary), // Source segment size 133311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kDictionary), 134311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Source segment position: start of dictionary 135311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x08, // Length of the delta encoding 136311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1C, // Size of the target window (28) 137311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 138311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 139311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // length of instructions section 140311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // length of addresses for COPYs 141311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // No data for ADDs and RUNs 142311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Instructions and sizes (length 2) 143311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x13, // VCD_COPY mode VCD_SELF, size 0 144311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1C, // Size of COPY (28) 145311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Addresses for COPYs (length 1) 146311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Start of dictionary 147311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 2: 148311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Win_Indicator: No source segment (ADD only) 149311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x44, // Length of the delta encoding 15028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff static_cast<char>(kWindow2Size), // Size of the target window (61) 151311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 152311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x3D, // length of data for ADDs and RUNs 153311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // length of instructions section 154311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 155311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 61) 156311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ' ', 'I', ' ', 'h', 'a', 'v', 'e', ' ', 's', 'a', 'i', 'd', ' ', 157311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'i', 't', ' ', 't', 'w', 'i', 'c', 'e', ':', '\n', 158311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'T', 'h', 'a', 't', ' ', 159311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'a', 'l', 'o', 'n', 'e', ' ', 's', 'h', 'o', 'u', 'l', 'd', ' ', 160311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'e', 'n', 'c', 'o', 'u', 'r', 'a', 'g', 'e', ' ', 161311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 't', 'h', 'e', ' ', 'c', 'r', 'e', 'w', '.', '\n', 162311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Instructions and sizes (length 2) 163311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // VCD_ADD size 0 164311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x3D, // Size of ADD (61) 165311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // No addresses for COPYs 166311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 3: 167311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_TARGET, // Win_Indicator: take source from decoded data 168311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x59, // Source segment size: length of data decoded so far 169311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Source segment position: start of decoded data 170311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x08, // Length of the delta encoding 171311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x2C, // Size of the target window 172311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 173311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 174311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // length of instructions section 175311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // length of addresses for COPYs 176311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // No data for ADDs and RUNs 177311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Instructions and sizes (length 2) 178311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x23, // VCD_COPY mode VCD_HERE, size 0 179311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x2C, // Size of COPY (44) 180311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Addresses for COPYs (length 1) 181311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x58, // HERE mode address (27+61 back from here_address) 182311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 4: 183311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_TARGET, // Win_Indicator: take source from decoded data 184311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x05, // Source segment size: only 5 bytes needed for this COPY 185311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x2E, // Source segment position: offset for COPY 186311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x09, // Length of the delta encoding 187311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x07, // Size of the target window 188311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 189311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // length of data for ADDs and RUNs 190311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // length of instructions section 191311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // length of addresses for COPYs 192311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 2) 193311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'h', 'r', 194311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Instructions and sizes (length 1) 195311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0xA7, // VCD_ADD size 2 + VCD_COPY mode SELF size 5 196311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Addresses for COPYs (length 1) 197311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // SELF mode address (start of source segment) 198311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 5: 199311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Win_Indicator: No source segment (ADD only) 200311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x0F, // Length of the delta encoding 201311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x09, // Size of the target window 202311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 203311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x09, // length of data for ADDs and RUNs 204311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // length of instructions section 205311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 206311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 9) 207311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'W', 'h', 'a', 't', ' ', 'I', ' ', 't', 'e', 208311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Instructions and sizes (length 1) 209311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x0A, // VCD_ADD size 9 210311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // No addresses for COPYs 211311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 6: 212311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Win_Indicator: No source segment (RUN only) 213311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x08, // Length of the delta encoding 214311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // Size of the target window 215311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 216311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // length of data for ADDs and RUNs 217311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // length of instructions section 218311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 219311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for RUN (length 1) 220311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'l', 221311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Instructions and sizes (length 2) 222311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // VCD_RUN size 0 223311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // Size of RUN (2) 224311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // No addresses for COPYs 225311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 7: 226311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Win_Indicator: No source segment (ADD only) 227311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x22, // Length of the delta encoding 228311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1B, // Size of the target window 229311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 230311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1B, // length of data for ADDs and RUNs 231311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // length of instructions section 232311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 233311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD: 4th section (length 27) 234311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ' ', 'y', 'o', 'u', ' ', 235311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 't', 'h', 'r', 'e', 'e', ' ', 't', 'i', 'm', 'e', 's', ' ', 'i', 's', ' ', 236311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 't', 'r', 'u', 'e', '.', '\"', '\n', 237311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Instructions and sizes (length 2) 238311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // VCD_ADD size 0 239311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1B, // Size of ADD (27) 240311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // No addresses for COPYs 241311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 242311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 243311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffVCDiffStandardWindowDecoderTest::VCDiffStandardWindowDecoderTest() { 244311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff UseStandardFileHeader(); 245311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_body_.assign(kWindowBody, sizeof(kWindowBody)); 246311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 247311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 248311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardWindowDecoderTest, Decode) { 249311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 250311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 251311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 252311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 253311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 254732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 255311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 256311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 257311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Bug 1287926: If DecodeChunk() stops in the middle of the window header, 258311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// and the expected size of the current target window is smaller than the 259311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// cumulative target bytes decoded so far, an underflow occurs and the decoder 260311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// tries to allocate ~MAX_INT bytes. 261311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardWindowDecoderTest, DecodeBreakInFourthWindowHeader) { 262311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Parse file header + first two windows. 26383bbde0df33922d8dc6fa737cfb306d9caae13b1openvcdiff const size_t chunk_1_size = delta_file_header_.size() + 83; 264311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Parse third window, plus everything up to "Size of the target window" field 265311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // of fourth window, but do not parse complete header of fourth window. 26683bbde0df33922d8dc6fa737cfb306d9caae13b1openvcdiff const size_t chunk_2_size = 12 + 5; 267311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff CHECK_EQ(VCD_TARGET, static_cast<unsigned char>(delta_file_[chunk_1_size])); 268311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff CHECK_EQ(0x00, static_cast<int>(delta_file_[chunk_1_size + chunk_2_size])); 269311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff string output_chunk1, output_chunk2, output_chunk3; 270311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 271311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[0], 272311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff chunk_1_size, 273311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk1)); 274311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[chunk_1_size], 275311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff chunk_2_size, 276311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk2)); 277311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[chunk_1_size + chunk_2_size], 278311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size() 279311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff - (chunk_1_size + chunk_2_size), 280311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk3)); 281311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 282732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), 283732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com output_chunk1 + output_chunk2 + output_chunk3); 284311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 285311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 286baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiffTEST_F(VCDiffStandardWindowDecoderTest, DecodeChunkNoVcdTargetAllowed) { 287baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.SetAllowVcdTarget(false); 288baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff // Parse file header + first two windows. 289baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff const size_t chunk_1_size = delta_file_header_.size() + 83; 290baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff // The third window begins with Win_Indicator = VCD_TARGET which is not 291baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff // allowed. 292baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff CHECK_EQ(VCD_TARGET, static_cast<unsigned char>(delta_file_[chunk_1_size])); 293baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 294baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[0], chunk_1_size, &output_)); 295baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff // Just parsing one more byte (the VCD_TARGET) should result in an error. 296baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_FALSE(decoder_.DecodeChunk(&delta_file_[chunk_1_size], 1, &output_)); 297baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff // The target data for the first two windows should have been output. 298732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.substr(0, 89).c_str(), output_); 299baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff} 300baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff 301311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardWindowDecoderTest, DecodeInTwoParts) { 302311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff const size_t delta_file_size = delta_file_.size(); 303311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 1; i < delta_file_size; i++) { 304311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff string output_chunk1, output_chunk2; 305311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 306311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[0], 307311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff i, 308311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk1)); 309311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 310311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_size - i, 311311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk2)); 312311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 313732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_chunk1 + output_chunk2); 314311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 315311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 316311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 317311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardWindowDecoderTest, DecodeInThreeParts) { 318311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff const size_t delta_file_size = delta_file_.size(); 319311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 1; i < delta_file_size - 1; i++) { 320311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t j = i + 1; j < delta_file_size; j++) { 321311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff string output_chunk1, output_chunk2, output_chunk3; 322311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 323311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[0], 324311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff i, 325311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk1)); 326311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 327311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff j - i, 328311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk2)); 329311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[j], 330311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_size - j, 331311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk3)); 332311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 333732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), 334311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff output_chunk1 + output_chunk2 + output_chunk3); 335311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 336311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 337311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 338311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 33928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff// For the window test, the maximum target window size is much smaller than the 34028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff// target file size. (The largest window is Window 2, with 61 target bytes.) 34128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff// Use the minimum values possible. 34228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardWindowDecoderTest, TargetMatchesWindowSizeLimit) { 34328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetWindowSize(kWindow2Size); 34428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 34528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 34628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff delta_file_.size(), 34728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff &output_)); 34828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 349732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 35028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 35128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 35228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardWindowDecoderTest, TargetMatchesFileSizeLimit) { 35328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetFileSize(expected_target_.size()); 35428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 35528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 35628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff delta_file_.size(), 35728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff &output_)); 35828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 359732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 36028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 36128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 36228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardWindowDecoderTest, TargetExceedsWindowSizeLimit) { 36328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetWindowSize(kWindow2Size - 1); 36428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 36528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 36628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff delta_file_.size(), 36728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff &output_)); 36828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_EQ("", output_); 36928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 37028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 37128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardWindowDecoderTest, TargetExceedsFileSizeLimit) { 37228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetFileSize(expected_target_.size() - 1); 37328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 37428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 37528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff delta_file_.size(), 37628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff &output_)); 37728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_EQ("", output_); 37828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 37928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 380311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VCDiffStandardWindowDecoderTest 381311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffStandardWindowDecoderTestByteByByte; 382baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff 383311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardWindowDecoderTestByteByByte, Decode) { 384311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 385311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 386311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 387311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 388311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 389732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 390311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 391311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 392baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiffTEST_F(VCDiffStandardWindowDecoderTestByteByByte, DecodeExplicitVcdTarget) { 393baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.SetAllowVcdTarget(true); 394baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 395baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 396baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 397baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff } 398baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 399732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 400baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff} 401baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff 402baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff// Windows 3 and 4 use the VCD_TARGET flag, so decoder should signal an error. 403baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiffTEST_F(VCDiffStandardWindowDecoderTestByteByByte, DecodeNoVcdTarget) { 404baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.SetAllowVcdTarget(false); 405baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 406baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff size_t i = 0; 407baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff for (; i < delta_file_.size(); ++i) { 408baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 409baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff break; 410baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff } 411baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff } 412baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff // The failure should occur just at the position of the first VCD_TARGET. 413baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_EQ(delta_file_header_.size() + 83, i); 414baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff // The target data for the first two windows should have been output. 415732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.substr(0, 89).c_str(), output_); 416baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff} 417baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff 418311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Divides up the interleaved encoding into eight separate delta file windows. 419311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass VCDiffInterleavedWindowDecoderTest 420311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff : public VCDiffStandardWindowDecoderTest { 421311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff protected: 422311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffInterleavedWindowDecoderTest(); 423311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual ~VCDiffInterleavedWindowDecoderTest() {} 424311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff private: 425311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kWindowBody[]; 426311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}; 427311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 428311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffInterleavedWindowDecoderTest::kWindowBody[] = { 429311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 1: 430311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_SOURCE, // Win_Indicator: take source from dictionary 431311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kDictionary), // Source segment size 432311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kDictionary), 433311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Source segment position: start of dictionary 434311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x08, // Length of the delta encoding 435311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1C, // Size of the target window (28) 436311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 437311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 438311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x03, // length of instructions section 439311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 440311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x13, // VCD_COPY mode VCD_SELF, size 0 441311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1C, // Size of COPY (28) 442311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Start of dictionary 443311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 2: 444311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Win_Indicator: No source segment (ADD only) 445311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x44, // Length of the delta encoding 446311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x3D, // Size of the target window (61) 447311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 448311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 449311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x3F, // length of instructions section 450311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 451311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // VCD_ADD size 0 452311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x3D, // Size of ADD (61) 453311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ' ', 'I', ' ', 'h', 'a', 'v', 'e', ' ', 's', 'a', 'i', 'd', ' ', 454311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'i', 't', ' ', 't', 'w', 'i', 'c', 'e', ':', '\n', 455311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'T', 'h', 'a', 't', ' ', 456311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'a', 'l', 'o', 'n', 'e', ' ', 's', 'h', 'o', 'u', 'l', 'd', ' ', 457311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'e', 'n', 'c', 'o', 'u', 'r', 'a', 'g', 'e', ' ', 458311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 't', 'h', 'e', ' ', 'c', 'r', 'e', 'w', '.', '\n', 459311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 3: 460311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_TARGET, // Win_Indicator: take source from decoded data 461311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x59, // Source segment size: length of data decoded so far 462311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Source segment position: start of decoded data 463311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x08, // Length of the delta encoding 464311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x2C, // Size of the target window 465311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 466311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 467311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x03, // length of instructions section 468311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 469311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x23, // VCD_COPY mode VCD_HERE, size 0 470311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x2C, // Size of COPY (44) 471311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x58, // HERE mode address (27+61 back from here_address) 472311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 4: 473311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_TARGET, // Win_Indicator: take source from decoded data 474311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x05, // Source segment size: only 5 bytes needed for this COPY 475311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x2E, // Source segment position: offset for COPY 476311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x09, // Length of the delta encoding 477311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x07, // Size of the target window 478311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 479311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 480311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x04, // length of instructions section 481311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 482311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0xA7, // VCD_ADD size 2 + VCD_COPY mode SELF, size 5 483311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'h', 'r', 484311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // SELF mode address (start of source segment) 485311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 5: 486311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Win_Indicator: No source segment (ADD only) 487311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x0F, // Length of the delta encoding 488311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x09, // Size of the target window 489311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 490311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 491311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x0A, // length of instructions section 492311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 493311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x0A, // VCD_ADD size 9 494311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'W', 'h', 'a', 't', ' ', 'I', ' ', 't', 'e', 495311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 6: 496311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Win_Indicator: No source segment (RUN only) 497311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x08, // Length of the delta encoding 498311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // Size of the target window 499311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 500311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 501311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x03, // length of instructions section 502311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 503311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // VCD_RUN size 0 504311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // Size of RUN (2) 505311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'l', 506311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Window 7: 507311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Win_Indicator: No source segment (ADD only) 508311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x22, // Length of the delta encoding 509311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1B, // Size of the target window 510311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 511311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 512311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1D, // length of instructions section 513311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 514311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // VCD_ADD size 0 515311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1B, // Size of ADD (27) 516311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ' ', 'y', 'o', 'u', ' ', 517311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 't', 'h', 'r', 'e', 'e', ' ', 't', 'i', 'm', 'e', 's', ' ', 'i', 's', ' ', 518311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 't', 'r', 'u', 'e', '.', '\"', '\n', 519311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 520311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 521311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffVCDiffInterleavedWindowDecoderTest::VCDiffInterleavedWindowDecoderTest() { 522311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff UseInterleavedFileHeader(); 523311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // delta_window_header_ is left blank. All window headers and bodies are 524311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // lumped together in delta_window_body_. This means that AddChecksum() 525311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // cannot be used to test the checksum feature. 526311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_body_.assign(kWindowBody, sizeof(kWindowBody)); 527311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 528311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 529311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedWindowDecoderTest, Decode) { 530311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 531311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 532311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 533311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 534311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 535732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 536311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 537311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 538311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedWindowDecoderTest, DecodeInTwoParts) { 539311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff const size_t delta_file_size = delta_file_.size(); 540311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 1; i < delta_file_size; i++) { 541311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff string output_chunk1, output_chunk2; 542311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 543311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[0], 544311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff i, 545311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk1)); 546311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 547311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_size - i, 548311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk2)); 549311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 550732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_chunk1 + output_chunk2); 551311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 552311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 553311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 554311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedWindowDecoderTest, DecodeInThreeParts) { 555311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff const size_t delta_file_size = delta_file_.size(); 556311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 1; i < delta_file_size - 1; i++) { 557311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t j = i + 1; j < delta_file_size; j++) { 558311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff string output_chunk1, output_chunk2, output_chunk3; 559311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 560311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[0], 561311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff i, 562311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk1)); 563311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 564311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff j - i, 565311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk2)); 566311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[j], 567311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_size - j, 568311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_chunk3)); 569311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 570732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), 571311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff output_chunk1 + output_chunk2 + output_chunk3); 572311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 573311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 574311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 575311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 576311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VCDiffInterleavedWindowDecoderTest 577311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffInterleavedWindowDecoderTestByteByByte; 578311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 579311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedWindowDecoderTestByteByByte, Decode) { 580311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 581311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 582311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 583311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 584311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 585732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 586311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 587311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 588baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff// Windows 3 and 4 use the VCD_TARGET flag, so decoder should signal an error. 589baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiffTEST_F(VCDiffInterleavedWindowDecoderTestByteByByte, DecodeNoVcdTarget) { 590baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.SetAllowVcdTarget(false); 591baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 592baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff size_t i = 0; 593baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff for (; i < delta_file_.size(); ++i) { 594baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 595baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff break; 596baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff } 597baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff } 598baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff // The failure should occur just at the position of the first VCD_TARGET. 599baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_EQ(delta_file_header_.size() + 83, i); 600baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff // The target data for the first two windows should have been output. 601732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.substr(0, 89).c_str(), output_); 602baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff} 603baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff 604311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// The original version of VCDiffDecoder did not allow the caller to modify the 605311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// contents of output_string between calls to DecodeChunk(). That restriction 606311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// has been removed. Verify that the same result is still produced if the 607311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// output string is cleared after each call to DecodeChunk(). Use the window 608311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// encoding because it refers back to the previously decoded target data, which 609311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// is the feature that would fail if the restriction still applied. 610311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// 611311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedWindowDecoderTest, OutputStringCanBeModified) { 612311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff string temp_output; 613311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 614311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 615311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &temp_output)); 616311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff output_.append(temp_output); 617311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff temp_output.clear(); 618311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 619311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 620732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 621311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 622311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 623311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedWindowDecoderTest, OutputStringIsPreserved) { 624311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff const string previous_data("Previous data"); 625311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff output_ = previous_data; 626311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 627311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 628311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 629311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 630311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 631732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ((previous_data + expected_target_).c_str(), output_); 632311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 633311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 634311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// A decode job that tests the ability to COPY across the boundary between 635311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// source data and target data. 636311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass VCDiffStandardCrossDecoderTest : public VCDiffDecoderTest { 637311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff protected: 638311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kExpectedTarget[]; 639311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kWindowHeader[]; 640311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kWindowBody[]; 641311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 642311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffStandardCrossDecoderTest(); 643311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual ~VCDiffStandardCrossDecoderTest() {} 644311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}; 645311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 646311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffStandardCrossDecoderTest::kWindowHeader[] = { 647311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_SOURCE, // Win_Indicator: take source from dictionary 648311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kDictionary), // Source segment size 649311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kDictionary), 650311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Source segment position: start of dictionary 651311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x15, // Length of the delta encoding 652311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff StringLengthAsByte(kExpectedTarget), // Size of the target window 653311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 654311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x07, // length of data for ADDs and RUNs 655311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x06, // length of instructions section 656311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x03 // length of addresses for COPYs 657311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 658311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 659311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffStandardCrossDecoderTest::kWindowBody[] = { 660311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 7) 661311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'S', 'p', 'i', 'd', 'e', 'r', 's', 662311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Instructions and sizes (length 6) 663311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // VCD_ADD size 0 664311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x07, // Size of ADD (7) 665311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x23, // VCD_COPY mode VCD_HERE, size 0 666311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x19, // Size of COPY (25) 667311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x14, // VCD_COPY mode VCD_SELF, size 4 668311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x25, // VCD_COPY mode VCD_HERE, size 5 669311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Addresses for COPYs (length 3) 670311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x15, // HERE mode address for 1st copy (21 back from here_address) 671311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x06, // SELF mode address for 2nd copy 672311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x14 // HERE mode address for 3rd copy 673311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 674311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 675311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffStandardCrossDecoderTest::kExpectedTarget[] = 676311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff "Spiders in his hair.\n" 677311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff "Spiders in the air.\n"; 678311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 679311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffVCDiffStandardCrossDecoderTest::VCDiffStandardCrossDecoderTest() { 680311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff UseStandardFileHeader(); 681311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_header_.assign(kWindowHeader, sizeof(kWindowHeader)); 682311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_body_.assign(kWindowBody, sizeof(kWindowBody)); 683311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff expected_target_.assign(kExpectedTarget); 684311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 685311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 686311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardCrossDecoderTest, Decode) { 687311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 688311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 689311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 690311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 691311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 692732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 693311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 694311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 695311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VCDiffStandardCrossDecoderTest VCDiffStandardCrossDecoderTestByteByByte; 696311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 697311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardCrossDecoderTestByteByByte, Decode) { 698311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 699311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 700311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 701311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 702311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 703732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 704311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 705311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 706311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// The same decode job that tests the ability to COPY across the boundary 707311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// between source data and target data, but using the interleaved format rather 708311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// than the standard format. 709311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass VCDiffInterleavedCrossDecoderTest 710311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff : public VCDiffStandardCrossDecoderTest { 711311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff protected: 712311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffInterleavedCrossDecoderTest(); 713311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual ~VCDiffInterleavedCrossDecoderTest() {} 714311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 715311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff private: 716311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kWindowHeader[]; 717311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kWindowBody[]; 718311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}; 719311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 720311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffInterleavedCrossDecoderTest::kWindowHeader[] = { 721311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_SOURCE, // Win_Indicator: take source from dictionary 722311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kDictionary), // Source segment size 723311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kDictionary), 724311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Source segment position: start of dictionary 725311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x15, // Length of the delta encoding 726311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff StringLengthAsByte(kExpectedTarget), // Size of the target window 727311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 728311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs 729311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x10, // length of instructions section 730311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs 731311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 732311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 733311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffInterleavedCrossDecoderTest::kWindowBody[] = { 734311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x01, // VCD_ADD size 0 735311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x07, // Size of ADD (7) 736311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 7) 737311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'S', 'p', 'i', 'd', 'e', 'r', 's', 738311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x23, // VCD_COPY mode VCD_HERE, size 0 739311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x19, // Size of COPY (25) 740311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x15, // HERE mode address for 1st copy (21 back from here_address) 741311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x14, // VCD_COPY mode VCD_SELF, size 4 742311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x06, // SELF mode address for 2nd copy 743311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x25, // VCD_COPY mode VCD_HERE, size 5 744311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x14 // HERE mode address for 3rd copy 745311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 746311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 747311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffVCDiffInterleavedCrossDecoderTest::VCDiffInterleavedCrossDecoderTest() { 748311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff UseInterleavedFileHeader(); 749311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_header_.assign(kWindowHeader, sizeof(kWindowHeader)); 750311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_body_.assign(kWindowBody, sizeof(kWindowBody)); 751311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 752311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 753311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedCrossDecoderTest, Decode) { 754311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 755311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 756311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 757311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 758311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 759732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 760311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 761311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 762311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedCrossDecoderTest, DecodeWithChecksum) { 763311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ComputeAndAddChecksum(); 764311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 765311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 766311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 767311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 768311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 769311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 770732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 771311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 772311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 773311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VCDiffInterleavedCrossDecoderTest 774311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffInterleavedCrossDecoderTestByteByByte; 775311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 776311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedCrossDecoderTestByteByByte, Decode) { 777311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 778311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 779311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 780311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 781311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 782732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 783311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 784311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 785311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffInterleavedCrossDecoderTestByteByByte, DecodeWithChecksum) { 786311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ComputeAndAddChecksum(); 787311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 788311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 789311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 790311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 791311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 792311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 793732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 794311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 795311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 796311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Test using a custom code table and custom cache sizes with interleaved 797311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// format. 798311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass VCDiffCustomCodeTableDecoderTest : public VCDiffInterleavedDecoderTest { 799311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff protected: 800311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kFileHeader[]; 801311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kWindowHeader[]; 802311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kWindowBody[]; 803311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char kEncodedCustomCodeTable[]; 804311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 805311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffCustomCodeTableDecoderTest(); 806311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff virtual ~VCDiffCustomCodeTableDecoderTest() {} 807311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}; 808311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 809311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffCustomCodeTableDecoderTest::kFileHeader[] = { 810311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0xD6, // 'V' | 0x80 811311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0xC3, // 'C' | 0x80 812311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0xC4, // 'D' | 0x80 813311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'S', // SDCH version code 814311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02 // Hdr_Indicator: Use custom code table 815311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 816311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 817311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Make a custom code table that includes exactly the instructions we need 818311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// to encode the first test's data without using any explicit length values. 819311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Be careful not to replace any existing opcodes that have size 0, 820311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// to ensure that the custom code table is valid (can express all possible 821311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// values of inst (also known as instruction type) and mode with size 0.) 822311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This encoding uses interleaved format, which is easier to read. 823311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// 824311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Here are the changes to the standard code table: 825311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// ADD size 2 (opcode 3) => RUN size 2 (inst1[3] = VCD_RUN) 826311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// ADD size 16 (opcode 17) => ADD size 27 (size1[17] = 27) 827311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// ADD size 17 (opcode 18) => ADD size 61 (size1[18] = 61) 828311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// COPY mode 0 size 18 (opcode 34) => COPY mode 0 size 28 (size1[34] = 28) 829311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// COPY mode 1 size 18 (opcode 50) => COPY mode 1 size 44 (size1[50] = 44) 830311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// 831311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffCustomCodeTableDecoderTest::kEncodedCustomCodeTable[] = { 832311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0xD6, // 'V' | 0x80 833311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0xC3, // 'C' | 0x80 834311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0xC4, // 'D' | 0x80 835311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'S', // SDCH version code 836311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Hdr_Indicator: no custom code table, no compression 837311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_SOURCE, // Win_Indicator: take source from dictionary 838311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff (sizeof(VCDiffCodeTableData) >> 7) | 0x80, // First byte of table length 839311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff sizeof(VCDiffCodeTableData) & 0x7F, // Second byte of table length 840311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Source segment position: start of default code table 841311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1F, // Length of the delta encoding 842311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff (sizeof(VCDiffCodeTableData) >> 7) | 0x80, // First byte of table length 843311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff sizeof(VCDiffCodeTableData) & 0x7F, // Second byte of table length 844311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 845311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs (unused) 846311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x19, // length of interleaved section 847311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of addresses for COPYs (unused) 848311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x05, // VCD_ADD size 4 849311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 4) 850311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_RUN, VCD_ADD, VCD_ADD, VCD_RUN, 851311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x13, // VCD_COPY mode VCD_SELF size 0 852311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x84, // Size of copy: upper bits (512 - 4 + 17 = 525) 853311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x0D, // Size of copy: lower bits 854311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x04, // Address of COPY 855311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x03, // VCD_ADD size 2 856311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 2) 857311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1B, 0x3D, 858311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x3F, // VCD_COPY mode VCD_NEAR(0) size 15 859311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x84, // Address of copy: upper bits (525 + 2 = 527) 860311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x0F, // Address of copy: lower bits 861311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // VCD_ADD size 1 862311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 1) 863311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x1C, 864311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x4F, // VCD_COPY mode VCD_NEAR(1) size 15 865311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x10, // Address of copy 866311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x02, // VCD_ADD size 1 867311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 1) 868311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x2C, 869311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x53, // VCD_COPY mode VCD_NEAR(2) size 0 870311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x87, // Size of copy: upper bits (256 * 4 - 51 = 973) 871311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x4D, // Size of copy: lower bits 872311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x10 // Address of copy 873311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 874311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 875311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This is similar to VCDiffInterleavedDecoderTest, but uses the custom code 876311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// table to eliminate the need to explicitly encode instruction sizes. 877311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Notice that NEAR(0) mode is used here where NEAR(1) mode was used in 878311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// VCDiffInterleavedDecoderTest. This is because the custom code table 879311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// has the size of the NEAR cache set to 1; only the most recent 880311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// COPY instruction is available. This will also be a test of 881311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// custom cache sizes. 882311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffCustomCodeTableDecoderTest::kWindowHeader[] = { 883311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCD_SOURCE, // Win_Indicator: take source from dictionary 884311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kDictionary), // Source segment size 885311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kDictionary), 886311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Source segment position: start of dictionary 887311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x74, // Length of the delta encoding 888311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kExpectedTarget), // Size of the target window 889311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kExpectedTarget), 890311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Delta_indicator (no compression) 891311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // length of data for ADDs and RUNs (unused) 892311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x6E, // length of interleaved section 893311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00 // length of addresses for COPYs (unused) 894311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 895311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 896311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VCDiffCustomCodeTableDecoderTest::kWindowBody[] = { 897311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x22, // VCD_COPY mode VCD_SELF, size 28 898311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x00, // Address of COPY: Start of dictionary 899311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x12, // VCD_ADD size 61 900311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD (length 61) 901311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ' ', 'I', ' ', 'h', 'a', 'v', 'e', ' ', 's', 'a', 'i', 'd', ' ', 902311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'i', 't', ' ', 't', 'w', 'i', 'c', 'e', ':', '\n', 903311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'T', 'h', 'a', 't', ' ', 904311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'a', 'l', 'o', 'n', 'e', ' ', 's', 'h', 'o', 'u', 'l', 'd', ' ', 905311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'e', 'n', 'c', 'o', 'u', 'r', 'a', 'g', 'e', ' ', 906311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 't', 'h', 'e', ' ', 'c', 'r', 'e', 'w', '.', '\n', 907311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x32, // VCD_COPY mode VCD_HERE, size 44 908311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x58, // HERE mode address (27+61 back from here_address) 909311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0xBF, // VCD_ADD size 2 + VCD_COPY mode NEAR(0), size 5 910311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADDs: 2nd section (length 2) 911311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'h', 'r', 912311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x2D, // NEAR(0) mode address (45 after prior address) 913311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x0A, // VCD_ADD size 9 914311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADDs: 3rd section (length 9) 915311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'W', 'h', 'a', 't', ' ', 916311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'I', ' ', 't', 'e', 917311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x03, // VCD_RUN size 2 918311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for RUN: 4th section (length 1) 919311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 'l', 920311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 0x11, // VCD_ADD size 27 921311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Data for ADD: 4th section (length 27) 922311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ' ', 'y', 'o', 'u', ' ', 923311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 't', 'h', 'r', 'e', 'e', ' ', 't', 'i', 'm', 'e', 's', ' ', 'i', 's', ' ', 924311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 't', 'r', 'u', 'e', '.', '\"', '\n' 925311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff }; 926311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 927311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffVCDiffCustomCodeTableDecoderTest::VCDiffCustomCodeTableDecoderTest() { 928311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.assign(kFileHeader, sizeof(kFileHeader)); 929311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.push_back(0x01); // NEAR cache size (custom) 930311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.push_back(0x06); // SAME cache size (custom) 931311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.append(kEncodedCustomCodeTable, 932311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff sizeof(kEncodedCustomCodeTable)); 933311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_header_.assign(kWindowHeader, sizeof(kWindowHeader)); 934311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_body_.assign(kWindowBody, sizeof(kWindowBody)); 935311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 936311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 937311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffCustomCodeTableDecoderTest, CustomCodeTableEncodingMatches) { 938311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffCodeTableData custom_code_table( 939311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffCodeTableData::kDefaultCodeTableData); 940311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff custom_code_table.inst1[3] = VCD_RUN; 941311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff custom_code_table.size1[17] = 27; 942311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff custom_code_table.size1[18] = 61; 943311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff custom_code_table.size1[34] = 28; 944311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff custom_code_table.size1[50] = 44; 945311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 946311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding( 947311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff reinterpret_cast<const char*>( 948311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &VCDiffCodeTableData::kDefaultCodeTableData), 949311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff sizeof(VCDiffCodeTableData::kDefaultCodeTableData)); 950311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(kEncodedCustomCodeTable, 951311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff sizeof(kEncodedCustomCodeTable), 952311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 953311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 954311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(sizeof(custom_code_table), output_.size()); 955311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff const VCDiffCodeTableData* decoded_table = 956311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff reinterpret_cast<const VCDiffCodeTableData*>(output_.data()); 957311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(VCD_RUN, decoded_table->inst1[0]); 958311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(VCD_RUN, decoded_table->inst1[3]); 959311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(27, decoded_table->size1[17]); 960311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(61, decoded_table->size1[18]); 961311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(28, decoded_table->size1[34]); 962311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(44, decoded_table->size1[50]); 963311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (int i = 0; i < VCDiffCodeTableData::kCodeTableSize; ++i) { 964311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(custom_code_table.inst1[i], decoded_table->inst1[i]); 965311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(custom_code_table.inst2[i], decoded_table->inst2[i]); 966311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(custom_code_table.size1[i], decoded_table->size1[i]); 967311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(custom_code_table.size2[i], decoded_table->size2[i]); 968311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(custom_code_table.mode1[i], decoded_table->mode1[i]); 969311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(custom_code_table.mode2[i], decoded_table->mode2[i]); 970311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 971311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 972311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 973311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffCustomCodeTableDecoderTest, DecodeUsingCustomCodeTable) { 974311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 975311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 976311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 977311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 978311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 979732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 980311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 981311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 982311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffCustomCodeTableDecoderTest, IncompleteCustomCodeTable) { 983311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 984311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_header_.data(), 985311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.size() - 1, 986311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 987311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.FinishDecoding()); 988311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 989311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 990311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 991311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VCDiffCustomCodeTableDecoderTest 992311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff VCDiffCustomCodeTableDecoderTestByteByByte; 993311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 994311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffCustomCodeTableDecoderTestByteByByte, DecodeUsingCustomCodeTable) { 995311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 996311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 997311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 998311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 999311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 1000732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 1001311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1002311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1003311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffCustomCodeTableDecoderTestByteByByte, IncompleteCustomCodeTable) { 1004311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.resize(delta_file_header_.size() - 1); 1005311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1006311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1007311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 1008311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1009311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.FinishDecoding()); 1010311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 1011311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1012311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1013baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiffTEST_F(VCDiffCustomCodeTableDecoderTestByteByByte, CustomTableNoVcdTarget) { 1014baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.SetAllowVcdTarget(false); 1015baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1016baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1017baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 1018baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff } 1019baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 1020732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 1021baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff} 1022baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff 1023311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#ifdef GTEST_HAS_DEATH_TEST 1024311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VCDiffCustomCodeTableDecoderTest VCDiffCustomCodeTableDecoderDeathTest; 1025311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1026311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffCustomCodeTableDecoderDeathTest, BadCustomCacheSizes) { 1027311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.assign(kFileHeader, sizeof(kFileHeader)); 1028311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.push_back(0x81); // NEAR cache size (top bit) 1029311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.push_back(0x10); // NEAR cache size (custom value 0x90) 1030311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.push_back(0x81); // SAME cache size (top bit) 1031311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.push_back(0x10); // SAME cache size (custom value 0x90) 1032311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.append(kEncodedCustomCodeTable, 1033311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff sizeof(kEncodedCustomCodeTable)); 1034311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 1035311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1036311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_DEBUG_DEATH(EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 1037311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 1038311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)), 1039311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff "cache"); 1040311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 1041311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1042baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff 1043baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiffTEST_F(VCDiffCustomCodeTableDecoderDeathTest, BadCustomCacheSizesNoVcdTarget) { 1044baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.SetAllowVcdTarget(false); 1045baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff delta_file_header_.assign(kFileHeader, sizeof(kFileHeader)); 1046baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff delta_file_header_.push_back(0x81); // NEAR cache size (top bit) 1047baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff delta_file_header_.push_back(0x10); // NEAR cache size (custom value 0x90) 1048baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff delta_file_header_.push_back(0x81); // SAME cache size (top bit) 1049baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff delta_file_header_.push_back(0x10); // SAME cache size (custom value 0x90) 1050baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff delta_file_header_.append(kEncodedCustomCodeTable, 1051baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff sizeof(kEncodedCustomCodeTable)); 1052baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff InitializeDeltaFile(); 1053baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1054baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_DEBUG_DEATH(EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 1055baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff delta_file_.size(), 1056baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff &output_)), 1057baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff "cache"); 1058baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_EQ("", output_); 1059baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff} 1060baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff 1061311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#endif // GTEST_HAS_DEATH_TEST 1062311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1063311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} // namespace open_vcdiff 1064311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} // unnamed namespace 1065