Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2011 The LevelDB Authors. All rights reserved.2// Use of this source code is governed by a BSD-style license that can be3// found in the LICENSE file. See the AUTHORS file for names of contributors.5#include <vector>7#include "util/coding.h"8#include "util/testharness.h"10namespace leveldb {12class Coding {};14TEST(Coding, Fixed32) {15std::string s;16for (uint32_t v = 0; v < 100000; v++) {17PutFixed32(&s, v);18}20const char* p = s.data();21for (uint32_t v = 0; v < 100000; v++) {22uint32_t actual = DecodeFixed32(p);23ASSERT_EQ(v, actual);24p += sizeof(uint32_t);25}26}28TEST(Coding, Fixed64) {29std::string s;30for (int power = 0; power <= 63; power++) {31uint64_t v = static_cast<uint64_t>(1) << power;32PutFixed64(&s, v - 1);33PutFixed64(&s, v + 0);34PutFixed64(&s, v + 1);35}37const char* p = s.data();38for (int power = 0; power <= 63; power++) {39uint64_t v = static_cast<uint64_t>(1) << power;40uint64_t actual;41actual = DecodeFixed64(p);42ASSERT_EQ(v - 1, actual);43p += sizeof(uint64_t);45actual = DecodeFixed64(p);46ASSERT_EQ(v + 0, actual);47p += sizeof(uint64_t);49actual = DecodeFixed64(p);50ASSERT_EQ(v + 1, actual);51p += sizeof(uint64_t);52}53}55// Test that encoding routines generate little-endian encodings56TEST(Coding, EncodingOutput) {57std::string dst;58PutFixed32(&dst, 0x04030201);59ASSERT_EQ(4, dst.size());60ASSERT_EQ(0x01, static_cast<int>(dst[0]));61ASSERT_EQ(0x02, static_cast<int>(dst[1]));62ASSERT_EQ(0x03, static_cast<int>(dst[2]));63ASSERT_EQ(0x04, static_cast<int>(dst[3]));65dst.clear();66PutFixed64(&dst, 0x0807060504030201ull);67ASSERT_EQ(8, dst.size());68ASSERT_EQ(0x01, static_cast<int>(dst[0]));69ASSERT_EQ(0x02, static_cast<int>(dst[1]));70ASSERT_EQ(0x03, static_cast<int>(dst[2]));71ASSERT_EQ(0x04, static_cast<int>(dst[3]));72ASSERT_EQ(0x05, static_cast<int>(dst[4]));73ASSERT_EQ(0x06, static_cast<int>(dst[5]));74ASSERT_EQ(0x07, static_cast<int>(dst[6]));75ASSERT_EQ(0x08, static_cast<int>(dst[7]));76}78TEST(Coding, Varint32) {79std::string s;80for (uint32_t i = 0; i < (32 * 32); i++) {81uint32_t v = (i / 32) << (i % 32);82PutVarint32(&s, v);83}85const char* p = s.data();86const char* limit = p + s.size();87for (uint32_t i = 0; i < (32 * 32); i++) {88uint32_t expected = (i / 32) << (i % 32);89uint32_t actual;90const char* start = p;91p = GetVarint32Ptr(p, limit, &actual);92ASSERT_TRUE(p != nullptr);93ASSERT_EQ(expected, actual);94ASSERT_EQ(VarintLength(actual), p - start);95}96ASSERT_EQ(p, s.data() + s.size());97}99TEST(Coding, Varint64) {100// Construct the list of values to check101std::vector<uint64_t> values;102// Some special values103values.push_back(0);104values.push_back(100);105values.push_back(~static_cast<uint64_t>(0));106values.push_back(~static_cast<uint64_t>(0) - 1);107for (uint32_t k = 0; k < 64; k++) {108// Test values near powers of two109const uint64_t power = 1ull << k;110values.push_back(power);111values.push_back(power - 1);112values.push_back(power + 1);113}115std::string s;116for (size_t i = 0; i < values.size(); i++) {117PutVarint64(&s, values[i]);118}120const char* p = s.data();121const char* limit = p + s.size();122for (size_t i = 0; i < values.size(); i++) {123ASSERT_TRUE(p < limit);124uint64_t actual;125const char* start = p;126p = GetVarint64Ptr(p, limit, &actual);127ASSERT_TRUE(p != nullptr);128ASSERT_EQ(values[i], actual);129ASSERT_EQ(VarintLength(actual), p - start);130}131ASSERT_EQ(p, limit);132}134TEST(Coding, Varint32Overflow) {135uint32_t result;136std::string input("\x81\x82\x83\x84\x85\x11");137ASSERT_TRUE(GetVarint32Ptr(input.data(), input.data() + input.size(),138&result) == nullptr);139}141TEST(Coding, Varint32Truncation) {142uint32_t large_value = (1u << 31) + 100;143std::string s;144PutVarint32(&s, large_value);145uint32_t result;146for (size_t len = 0; len < s.size() - 1; len++) {147ASSERT_TRUE(GetVarint32Ptr(s.data(), s.data() + len, &result) == nullptr);148}149ASSERT_TRUE(GetVarint32Ptr(s.data(), s.data() + s.size(), &result) !=150nullptr);151ASSERT_EQ(large_value, result);152}154TEST(Coding, Varint64Overflow) {155uint64_t result;156std::string input("\x81\x82\x83\x84\x85\x81\x82\x83\x84\x85\x11");157ASSERT_TRUE(GetVarint64Ptr(input.data(), input.data() + input.size(),158&result) == nullptr);159}161TEST(Coding, Varint64Truncation) {162uint64_t large_value = (1ull << 63) + 100ull;163std::string s;164PutVarint64(&s, large_value);165uint64_t result;166for (size_t len = 0; len < s.size() - 1; len++) {167ASSERT_TRUE(GetVarint64Ptr(s.data(), s.data() + len, &result) == nullptr);168}169ASSERT_TRUE(GetVarint64Ptr(s.data(), s.data() + s.size(), &result) !=170nullptr);171ASSERT_EQ(large_value, result);172}174TEST(Coding, Strings) {175std::string s;176PutLengthPrefixedSlice(&s, Slice(""));177PutLengthPrefixedSlice(&s, Slice("foo"));178PutLengthPrefixedSlice(&s, Slice("bar"));179PutLengthPrefixedSlice(&s, Slice(std::string(200, 'x')));181Slice input(s);182Slice v;183ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v));184ASSERT_EQ("", v.ToString());185ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v));186ASSERT_EQ("foo", v.ToString());187ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v));188ASSERT_EQ("bar", v.ToString());189ASSERT_TRUE(GetLengthPrefixedSlice(&input, &v));190ASSERT_EQ(std::string(200, 'x'), v.ToString());191ASSERT_EQ("", input.ToString());192}194} // namespace leveldb196int main(int argc, char** argv) { return leveldb::test::RunAllTests(); }
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.