1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
crate::ix!();
//-------------------------------------------[.cpp/bitcoin/src/test/validationinterface_tests.cpp]
#[cfg(test)]
#[fixture(TestingSetup)]
pub mod validationinterface_tests {
pub struct TestSubscriberNoop {
base: ValidationInterface,
}
impl TestSubscriberNoop {
pub fn block_checked(&mut self,
_0: &Block,
_1: &BlockValidationState) { }
}
#[test] fn unregister_validation_interface_race() {
todo!();
/*
std::atomic<bool> generate{true};
// Start thread to generate notifications
std::thread gen{[&] {
const CBlock block_dummy;
BlockValidationState state_dummy;
while (generate) {
GetMainSignals().BlockChecked(block_dummy, state_dummy);
}
}};
// Start thread to consume notifications
std::thread sub{[&] {
// keep going for about 1 sec, which is 250k iterations
for (int i = 0; i < 250000; i++) {
auto sub = std::make_shared<TestSubscriberNoop>();
RegisterSharedValidationInterface(sub);
UnregisterSharedValidationInterface(sub);
}
// tell the other thread we are done
generate = false;
}};
gen.join();
sub.join();
BOOST_CHECK(!generate);
*/
}
pub struct TestInterface {
base: ValidationInterface,
on_call: fn() -> (),
on_destroy: fn() -> (),
}
impl Drop for TestInterface {
fn drop(&mut self) {
todo!();
/*
if (m_on_destroy) m_on_destroy();
*/
}
}
impl TestInterface {
pub fn new(
on_call: fn() -> (),
on_destroy: fn() -> ()) -> Self {
todo!();
/*
: m_on_call(std::move(on_call)), m_on_destroy(std::move(on_destroy))
*/
}
pub fn block_checked(&mut self,
block: &Block,
state: &BlockValidationState) {
todo!();
/*
if (m_on_call) m_on_call();
*/
}
pub fn call() {
todo!();
/*
CBlock block;
BlockValidationState state;
GetMainSignals().BlockChecked(block, state);
*/
}
}
/**
| Regression test to ensure
| UnregisterAllValidationInterfaces calls don't
| destroy a validation interface while it is
| being called. Bug:
| https://github.com/bitcoin/bitcoin/pull/18551
*/
#[test] fn unregister_all_during_call() {
todo!();
/*
bool destroyed = false;
RegisterSharedValidationInterface(std::make_shared<TestInterface>(
[&] {
// First call should decrements reference count 2 -> 1
UnregisterAllValidationInterfaces();
BOOST_CHECK(!destroyed);
// Second call should not decrement reference count 1 -> 0
UnregisterAllValidationInterfaces();
BOOST_CHECK(!destroyed);
},
[&] { destroyed = true; }));
TestInterface::Call();
BOOST_CHECK(destroyed);
*/
}
}