From 5f0ab21268e7a08e47266519efdff2140e1f5028 Mon Sep 17 00:00:00 2001 From: Lee Miller Date: Wed, 25 Sep 2024 04:04:31 +0300 Subject: [PATCH] Add a test for PoW interrruption, make a separate test case for PoW --- minode/tests/test_proofofwork.py | 77 ++++++++++++++++++++++++++++++++ minode/tests/test_structure.py | 40 ----------------- 2 files changed, 77 insertions(+), 40 deletions(-) create mode 100644 minode/tests/test_proofofwork.py diff --git a/minode/tests/test_proofofwork.py b/minode/tests/test_proofofwork.py new file mode 100644 index 0000000..b76ad63 --- /dev/null +++ b/minode/tests/test_proofofwork.py @@ -0,0 +1,77 @@ +"""Special tests for PoW""" +import base64 +import logging +import multiprocessing +import os +import queue +import signal +import threading +import time +import unittest + +from minode import proofofwork, shared, structure + + +logging.basicConfig( + level=logging.DEBUG, + format='[%(asctime)s] [%(levelname)s] %(message)s') + +multiprocessing.set_start_method('spawn') + + +class TestProofofwork(unittest.TestCase): + """Test components of proof of work""" + + def setUp(self): + shared.objects = {} + + def test_proofofwork(self): + """Check the main proofofwork call and worker""" + shared.vector_advertise_queue = queue.Queue() + obj = structure.Object( + b'\x00' * 8, int(time.time() + 300), 42, 1, + shared.stream, b'HELLO') + start_time = time.time() + proofofwork.do_pow_and_publish(obj) + try: + vector = shared.vector_advertise_queue.get(timeout=300) + except queue.Empty: + self.fail("Couldn't make work in 300 sec") + else: + time.sleep(1) + try: + result = shared.objects[vector] + except KeyError: + self.fail( + "Couldn't found object with vector %s" + " %s sec after pow start" % ( + base64.b16encode(vector), time.time() - start_time)) + self.assertTrue(result.is_valid()) + self.assertEqual(result.object_type, 42) + self.assertEqual(result.object_payload, b'HELLO') + + q = queue.Queue() + # pylint: disable=protected-access + proofofwork._pow_worker(obj.pow_target(), obj.pow_initial_hash(), q) + try: + nonce = q.get(timeout=5) + except queue.Empty: + self.fail("No nonce found in the queue") + + obj = structure.Object( + nonce, obj.expires_time, obj.object_type, obj.version, + obj.stream_number, obj.object_payload) + self.assertTrue(obj.is_valid()) + + def test_interrupt(self): + """Send signals to _pow_worker process""" + obj = structure.Object( + b'\x00' * 8, int(time.time() + 300), 42, 1, 2, os.urandom(4096)) + # pylint: disable=protected-access + threading.Thread(target=proofofwork._worker, args=(obj, )).start() + time.sleep(1) + worker = multiprocessing.active_children()[0] + # worker.terminate() + os.kill(worker.pid, signal.SIGINT) + time.sleep(1) + self.assertFalse(worker.is_alive()) diff --git a/minode/tests/test_structure.py b/minode/tests/test_structure.py index 970c152..9a3d924 100644 --- a/minode/tests/test_structure.py +++ b/minode/tests/test_structure.py @@ -1,7 +1,5 @@ """Tests for structures""" -import base64 import logging -import queue import struct import time import unittest @@ -154,41 +152,3 @@ class TestStructure(unittest.TestCase): obj.object_payload = \ b'TIGER, tiger, burning bright. In the forests of the night' self.assertFalse(obj.is_valid()) - - def test_proofofwork(self): - """Check the main proofofwork call and worker""" - shared.vector_advertise_queue = queue.Queue() - obj = structure.Object( - b'\x00' * 8, int(time.time() + 300), 42, 1, - shared.stream, b'HELLO') - start_time = time.time() - proofofwork.do_pow_and_publish(obj) - try: - vector = shared.vector_advertise_queue.get(timeout=300) - except queue.Empty: - self.fail("Couldn't make work in 300 sec") - else: - time.sleep(1) - try: - result = shared.objects[vector] - except KeyError: - self.fail( - "Couldn't found object with vector %s" - " %s sec after pow start" % ( - base64.b16encode(vector), time.time() - start_time)) - self.assertTrue(result.is_valid()) - self.assertEqual(result.object_type, 42) - self.assertEqual(result.object_payload, b'HELLO') - - q = queue.Queue() - # pylint: disable=protected-access - proofofwork._pow_worker(obj.pow_target(), obj.pow_initial_hash(), q) - try: - nonce = q.get(timeout=5) - except queue.Empty: - self.fail("No nonce found in the queue") - - obj = structure.Object( - nonce, obj.expires_time, obj.object_type, obj.version, - obj.stream_number, obj.object_payload) - self.assertTrue(obj.is_valid())