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 "varint_bigendian.h"
1828db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff#include <stdlib.h>  // rand, srand
1928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff#include <string.h>  // strlen
20311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include <string>
21311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include <vector>
22311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#include "testing.h"
23311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
24311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace open_vcdiff {
25311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffnamespace {
26311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
27311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass VarintBETestCommon : public testing::Test {
28311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff protected:
2928db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff  typedef std::string string;
3028db8079f707ebdf43ce62cdfd96eb39c8f889e0openvcdiff
31311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  VarintBETestCommon()
32311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      : varint_buf_(VarintBE<int64_t>::kMaxBytes),
33311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff        verify_encoded_byte_index_(0),
34311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff        verify_expected_length_(0),
35311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff        parse_data_ptr_(parse_data_all_FFs) {
36311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
37311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
38311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  virtual ~VarintBETestCommon() { }
39311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
40311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void ExpectEncodedByte(char expected_byte) {
41311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(expected_byte, varint_buf_[verify_encoded_byte_index_]);
42311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(expected_byte, s_[verify_encoded_byte_index_]);
43311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    ++verify_encoded_byte_index_;
44311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
45311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
46311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static const char parse_data_all_FFs[];
47311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  static const char parse_data_CADA1[];
48311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
49311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  std::vector<char> varint_buf_;
50311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  string s_;
51311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  int verify_encoded_byte_index_;
52311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  int verify_expected_length_;
53311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  const char* parse_data_ptr_;
54311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff};
55311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
56311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftemplate <typename SignedIntegerType>
57311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffclass VarintBETestTemplate : public VarintBETestCommon {
58311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff protected:
59311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  VarintBETestTemplate() { }
60311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
61311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  virtual ~VarintBETestTemplate() { }
62311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
63311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  typedef SignedIntegerType SignedIntType;
64311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  typedef VarintBE<SignedIntegerType> VarintType;
65311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
66311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void StartEncodingTest(SignedIntegerType v, int expected_length) {
67311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    verify_expected_length_ = expected_length;
68311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(expected_length, VarintType::Length(v));
69311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(expected_length, VarintType::Encode(v, &varint_buf_[0]));
70311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    VarintType::AppendToString(v, &s_);
71311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(static_cast<size_t>(expected_length), s_.length());
72311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
73311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
74311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TestEncodeInvalid(SignedIntegerType v) {
75311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_DEATH(VarintType::Length(v), "v >= 0");
76311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_DEATH(VarintType::Encode(v, &varint_buf_[0]), "v >= 0");
77311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_DEATH(VarintType::AppendToString(v, &s_), ">= 0");
78311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
79311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
80311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  // Need one function for each test type that will be applied to
81311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  // multiple classes
82311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestDISABLED_EncodeNegative();
83311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestEncodeZero();
84311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestEncodeEightBits();
85311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestEncodeCADAD1A();
86311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestEncode32BitMaxInt();
87311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestEncodeDoesNotOverwriteExistingString();
88311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestParseNullPointer();
89311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestEndPointerPrecedesBeginning();
90311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestParseVarintTooLong();
91311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestParseZero();
92311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestParseCADA1();
93311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestParseEmpty();
94311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestParse123456789();
95311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestDecode31Bits();
96311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  void TemplateTestEncodeDecodeRandom();
97f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  void TemplateTestContinuationBytesPastEndOfInput();
98311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff};
99311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
100311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VarintBETestTemplate<int32_t> VarintBEInt32Test;
101311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VarintBETestTemplate<int64_t> VarintBEInt64Test;
102311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
103311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#ifdef GTEST_HAS_DEATH_TEST
104311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// These synonyms are needed for the tests that use ASSERT_DEATH
105311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VarintBEInt32Test VarintBEInt32DeathTest;
106311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdifftypedef VarintBEInt64Test VarintBEInt64DeathTest;
107311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#endif  // GTEST_HAS_DEATH_TEST
108311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
109311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VarintBETestCommon::parse_data_all_FFs[] =
110311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
111311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
112311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffconst char VarintBETestCommon::parse_data_CADA1[] =
113311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    { 0xCA, 0xDA, 0x01 };
114311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
115311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// A macro to allow defining tests once and having them run against
116311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// both VarintBE<int32_t> and VarintBE<int64_t>.
117311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff//
118311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#define TEMPLATE_TEST_F(TEST_TYPE, TEST_NAME) \
119311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    TEST_F(VarintBEInt32##TEST_TYPE, TEST_NAME) { \
120311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      TemplateTest##TEST_NAME(); \
121311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    } \
122311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    TEST_F(VarintBEInt64##TEST_TYPE, TEST_NAME) { \
123311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff      TemplateTest##TEST_NAME(); \
124311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    } \
125311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    template <class CacheType> \
126311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    void VarintBETestTemplate<CacheType>::TemplateTest##TEST_NAME()
127311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
128311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Encoding tests: Length(), Encode(), AppendToString(), AppendToBuffer()
129311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
130311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#ifdef GTEST_HAS_DEATH_TEST
131311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This test hangs for non-debug build (DeathTest threading problem)
132311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(DeathTest, DISABLED_EncodeNegative) {
133311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TestEncodeInvalid(-1);
134311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
135311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#endif  // GTEST_HAS_DEATH_TEST
136311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
137311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, EncodeZero) {
138311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  StartEncodingTest(/* value */ 0x00, /* expected length */ 1);
139311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x00);
140311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
141311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
142311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
143311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, EncodeEightBits) {
144311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  StartEncodingTest(/* value */ 0xFF, /* expected length */ 2);
145311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x81);
146311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x7F);
147311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
148311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
149311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
150311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, EncodeCADAD1A) {
151311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  StartEncodingTest(/* value */ 0x0CADAD1A, /* expected length */ 4);
152311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xE5);
153311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xB6);
154311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xDA);
155311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x1A);
156311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
157311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
158311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
159311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, Encode32BitMaxInt) {
160311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  StartEncodingTest(/* value */ 0x7FFFFFFF, /* expected length */ 5);
161311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x87);
162311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
163311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
164311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
165311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x7F);
166311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
167311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
168311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
169311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#ifdef GTEST_HAS_DEATH_TEST
170311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This test hangs for non-debug build (DeathTest threading problem)
171311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VarintBEInt32DeathTest, DISABLED_Encode32BitsTooBig) {
172311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TestEncodeInvalid(0x80000000);
173311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
174311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#endif  // GTEST_HAS_DEATH_TEST
175311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
176311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VarintBEInt64Test, Encode32Bits) {
177311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  StartEncodingTest(/* value */ 0x80000000, /* expected length */ 5);
178311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x88);
179311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x80);
180311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x80);
181311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x80);
182311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x00);
183311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
184311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
185311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
186311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VarintBEInt64Test, Encode63Bits) {
187311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  StartEncodingTest(/* value */ 0x7FFFFFFFFFFFFFFFULL, /* expected length */ 9);
188311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
189311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
190311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
191311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
192311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
193311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
194311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
195311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0xFF);
196311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  ExpectEncodedByte(0x7F);
197311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(verify_expected_length_, verify_encoded_byte_index_);
198311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
199311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
200311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#ifdef GTEST_HAS_DEATH_TEST
201311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This test hangs for non-debug build (DeathTest threading problem)
202311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VarintBEInt64DeathTest, DISABLED_Encode64BitsTooBig) {
203311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  TestEncodeInvalid(0x8000000000000000ULL);
204311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
205311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff#endif  // GTEST_HAS_DEATH_TEST
206311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
207311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, EncodeDoesNotOverwriteExistingString) {
208311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  s_.append("Test");
209311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  VarintType::AppendToString('1', &s_);
210311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(strlen("Test1"), s_.length());
211311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ("Test1", s_);
212311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
213311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
214311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// Decoding tests: Parse(), ParseFromBuffer()
215311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
216311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, ParseVarintTooLong) {
217311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(RESULT_ERROR,
218311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff            VarintType::Parse(parse_data_ptr_ + VarintType::kMaxBytes,
219311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                              &parse_data_ptr_));
220311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
221311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
222f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.comTEST_F(VarintBEInt32Test, ParseFourFFs) {
223f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  // For a 31-bit non-negative VarintBE, the sequence FF FF FF FF is invalid.
224f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  // Even though the largest allowable 31-bit value occupies 5 bytes as a
225f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  // Varint, it shouldn't have the highest bits set and so can't begin with FF.
226f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  EXPECT_EQ(RESULT_ERROR, VarintType::Parse(parse_data_ptr_ + 4,
227f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com                                            &parse_data_ptr_));
228f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com}
229f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com
230f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.comTEST_F(VarintBEInt32Test, ParseThreeFFs) {
231f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  EXPECT_EQ(RESULT_END_OF_DATA, VarintType::Parse(parse_data_ptr_ + 3,
232f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com                                                  &parse_data_ptr_));
233f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com}
234f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com
235f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.comTEST_F(VarintBEInt64Test, ParseEightFFs) {
236f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  // For a 63-bit non-negative VarintBE, a series of eight FFs is valid, because
237f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  // the largest allowable 63-bit value is expressed as eight FF bytes followed
238f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  // by a 7F byte.  This is in contrast to the 32-bit case (see ParseFourFFs,
239f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  // above.)
240f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  EXPECT_EQ(RESULT_END_OF_DATA, VarintType::Parse(parse_data_ptr_ + 8,
241f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com                                                  &parse_data_ptr_));
242311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
243311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
244311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, ParseZero) {
245311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  const char zero_data[] = { 0x00 };
246311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  parse_data_ptr_ = zero_data;
247311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(0x00, VarintType::Parse(parse_data_ptr_ + 1, &parse_data_ptr_));
248311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(zero_data + 1, parse_data_ptr_);
249311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
250311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
251311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, ParseCADA1) {
252311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  parse_data_ptr_ = parse_data_CADA1;
253311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(0x12AD01,
254311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff            VarintType::Parse(parse_data_CADA1 + sizeof(parse_data_CADA1),
255311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                              &parse_data_ptr_));
256311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(parse_data_CADA1 + 3, parse_data_ptr_);
257311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
258311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
259f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.comTEMPLATE_TEST_F(Test, ParseNullPointer) {
260311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  parse_data_ptr_ = parse_data_CADA1;
261f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  EXPECT_EQ(RESULT_ERROR,
262f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com            VarintType::Parse((const char*) NULL, &parse_data_ptr_));
263311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
264311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
265311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, EndPointerPrecedesBeginning) {
266311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  // This is not an error.
267311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  parse_data_ptr_ = parse_data_CADA1;
268f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  EXPECT_EQ(RESULT_END_OF_DATA,
269f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com            VarintType::Parse(parse_data_ptr_ - 1, &parse_data_ptr_));
270311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
271311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
272311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, ParseEmpty) {
273311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(RESULT_END_OF_DATA,
274311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff            VarintType::Parse(parse_data_ptr_, &parse_data_ptr_));
275311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
276311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
277311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff// This example is taken from the Varint description in RFC 3284, section 2.
278311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, Parse123456789) {
279311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  const char parse_data_123456789[] = { 0x80 + 58, 0x80 + 111, 0x80 + 26, 21 };
280311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  parse_data_ptr_ = parse_data_123456789;
281311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(123456789, VarintType::Parse(parse_data_123456789
282311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                                             + sizeof(parse_data_123456789),
283311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                                         &parse_data_ptr_));
284311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
285311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
286311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, Decode31Bits) {
287311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  const char parse_data_31_bits[] = { 0x87, 0xFF, 0xFF, 0xFF, 0x7F };
288311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  parse_data_ptr_ = parse_data_31_bits;
289311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(0x7FFFFFFF,
290311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff            VarintType::Parse(parse_data_31_bits + sizeof(parse_data_31_bits),
291311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                              &parse_data_ptr_));
292311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
293311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
294311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VarintBEInt32Test, Decode32Bits) {
295311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  const char parse_data_32_bits[] = { 0x88, 0x80, 0x80, 0x80, 0x00 };
296311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  parse_data_ptr_ = parse_data_32_bits;
297311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(RESULT_ERROR,
298311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff            VarintType::Parse(parse_data_32_bits + sizeof(parse_data_32_bits),
299311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                              &parse_data_ptr_));
300311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
301311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
302311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEST_F(VarintBEInt64Test, Decode32Bits) {
303311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  const char parse_data_32_bits[] = { 0x88, 0x80, 0x80, 0x80, 0x00 };
304311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  parse_data_ptr_ = parse_data_32_bits;
305311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  EXPECT_EQ(0x80000000,
306311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff            VarintType::Parse(parse_data_32_bits + sizeof(parse_data_32_bits),
307311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                              &parse_data_ptr_));
308311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
309311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
310311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiffTEMPLATE_TEST_F(Test, EncodeDecodeRandom) {
311311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  const int test_size = 1024;  // 1K random encode/decode operations
312311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  char encode_buffer[VarintType::kMaxBytes];
313311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  srand(1);
314311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  for (int i = 0; i < test_size; ++i) {
315311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    SignedIntType value = PortableRandomInRange(VarintType::kMaxVal);
316311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    int length = VarintType::Encode(value, encode_buffer);
317311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(length, VarintType::Length(value));
318311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    const char* parse_pointer = encode_buffer;
319311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(value, VarintType::Parse(encode_buffer + sizeof(encode_buffer),
320311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff                                       &parse_pointer));
321311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(encode_buffer + length, parse_pointer);
322311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
323311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  for (int i = 0; i < test_size; ++i) {
324311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    s_.clear();
325311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    SignedIntType value = PortableRandomInRange(VarintType::kMaxVal);
326311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    VarintType::AppendToString(value, &s_);
327311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    const int varint_length = static_cast<int>(s_.length());
328311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(VarintType::Length(value), varint_length);
329311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    const char* parse_pointer = s_.c_str();
330311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    const char* const buffer_end_pointer = s_.c_str() + s_.length();
331311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(value, VarintType::Parse(buffer_end_pointer, &parse_pointer));
332311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff    EXPECT_EQ(buffer_end_pointer, parse_pointer);
333311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff  }
334311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}
335311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff
336f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com// If only 10 bytes of data are available, but there are 20 continuation
337f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com// bytes, Parse() should not read to the end of the continuation bytes.  It is
338f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com// legal (according to the RFC3284 spec) to use any number of continuation
339f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com// bytes, but they should not cause us to read past the end of available input.
340f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.comTEMPLATE_TEST_F(Test, ContinuationBytesPastEndOfInput) {
341f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  const char parse_data_20_continuations[] =
342f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com    { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
343f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com      0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
344f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com      0x00 };
345f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  parse_data_ptr_ = parse_data_20_continuations;
346f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com  EXPECT_EQ(RESULT_END_OF_DATA,
347f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com            VarintType::Parse(parse_data_20_continuations + 10,
348f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com                              &parse_data_ptr_));
349f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com}
350f1dd933c4e47a65889b4bba2a5f58b12aac53383openvcdiff@gmail.com
351311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}  // anonymous namespace
352311c71486f5f6074e5ba62a7f4c5397c8700b868openvcdiff}  // namespace open_vcdiff
353