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#include <config.h>
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "varint_bigendian.h"
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <stdlib.h>  // rand, srand
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string.h>  // strlen
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string>
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <vector>
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing.h"
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace open_vcdiff {
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass VarintBETestCommon : public testing::Test {
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef std::string string;
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VarintBETestCommon()
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      : varint_buf_(VarintBE<int64_t>::kMaxBytes),
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        verify_encoded_byte_index_(0),
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        verify_expected_length_(0),
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        parse_data_ptr_(parse_data_all_FFs) {
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~VarintBETestCommon() { }
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void ExpectEncodedByte(char expected_byte) {
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(expected_byte, varint_buf_[verify_encoded_byte_index_]);
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(expected_byte, s_[verify_encoded_byte_index_]);
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    ++verify_encoded_byte_index_;
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char parse_data_all_FFs[];
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const char parse_data_CADA1[];
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  std::vector<char> varint_buf_;
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  string s_;
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int verify_encoded_byte_index_;
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int verify_expected_length_;
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char* parse_data_ptr_;
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <typename SignedIntegerType>
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass VarintBETestTemplate : public VarintBETestCommon {
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VarintBETestTemplate() { }
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual ~VarintBETestTemplate() { }
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef SignedIntegerType SignedIntType;
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  typedef VarintBE<SignedIntegerType> VarintType;
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void StartEncodingTest(SignedIntegerType v, int expected_length) {
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    verify_expected_length_ = expected_length;
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(expected_length, VarintType::Length(v));
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(expected_length, VarintType::Encode(v, &varint_buf_[0]));
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    VarintType::AppendToString(v, &s_);
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(static_cast<size_t>(expected_length), s_.length());
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TestEncodeInvalid(SignedIntegerType v) {
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_DEATH(VarintType::Length(v), "v >= 0");
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_DEATH(VarintType::Encode(v, &varint_buf_[0]), "v >= 0");
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_DEATH(VarintType::AppendToString(v, &s_), ">= 0");
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Need one function for each test type that will be applied to
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // multiple classes
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestDISABLED_EncodeNegative();
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestEncodeZero();
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestEncodeEightBits();
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestEncodeCADAD1A();
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestEncode32BitMaxInt();
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestEncodeDoesNotOverwriteExistingString();
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestParseNullPointer();
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestEndPointerPrecedesBeginning();
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestParseVarintTooLong();
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestParseZero();
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestParseCADA1();
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestParseEmpty();
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestParse123456789();
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestDecode31Bits();
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestEncodeDecodeRandom();
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void TemplateTestContinuationBytesPastEndOfInput();
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef VarintBETestTemplate<int32_t> VarintBEInt32Test;
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef VarintBETestTemplate<int64_t> VarintBEInt64Test;
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_HAS_DEATH_TEST
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// These synonyms are needed for the tests that use ASSERT_DEATH
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef VarintBEInt32Test VarintBEInt32DeathTest;
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef VarintBEInt64Test VarintBEInt64DeathTest;
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_HAS_DEATH_TEST
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char VarintBETestCommon::parse_data_all_FFs[] =
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst char VarintBETestCommon::parse_data_CADA1[] =
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { 0xCA, 0xDA, 0x01 };
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A macro to allow defining tests once and having them run against
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// both VarintBE<int32_t> and VarintBE<int64_t>.
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define TEMPLATE_TEST_F(TEST_TYPE, TEST_NAME) \
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TEST_F(VarintBEInt32##TEST_TYPE, TEST_NAME) { \
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      TemplateTest##TEST_NAME(); \
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    } \
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    TEST_F(VarintBEInt64##TEST_TYPE, TEST_NAME) { \
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      TemplateTest##TEST_NAME(); \
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    } \
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    template <class CacheType> \
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    void VarintBETestTemplate<CacheType>::TemplateTest##TEST_NAME()
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Encoding tests: Length(), Encode(), AppendToString(), AppendToBuffer()
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_HAS_DEATH_TEST
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This test hangs for non-debug build (DeathTest threading problem)
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(DeathTest, DISABLED_EncodeNegative) {
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestEncodeInvalid(-1);
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_HAS_DEATH_TEST
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, EncodeZero) {
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  StartEncodingTest(/* value */ 0x00, /* expected length */ 1);
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x00);
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, EncodeEightBits) {
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  StartEncodingTest(/* value */ 0xFF, /* expected length */ 2);
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x81);
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x7F);
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, EncodeCADAD1A) {
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  StartEncodingTest(/* value */ 0x0CADAD1A, /* expected length */ 4);
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xE5);
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xB6);
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xDA);
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x1A);
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, Encode32BitMaxInt) {
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  StartEncodingTest(/* value */ 0x7FFFFFFF, /* expected length */ 5);
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x87);
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x7F);
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_HAS_DEATH_TEST
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This test hangs for non-debug build (DeathTest threading problem)
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(VarintBEInt32DeathTest, DISABLED_Encode32BitsTooBig) {
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestEncodeInvalid(0x80000000);
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_HAS_DEATH_TEST
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(VarintBEInt64Test, Encode32Bits) {
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  StartEncodingTest(/* value */ 0x80000000, /* expected length */ 5);
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x88);
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x80);
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x80);
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x80);
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x00);
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(VarintBEInt64Test, Encode63Bits) {
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  StartEncodingTest(/* value */ 0x7FFFFFFFFFFFFFFFULL, /* expected length */ 9);
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0xFF);
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  ExpectEncodedByte(0x7F);
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifdef GTEST_HAS_DEATH_TEST
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This test hangs for non-debug build (DeathTest threading problem)
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(VarintBEInt64DeathTest, DISABLED_Encode64BitsTooBig) {
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  TestEncodeInvalid(0x8000000000000000ULL);
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // GTEST_HAS_DEATH_TEST
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, EncodeDoesNotOverwriteExistingString) {
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  s_.append("Test");
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  VarintType::AppendToString('1', &s_);
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(strlen("Test1"), s_.length());
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ("Test1", s_);
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Decoding tests: Parse(), ParseFromBuffer()
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, ParseVarintTooLong) {
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(RESULT_ERROR,
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            VarintType::Parse(parse_data_ptr_ + VarintType::kMaxBytes,
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              &parse_data_ptr_));
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(VarintBEInt32Test, ParseFourFFs) {
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // For a 31-bit non-negative VarintBE, the sequence FF FF FF FF is invalid.
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Even though the largest allowable 31-bit value occupies 5 bytes as a
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Varint, it shouldn't have the highest bits set and so can't begin with FF.
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(RESULT_ERROR, VarintType::Parse(parse_data_ptr_ + 4,
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                            &parse_data_ptr_));
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(VarintBEInt32Test, ParseThreeFFs) {
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(RESULT_END_OF_DATA, VarintType::Parse(parse_data_ptr_ + 3,
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                  &parse_data_ptr_));
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(VarintBEInt64Test, ParseEightFFs) {
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // For a 63-bit non-negative VarintBE, a series of eight FFs is valid, because
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the largest allowable 63-bit value is expressed as eight FF bytes followed
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // by a 7F byte.  This is in contrast to the 32-bit case (see ParseFourFFs,
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // above.)
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(RESULT_END_OF_DATA, VarintType::Parse(parse_data_ptr_ + 8,
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                                  &parse_data_ptr_));
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, ParseZero) {
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char zero_data[] = { 0x00 };
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  parse_data_ptr_ = zero_data;
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0x00, VarintType::Parse(parse_data_ptr_ + 1, &parse_data_ptr_));
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(zero_data + 1, parse_data_ptr_);
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, ParseCADA1) {
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  parse_data_ptr_ = parse_data_CADA1;
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0x12AD01,
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            VarintType::Parse(parse_data_CADA1 + sizeof(parse_data_CADA1),
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              &parse_data_ptr_));
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(parse_data_CADA1 + 3, parse_data_ptr_);
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, ParseNullPointer) {
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  parse_data_ptr_ = parse_data_CADA1;
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(RESULT_ERROR,
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            VarintType::Parse((const char*) NULL, &parse_data_ptr_));
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, EndPointerPrecedesBeginning) {
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This is not an error.
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  parse_data_ptr_ = parse_data_CADA1;
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(RESULT_END_OF_DATA,
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            VarintType::Parse(parse_data_ptr_ - 1, &parse_data_ptr_));
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, ParseEmpty) {
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(RESULT_END_OF_DATA,
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            VarintType::Parse(parse_data_ptr_, &parse_data_ptr_));
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// This example is taken from the Varint description in RFC 3284, section 2.
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, Parse123456789) {
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char parse_data_123456789[] = { 0x80 + 58, 0x80 + 111, 0x80 + 26, 21 };
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  parse_data_ptr_ = parse_data_123456789;
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123456789, VarintType::Parse(parse_data_123456789
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                             + sizeof(parse_data_123456789),
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                         &parse_data_ptr_));
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, Decode31Bits) {
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char parse_data_31_bits[] = { 0x87, 0xFF, 0xFF, 0xFF, 0x7F };
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  parse_data_ptr_ = parse_data_31_bits;
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0x7FFFFFFF,
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            VarintType::Parse(parse_data_31_bits + sizeof(parse_data_31_bits),
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              &parse_data_ptr_));
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(VarintBEInt32Test, Decode32Bits) {
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char parse_data_32_bits[] = { 0x88, 0x80, 0x80, 0x80, 0x00 };
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  parse_data_ptr_ = parse_data_32_bits;
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(RESULT_ERROR,
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            VarintType::Parse(parse_data_32_bits + sizeof(parse_data_32_bits),
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              &parse_data_ptr_));
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(VarintBEInt64Test, Decode32Bits) {
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char parse_data_32_bits[] = { 0x88, 0x80, 0x80, 0x80, 0x00 };
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  parse_data_ptr_ = parse_data_32_bits;
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0x80000000,
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            VarintType::Parse(parse_data_32_bits + sizeof(parse_data_32_bits),
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              &parse_data_ptr_));
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, EncodeDecodeRandom) {
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const int test_size = 1024;  // 1K random encode/decode operations
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  char encode_buffer[VarintType::kMaxBytes];
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  srand(1);
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < test_size; ++i) {
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SignedIntType value = PortableRandomInRange(VarintType::kMaxVal);
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    int length = VarintType::Encode(value, encode_buffer);
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(length, VarintType::Length(value));
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* parse_pointer = encode_buffer;
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(value, VarintType::Parse(encode_buffer + sizeof(encode_buffer),
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       &parse_pointer));
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(encode_buffer + length, parse_pointer);
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (int i = 0; i < test_size; ++i) {
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    s_.clear();
325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    SignedIntType value = PortableRandomInRange(VarintType::kMaxVal);
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    VarintType::AppendToString(value, &s_);
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const int varint_length = static_cast<int>(s_.length());
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(VarintType::Length(value), varint_length);
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* parse_pointer = s_.c_str();
330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    const char* const buffer_end_pointer = s_.c_str() + s_.length();
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(value, VarintType::Parse(buffer_end_pointer, &parse_pointer));
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(buffer_end_pointer, parse_pointer);
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// If only 10 bytes of data are available, but there are 20 continuation
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// bytes, Parse() should not read to the end of the continuation bytes.  It is
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// legal (according to the RFC3284 spec) to use any number of continuation
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// bytes, but they should not cause us to read past the end of available input.
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEMPLATE_TEST_F(Test, ContinuationBytesPastEndOfInput) {
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  const char parse_data_20_continuations[] =
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      0x00 };
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  parse_data_ptr_ = parse_data_20_continuations;
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(RESULT_END_OF_DATA,
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            VarintType::Parse(parse_data_20_continuations + 10,
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                              &parse_data_ptr_));
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // anonymous namespace
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace open_vcdiff
353