diff --git a/src/tests/test_overall.py b/src/tests/test_overall.py new file mode 100644 --- /dev/null +++ b/src/tests/test_overall.py @@ -0,0 +1,78 @@ +import os +import shutil +import hashlib +import multiprocessing +from unittest import TestCase + +import config +from hashtree import HashTree +from client import Client, Connection as ClientConnection +from server import Miniserver + + +dataDir=os.path.join(config.directory,"src/tests/data") +filename=os.path.join(dataDir,"test.img") + + +def compareFiles(f1,f2): + with open(f1,mode="rb") as f: + h2=hashlib.sha256(f.read()).hexdigest() + with open(f2,mode="rb") as f: + h=hashlib.sha256(f.read()).hexdigest() + return (h,h2) + + +class TestMorevna(TestCase): + def setUp(self): + src=os.path.join(dataDir,"test1.img") + shutil.copyfile(src,filename) + + @classmethod + def tearDownClass(cls): + os.remove(filename) + + def test_build(self): + treeFile=os.path.join(dataDir,"test.bin") + refFile=os.path.join(dataDir,"test1.bin") + + tree=HashTree.fromFile(os.path.join(dataDir,"test1.img")) + tree.save(treeFile) + + self.assertEqual(*compareFiles(refFile,treeFile)) + + os.remove(treeFile) + + def test_push(self): + ms=Miniserver(filename) + p=multiprocessing.Process(target=ms.serve) + p.start() + + for clientFile in ("test2.img","test3.img"): + clientFile=os.path.join(dataDir,clientFile) + c=Client(clientFile) + with ClientConnection() as con: + c.setConnection(con) + blocksToTransfer=c.negotiate() + c.sendData(blocksToTransfer) + + self.assertEqual(*compareFiles(clientFile,filename)) + + p.terminate() + p.join() + + def test_pull(self): + serverFile=os.path.join(dataDir,"test3.img") + ms=Miniserver(serverFile) + p=multiprocessing.Process(target=ms.serve) + p.start() + + c=Client(filename) + with ClientConnection() as con: + c.setConnection(con) + blocksToTransfer=c.negotiate() + c.pullData(blocksToTransfer) + + self.assertEqual(*compareFiles(serverFile,filename)) + + p.terminate() + p.join()