epicyon/tests.py

163 lines
5.8 KiB
Python

__filename__ = "tests.py"
__author__ = "Bob Mottram"
__license__ = "AGPL3+"
__version__ = "0.0.1"
__maintainer__ = "Bob Mottram"
__email__ = "bob@freedombone.net"
__status__ = "Production"
import base64
import time
import os
import shutil
from person import createPerson
from Crypto.Hash import SHA256
from httpsig import signPostHeaders
from httpsig import verifyPostHeaders
from cache import storePersonInCache
from cache import getPersonFromCache
from threads import threadWithTrace
from daemon import runDaemon
from session import createSession
from person import createPerson
from posts import deleteAllPosts
from posts import createPublicPost
from follow import followPerson
from follow import followerOfPerson
def testHttpsigBase(withDigest):
print('testHttpsig(' + str(withDigest) + ')')
username='socrates'
domain='argumentative.social'
https=True
port=80
privateKeyPem,publicKeyPem,person,wfEndpoint=createPerson(username,domain,port,https,False)
messageBodyJson = '{"a key": "a value", "another key": "A string"}'
if not withDigest:
headers = {'host': domain}
else:
bodyDigest = base64.b64encode(SHA256.new(messageBodyJson.encode()).digest())
headers = {'host': domain, 'digest': f'SHA-256={bodyDigest}'}
path='/inbox'
signatureHeader = signPostHeaders(privateKeyPem, username, domain, path, https, None)
headers['signature'] = signatureHeader
assert verifyPostHeaders(https, publicKeyPem, headers, '/inbox' ,False, messageBodyJson)
assert verifyPostHeaders(https, publicKeyPem, headers, '/parambulator/inbox', False , messageBodyJson) == False
assert verifyPostHeaders(https, publicKeyPem, headers, '/inbox', True, messageBodyJson) == False
if not withDigest:
# fake domain
headers = {'host': 'bogon.domain'}
else:
# correct domain but fake message
messageBodyJson = '{"a key": "a value", "another key": "Fake GNUs"}'
bodyDigest = base64.b64encode(SHA256.new(messageBodyJson.encode()).digest())
headers = {'host': domain, 'digest': f'SHA-256={bodyDigest}'}
headers['signature'] = signatureHeader
assert verifyPostHeaders(https, publicKeyPem, headers, '/inbox', True, messageBodyJson) == False
def testHttpsig():
testHttpsigBase(False)
testHttpsigBase(True)
def testCache():
print('testCache')
personUrl="cat@cardboard.box"
personJson={ "id": 123456, "test": "This is a test" }
storePersonInCache(personUrl,personJson)
result=getPersonFromCache(personUrl)
assert result['id']==123456
assert result['test']=='This is a test'
def testThreadsFunction(param: str):
for i in range(10000):
time.sleep(2)
def testThreads():
print('testThreads')
thr = threadWithTrace(target=testThreadsFunction,args=('test',),daemon=True)
thr.start()
assert thr.isAlive()==True
time.sleep(1)
thr.kill()
thr.join()
assert thr.isAlive()==False
def createServerAlice(path: str,port: int):
print('Creating test server: Alice on port '+str(port))
if os.path.isdir(path):
shutil.rmtree(path)
os.mkdir(path)
os.chdir(path)
federationList=['127.0.0.1']
username='alice'
domain='127.0.0.1'
https=False
useTor=False
session = createSession(useTor)
privateKeyPem,publicKeyPem,person,wfEndpoint=createPerson(username,domain,port,https,True)
deleteAllPosts(username,domain)
followPerson(username,domain,'bob','127.0.0.1:61936',federationList)
followerOfPerson(username,domain,'bob','127.0.0.1:61936',federationList)
createPublicPost(username, domain, https, "No wise fish would go anywhere without a porpoise", False, True)
createPublicPost(username, domain, https, "Curiouser and curiouser!", False, True)
createPublicPost(username, domain, https, "In the gardens of memory, in the palace of dreams, that is where you and I shall meet", False, True)
print('Server running: Alice')
runDaemon(domain,port,https,federationList,useTor)
def createServerBob(path: str,port: int):
print('Creating test server: Bob on port '+str(port))
if os.path.isdir(path):
shutil.rmtree(path)
os.mkdir(path)
os.chdir(path)
federationList=['127.0.0.1']
username='alice'
domain='127.0.0.1'
https=False
useTor=False
session = createSession(useTor)
privateKeyPem,publicKeyPem,person,wfEndpoint=createPerson(username,domain,port,https,True)
deleteAllPosts(username,domain)
followPerson(username,domain,'alice','127.0.0.1:61935',federationList)
followerOfPerson(username,domain,'alice','127.0.0.1:61935',federationList)
createPublicPost(username, domain, https, "It's your life, live it your way.", False, True)
createPublicPost(username, domain, https, "One of the things I've realised is that I am very simple", False, True)
createPublicPost(username, domain, https, "Quantum physics is a bit of a passion of mine", False, True)
print('Server running: Bob')
runDaemon(domain,port,https,federationList,useTor)
def testPostMessageBetweenServers():
print('Testing sending message from one server to the inbox of another')
baseDir=os.getcwd()
if not os.path.isdir(baseDir+'/.tests'):
os.mkdir(baseDir+'/.tests')
# create the servers
thrAlice = threadWithTrace(target=createServerAlice,args=(baseDir+'/.tests/alice',61935),daemon=True)
thrAlice.start()
assert thrAlice.isAlive()==True
thrBob = threadWithTrace(target=createServerBob,args=(baseDir+'/.tests/bob',61936),daemon=True)
thrBob.start()
assert thrBob.isAlive()==True
time.sleep(10)
# stop the servers
thrAlice.kill()
thrAlice.join()
assert thrAlice.isAlive()==False
thrBob.kill()
thrBob.join()
assert thrBob.isAlive()==False
def runAllTests():
print('Running tests...')
testHttpsig()
testCache()
testThreads()
print('Tests succeeded\n')