import os import sys import shutil import hashlib import multiprocessing from logging import FileHandler from unittest import TestCase import config from hashtree import HashTree from client import Client, Connection as ClientConnection from server import Miniserver config.logger.removeHandler(config.handler) handler=FileHandler("/tmp/morevna.log") handler.setFormatter(config.formatter) config.logger.addHandler(handler) config.batchSize=8 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): _stdout=None @classmethod def setUpClass(cls): cls._stdout=sys.stdout sys.stdout=open("/tmp/morevna-stdout.log",mode="a") def setUp(self): src=os.path.join(dataDir,"test1.img") shutil.copyfile(src,filename) @classmethod def tearDownClass(cls): os.remove(filename) sys.stdout.close() sys.stdout=cls._stdout 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","test4.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()