rippled
BuildInfo_test.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2020 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #include <ripple/beast/unit_test.h>
21 #include <ripple/protocol/BuildInfo.h>
22 
23 namespace ripple {
24 
25 class BuildInfo_test : public beast::unit_test::suite
26 {
27 public:
28  void
30  {
31  testcase("EncodeSoftwareVersion");
32 
33  auto encodedVersion = BuildInfo::encodeSoftwareVersion("1.2.3-b7");
34 
35  // the first two bytes identify the particular implementation, 0x183B
36  BEAST_EXPECT(
37  (encodedVersion & 0xFFFF'0000'0000'0000LLU) ==
38  0x183B'0000'0000'0000LLU);
39 
40  // the next three bytes: major version, minor version, patch version,
41  // 0x010203
42  BEAST_EXPECT(
43  (encodedVersion & 0x0000'FFFF'FF00'0000LLU) ==
44  0x0000'0102'0300'0000LLU);
45 
46  // the next two bits:
47  {
48  // 01 if a beta
49  BEAST_EXPECT(
50  (encodedVersion & 0x0000'0000'00C0'0000LLU) >> 22 == 0b01);
51  // 10 if an RC
52  encodedVersion = BuildInfo::encodeSoftwareVersion("1.2.4-rc7");
53  BEAST_EXPECT(
54  (encodedVersion & 0x0000'0000'00C0'0000LLU) >> 22 == 0b10);
55  // 11 if neither an RC nor a beta
56  encodedVersion = BuildInfo::encodeSoftwareVersion("1.2.5");
57  BEAST_EXPECT(
58  (encodedVersion & 0x0000'0000'00C0'0000LLU) >> 22 == 0b11);
59  }
60 
61  // the next six bits: rc/beta number (1-63)
62  encodedVersion = BuildInfo::encodeSoftwareVersion("1.2.6-b63");
63  BEAST_EXPECT((encodedVersion & 0x0000'0000'003F'0000LLU) >> 16 == 63);
64 
65  // the last two bytes are zeros
66  BEAST_EXPECT((encodedVersion & 0x0000'0000'0000'FFFFLLU) == 0);
67 
68  // Test some version strings with wrong formats:
69  // no rc/beta number
70  encodedVersion = BuildInfo::encodeSoftwareVersion("1.2.3-b");
71  BEAST_EXPECT((encodedVersion & 0x0000'0000'00FF'0000LLU) == 0);
72  // rc/beta number out of range
73  encodedVersion = BuildInfo::encodeSoftwareVersion("1.2.3-b64");
74  BEAST_EXPECT((encodedVersion & 0x0000'0000'00FF'0000LLU) == 0);
75 
76  // Check that the rc/beta number of a release is 0:
77  encodedVersion = BuildInfo::encodeSoftwareVersion("1.2.6");
78  BEAST_EXPECT((encodedVersion & 0x0000'0000'003F'0000LLU) == 0);
79  }
80 
81  void
83  {
84  testcase("IsRippledVersion");
85  auto vFF = 0xFFFF'FFFF'FFFF'FFFFLLU;
86  BEAST_EXPECT(!BuildInfo::isRippledVersion(vFF));
87  auto vRippled = 0x183B'0000'0000'0000LLU;
88  BEAST_EXPECT(BuildInfo::isRippledVersion(vRippled));
89  }
90 
91  void
93  {
94  testcase("IsNewerVersion");
95  auto vFF = 0xFFFF'FFFF'FFFF'FFFFLLU;
96  BEAST_EXPECT(!BuildInfo::isNewerVersion(vFF));
97 
98  auto v159 = BuildInfo::encodeSoftwareVersion("1.5.9");
99  BEAST_EXPECT(!BuildInfo::isNewerVersion(v159));
100 
101  auto vCurrent = BuildInfo::getEncodedVersion();
102  BEAST_EXPECT(!BuildInfo::isNewerVersion(vCurrent));
103 
104  auto vMax = BuildInfo::encodeSoftwareVersion("255.255.255");
105  BEAST_EXPECT(BuildInfo::isNewerVersion(vMax));
106  }
107 
108  void
109  run() override
110  {
111  testEncodeSoftwareVersion();
112  testIsRippledVersion();
113  testIsNewerVersion();
114  }
115 };
116 
117 BEAST_DEFINE_TESTSUITE(BuildInfo, protocol, ripple);
118 } // namespace ripple
ripple::BuildInfo_test::testIsRippledVersion
void testIsRippledVersion()
Definition: BuildInfo_test.cpp:82
ripple::BuildInfo::encodeSoftwareVersion
std::uint64_t encodeSoftwareVersion(char const *const versionStr)
Encode an arbitrary server software version in a 64-bit integer.
Definition: BuildInfo.cpp:90
ripple::BuildInfo::isRippledVersion
bool isRippledVersion(std::uint64_t version)
Check if the encoded software version is a rippled software version.
Definition: BuildInfo.cpp:162
ripple::BuildInfo_test
Definition: BuildInfo_test.cpp:25
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::BuildInfo_test::testEncodeSoftwareVersion
void testEncodeSoftwareVersion()
Definition: BuildInfo_test.cpp:29
ripple::BuildInfo_test::testIsNewerVersion
void testIsNewerVersion()
Definition: BuildInfo_test.cpp:92