import http . server
import threading
import socket
from functools import wraps
class MockResponse :
def __init__ ( self , json , status_code ) :
self . json = json
self . text = json
self . status_code = status_code
class EchoSocket ( ) :
def __init__ ( self , port ) :
self . socket = socket . socket ( socket . AF_INET , socket . SOCK_STREAM )
self . socket . bind ( ( ' 127.0.0.1 ' , port ) )
self . socket . listen ( 1 )
def run ( self ) :
conn , _ = self . socket . accept ( )
conn . settimeout ( 5.0 )
try :
while True :
data = conn . recv ( 4096 )
if data :
print ( f ' EchoSocket got { data } ' )
conn . sendall ( data )
else :
break
finally :
conn . shutdown ( 0 )
conn . close ( )
self . socket . shutdown ( 0 )
self . socket . close ( )
class MockApi ( ) :
def __init__ ( self , dongle_id ) :
pass
def get_token ( self ) :
return " fake-token "
class MockWebsocket ( ) :
def __init__ ( self , recv_queue , send_queue ) :
self . recv_queue = recv_queue
self . send_queue = send_queue
def recv ( self ) :
data = self . recv_queue . get ( )
if isinstance ( data , Exception ) :
raise data
return data
def send ( self , data , opcode ) :
self . send_queue . put_nowait ( ( data , opcode ) )
class HTTPRequestHandler ( http . server . SimpleHTTPRequestHandler ) :
def do_PUT ( self ) :
length = int ( self . headers [ ' Content-Length ' ] )
self . rfile . read ( length )
self . send_response ( 201 , " Created " )
self . end_headers ( )
def with_http_server ( func , handler = http . server . BaseHTTPRequestHandler , setup = None ) :
@wraps ( func )
def inner ( * args , * * kwargs ) :
host = ' 127.0.0.1 '
server = http . server . HTTPServer ( ( host , 0 ) , handler )
port = server . server_port
t = threading . Thread ( target = server . serve_forever )
t . start ( )
if setup is not None :
setup ( host , port )
try :
return func ( * args , f ' http:// { host } : { port } ' , * * kwargs )
finally :
server . shutdown ( )
server . server_close ( )
t . join ( )
return inner