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 "testing.h" 19311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "vcdecoder_test.h" 20311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "vcdiff_defs.h" // VCD_SOURCE 21311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 22311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace open_vcdiff { 23311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 24311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// These are the same tests as for VCDiffStandardDecoderTest, with the added 25311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// complication that instead of calling DecodeChunk() once with the entire data 26311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// set, DecodeChunk() is called once for each byte of input. This is intended 27311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// to shake out any bugs with rewind and resume while parsing chunked data. 28311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 29311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VCDiffStandardDecoderTest VCDiffStandardDecoderTestByteByByte; 30311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 31311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, DecodeHeaderOnly) { 32311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 33311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_header_.size(); ++i) { 34311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_header_[i], 1, &output_)); 35311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 36311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 37311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 38311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 39311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 40311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, Decode) { 41311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 42311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 43311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 44311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 45311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 46732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 47311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 48311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 49baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, DecodeNoVcdTarget) { 50baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.SetAllowVcdTarget(false); 51baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 52baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 53baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 54baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff } 55baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 56732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 57baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff} 58baf44ead8ad43d5c600b7f89420905a7397489fbopenvcdiff 59311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Remove one byte from the length of the chunk to process, and 60311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// verify that an error is returned for FinishDecoding(). 61311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, FinishAfterDecodingPartialWindow) { 62311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.resize(delta_file_.size() - 1); 63311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 64311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 65311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 66311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 67311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.FinishDecoding()); 68311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 69311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 70311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 71311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 72311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, 73311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FinishAfterDecodingPartialWindowHeader) { 74311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.resize(delta_file_header_.size() 75311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff + delta_window_header_.size() - 1); 76311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 77311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 78311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 79311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 80311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_FALSE(decoder_.FinishDecoding()); 81311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 82311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 83311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 84311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// If we add a checksum to a standard-format delta file (without using format 85311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// extensions), it will be interpreted as random bytes inserted into the middle 86311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// of the file. The decode operation should fail, but where exactly it fails is 87311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// undefined. 88311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, 89311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff StandardFormatDoesNotSupportChecksum) { 90311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ComputeAndAddChecksum(); 91311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 92311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 93311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 94311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 95311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 96311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 97311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 98311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 99311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 100311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 101311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 102311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 103311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 104311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 10528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetMatchesWindowSizeLimit) { 10628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetWindowSize(expected_target_.size()); 10728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 10828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 10928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 11028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff } 11128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 112732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 11328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 11428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 11528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetMatchesFileSizeLimit) { 11628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetFileSize(expected_target_.size()); 11728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 11828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 11928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 12028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff } 12128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 122732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 12328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 12428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 12528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetExceedsWindowSizeLimit) { 12628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetWindowSize(expected_target_.size() - 1); 12728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 12828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff bool failed = false; 12928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 13028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 13128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff failed = true; 13228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff break; 13328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff } 13428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff } 13528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(failed); 13628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_EQ("", output_); 13728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 13828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 13928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetExceedsFileSizeLimit) { 14028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.SetMaximumTargetFileSize(expected_target_.size() - 1); 14128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 14228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff bool failed = false; 14328db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 14428db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 14528db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff failed = true; 14628db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff break; 14728db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff } 14828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff } 14928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_TRUE(failed); 15028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff EXPECT_EQ("", output_); 15128db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff} 15228db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff 153311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Fuzz bits to make sure decoder does not violently crash. 154311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This test has no expected behavior except that no crashes should occur. 155311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// In some cases, changing bits will still decode to the correct target; 156311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// for example, changing unused bits within a bitfield. 157311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, FuzzBits) { 158311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff while (FuzzOneByteInDeltaFile()) { 159311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 160311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 161311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 162311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 163311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 164311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 165311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 166311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 167311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!failed) { 168311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.FinishDecoding(); 169311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 170311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 171311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 172311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 173311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff output_.clear(); 174311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 175311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 176311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 177311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Change each element of the delta file window to an erroneous value 178311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// and make sure it's caught as an error. 179311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 180311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, 181311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WinIndicatorHasBothSourceAndTarget) { 182311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size()] = VCD_SOURCE + VCD_TARGET; 183311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 184311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 185311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 186311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 187311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 188311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail at the position that was altered 189311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size(), i); 190311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 191311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 192311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 193311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 194311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 195311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 196311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 197311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, OkayToSetUpperBitsOfWinIndicator) { 198311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It is not an error to set any of the other bits in Win_Indicator 199311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // besides VCD_SOURCE and VCD_TARGET. 200311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size()] = 0xFD; 201311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 202311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 203311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 204311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 205311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 206732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 207311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 208311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 209311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, 210311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff CopyInstructionsShouldFailIfNoSourceSegment) { 211311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // Replace the Win_Indicator and the source size and source offset with a 212311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // single 0 byte (a Win_Indicator for a window with no source segment.) 213311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_window_header_.replace(0, 4, "\0", 1); 214311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InitializeDeltaFile(); 215311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 216311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 217311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 218311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 219311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 220311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The first COPY instruction should fail. With the standard format, 221311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // it may need to see the whole delta window before knowing that it is 222311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // invalid. 223311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 224311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 225311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 226311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 227311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 228311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 229311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 230311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, 231311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SourceSegmentSizeExceedsDictionarySize) { 232311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 2]; // increment size 233311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 234311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 235311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 236311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 237311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 238311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the source segment size 239311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 2, i); 240311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 241311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 242311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 243311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 244311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 245311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 246311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 247311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, SourceSegmentSizeMaxInt) { 248311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(1, 2); 249311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 250311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 251311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 252311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 253311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 254311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the source segment size 255311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 5, i); 256311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 257311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 258311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 259311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 260311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 261311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 262311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 263311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, SourceSegmentSizeNegative) { 264311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(1, 2); 265311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 266311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 267311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 268311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 269311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 270311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the source segment size 271f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com EXPECT_EQ(delta_file_header_.size() + 4, i); 272311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 273311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 274311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 275311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 276311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 277311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 278311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 279311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, SourceSegmentSizeInvalid) { 280311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(1, 2); 281311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 282311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 283311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 284311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 285311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 286311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the source segment size 287311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + 6, i); 288311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 289311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 290311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 291311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 292311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 293311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 294311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 295311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, 296311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SourceSegmentEndExceedsDictionarySize) { 297311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 3]; // increment start pos 298311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 299311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 300311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 301311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 302311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 303311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the source segment end 304311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 3, i); 305311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 306311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 307311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 308311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 309311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 310311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 311311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 312311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, SourceSegmentPosMaxInt) { 313311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(3, 1); 314311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 315311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 316311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 317311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 318311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 319311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the source segment pos 320311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 7, i); 321311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 322311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 323311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 324311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 325311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 326311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 327311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 328311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, SourceSegmentPosNegative) { 329311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(3, 1); 330311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 331311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 332311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 333311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 334311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 335311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the source segment pos 336f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com EXPECT_EQ(delta_file_header_.size() + 6, i); 337311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 338311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 339311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 340311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 341311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 342311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 343311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 344311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, SourceSegmentPosInvalid) { 345311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(3, 1); 346311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 347311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 348311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 349311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 350311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 351311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the source segment pos 352311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + 8, i); 353311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 354311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 355311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 356311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 357311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 358311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 359311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 360311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, DeltaEncodingLengthZero) { 361311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 4] = 0; 362311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 363311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 364311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 365311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 366311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 367311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 368311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 369311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 370311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 371311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 372311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 373311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 374311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 375311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 376311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, DeltaEncodingLengthTooLargeByOne) { 377311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 4]; 378311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 379311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 380311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 381311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 382311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 383311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 384311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 385311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 386311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 387311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 388311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 389311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 390311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 391311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 392311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, DeltaEncodingLengthTooSmallByOne) { 393311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 4]; 394311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 395311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 396311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 397311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 398311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 399311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 400311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 401311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 402311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 403311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 404311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 405311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 406311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 407311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 408311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, DeltaEncodingLengthMaxInt) { 409311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(4, 1); 410311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 411311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 412311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 413311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 414311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 415311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail before finishing the window header 416311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + delta_window_header_.size() + 4, 417311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff i); 418311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 419311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 420311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 421311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 422311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 423311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 424311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 425311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, DeltaEncodingLengthNegative) { 426311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(4, 1); 427311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 428311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 429311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 430311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 431311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 432311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the delta encoding length 433f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com EXPECT_EQ(delta_file_header_.size() + 7, i); 434311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 435311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 436311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 437311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 438311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 439311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 440311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 441311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, DeltaEncodingLengthInvalid) { 442311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(4, 1); 443311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 444311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 445311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 446311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 447311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 448311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the delta encoding length 449311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + 9, i); 450311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 451311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 452311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 453311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 454311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 455311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 456311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 457311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetWindowSizeZero) { 458311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff static const char zero_size[] = { 0x00 }; 459311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_.replace(delta_file_header_.size() + 5, 2, zero_size, 1); 460311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 461311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 462311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 463311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 464311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 465311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 466311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 467311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 468311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 469311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 470311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 471311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 472311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetWindowSizeTooLargeByOne) { 473311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 6]; 474311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 475311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 476311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 477311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 478311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 479311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 480311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 481311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 482311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 483311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 484311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 485311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 486311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 487311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetWindowSizeTooSmallByOne) { 488311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 6]; 489311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 490311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 491311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 492311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 493311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 494311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 495311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 496311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 497311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 498311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 499311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 500311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 501311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 502311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetWindowSizeMaxInt) { 503311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(5, 2); 504311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 505311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 506311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 507311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 508311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 509311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the target window size 510311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 9, i); 511311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 512311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 513311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 514311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 515311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 516311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 517311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 518311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetWindowSizeNegative) { 519311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(5, 2); 520311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 521311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 522311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 523311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 524311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 525311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the target window size 526f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com EXPECT_EQ(delta_file_header_.size() + 8, i); 527311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 528311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 529311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 530311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 531311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 532311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 533311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 534311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, TargetWindowSizeInvalid) { 535311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(5, 2); 536311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 537311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 538311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 539311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 540311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 541311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the target window size 542311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + 10, i); 543311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 544311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 545311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 546311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 547311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 548311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 549311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 550311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, 551311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff OkayToSetUpperBitsOfDeltaIndicator) { 552311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 7] = 0xF8; 553311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 554311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 555311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.DecodeChunk(&delta_file_[i], 1, &output_)); 556311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 557311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(decoder_.FinishDecoding()); 558732fff248e662ec47aa27c124632f406f27b6c8dopenvcdiff@gmail.com EXPECT_EQ(expected_target_.c_str(), output_); 559311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 560311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 561311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, DataCompressionNotSupported) { 562311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 7] = 0x01; 563311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 564311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 565311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 566311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 567311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 568311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the delta indicator 569311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 7, i); 570311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 571311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 572311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 573311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 574311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 575311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 576311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 577311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, 578311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff InstructionCompressionNotSupported) { 579311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 7] = 0x02; 580311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 581311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 582311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 583311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 584311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 585311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the delta indicator 586311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 7, i); 587311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 588311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 589311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 590311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 591311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 592311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 593311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 594311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddressCompressionNotSupported) { 595311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 7] = 0x04; 596311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 597311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 598311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 599311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 600311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 601311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the delta indicator 602311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 7, i); 603311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 604311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 605311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 606311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 607311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 608311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 609311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 610311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddRunDataSizeZero) { 611311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 8] = 0; 612311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 613311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 614311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 615311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 616311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 617311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 618311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 619311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 620311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 621311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 622311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 623311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 624311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 625311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 626311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddRunDataSizeTooLargeByOne) { 627311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 8]; 628311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 629311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 630311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 631311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 632311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 633311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 634311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 635311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 636311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 637311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 638311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 639311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 640311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 641311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 642311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddRunDataSizeTooSmallByOne) { 643311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 8]; 644311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 645311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 646311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 647311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 648311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 649311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 650311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 651311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 652311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 653311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 654311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 655311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 656311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 657311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 658311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddRunDataSizeMaxInt) { 659311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(8, 1); 660311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 661311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 662311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 663311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 664311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 665311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail before finishing the window header 666311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + delta_window_header_.size() + 4, 667311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff i); 668311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 669311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 670311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 671311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 672311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 673311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 674311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 675311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddRunDataSizeNegative) { 676311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(8, 1); 677311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 678311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 679311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 680311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 681311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 682311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the add/run data segment size 683f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com EXPECT_EQ(delta_file_header_.size() + 11, i); 684311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 685311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 686311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 687311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 688311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 689311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 690311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 691311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddRunDataSizeInvalid) { 692311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(8, 1); 693311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 694311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 695311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 696311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 697311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 698311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the add/run data segment size 699311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + 13, i); 700311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 701311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 702311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 703311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 704311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 705311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 706311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 707311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, InstructionsSizeZero) { 708311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 9] = 0; 709311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 710311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 711311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 712311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 713311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 714311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 715311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 716311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 717311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 718311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 719311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 720311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 721311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 722311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 723311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, InstructionsSizeTooLargeByOne) { 724311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 9]; 725311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 726311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 727311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 728311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 729311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 730311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 731311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 732311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 733311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 734311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 735311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 736311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 737311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 738311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 739311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, InstructionsSizeTooSmallByOne) { 740311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 9]; 741311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 742311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 743311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 744311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 745311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 746311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 747311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 748311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 749311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 750311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 751311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 752311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 753311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 754311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 755311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, InstructionsSizeMaxInt) { 756311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(9, 1); 757311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 758311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 759311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 760311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 761311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 762311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail before finishing the window header 763311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + delta_window_header_.size() + 4, 764311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff i); 765311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 766311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 767311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 768311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 769311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 770311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 771311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 772311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, InstructionsSizeNegative) { 773311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(9, 1); 774311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 775311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 776311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 777311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 778311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 779311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the instructions segment size 780f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com EXPECT_EQ(delta_file_header_.size() + 12, i); 781311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 782311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 783311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 784311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 785311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 786311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 787311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 788311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, InstructionsSizeInvalid) { 789311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(9, 1); 790311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 791311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 792311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 793311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 794311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 795311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the instructions segment size 796311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + 14, i); 797311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 798311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 799311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 800311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 801311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 802311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 803311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 804311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressSizeZero) { 805311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 10] = 0; 806311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 807311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 808311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 809311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 810311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 811311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 812311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 813311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 814311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 815311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 816311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 817311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 818311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 819311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 820311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressSizeTooLargeByOne) { 821311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 10]; 822311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 823311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 824311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 825311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 826311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 827311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 828311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 829311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 830311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 831311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 832311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 833311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 834311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 835311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 836311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressSizeTooSmallByOne) { 837311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 10]; 838311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 839311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 840311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 841311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 842311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 843311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 844311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 10, i); 845311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 846311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 847311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 848311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 849311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 850311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 851311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 852311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressSizeMaxInt) { 853311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(10, 1); 854311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 855311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 856311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 857311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 858311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 859311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 860311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ(delta_file_header_.size() + 14, i); 861311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 862311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 863311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 864311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 865311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 866311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 867311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 868311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressSizeNegative) { 869311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(10, 1); 870311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 871311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 872311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 873311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 874311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 875311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 876f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com EXPECT_EQ(delta_file_header_.size() + 13, i); 877311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 878311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 879311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 880311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 881311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 882311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 883311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 884311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressSizeInvalid) { 885311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(10, 1); 886311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 887311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 888311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 889311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 890311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 891311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // It should fail after decoding the copy address segment size 892311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(delta_file_header_.size() + 15, i); 893311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 894311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 895311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 896311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 897311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_EQ("", output_); 898311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 899311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 900311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, InstructionsEndEarly) { 901311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 9]; 902311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 10]; 903311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 904311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 905311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 906311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 907311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 908311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 909311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 910311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 911311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 912311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 913311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 914311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 915311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 916311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// From this point on, the tests should also be run against the interleaved 917311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// format. 918311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 919311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyMoreThanExpectedTarget) { 920311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x70] = 921311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kExpectedTarget); 922311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x71] = 923311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kExpectedTarget) + 1; 924311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 925311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 926311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 927311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 928311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 929311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 930311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 931311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 932311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 933311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 934311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 935311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 936311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 937311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopySizeZero) { 938311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x70] = 0; 939311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 940311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 941311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 942311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 943311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 944311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 945311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 946311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 947311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 948311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 949311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 950311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 951311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 952311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopySizeTooLargeByOne) { 953311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 0x70]; 954311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 955311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 956311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 957311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 958311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 959311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 960311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 961311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 962311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 963311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 964311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 965311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 966311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 967311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopySizeTooSmallByOne) { 968311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 0x70]; 969311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 970311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 971311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 972311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 973311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 974311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 975311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 976311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 977311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 978311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 979311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 980311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 981311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 982311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopySizeMaxInt) { 983311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(0x70, 1); 984311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 985311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 986311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 987311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 988311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 989311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 990311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 991311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 992311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 993311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 994311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 995311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 996311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 997311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopySizeNegative) { 998311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(0x70, 1); 999311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1000311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1001311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1002311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1003311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1004311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1005311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1006311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1007311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1008311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1009311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1010311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1011311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1012311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopySizeInvalid) { 1013311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(0x70, 1); 1014311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1015311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1016311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1017311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1018311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1019311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1020311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1021311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1022311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1023311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1024311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1025311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1026311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1027311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressBeyondHereAddress) { 1028311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x7B] = 1029311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kDictionary); 1030311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x7C] = 1031311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kDictionary); 1032311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1033311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1034311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1035311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1036311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1037311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1038311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1039311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1040311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1041311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1042311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1043311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1044311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1045311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressMaxInt) { 1046311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(0x7B, 1); 1047311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1048311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1049311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1050311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1051311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1052311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1053311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1054311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1055311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1056311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1057311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1058311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1059311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1060311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressNegative) { 1061311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(0x70, 1); 1062311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1063311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1064311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1065311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1066311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1067311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1068311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1069311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1070311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1071311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1072311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1073311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1074311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1075311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, CopyAddressInvalid) { 1076311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(0x70, 1); 1077311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1078311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1079311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1080311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1081311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1082311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1083311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1084311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1085311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1086311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1087311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1088311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1089311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1090311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddMoreThanExpectedTarget) { 1091311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x72] = 1092311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kExpectedTarget); 1093311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x73] = 1094311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kExpectedTarget) + 1; 1095311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1096311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1097311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1098311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1099311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1100311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1101311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1102311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1103311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1104311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1105311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1106311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1107311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1108311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddSizeZero) { 1109311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x72] = 0; 1110311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1111311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1112311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1113311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1114311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1115311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1116311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1117311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1118311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1119311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1120311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1121311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1122311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1123311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddSizeTooLargeByOne) { 1124311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 0x72]; 1125311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1126311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1127311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1128311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1129311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1130311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1131311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1132311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1133311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1134311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1135311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1136311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1137311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1138311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddSizeTooSmallByOne) { 1139311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 0x72]; 1140311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1141311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1142311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1143311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1144311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1145311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1146311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1147311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1148311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1149311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1150311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1151311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1152311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1153311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddSizeMaxInt) { 1154311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(0x72, 1); 1155311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1156311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1157311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1158311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1159311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1160311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1161311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1162311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1163311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1164311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1165311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1166311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1167311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1168311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddSizeNegative) { 1169311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(0x72, 1); 1170311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1171311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1172311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1173311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1174311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1175311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1176311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1177311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1178311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1179311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1180311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1181311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1182311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1183311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, AddSizeInvalid) { 1184311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(0x72, 1); 1185311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1186311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1187311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1188311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1189311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1190311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1191311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1192311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1193311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1194311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1195311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1196311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1197311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1198311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, RunMoreThanExpectedTarget) { 1199311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x78] = 1200311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff FirstByteOfStringLength(kExpectedTarget); 1201311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x79] = 1202311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff SecondByteOfStringLength(kExpectedTarget) + 1; 1203311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1204311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1205311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1206311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1207311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1208311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1209311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1210311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1211311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1212311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1213311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1214311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1215311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1216311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, RunSizeZero) { 1217311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff delta_file_[delta_file_header_.size() + 0x78] = 0; 1218311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1219311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1220311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1221311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1222311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1223311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1224311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1225311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1226311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1227311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1228311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1229311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1230311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1231311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, RunSizeTooLargeByOne) { 1232311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff ++delta_file_[delta_file_header_.size() + 0x78]; 1233311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1234311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1235311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1236311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1237311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1238311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1239311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1240311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1241311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1242311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1243311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1244311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1245311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1246311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, RunSizeTooSmallByOne) { 1247311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff --delta_file_[delta_file_header_.size() + 0x78]; 1248311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1249311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1250311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1251311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1252311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1253311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1254311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1255311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1256311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1257311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1258311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1259311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1260311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1261311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, RunSizeMaxInt) { 1262311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteMaxVarintAtOffset(0x78, 1); 1263311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1264311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1265311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1266311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1267311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1268311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1269311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1270311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1271311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1272311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1273311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1274311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1275311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1276311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, RunSizeNegative) { 1277311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteNegativeVarintAtOffset(0x78, 1); 1278311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1279311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1280311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1281311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1282311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1283311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1284311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1285311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1286311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1287311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1288311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1289311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1290311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1291311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VCDiffStandardDecoderTestByteByByte, RunSizeInvalid) { 1292311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff WriteInvalidVarintAtOffset(0x78, 1); 1293311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff decoder_.StartDecoding(dictionary_.data(), dictionary_.size()); 1294311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff bool failed = false; 1295311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff for (size_t i = 0; i < delta_file_.size(); ++i) { 1296311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff if (!decoder_.DecodeChunk(&delta_file_[i], 1, &output_)) { 1297311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff failed = true; 1298311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff break; 1299311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1300311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff } 1301311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_TRUE(failed); 1302311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff // The decoder should not create more target bytes than were expected. 1303311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff EXPECT_GE(expected_target_.size(), output_.size()); 1304311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} 1305311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff 1306311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff} // namespace open_vcdiff 1307