added test for learning lan services

master
Kevin Froman 2020-03-13 23:47:44 -05:00
parent 7bb95c3b87
commit d4652e1107
5 changed files with 93 additions and 40 deletions

View File

@ -31,8 +31,11 @@ class LANManager:
def __init__(self, too_many: "TooMany"): def __init__(self, too_many: "TooMany"):
self.too_many = too_many self.too_many = too_many
self.peers: "exploded IP Address string" = set()
def start(self): def start(self):
Thread(target=learn_services, daemon=True).start() Thread(target=learn_services, daemon=True).start()
Thread(target=advertise_service, daemon=True).start() Thread(target=advertise_service, daemon=True).start()
Thread(tra)

View File

@ -4,6 +4,10 @@ Discover and publish private-network
""" """
import socket import socket
import struct import struct
from typing import TYPE_CHECKING
from typing import List
from ipaddress import ip_address
from socket import SHUT_RDWR
from .getip import lan_ips from .getip import lan_ips
from utils.bettersleep import better_sleep from utils.bettersleep import better_sleep
@ -27,7 +31,10 @@ IS_ALL_GROUPS = True
ANNOUNCE_LOOP_SLEEP = 30 ANNOUNCE_LOOP_SLEEP = 30
def learn_services():
def learn_services(lan_service_list: List):
"""Take a list to infintely add lan service info to."""
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if IS_ALL_GROUPS: if IS_ALL_GROUPS:
@ -41,11 +48,26 @@ def learn_services():
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True: while True:
rec_data = sock.recv(1024) service_ips = sock.recv(200).decode('utf-8')
print('reced_data', rec_data) if 'onionr' not in service_ips:
continue
service_ips = service_ips.replace('onionr-', '').split('-')
port = 0
for service in service_ips:
try:
ip_address(service)
except ValueError:
service_ips.remove(service)
continue
# remove our own ips
service_ips = set(lan_ips) ^ set(service_ips)
# remove known ips and add to external list
lan_service_list = set(service_ips) ^ set(lan_service_list)
sock.shutdown()
sock.shutdown(SHUT_RDWR)
sock.close() sock.close()
# no return intended, list modified by reference
def advertise_service(): def advertise_service():
@ -61,5 +83,5 @@ def advertise_service():
while True: while True:
sock.sendto(f"onionr-{ips}".encode('utf-8'), (MCAST_GRP, MCAST_PORT)) sock.sendto(f"onionr-{ips}".encode('utf-8'), (MCAST_GRP, MCAST_PORT))
better_sleep(ANNOUNCE_LOOP_SLEEP) better_sleep(ANNOUNCE_LOOP_SLEEP)
sock.shutdown() sock.shutdown(SHUT_RDWR)
sock.close() sock.close()

View File

@ -2,6 +2,8 @@
LAN transport server thread LAN transport server thread
""" """
from gevent.pywsgi import WSGIServer
from flask import Flask
""" """
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -16,3 +18,16 @@ LAN transport server thread
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
class LANServer:
def __init__(self, shared_state):
app = Flask(__name__)
self.app = app
@app.route("/")
def ping():
return "pong!"
def start_server():
return

View File

@ -1,35 +0,0 @@
from unittest.mock import patch
import sys, os
sys.path.append(".")
sys.path.append("src/")
import unittest, uuid
TEST_DIR = 'testdata/%s-%s' % (uuid.uuid4(), os.path.basename(__file__)) + '/'
print("Test directory:", TEST_DIR)
os.environ["ONIONR_HOME"] = TEST_DIR
from utils import createdirs
from onionrcommands import parser
import onionrsetup as setup
from netcontroller.torcontrol import customtorrc
from utils import createdirs
from onionrsetup import setup_config, setup_default_plugins
from coredb import blockmetadb
from etc.onionrvalues import BLOCK_EXPORT_FILE_EXT
from threading import Thread
createdirs.create_dirs()
setup_config()
setup_default_plugins()
import config
from filepaths import export_location
class OnionrTests(unittest.TestCase):
def test_lan_discover(self):
testargs = ['onionr.py', 'start']
with patch.object(sys, 'argv', testargs):
try:
Thread(target=parser.register, daemon=True).start()
except SystemExit:
pass
unittest.main()

48
tests/test_lan_learn.py Normal file
View File

@ -0,0 +1,48 @@
#!/usr/bin/env python3
import sys, os
sys.path.append(".")
sys.path.append("src/")
import uuid
from threading import Thread
TEST_DIR = 'testdata/%s-%s' % (uuid.uuid4(), os.path.basename(__file__)) + '/'
print("Test directory:", TEST_DIR)
os.environ["ONIONR_HOME"] = TEST_DIR
import unittest, json
from utils import identifyhome, createdirs
from onionrsetup import setup_config
createdirs.create_dirs()
setup_config()
from utils import bettersleep
from lan.discover import lan_ips, MCAST_GRP, MCAST_PORT
from lan.discover import learn_services, advertise_service
import socket
from socket import SHUT_RDWR
lan_ips = ['']
class TestLanLearn(unittest.TestCase):
def test_lan_learn(self):
test_ip = '192.168.1.30'
def multicast():
port = 1349
MULTICAST_TTL = 3
ips = '-'.join([test_ip]) + f'-{port}'
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, MULTICAST_TTL)
sock.sendto(f"onionr-{ips}".encode('utf-8'), (MCAST_GRP, MCAST_PORT))
bettersleep.better_sleep(1)
try:
sock.shutdown(SHUT_RDWR)
except OSError:
pass
sock.close()
test_list = [test_ip]
Thread(target=learn_services, args=[test_list], daemon=True).start()
bettersleep.better_sleep(3)
multicast()
self.assertIn(test_ip, test_list)
unittest.main()