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