Forking what is left of ZeroNet and hopefully adding an AT Proto Frontend/Proxy
1import time
2import io
3
4import pytest
5
6from File import FileServer
7from File import FileRequest
8from Crypt import CryptHash
9from . import Spy
10
11
12@pytest.mark.usefixtures("resetSettings")
13@pytest.mark.usefixtures("resetTempSettings")
14class TestPeer:
15 def testPing(self, file_server, site, site_temp):
16 file_server.sites[site.address] = site
17 client = FileServer(file_server.ip, 1545)
18 client.sites = {site_temp.address: site_temp}
19 site_temp.connection_server = client
20 connection = client.getConnection(file_server.ip, 1544)
21
22 # Add file_server as peer to client
23 peer_file_server = site_temp.addPeer(file_server.ip, 1544)
24
25 assert peer_file_server.ping() is not None
26
27 assert peer_file_server in site_temp.peers.values()
28 peer_file_server.remove()
29 assert peer_file_server not in site_temp.peers.values()
30
31 connection.close()
32 client.stop()
33
34 def testDownloadFile(self, file_server, site, site_temp):
35 file_server.sites[site.address] = site
36 client = FileServer(file_server.ip, 1545)
37 client.sites = {site_temp.address: site_temp}
38 site_temp.connection_server = client
39 connection = client.getConnection(file_server.ip, 1544)
40
41 # Add file_server as peer to client
42 peer_file_server = site_temp.addPeer(file_server.ip, 1544)
43
44 # Testing streamFile
45 buff = peer_file_server.getFile(site_temp.address, "content.json", streaming=True)
46 assert b"sign" in buff.getvalue()
47
48 # Testing getFile
49 buff = peer_file_server.getFile(site_temp.address, "content.json")
50 assert b"sign" in buff.getvalue()
51
52 connection.close()
53 client.stop()
54
55 def testHashfield(self, site):
56 sample_hash = list(site.content_manager.contents["content.json"]["files_optional"].values())[0]["sha512"]
57
58 site.storage.verifyFiles(quick_check=True) # Find what optional files we have
59
60 # Check if hashfield has any files
61 assert site.content_manager.hashfield
62 assert len(site.content_manager.hashfield) > 0
63
64 # Check exsist hash
65 assert site.content_manager.hashfield.getHashId(sample_hash) in site.content_manager.hashfield
66
67 # Add new hash
68 new_hash = CryptHash.sha512sum(io.BytesIO(b"hello"))
69 assert site.content_manager.hashfield.getHashId(new_hash) not in site.content_manager.hashfield
70 assert site.content_manager.hashfield.appendHash(new_hash)
71 assert not site.content_manager.hashfield.appendHash(new_hash) # Don't add second time
72 assert site.content_manager.hashfield.getHashId(new_hash) in site.content_manager.hashfield
73
74 # Remove new hash
75 assert site.content_manager.hashfield.removeHash(new_hash)
76 assert site.content_manager.hashfield.getHashId(new_hash) not in site.content_manager.hashfield
77
78 def testHashfieldExchange(self, file_server, site, site_temp):
79 server1 = file_server
80 server1.sites[site.address] = site
81 site.connection_server = server1
82
83 server2 = FileServer(file_server.ip, 1545)
84 server2.sites[site_temp.address] = site_temp
85 site_temp.connection_server = server2
86 site.storage.verifyFiles(quick_check=True) # Find what optional files we have
87
88 # Add file_server as peer to client
89 server2_peer1 = site_temp.addPeer(file_server.ip, 1544)
90
91 # Check if hashfield has any files
92 assert len(site.content_manager.hashfield) > 0
93
94 # Testing hashfield sync
95 assert len(server2_peer1.hashfield) == 0
96 assert server2_peer1.updateHashfield() # Query hashfield from peer
97 assert len(server2_peer1.hashfield) > 0
98
99 # Test force push new hashfield
100 site_temp.content_manager.hashfield.appendHash("AABB")
101 server1_peer2 = site.addPeer(file_server.ip, 1545, return_peer=True)
102 with Spy.Spy(FileRequest, "route") as requests:
103 assert len(server1_peer2.hashfield) == 0
104 server2_peer1.sendMyHashfield()
105 assert len(server1_peer2.hashfield) == 1
106 server2_peer1.sendMyHashfield() # Hashfield not changed, should be ignored
107
108 assert len(requests) == 1
109
110 time.sleep(0.01) # To make hashfield change date different
111
112 site_temp.content_manager.hashfield.appendHash("AACC")
113 server2_peer1.sendMyHashfield() # Push hashfield
114
115 assert len(server1_peer2.hashfield) == 2
116 assert len(requests) == 2
117
118 site_temp.content_manager.hashfield.appendHash("AADD")
119
120 assert server1_peer2.updateHashfield(force=True) # Request hashfield
121 assert len(server1_peer2.hashfield) == 3
122 assert len(requests) == 3
123
124 assert not server2_peer1.sendMyHashfield() # Not changed, should be ignored
125 assert len(requests) == 3
126
127 server2.stop()
128
129 def testFindHash(self, file_server, site, site_temp):
130 file_server.sites[site.address] = site
131 client = FileServer(file_server.ip, 1545)
132 client.sites = {site_temp.address: site_temp}
133 site_temp.connection_server = client
134
135 # Add file_server as peer to client
136 peer_file_server = site_temp.addPeer(file_server.ip, 1544)
137
138 assert peer_file_server.findHashIds([1234]) == {}
139
140 # Add fake peer with requred hash
141 fake_peer_1 = site.addPeer(file_server.ip_external, 1544)
142 fake_peer_1.hashfield.append(1234)
143 fake_peer_2 = site.addPeer("1.2.3.5", 1545)
144 fake_peer_2.hashfield.append(1234)
145 fake_peer_2.hashfield.append(1235)
146 fake_peer_3 = site.addPeer("1.2.3.6", 1546)
147 fake_peer_3.hashfield.append(1235)
148 fake_peer_3.hashfield.append(1236)
149
150 res = peer_file_server.findHashIds([1234, 1235])
151 assert sorted(res[1234]) == sorted([(file_server.ip_external, 1544), ("1.2.3.5", 1545)])
152 assert sorted(res[1235]) == sorted([("1.2.3.5", 1545), ("1.2.3.6", 1546)])
153
154 # Test my address adding
155 site.content_manager.hashfield.append(1234)
156
157 res = peer_file_server.findHashIds([1234, 1235])
158 assert sorted(res[1234]) == sorted([(file_server.ip_external, 1544), ("1.2.3.5", 1545), (file_server.ip, 1544)])
159 assert sorted(res[1235]) == sorted([("1.2.3.5", 1545), ("1.2.3.6", 1546)])