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