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 "testing.h" 20311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "vcdecoder_test.h" 21311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "vcdiff_defs.h" 22311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 23311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace open_vcdiff { 24311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 25311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, DecodeHeaderOnly) { 26311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 27311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_header_.data(), 28311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.size(), 29311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 30311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 31311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 32311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 33311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 34311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, Decode) { 35311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 36311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 37311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 38311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 39311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 40732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 41311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 42311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 43311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// If we add a checksum to a standard-format delta file (without using format 44311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// extensions), it will be interpreted as random bytes inserted into the middle 45311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// of the file. The decode operation should fail, but where exactly it fails is 46311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// not easy to predict. 47311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, StandardFormatDoesNotSupportChecksum) { 48311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ComputeAndAddChecksum(); 49311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 50311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 51311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 52311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 53311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 54311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 55311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 56311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 57311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Remove one byte from the length of the chunk to process, and 58311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// verify that an error is returned for FinishDecoding(). 59311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, FinishAfterDecodingPartialWindow) { 60311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 61311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 62311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size() - 1, 63311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 64311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.FinishDecoding()); 65311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 66311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 67311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 68311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 69311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, FinishAfterDecodingPartialWindowHeader) { 70311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 71311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 72311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_header_.size() 73311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff + delta_window_header_.size() - 1, 74311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 75311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.FinishDecoding()); 76311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 77311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 78311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 7928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetMatchesWindowSizeLimit) { 8028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetWindowSize(expected_target_.size()); 8128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 8228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 8328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff delta_file_.size(), 8428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff &output_)); 8528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 86732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 8728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 8828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 8928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetMatchesFileSizeLimit) { 9028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetFileSize(expected_target_.size()); 9128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 9228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 9328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff delta_file_.size(), 9428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff &output_)); 9528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 96732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 9728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 9828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 9928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetExceedsWindowSizeLimit) { 10028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetWindowSize(expected_target_.size() - 1); 10128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 10228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 10328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff delta_file_.size(), 10428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff &output_)); 10528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_EQ("", output_); 10628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 10728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 10828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetExceedsFileSizeLimit) { 10928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetFileSize(expected_target_.size() - 1); 11028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 11128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 11228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff delta_file_.size(), 11328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff &output_)); 11428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_EQ("", output_); 11528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 11628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 117311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Fuzz bits to make sure decoder does not violently crash. 118311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This test has no expected behavior except that no crashes should occur. 119311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// In some cases, changing bits will still decode to the correct target; 120311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// for example, changing unused bits within a bitfield. 121311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, FuzzBits) { 122311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff while (FuzzOneByteInDeltaFile()) { 123311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 124311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (decoder_.DecodeChunk(delta_file_.data(), 125311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 126311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)) { 127311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.FinishDecoding(); 128311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 129311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 130311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff output_.clear(); 131311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 132311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 133311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 134311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Change each element of the delta file window to an erroneous value 135311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// and make sure it's caught as an error. 136311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 137311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, WinIndicatorHasBothSourceAndTarget) { 138311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size()] = VCD_SOURCE + VCD_TARGET; 139311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 140311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 141311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 142311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 143311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 144311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 145311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 146311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, OkayToSetUpperBitsOfWinIndicator) { 147311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It is not an error to set any of the other bits in Win_Indicator 148311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // besides VCD_SOURCE and VCD_TARGET. 149311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size()] = 0xFD; 150311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 151311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 152311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 153311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 154311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 155732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 156311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 157311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 158311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyInstructionsShouldFailIfNoSourceSegment) { 159311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Replace the Win_Indicator and the source size and source offset with a 160311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // single 0 byte (a Win_Indicator for a window with no source segment.) 161311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_header_.replace(0, 4, "\0", 1); 162311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 163311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 164311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 165311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 166311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 167311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The first COPY instruction should fail, so there should be no output 168311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 169311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 170311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 171311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, SourceSegmentSizeExceedsDictionarySize) { 172311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 2]; // increment size 173311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 174311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 175311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 176311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 177311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 178311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 179311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 180311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, SourceSegmentSizeMaxInt) { 181311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(1, 2); 182311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 183311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 184311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 185311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 186311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 187311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 188311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 189311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, SourceSegmentSizeNegative) { 190311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(1, 2); 191311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 192311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 193311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 194311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 195311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 196311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 197311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 198311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, SourceSegmentSizeInvalid) { 199311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(1, 2); 200311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 201311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 202311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 203311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 204311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 205311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 206311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 207311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, SourceSegmentEndExceedsDictionarySize) { 208311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 3]; // increment start pos 209311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 210311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 211311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 212311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 213311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 214311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 215311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 216311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, SourceSegmentPosMaxInt) { 217311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(3, 1); 218311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 219311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 220311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 221311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 222311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 223311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 224311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 225311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, SourceSegmentPosNegative) { 226311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(3, 1); 227311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 228311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 229311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 230311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 231311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 232311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 233311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 234311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, SourceSegmentPosInvalid) { 235311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(3, 1); 236311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 237311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 238311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 239311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 240311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 241311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 242311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 243311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, DeltaEncodingLengthZero) { 244311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 4] = 0; 245311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 246311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 247311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 248311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 249311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 250311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 251311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 252311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, DeltaEncodingLengthTooLargeByOne) { 253311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 4]; 254311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 255311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 256311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 257311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 258311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 259311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 260311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 261311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, DeltaEncodingLengthTooSmallByOne) { 262311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 4]; 263311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 264311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 265311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 266311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 267311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 268311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 269311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 270311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, DeltaEncodingLengthMaxInt) { 271311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(4, 1); 272311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 273311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 274311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 275311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 276311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 277311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 278311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 279311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, DeltaEncodingLengthNegative) { 280311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(4, 1); 281311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 282311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 283311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 284311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 285311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 286311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 287311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 288311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, DeltaEncodingLengthInvalid) { 289311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(4, 1); 290311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 291311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 292311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 293311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 294311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 295311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 296311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 297311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetWindowSizeZero) { 298311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char zero_size[] = { 0x00 }; 299311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.replace(delta_file_header_.size() + 5, 2, zero_size, 1); 300311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 301311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 302311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 303311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 304311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 305311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 306311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 307311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetWindowSizeTooLargeByOne) { 308311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 6]; 309311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 310311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 311311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 312311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 313311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 314311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 315311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 316311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetWindowSizeTooSmallByOne) { 317311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 6]; 318311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 319311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 320311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 321311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 322311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 323311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 324311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 325311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetWindowSizeMaxInt) { 326311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(5, 2); 327311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 328311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 329311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 330311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 331311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 332311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 333311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 334311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetWindowSizeNegative) { 335311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(5, 2); 336311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 337311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 338311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 339311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 340311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 341311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 342311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 343311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, TargetWindowSizeInvalid) { 344311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(5, 2); 345311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 346311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 347311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 348311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 349311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 350311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 351311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 352311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, OkayToSetUpperBitsOfDeltaIndicator) { 353311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 7] = 0xF8; 354311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 355311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(delta_file_.data(), 356311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 357311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 358311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 359732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 360311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 361311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 362311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, DataCompressionNotSupported) { 363311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 7] = 0x01; 364311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 365311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 366311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 367311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 368311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 369311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 370311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 371311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, InstructionCompressionNotSupported) { 372311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 7] = 0x02; 373311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 374311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 375311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 376311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 377311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 378311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 379311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 380311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddressCompressionNotSupported) { 381311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 7] = 0x04; 382311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 383311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 384311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 385311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 386311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 387311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 388311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 389311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddRunDataSizeZero) { 390311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 8] = 0; 391311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 392311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 393311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 394311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 395311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 396311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 397311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 398311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddRunDataSizeTooLargeByOne) { 399311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 8]; 400311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 401311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 402311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 403311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 404311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 405311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 406311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 407311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddRunDataSizeTooSmallByOne) { 408311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 8]; 409311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 410311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 411311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 412311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 413311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 414311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 415311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 416311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddRunDataSizeMaxInt) { 417311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(8, 1); 418311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 419311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 420311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 421311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 422311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 423311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 424311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 425311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddRunDataSizeNegative) { 426311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(8, 1); 427311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 428311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 429311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 430311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 431311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 432311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 433311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 434311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddRunDataSizeInvalid) { 435311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(8, 1); 436311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 437311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 438311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 439311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 440311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 441311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 442311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 443311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, InstructionsSizeZero) { 444311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 9] = 0; 445311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 446311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 447311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 448311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 449311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 450311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 451311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 452311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, InstructionsSizeTooLargeByOne) { 453311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 9]; 454311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 455311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 456311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 457311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 458311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 459311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 460311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 461311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, InstructionsSizeTooSmallByOne) { 462311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 9]; 463311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 464311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 465311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 466311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 467311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 468311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 469311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 470311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, InstructionsSizeMaxInt) { 471311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(9, 1); 472311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 473311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 474311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 475311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 476311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 477311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 478311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 479311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, InstructionsSizeNegative) { 480311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(9, 1); 481311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 482311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 483311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 484311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 485311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 486311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 487311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 488311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, InstructionsSizeInvalid) { 489311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(9, 1); 490311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 491311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 492311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 493311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 494311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 495311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 496311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 497311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressSizeZero) { 498311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 10] = 0; 499311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 500311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 501311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 502311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 503311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 504311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 505311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 506311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressSizeTooLargeByOne) { 507311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 10]; 508311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 509311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 510311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 511311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 512311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 513311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 514311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 515311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressSizeTooSmallByOne) { 516311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 10]; 517311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 518311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 519311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 520311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 521311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 522311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 523311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 524311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressSizeMaxInt) { 525311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(10, 1); 526311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 527311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 528311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 529311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 530311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 531311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 532311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 533311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressSizeNegative) { 534311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(10, 1); 535311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 536311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 537311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 538311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 539311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 540311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 541311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 542311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressSizeInvalid) { 543311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(10, 1); 544311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 545311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 546311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 547311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 548311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 549311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 550311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 551311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, InstructionsEndEarly) { 552311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 9]; 553311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 10]; 554311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 555311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 556311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 557311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 558311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 559311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 560311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 561311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// From this point on, the tests should also be run against the interleaved 562311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// format. 563311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 564311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyMoreThanExpectedTarget) { 565311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x70] = 566311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kExpectedTarget); 567311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x71] = 568311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kExpectedTarget) + 1; 569311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 570311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 571311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 572311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 573311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 574311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 575311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 576311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopySizeZero) { 577311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x70] = 0; 578311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 579311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 580311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 581311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 582311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 583311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 584311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 585311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopySizeTooLargeByOne) { 586311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 0x70]; 587311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 588311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 589311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 590311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 591311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 592311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 593311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 594311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopySizeTooSmallByOne) { 595311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 0x70]; 596311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 597311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 598311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 599311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 600311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 601311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 602311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 603311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopySizeMaxInt) { 604311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(0x70, 1); 605311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 606311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 607311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 608311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 609311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 610311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 611311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 612311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopySizeNegative) { 613311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(0x70, 1); 614311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 615311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 616311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 617311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 618311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 619311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 620311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 621311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopySizeInvalid) { 622311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(0x70, 1); 623311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 624311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 625311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 626311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 627311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 628311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 629311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 630311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressBeyondHereAddress) { 631311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x7B] = 632311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kDictionary); 633311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x7C] = 634311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kDictionary); 635311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 636311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 637311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 638311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 639311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 640311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 641311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 642311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressMaxInt) { 643311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(0x7B, 1); 644311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 645311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 646311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 647311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 648311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 649311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 650311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 651311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressNegative) { 652311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(0x70, 1); 653311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 654311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 655311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 656311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 657311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 658311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 659311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 660311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, CopyAddressInvalid) { 661311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(0x70, 1); 662311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 663311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 664311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 665311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 666311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 667311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 668311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 669311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddMoreThanExpectedTarget) { 670311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x72] = 671311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kExpectedTarget); 672311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x73] = 673311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kExpectedTarget) + 1; 674311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 675311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 676311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 677311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 678311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 679311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 680311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 681311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddSizeZero) { 682311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x72] = 0; 683311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 684311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 685311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 686311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 687311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 688311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 689311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 690311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddSizeTooLargeByOne) { 691311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 0x72]; 692311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 693311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 694311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 695311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 696311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 697311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 698311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 699311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddSizeTooSmallByOne) { 700311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 0x72]; 701311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 702311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 703311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 704311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 705311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 706311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 707311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 708311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddSizeMaxInt) { 709311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(0x72, 1); 710311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 711311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 712311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 713311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 714311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 715311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 716311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 717311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddSizeNegative) { 718311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(0x72, 1); 719311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 720311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 721311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 722311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 723311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 724311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 725311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 726311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, AddSizeInvalid) { 727311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(0x72, 1); 728311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 729311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 730311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 731311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 732311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 733311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 734311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 735311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, RunMoreThanExpectedTarget) { 736311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x78] = 737311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kExpectedTarget); 738311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x79] = 739311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kExpectedTarget) + 1; 740311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 741311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 742311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 743311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 744311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 745311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 746311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 747311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, RunSizeZero) { 748311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x78] = 0; 749311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 750311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 751311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 752311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 753311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 754311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 755311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 756311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, RunSizeTooLargeByOne) { 757311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 0x78]; 758311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 759311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 760311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 761311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 762311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 763311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 764311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 765311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, RunSizeTooSmallByOne) { 766311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 0x78]; 767311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 768311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 769311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 770311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 771311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 772311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 773311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 774311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, RunSizeMaxInt) { 775311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(0x78, 1); 776311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 777311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 778311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 779311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 780311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 781311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 782311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 783311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, RunSizeNegative) { 784311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(0x78, 1); 785311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 786311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 787311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 788311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 789311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 790311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 791311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 792311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTest, RunSizeInvalid) { 793311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(0x78, 1); 794311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 795311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.DecodeChunk(delta_file_.data(), 796311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.size(), 797311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff &output_)); 798311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 799311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 800311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 801311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} // namespace open_vcdiff 802