Skip to content

Commit 83aa120

Browse files
Add an example test and finnish the framework
1 parent 09225b6 commit 83aa120

10 files changed

Lines changed: 139 additions & 51 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ Cargo.lock
44
perf.*
55
*.svg
66
config.toml
7-
/builds
7+
/builds
8+
/data

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ edition = "2021"
55

66
[dependencies]
77
rustreexo = { git = "https://www.github.com/mit-dci/rustreexo" }
8-
btcd-rpc = { git = "https://github.com/Davidson-Souza/rust-btcd-rpc", features = ["utreexod"], branch = "use-reqwest"}
8+
# btcd-rpc = { git = "https://github.com/Davidson-Souza/rust-btcd-rpc", features = ["utreexod"], branch = "use-reqwest"}
9+
btcd-rpc = { path = "../utreexod-cli/client/", features = ["utreexod"] }
910
clap = {version = "4.0.29", features = ["derive"]}
1011
sha2 = "^0.10.6"
1112
async-std = "1.12.0"

tests/basic/restart.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import subprocess
2+
import time
3+
import os
4+
import filecmp
5+
from test_framework.test_framework import TestFramework
6+
7+
8+
class TestRestart(TestFramework):
9+
def run_test(self):
10+
"""
11+
Tests if we don't corrupt our data dir between restarts. This would have caught,
12+
the error fixed in #9
13+
"""
14+
print("Running restart test")
15+
base_testdir = "data/TestRestart/"
16+
self.run_node(base_testdir + "1/")
17+
time.sleep(10)
18+
self.stop_node(0)
19+
self.run_node(base_testdir + "2/")
20+
time.sleep(10)
21+
self.stop_node(0)
22+
assert (filecmp.dircmp(base_testdir + "2/", base_testdir + "1/"))
23+
print("restart test passed!")

tests/data/rpc/block_index.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[
2+
"",
3+
"00000086d6b2636cb2a392d45edc4ec544a10024d30141c9adf4bfd9de533b53",
4+
"00000032bb881de703dcc968e8258080c7ed4a2933e3a35888fa0b2f75f36029",
5+
"000000e8daac2a2e973ecaab46dc948181c638adecf5ae0fd5d3e13aa14364b0",
6+
"00000194763f1233e40afd5f6eb2e64abd2e5e158a4139198a224f8a7503d47e",
7+
"000003776c984edd753b876f0e70d08450f92dd76a768df03d2c42d1880aea5b",
8+
"000001b62ff822d0b1c68e231670eba2cf8d494075f9616447194b370db6f3da",
9+
"000000b6f018c5b53240616c7868eab7e1338de4200ec25b65a5e1c2f3c57c45",
10+
"000002213230ed813e42076f753f666244db421b3e36a3a3ba31384feb61eba2",
11+
"000001e163d0a8e294c3406a713ba4363f422f1322a1d6ab6de4e54b51e868a8"
12+
]

tests/data/rpc/blocks.json

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
[
2-
{
1+
{
2+
"00000086d6b2636cb2a392d45edc4ec544a10024d30141c9adf4bfd9de533b53": {
33
"0": "00000020f61eee3b63a380a477a063af32b2bbc97c9ff9f01f2c4225e973988108000000f575c83235984e7dc4afc1f30944c170462e84437ab6f2d52e16878a79e4678bd1914d5fae77031eccf4070001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025151feffffff0200f2052a010000001600149243f727dd5343293eb83174324019ec16c2630f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402205e423a8754336ca99dbe16509b877ef1bf98d008836c725005b3c787c41ebe46022047246e4467ad7cc7f1ad98662afcaf14c115e0095a227c7b05c5182591c23e7e01000120000000000000000000000000000000000000000000000000000000000000000000000000",
44
"1": {
55
"hash": "00000086d6b2636cb2a392d45edc4ec544a10024d30141c9adf4bfd9de533b53",
@@ -22,7 +22,7 @@
2222
"nextblockhash": "00000032bb881de703dcc968e8258080c7ed4a2933e3a35888fa0b2f75f36029"
2323
}
2424
},
25-
{
25+
"00000032bb881de703dcc968e8258080c7ed4a2933e3a35888fa0b2f75f36029": {
2626
"0": "00000020533b53ded9bff4adc94101d32400a144c54edc5ed492a3b26c63b2d686000000b38fef50592017cfafbcab88eb3d9cf50b2c801711cad8299495d26df5e54812e7914d5fae77031ecfdd0b0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025251feffffff0200f2052a01000000160014fd09839740f0e0b4fc6d5e2527e4022aa9b89dfa0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa24900473044022031d64a1692cdad1fc0ced69838169fe19ae01be524d831b95fcf5ea4e6541c3c02204f9dea0801df8b4d0cd0857c62ab35c6c25cc47c930630dc7fe723531daa3e9b01000120000000000000000000000000000000000000000000000000000000000000000000000000",
2727
"1": {
2828
"hash": "00000032bb881de703dcc968e8258080c7ed4a2933e3a35888fa0b2f75f36029",
@@ -45,7 +45,7 @@
4545
"nextblockhash": "000000e8daac2a2e973ecaab46dc948181c638adecf5ae0fd5d3e13aa14364b0"
4646
}
4747
},
48-
{
48+
"000000e8daac2a2e973ecaab46dc948181c638adecf5ae0fd5d3e13aa14364b0": {
4949
"0": "000000202960f3752f0bfa8858a3e333294aedc7808025e868c9dc03e71d88bb320000007765fcd3d5b4966beb338bba2675dc2cf2ad28d4ad1d83bdb6f286e7e27ac1f807924d5fae77031e81d60b0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025351feffffff0200f2052a010000001600141e5fb426042692ae0e87c070e78c39307a5661c20000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402205de93694763a42954865bcf1540cb82958bc62d0ec4eee02070fb7937cd037f4022067f333753bce47b10bc25eb6e1f311482e994c862a7e0b2d41ab1c8679fd1b1101000120000000000000000000000000000000000000000000000000000000000000000000000000",
5050
"1": {
5151
"hash": "000000e8daac2a2e973ecaab46dc948181c638adecf5ae0fd5d3e13aa14364b0",
@@ -68,7 +68,7 @@
6868
"nextblockhash": "00000194763f1233e40afd5f6eb2e64abd2e5e158a4139198a224f8a7503d47e"
6969
}
7070
},
71-
{
71+
"00000194763f1233e40afd5f6eb2e64abd2e5e158a4139198a224f8a7503d47e": {
7272
"0": "00000020b06443a13ae1d3d50faef5ecad38c6818194dc46abca3e972e2aacdae800000069a5829097e80fee00ac49a56ea9f82d741a6af84d32b3bc455cf31871e2a8ac27924d5fae77031e9c91050001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025451feffffff0200f2052a0100000016001430db2f8225dcf7751361ab38735de08190318cb70000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402200936f5f9872f6df5dd242026ad52241a68423f7f682e79169a8d85a374eab9b802202cd2979c48b321b3453e65e8f92460db3fca93cbea8539b450c959f4fbe630c601000120000000000000000000000000000000000000000000000000000000000000000000000000",
7373
"1": {
7474
"hash": "00000194763f1233e40afd5f6eb2e64abd2e5e158a4139198a224f8a7503d47e",
@@ -91,7 +91,7 @@
9191
"nextblockhash": "000003776c984edd753b876f0e70d08450f92dd76a768df03d2c42d1880aea5b"
9292
}
9393
},
94-
{
94+
"000003776c984edd753b876f0e70d08450f92dd76a768df03d2c42d1880aea5b": {
9595
"0": "000000207ed403758a4f228a1939418a155e2ebd4ae6b26e5ffd0ae433123f7694010000542e80b609c5bc58af5bdf492e26d4f60cd43a3966c2e063c50444c29b3757a636924d5fae77031ee8601d0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025551feffffff0200f2052a01000000160014edc207e014df34fa3885dff97d1129d356e1186a0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa24900473044022021a3656609f85a66a2c5672ed9322c2158d57251040d2716ed202a1fe14f0c12022057d68bc6611f7a9424a7e00bbf3e27e6ae6b096f60bac624a094bc97a59aa1ff01000120000000000000000000000000000000000000000000000000000000000000000000000000",
9696
"1": {
9797
"hash": "000003776c984edd753b876f0e70d08450f92dd76a768df03d2c42d1880aea5b",
@@ -114,7 +114,7 @@
114114
"nextblockhash": "000001b62ff822d0b1c68e231670eba2cf8d494075f9616447194b370db6f3da"
115115
}
116116
},
117-
{
117+
"000001b62ff822d0b1c68e231670eba2cf8d494075f9616447194b370db6f3da": {
118118
"0": "000000205bea0a88d1422c3df08d766ad72df95084d0700e6f873b75dd4e986c7703000002b57516d33ed60c2bdd9f93d6d5614083324c837e68e5ba6e04287a7285633585924d5fae77031ed171960001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025651feffffff0200f2052a010000001600143ae612599cf96f2442ce572633e0251116eaa52f0000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa24900473044022059a7c54de76bfdbb1dd44c78ea2dbd2bb4e97f4abad38965f41e76433e56423c022054bf17f04fe17415c0141f60eebd2b839200f574d8ad8d55a0917b92b0eb913401000120000000000000000000000000000000000000000000000000000000000000000000000000",
119119
"1": {
120120
"hash": "000001b62ff822d0b1c68e231670eba2cf8d494075f9616447194b370db6f3da",
@@ -137,7 +137,7 @@
137137
"nextblockhash": "000000b6f018c5b53240616c7868eab7e1338de4200ec25b65a5e1c2f3c57c45"
138138
}
139139
},
140-
{
140+
"000000b6f018c5b53240616c7868eab7e1338de4200ec25b65a5e1c2f3c57c45": {
141141
"0": "00000020daf3b60d374b19476461f97540498dcfa2eb7016238ec6b1d022f82fb60100007a7ae65b53cb988c2ec92d2384996713821d5645ffe61c9acea60da75cd5edfa1a944d5fae77031e9dbb050001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025751feffffff0200f2052a01000000160014ef2dceae02e35f8137de76768ae3345d99ca68860000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402202b3f946d6447f9bf17d00f3696cede7ee70b785495e5498274ee682a493befd5022045fc0bcf9332243168b5d35507175f9f374a8eba2336873885d12aada67ea5f601000120000000000000000000000000000000000000000000000000000000000000000000000000",
142142
"1": {
143143
"hash": "000000b6f018c5b53240616c7868eab7e1338de4200ec25b65a5e1c2f3c57c45",
@@ -160,7 +160,7 @@
160160
"nextblockhash": "000002213230ed813e42076f753f666244db421b3e36a3a3ba31384feb61eba2"
161161
}
162162
},
163-
{
163+
"000002213230ed813e42076f753f666244db421b3e36a3a3ba31384feb61eba2": {
164164
"0": "00000020457cc5f3c2e1a5655bc20e20e48d33e1b7ea68786c614032b5c518f0b6000000541f36942d82c6e7248275ff15c8933487fbe1819c67a9ecc0f4b70bb7e6cf672a944d5fae77031e8f39860001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025851feffffff0200f2052a0100000016001472a27906947c06d034b38ba2fa13c6391a4832790000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402202d62805ce60cbd60591f97f949b5ea5bd7e2307bcde343e6ea8394da92758e72022053a25370b0aa20da100189b7899a8f8675a0fdc60e38ece6b8a4f98edd94569e01000120000000000000000000000000000000000000000000000000000000000000000000000000",
165165
"1": {
166166
"hash": "000002213230ed813e42076f753f666244db421b3e36a3a3ba31384feb61eba2",
@@ -183,7 +183,7 @@
183183
"nextblockhash": "000001e163d0a8e294c3406a713ba4363f422f1322a1d6ab6de4e54b51e868a8"
184184
}
185185
},
186-
{
186+
"000001e163d0a8e294c3406a713ba4363f422f1322a1d6ab6de4e54b51e868a8": {
187187
"0": "00000020a2eb61eb4f3831baa3a3363e1b42db4462663f756f07423e81ed30322102000077224de7dea0f8d0ec22b1d2e2e255f0a987b96fe7200e1a2e6373f48a2f5b7894954d5fae77031e36867e0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff025951feffffff0200f2052a01000000160014aa0ad9f26801258382e0734dceec03a4a75f60240000000000000000776a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf94c4fecc7daa2490047304402206fa0d59990eed369bd7375767c9a6c9369fae209152b8674e520da270605528c0220749eed3b12dbe3f583f505d21803e4aef59c8e24c5831951eafa4f15a8f92c4e01000120000000000000000000000000000000000000000000000000000000000000000000000000",
188188
"1": {
189189
"hash": "000001e163d0a8e294c3406a713ba4363f422f1322a1d6ab6de4e54b51e868a8",
@@ -206,4 +206,4 @@
206206
"nextblockhash": "000001418e9af8310ef3644093dbc4a8ad9edb0c9ac80397f3479ad1729d965b"
207207
}
208208
}
209-
]
209+
}

tests/data/rpc/proofs.json

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,83 +1,83 @@
1-
[
2-
{
3-
"proof": {
1+
{
2+
"00000086d6b2636cb2a392d45edc4ec544a10024d30141c9adf4bfd9de533b53": {
3+
"1": {
44
"proofhashes": [],
55
"rememberindexes": [],
66
"targethashes": [],
77
"targetpreimages": [],
88
"prooftargets": []
99
}
1010
},
11-
{
12-
"proof": {
11+
"00000032bb881de703dcc968e8258080c7ed4a2933e3a35888fa0b2f75f36029": {
12+
"1": {
1313
"proofhashes": [],
1414
"rememberindexes": [],
1515
"targethashes": [],
1616
"targetpreimages": [],
1717
"prooftargets": []
1818
}
1919
},
20-
{
21-
"proof": {
20+
"000000e8daac2a2e973ecaab46dc948181c638adecf5ae0fd5d3e13aa14364b0": {
21+
"1": {
2222
"proofhashes": [],
2323
"rememberindexes": [],
2424
"targethashes": [],
2525
"targetpreimages": [],
2626
"prooftargets": []
2727
}
2828
},
29-
{
30-
"proof": {
29+
"00000194763f1233e40afd5f6eb2e64abd2e5e158a4139198a224f8a7503d47e": {
30+
"1": {
3131
"proofhashes": [],
3232
"rememberindexes": [],
3333
"targethashes": [],
3434
"targetpreimages": [],
3535
"prooftargets": []
3636
}
3737
},
38-
{
39-
"proof": {
38+
"000003776c984edd753b876f0e70d08450f92dd76a768df03d2c42d1880aea5b": {
39+
"1": {
4040
"proofhashes": [],
4141
"rememberindexes": [],
4242
"targethashes": [],
4343
"targetpreimages": [],
4444
"prooftargets": []
4545
}
4646
},
47-
{
48-
"proof": {
47+
"000001b62ff822d0b1c68e231670eba2cf8d494075f9616447194b370db6f3da": {
48+
"1": {
4949
"proofhashes": [],
5050
"rememberindexes": [],
5151
"targethashes": [],
5252
"targetpreimages": [],
5353
"prooftargets": []
5454
}
5555
},
56-
{
57-
"proof": {
56+
"000000b6f018c5b53240616c7868eab7e1338de4200ec25b65a5e1c2f3c57c45": {
57+
"1": {
5858
"proofhashes": [],
5959
"rememberindexes": [],
6060
"targethashes": [],
6161
"targetpreimages": [],
6262
"prooftargets": []
6363
}
6464
},
65-
{
66-
"proof": {
65+
"000002213230ed813e42076f753f666244db421b3e36a3a3ba31384feb61eba2": {
66+
"1": {
6767
"proofhashes": [],
6868
"rememberindexes": [],
6969
"targethashes": [],
7070
"targetpreimages": [],
7171
"prooftargets": []
7272
}
7373
},
74-
{
75-
"proof": {
74+
"000001e163d0a8e294c3406a713ba4363f422f1322a1d6ab6de4e54b51e868a8": {
75+
"1": {
7676
"proofhashes": [],
7777
"rememberindexes": [],
7878
"targethashes": [],
7979
"targetpreimages": [],
8080
"prooftargets": []
8181
}
8282
}
83-
]
83+
}

tests/example_test.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""
2+
This is an example of how tests should look lke, see the class bellow for more info
3+
"""
4+
import time
5+
import os
6+
7+
from test_framework.test_framework import TestFramework
8+
from test_framework.electrum_client import ElectrumClient
9+
from test_framework.mock_rpc import MockUtreexod
10+
11+
# Tests should be a child class from TestFramework
12+
13+
14+
class ExampleTest(TestFramework):
15+
# All tests should override the run_test method
16+
def run_test(self):
17+
# This creates a dummy rpc listening on port 8080
18+
self.run_rpc()
19+
# Wait until the rpc is ready
20+
time.sleep(1)
21+
# Start a new node (this crate's binary)
22+
node1 = self.run_node("./data/test1", "signet")
23+
# Wait the node to start
24+
time.sleep(10)
25+
# Create an instance of the Electrum Client, a small implementation of the electrum
26+
# protocol, to test our own electrum implementation
27+
electrum = ElectrumClient("localhost", 50001)
28+
print(electrum.get_version())
29+
30+
# .... cleanup ....
31+
os.rmdir("./data")
32+
# Stop any rpc server that is running
33+
self.stop_rpc()
34+
# Stop the node that is running
35+
self.stop_node(0)

tests/test_framework/electrum_client.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ def _request(self, method, params):
2323
if c == b'\n':
2424
break
2525
buff += c.decode("utf-8")
26-
2726
return str.encode(buff)
2827

2928

@@ -177,4 +176,4 @@ def get_version(self) -> str:
177176
Identify the client to the server and negotiate the protocol version.
178177
Only the first server.version() message is accepted.
179178
"""
180-
return self.con._request("server.version", [])
179+
return self.con._request("server.version", ["test-client", "1.2"])

tests/test_framework/mock_rpc.py

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,19 @@ def __init__(self):
1111
self.server.register_function(self.getblock)
1212
self.server.register_function(self.stop)
1313
self.server.register_function(self.getutreexoproof)
14-
self.server.register_function(self.get_best_block)
15-
self.server.register_function(self.get_block_hash)
14+
self.server.register_function(self.getbestblock)
15+
self.server.register_function(self.getblockhash)
16+
self.server.register_function(self.getheaders)
1617

18+
def run(self):
19+
print("rpc running")
1720
self.server.serve_forever()
1821

1922
def get(self, what: str, key: str | int, verbosity=bool | int) -> dict:
20-
fp = open("tests/data/rpc/{}.json" % key)
23+
fp = open(f"tests/data/rpc/{what}.json")
2124
data = json.load(fp)
25+
if verbosity == None:
26+
return data[key]
2227

2328
if verbosity:
2429
return data[key]["1"]
@@ -30,13 +35,21 @@ def getblock(self, height: int, verbose: int = 0):
3035
def stop(self):
3136
return self.server.shutdown()
3237

33-
def get_best_block(self):
34-
fp = open("tests/data/rpc/blocks.json")
38+
def getbestblock(self):
39+
fp = open("tests/data/rpc/block_index.json")
3540
data = json.load(fp)
36-
return {"height": len(data), "hash": data[-1]["1"]["hash"]}
41+
return {"height": len(data) - 1, "hash": data[-1]}
3742

38-
def get_block_hash(self, height: str) -> dict:
39-
return self.get("blocks", height)["hash"]
43+
def getblockhash(self, height: str) -> dict:
44+
return self.get("block_index", height, None)
4045

41-
def getutreexoproof(self, height: str):
42-
return self.get("proofs", height)["hash"]
46+
def getheaders(self, locator, verbosity) -> dict:
47+
fBlocks = open("tests/data/rpc/blocks.json")
48+
blocks_data = json.load(fBlocks)
49+
headers = []
50+
for i in blocks_data:
51+
headers.append(blocks_data[i]["0"][0:160])
52+
return headers
53+
54+
def getutreexoproof(self, height: str, verbosity=None):
55+
return self.get("proofs", height)

tests/test_framework/test_framework.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
import subprocess
2+
23
from threading import Thread
3-
from mock_rpc import MockUtreexod
4-
from json_rpc import Server
4+
from test_framework.mock_rpc import MockUtreexod
55

66

77
class TestFramework:
88
tests = []
99
nodes: list() = []
1010
rpc: MockUtreexod = None
1111

12-
def run_node(self, datadir: str, net: Network):
13-
node = subprocess.Popen(["cargo", "run", "--", "--network",
14-
net, "run", "--data-dir", datadir])
12+
def run_node(self, datadir: str, net: str):
13+
node = subprocess.Popen([
14+
"cargo", "run", "--", "--network",
15+
net, "run", "--rpc-host", "http://localhost:8080",
16+
"--data-dir", datadir
17+
])
1518
self.nodes.append(node)
1619

1720
def run_rpc(self):
1821
# Run as a thread
19-
self.rpc = Thread(target=MockUtreexod)
22+
self.rpc = Thread(target=MockUtreexod().run)
23+
self.rpc.daemon = True
2024
self.rpc.start()
2125

2226
def stop_rpc(self):

0 commit comments

Comments
 (0)