Branch data Line data Source code
1 : : // Copyright (c) The Bitcoin Core developers
2 : : // Distributed under the MIT software license, see the accompanying
3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 : :
5 : : #include <cluster_linearize.h>
6 : : #include <test/util/cluster_linearize.h>
7 : : #include <test/util/setup_common.h>
8 : : #include <util/bitset.h>
9 : : #include <util/strencodings.h>
10 : :
11 : : #include <vector>
12 : :
13 : : #include <boost/test/unit_test.hpp>
14 : :
15 : : BOOST_FIXTURE_TEST_SUITE(cluster_linearize_tests, BasicTestingSetup)
16 : :
17 : : using namespace cluster_linearize;
18 : :
19 : : namespace {
20 : :
21 : : template<typename SetType>
22 : 6 : void TestDepGraphSerialization(const Cluster<SetType>& cluster, const std::string& hexenc)
23 : : {
24 : 6 : DepGraph depgraph(cluster);
25 : :
26 : : // Run normal sanity and correspondence checks, which includes a round-trip test.
27 [ + - ]: 6 : VerifyDepGraphFromCluster(cluster, depgraph);
28 : :
29 : : // There may be multiple serializations of the same graph, but DepGraphFormatter's serializer
30 : : // only produces one of those. Verify that hexenc matches that canonical serialization.
31 : 6 : std::vector<unsigned char> encoding;
32 [ + - ]: 6 : VectorWriter writer(encoding, 0);
33 [ + - ]: 6 : writer << Using<DepGraphFormatter>(depgraph);
34 [ + - + - : 12 : BOOST_CHECK_EQUAL(HexStr(encoding), hexenc);
+ - + - ]
35 : :
36 : : // Test that deserializing that encoding yields depgraph. This is effectively already implied
37 : : // by the round-trip test above (if depgraph is acyclic), but verify it explicitly again here.
38 [ + - ]: 6 : SpanReader reader(encoding);
39 [ + - ]: 6 : DepGraph<SetType> depgraph_read;
40 [ + - ]: 6 : reader >> Using<DepGraphFormatter>(depgraph_read);
41 [ + - + - ]: 18 : BOOST_CHECK(depgraph == depgraph_read);
42 : 6 : }
43 : :
44 : : } // namespace
45 : :
46 [ + - + - : 7 : BOOST_AUTO_TEST_CASE(depgraph_ser_tests)
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- ]
47 : : {
48 : : // Empty cluster.
49 [ + - ]: 2 : TestDepGraphSerialization<TestBitSet>(
50 : : {},
51 : : "00" /* end of graph */);
52 : :
53 : : // Transactions: A(fee=0,size=1).
54 [ + - + - ]: 2 : TestDepGraphSerialization<TestBitSet>(
55 : : {{{0, 1}, {}}},
56 : : "01" /* A size */
57 : : "00" /* A fee */
58 : : "00" /* A insertion position (no skips): A */
59 : : "00" /* end of graph */);
60 : :
61 : : // Transactions: A(fee=42,size=11), B(fee=-13,size=7), B depends on A.
62 [ + - + - ]: 2 : TestDepGraphSerialization<TestBitSet>(
63 : : {{{42, 11}, {}}, {{-13, 7}, {0}}},
64 : : "0b" /* A size */
65 : : "54" /* A fee */
66 : : "00" /* A insertion position (no skips): A */
67 : : "07" /* B size */
68 : : "19" /* B fee */
69 : : "00" /* B->A dependency (no skips) */
70 : : "00" /* B insertion position (no skips): A,B */
71 : : "00" /* end of graph */);
72 : :
73 : : // Transactions: A(64,128), B(128,256), C(1,1), C depends on A and B.
74 [ + - + - ]: 2 : TestDepGraphSerialization<TestBitSet>(
75 : : {{{64, 128}, {}}, {{128, 256}, {}}, {{1, 1}, {0, 1}}},
76 : : "8000" /* A size */
77 : : "8000" /* A fee */
78 : : "00" /* A insertion position (no skips): A */
79 : : "8100" /* B size */
80 : : "8100" /* B fee */
81 : : "01" /* B insertion position (skip B->A dependency): A,B */
82 : : "01" /* C size */
83 : : "02" /* C fee */
84 : : "00" /* C->B dependency (no skips) */
85 : : "00" /* C->A dependency (no skips) */
86 : : "00" /* C insertion position (no skips): A,B,C */
87 : : "00" /* end of graph */);
88 : :
89 : : // Transactions: A(-57,113), B(57,114), C(-58,115), D(58,116). Deps: B->A, C->A, D->C, in order
90 : : // [B,A,C,D]. This exercises non-topological ordering (internally serialized as A,B,C,D).
91 [ + - + - ]: 2 : TestDepGraphSerialization<TestBitSet>(
92 : : {{{57, 114}, {1}}, {{-57, 113}, {}}, {{-58, 115}, {1}}, {{58, 116}, {2}}},
93 : : "71" /* A size */
94 : : "71" /* A fee */
95 : : "00" /* A insertion position (no skips): A */
96 : : "72" /* B size */
97 : : "72" /* B fee */
98 : : "00" /* B->A dependency (no skips) */
99 : : "01" /* B insertion position (skip A): B,A */
100 : : "73" /* C size */
101 : : "73" /* C fee */
102 : : "01" /* C->A dependency (skip C->B dependency) */
103 : : "00" /* C insertion position (no skips): B,A,C */
104 : : "74" /* D size */
105 : : "74" /* D fee */
106 : : "00" /* D->C dependency (no skips) */
107 : : "01" /* D insertion position (skip D->B dependency, D->A is implied): B,A,C,D */
108 : : "00" /* end of graph */);
109 : :
110 : : // Transactions: A(1,2), B(3,1), C(2,1), D(1,3), E(1,1). Deps: C->A, D->A, D->B, E->D.
111 : : // In order: [D,A,B,E,C]. Internally serialized in order A,B,C,D,E.
112 [ + - + - ]: 2 : TestDepGraphSerialization<TestBitSet>(
113 : : {{{1, 3}, {1, 2}}, {{1, 2}, {}}, {{3, 1}, {}}, {{1, 1}, {0}}, {{2, 1}, {1}}},
114 : : "02" /* A size */
115 : : "02" /* A fee */
116 : : "00" /* A insertion position (no skips): A */
117 : : "01" /* B size */
118 : : "06" /* B fee */
119 : : "01" /* B insertion position (skip B->A dependency): A,B */
120 : : "01" /* C size */
121 : : "04" /* C fee */
122 : : "01" /* C->A dependency (skip C->B dependency) */
123 : : "00" /* C insertion position (no skips): A,B,C */
124 : : "03" /* D size */
125 : : "02" /* D fee */
126 : : "01" /* D->B dependency (skip D->C dependency) */
127 : : "00" /* D->A dependency (no skips) */
128 : : "03" /* D insertion position (skip C,B,A): D,A,B,C */
129 : : "01" /* E size */
130 : : "02" /* E fee */
131 : : "00" /* E->D dependency (no skips) */
132 : : "02" /* E insertion position (skip E->C dependency, E->B and E->A are implied,
133 : : skip insertion C): D,A,B,E,C */
134 : : "00" /* end of graph */
135 : : );
136 : 1 : }
137 : :
138 : : BOOST_AUTO_TEST_SUITE_END()
|