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