1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright 2008 Google Inc.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Author: Lincoln Smith
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Licensed under the Apache License, Version 2.0 (the "License");
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// you may not use this file except in compliance with the License.
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// You may obtain a copy of the License at
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//      http://www.apache.org/licenses/LICENSE-2.0
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unless required by applicable law or agreed to in writing, software
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// distributed under the License is distributed on an "AS IS" BASIS,
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// See the License for the specific language governing permissions and
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// limitations under the License.
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef OPEN_VCDIFF_VCDECODER_TEST_H_
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define OPEN_VCDIFF_VCDECODER_TEST_H_
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "google/vcdecoder.h"
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "checksum.h"
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing.h"
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace open_vcdiff {
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A base class used for all the decoder tests.  Most tests use the same
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// dictionary and target and construct the delta file in the same way.
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Those elements are provided as string members and can be modified or
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// overwritten by each specific decoder test as needed.
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass VCDiffDecoderTest : public testing::Test {
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef std::string string;
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char kDictionary[];
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char kExpectedTarget[];
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VCDiffDecoderTest();
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~VCDiffDecoderTest() {}
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void SetUp();
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // These functions populate delta_file_header_ with a standard or interleaved
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // file header.
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void UseStandardFileHeader();
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void UseInterleavedFileHeader();
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This function is called by SetUp().  It populates delta_file_ with the
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // concatenated delta file header, delta window header, and delta window
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // body, plus (if UseChecksum() is true) the corresponding checksum.
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // It can be called again by a test that has modified the contents of
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // delta_file_ and needs to restore them to their original state.
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void InitializeDeltaFile();
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This function adds an Adler32 checksum to the delta window header.
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void AddChecksum(VCDChecksum checksum);
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This function computes the Adler32 checksum for the expected target
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // and adds it to the delta window header.
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void ComputeAndAddChecksum();
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Write the maximum expressible positive 32-bit VarintBE
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // (0x7FFFFFFF) at the given offset in the delta window.
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void WriteMaxVarintAtOffset(int offset, int bytes_to_replace);
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Write a negative 32-bit VarintBE (0x80000000) at the given offset
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // in the delta window.
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void WriteNegativeVarintAtOffset(int offset, int bytes_to_replace);
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Write a VarintBE that has too many continuation bytes
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // at the given offset in the delta window.
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void WriteInvalidVarintAtOffset(int offset, int bytes_to_replace);
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This function iterates through a list of fuzzers (bit masks used to corrupt
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // bytes) and through positions in the delta file.  Each time it is called, it
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // attempts to corrupt a different byte in delta_file_ in a different way.  If
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // successful, it returns true. Once it exhausts the list of fuzzers and of
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // byte positions in delta_file_, it returns false.
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool FuzzOneByteInDeltaFile();
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Assuming the length of the given string can be expressed as a VarintBE
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // of length N, this function returns the byte at position which_byte, where
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // 0 <= which_byte < N.
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static char GetByteFromStringLength(const char* s, int which_byte);
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Assuming the length of the given string can be expressed as a one-byte
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // VarintBE, this function returns that byte value.
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static char StringLengthAsByte(const char* s) {
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return GetByteFromStringLength(s, 0);
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Assuming the length of the given string can be expressed as a two-byte
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // VarintBE, this function returns the first byte of its representation.
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static char FirstByteOfStringLength(const char* s) {
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return GetByteFromStringLength(s, 0);
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Assuming the length of the given string can be expressed as a two-byte
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // VarintBE, this function returns the second byte of its representation.
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static char SecondByteOfStringLength(const char* s) {
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    return GetByteFromStringLength(s, 1);
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VCDiffStreamingDecoder decoder_;
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // delta_file_ will be populated by InitializeDeltaFile() using the components
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // delta_file_header_, delta_window_header_, and delta_window_body_.
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  string delta_file_;
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This string is not populated during setup, but is used to receive the
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // decoded target file in each test.
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  string output_;
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Test fixtures that inherit from VCDiffDecoderTest can set these strings in
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // their constructors to override their default values (which come from
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // kDictionary, kExpectedTarget, etc.)
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  string dictionary_;
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  string expected_target_;
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The components that will be used to construct delta_file_.
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  string delta_file_header_;
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  string delta_window_header_;
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  string delta_window_body_;
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // These values should only be accessed via UseStandardFileHeader() and
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // UseInterleavedFileHeader().
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char kStandardFileHeader[];
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char kInterleavedFileHeader[];
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // These two counters are used by FuzzOneByteInDeltaFile() to iterate through
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // different ways to corrupt the delta file.
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t fuzzer_;
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t fuzzed_byte_position_;
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// The "standard" decoder test, which decodes a delta file that uses the
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// standard VCDIFF (RFC 3284) format with no extensions.
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass VCDiffStandardDecoderTest : public VCDiffDecoderTest {
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VCDiffStandardDecoderTest();
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~VCDiffStandardDecoderTest() {}
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char kWindowHeader[];
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char kWindowBody[];
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass VCDiffInterleavedDecoderTest : public VCDiffDecoderTest {
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VCDiffInterleavedDecoderTest();
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~VCDiffInterleavedDecoderTest() {}
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char kWindowHeader[];
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char kWindowBody[];
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace open_vcdiff
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // OPEN_VCDIFF_VCDECODER_TEST_H_
162