Rev452, Auto hide no peers found info message, Raise error on invalid file location, Test PEX, Test invalid file downloads, Test peer download and ping
This commit is contained in:
parent
3173313ca2
commit
39413b9755
7 changed files with 128 additions and 7 deletions
|
@ -8,7 +8,7 @@ class Config(object):
|
||||||
|
|
||||||
def __init__(self, argv):
|
def __init__(self, argv):
|
||||||
self.version = "0.3.2"
|
self.version = "0.3.2"
|
||||||
self.rev = 450
|
self.rev = 452
|
||||||
self.argv = argv
|
self.argv = argv
|
||||||
self.action = None
|
self.action = None
|
||||||
self.createParser()
|
self.createParser()
|
||||||
|
|
|
@ -1,6 +1,4 @@
|
||||||
# Included modules
|
# Included modules
|
||||||
import socket
|
|
||||||
import struct
|
|
||||||
import os
|
import os
|
||||||
from cStringIO import StringIO
|
from cStringIO import StringIO
|
||||||
|
|
||||||
|
@ -139,6 +137,8 @@ class FileRequest(object):
|
||||||
file.seek(params["location"])
|
file.seek(params["location"])
|
||||||
file.read_bytes = FILE_BUFF
|
file.read_bytes = FILE_BUFF
|
||||||
file_size = os.fstat(file.fileno()).st_size
|
file_size = os.fstat(file.fileno()).st_size
|
||||||
|
assert params["location"] < file_size
|
||||||
|
|
||||||
back = {
|
back = {
|
||||||
"body": file,
|
"body": file,
|
||||||
"size": file_size,
|
"size": file_size,
|
||||||
|
@ -179,6 +179,8 @@ class FileRequest(object):
|
||||||
file.seek(params["location"])
|
file.seek(params["location"])
|
||||||
file_size = os.fstat(file.fileno()).st_size
|
file_size = os.fstat(file.fileno()).st_size
|
||||||
stream_bytes = min(FILE_BUFF, file_size - params["location"])
|
stream_bytes = min(FILE_BUFF, file_size - params["location"])
|
||||||
|
assert stream_bytes >= 0
|
||||||
|
|
||||||
back = {
|
back = {
|
||||||
"size": file_size,
|
"size": file_size,
|
||||||
"location": min(file.tell() + FILE_BUFF, file_size),
|
"location": min(file.tell() + FILE_BUFF, file_size),
|
||||||
|
@ -215,16 +217,20 @@ class FileRequest(object):
|
||||||
|
|
||||||
got_peer_keys = []
|
got_peer_keys = []
|
||||||
added = 0
|
added = 0
|
||||||
connected_peer = site.addPeer(self.connection.ip, self.connection.port) # Add requester peer to site
|
|
||||||
if connected_peer: # Just added
|
# Add requester peer to site
|
||||||
|
connected_peer = site.addPeer(self.connection.ip, self.connection.port)
|
||||||
|
if connected_peer: # It was not registered before
|
||||||
added += 1
|
added += 1
|
||||||
connected_peer.connect(self.connection) # Assign current connection to peer
|
connected_peer.connect(self.connection) # Assign current connection to peer
|
||||||
|
|
||||||
for packed_address in params["peers"]: # Add sent peers to site
|
# Add sent peers to site
|
||||||
|
for packed_address in params["peers"]:
|
||||||
address = helper.unpackAddress(packed_address)
|
address = helper.unpackAddress(packed_address)
|
||||||
got_peer_keys.append("%s:%s" % address)
|
got_peer_keys.append("%s:%s" % address)
|
||||||
if site.addPeer(*address):
|
if site.addPeer(*address):
|
||||||
added += 1
|
added += 1
|
||||||
|
|
||||||
# Send back peers that is not in the sent list and connectable (not port 0)
|
# Send back peers that is not in the sent list and connectable (not port 0)
|
||||||
packed_peers = [peer.packMyAddress() for peer in site.getConnectablePeers(params["need"], got_peer_keys)]
|
packed_peers = [peer.packMyAddress() for peer in site.getConnectablePeers(params["need"], got_peer_keys)]
|
||||||
if added:
|
if added:
|
||||||
|
|
|
@ -472,6 +472,7 @@ class Site:
|
||||||
return task
|
return task
|
||||||
|
|
||||||
# Add or update a peer to site
|
# Add or update a peer to site
|
||||||
|
# return_peer: Always return the peer even if it was already present
|
||||||
def addPeer(self, ip, port, return_peer=False):
|
def addPeer(self, ip, port, return_peer=False):
|
||||||
if not ip:
|
if not ip:
|
||||||
return False
|
return False
|
||||||
|
|
|
@ -1,11 +1,15 @@
|
||||||
import cStringIO as StringIO
|
import cStringIO as StringIO
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
import time
|
||||||
|
|
||||||
from Connection import ConnectionServer
|
from Connection import ConnectionServer
|
||||||
|
from Connection import Connection
|
||||||
|
from File import FileServer
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("resetSettings")
|
@pytest.mark.usefixtures("resetSettings")
|
||||||
|
@pytest.mark.usefixtures("resetTempSettings")
|
||||||
class TestFileRequest:
|
class TestFileRequest:
|
||||||
def testGetFile(self, file_server, site):
|
def testGetFile(self, file_server, site):
|
||||||
file_server.ip_incoming = {} # Reset flood protection
|
file_server.ip_incoming = {} # Reset flood protection
|
||||||
|
@ -17,6 +21,18 @@ class TestFileRequest:
|
||||||
response = connection.request("getFile", {"site": site.address, "inner_path": "content.json", "location": 0})
|
response = connection.request("getFile", {"site": site.address, "inner_path": "content.json", "location": 0})
|
||||||
assert "sign" in response["body"]
|
assert "sign" in response["body"]
|
||||||
|
|
||||||
|
# Invalid file
|
||||||
|
response = connection.request("getFile", {"site": site.address, "inner_path": "invalid.file", "location": 0})
|
||||||
|
assert "No such file or directory" in response["error"]
|
||||||
|
|
||||||
|
# Location over size
|
||||||
|
response = connection.request("getFile", {"site": site.address, "inner_path": "content.json", "location": 1024 * 1024})
|
||||||
|
assert "File read error" in response["error"]
|
||||||
|
|
||||||
|
# Stream from parent dir
|
||||||
|
response = connection.request("getFile", {"site": site.address, "inner_path": "../users.json", "location": 0})
|
||||||
|
assert "File not allowed" in response["error"]
|
||||||
|
|
||||||
connection.close()
|
connection.close()
|
||||||
client.stop()
|
client.stop()
|
||||||
|
|
||||||
|
@ -31,5 +47,46 @@ class TestFileRequest:
|
||||||
assert "stream_bytes" in response
|
assert "stream_bytes" in response
|
||||||
assert "sign" in buff.getvalue()
|
assert "sign" in buff.getvalue()
|
||||||
|
|
||||||
|
# Invalid file
|
||||||
|
buff = StringIO.StringIO()
|
||||||
|
response = connection.request("streamFile", {"site": site.address, "inner_path": "invalid.file", "location": 0}, buff)
|
||||||
|
assert "No such file or directory" in response["error"]
|
||||||
|
|
||||||
|
# Location over size
|
||||||
|
buff = StringIO.StringIO()
|
||||||
|
response = connection.request(
|
||||||
|
"streamFile", {"site": site.address, "inner_path": "content.json", "location": 1024 * 1024}, buff
|
||||||
|
)
|
||||||
|
assert "File read error" in response["error"]
|
||||||
|
|
||||||
|
# Stream from parent dir
|
||||||
|
buff = StringIO.StringIO()
|
||||||
|
response = connection.request("streamFile", {"site": site.address, "inner_path": "../users.json", "location": 0}, buff)
|
||||||
|
assert "File not allowed" in response["error"]
|
||||||
|
|
||||||
|
connection.close()
|
||||||
|
client.stop()
|
||||||
|
|
||||||
|
def testPex(self, file_server, site, site_temp):
|
||||||
|
file_server.sites[site.address] = site
|
||||||
|
client = FileServer("127.0.0.1", 1545)
|
||||||
|
client.sites[site_temp.address] = site_temp
|
||||||
|
site_temp.connection_server = client
|
||||||
|
connection = client.getConnection("127.0.0.1", 1544)
|
||||||
|
|
||||||
|
# Add new fake peer to site
|
||||||
|
fake_peer = site.addPeer("1.2.3.4", 11337, return_peer=True)
|
||||||
|
# Add fake connection to it
|
||||||
|
fake_peer.connection = Connection(file_server, "1.2.3.4", 11337)
|
||||||
|
fake_peer.connection.last_recv_time = time.time()
|
||||||
|
assert fake_peer in site.getConnectablePeers()
|
||||||
|
|
||||||
|
# Add file_server as peer to client
|
||||||
|
peer_file_server = site_temp.addPeer("127.0.0.1", 1544)
|
||||||
|
|
||||||
|
assert "1.2.3.4:11337" not in site_temp.peers
|
||||||
|
assert peer_file_server.pex()
|
||||||
|
assert "1.2.3.4:11337" in site_temp.peers
|
||||||
|
|
||||||
connection.close()
|
connection.close()
|
||||||
client.stop()
|
client.stop()
|
||||||
|
|
54
src/Test/TestPeer.py
Normal file
54
src/Test/TestPeer.py
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
import cStringIO as StringIO
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
import time
|
||||||
|
|
||||||
|
from Connection import ConnectionServer
|
||||||
|
from Connection import Connection
|
||||||
|
from File import FileServer
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.usefixtures("resetSettings")
|
||||||
|
@pytest.mark.usefixtures("resetTempSettings")
|
||||||
|
class TestFileRequest:
|
||||||
|
def testPing(self, file_server, site, site_temp):
|
||||||
|
file_server.ip_incoming = {} # Reset flood protection
|
||||||
|
file_server.sites[site.address] = site
|
||||||
|
client = FileServer("127.0.0.1", 1545)
|
||||||
|
client.sites[site_temp.address] = site_temp
|
||||||
|
site_temp.connection_server = client
|
||||||
|
connection = client.getConnection("127.0.0.1", 1544)
|
||||||
|
|
||||||
|
# Add file_server as peer to client
|
||||||
|
peer_file_server = site_temp.addPeer("127.0.0.1", 1544)
|
||||||
|
|
||||||
|
assert peer_file_server.ping()
|
||||||
|
|
||||||
|
assert peer_file_server in site_temp.peers.values()
|
||||||
|
peer_file_server.remove()
|
||||||
|
assert peer_file_server not in site_temp.peers.values()
|
||||||
|
|
||||||
|
connection.close()
|
||||||
|
client.stop()
|
||||||
|
|
||||||
|
def testDownloadFile(self, file_server, site, site_temp):
|
||||||
|
file_server.ip_incoming = {} # Reset flood protection
|
||||||
|
file_server.sites[site.address] = site
|
||||||
|
client = FileServer("127.0.0.1", 1545)
|
||||||
|
client.sites[site_temp.address] = site_temp
|
||||||
|
site_temp.connection_server = client
|
||||||
|
connection = client.getConnection("127.0.0.1", 1544)
|
||||||
|
|
||||||
|
# Add file_server as peer to client
|
||||||
|
peer_file_server = site_temp.addPeer("127.0.0.1", 1544)
|
||||||
|
|
||||||
|
# Testing streamFile
|
||||||
|
buff = peer_file_server.streamFile(site_temp.address, "content.json")
|
||||||
|
assert "sign" in buff.getvalue()
|
||||||
|
|
||||||
|
# Testing getFile
|
||||||
|
buff = peer_file_server.getFile(site_temp.address, "content.json")
|
||||||
|
assert "sign" in buff.getvalue()
|
||||||
|
|
||||||
|
connection.close()
|
||||||
|
client.stop()
|
|
@ -127,5 +127,8 @@ def file_server(request):
|
||||||
gevent.spawn(lambda: ConnectionServer.start(file_server))
|
gevent.spawn(lambda: ConnectionServer.start(file_server))
|
||||||
time.sleep(0) # Port opening
|
time.sleep(0) # Port opening
|
||||||
assert file_server.running
|
assert file_server.running
|
||||||
|
def stop():
|
||||||
|
file_server.stop()
|
||||||
|
request.addfinalizer(stop)
|
||||||
return file_server
|
return file_server
|
||||||
|
|
||||||
|
|
|
@ -301,7 +301,7 @@ class UiWebsocket(object):
|
||||||
if len(site.peers) == 0:
|
if len(site.peers) == 0:
|
||||||
if sys.modules["main"].file_server.port_opened:
|
if sys.modules["main"].file_server.port_opened:
|
||||||
if notification:
|
if notification:
|
||||||
self.cmd("notification", ["info", "No peers found, but your content is ready to access."])
|
self.cmd("notification", ["info", "No peers found, but your content is ready to access.", 5000])
|
||||||
self.response(to, "ok")
|
self.response(to, "ok")
|
||||||
else:
|
else:
|
||||||
if notification:
|
if notification:
|
||||||
|
|
Loading…
Reference in a new issue