A test case for the network start checks that:
- all the threads are started, - it opens connections and updates stats. A base class for partial run essentially mimics bitmessagemain.
This commit is contained in:
parent
6b90332730
commit
8e05e4a178
35
src/tests/partial.py
Normal file
35
src/tests/partial.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
"""A test case for partial run class definition"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from pybitmessage import pathmagic
|
||||||
|
|
||||||
|
|
||||||
|
class TestPartialRun(unittest.TestCase):
|
||||||
|
"""
|
||||||
|
A base class for test cases running some parts of the app,
|
||||||
|
e.g. separate threads or packages.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
cls.dirs = (os.path.abspath(os.curdir), pathmagic.setup())
|
||||||
|
|
||||||
|
import bmconfigparser
|
||||||
|
import state
|
||||||
|
|
||||||
|
from debug import logger # noqa:F401 pylint: disable=unused-variable
|
||||||
|
|
||||||
|
state.shutdown = 0
|
||||||
|
cls.state = state
|
||||||
|
bmconfigparser.config = cls.config = bmconfigparser.BMConfigParser()
|
||||||
|
cls.config.read()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
cls.state.shutdown = 1
|
||||||
|
# deactivate pathmagic
|
||||||
|
os.chdir(cls.dirs[0])
|
||||||
|
sys.path.remove(cls.dirs[1])
|
74
src/tests/test_network.py
Normal file
74
src/tests/test_network.py
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
"""Test network module"""
|
||||||
|
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
|
from .common import skip_python3
|
||||||
|
from .partial import TestPartialRun
|
||||||
|
|
||||||
|
skip_python3()
|
||||||
|
|
||||||
|
|
||||||
|
class TestNetwork(TestPartialRun):
|
||||||
|
"""A test case for running the network subsystem"""
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setUpClass(cls):
|
||||||
|
super(TestNetwork, cls).setUpClass()
|
||||||
|
|
||||||
|
cls.state.maximumNumberOfHalfOpenConnections = 4
|
||||||
|
|
||||||
|
cls.config.set('bitmessagesettings', 'sendoutgoingconnections', 'True')
|
||||||
|
|
||||||
|
# config variable is still used inside of the network ):
|
||||||
|
import network
|
||||||
|
from network import connectionpool, stats
|
||||||
|
|
||||||
|
# beware of singleton
|
||||||
|
connectionpool.config = cls.config
|
||||||
|
cls.pool = network.BMConnectionPool()
|
||||||
|
cls.stats = stats
|
||||||
|
|
||||||
|
network.start(cls.config, cls.state)
|
||||||
|
|
||||||
|
def test_threads(self):
|
||||||
|
"""Ensure all the network threads started"""
|
||||||
|
threads = {
|
||||||
|
"AddrBroadcaster", "Asyncore", "Downloader", "InvBroadcaster",
|
||||||
|
"Uploader"}
|
||||||
|
extra = (
|
||||||
|
self.config.getint('threads', 'receive')
|
||||||
|
+ self.config.safeGetBoolean('bitmessagesettings', 'udp'))
|
||||||
|
for thread in threading.enumerate():
|
||||||
|
try:
|
||||||
|
threads.remove(thread.name)
|
||||||
|
except KeyError:
|
||||||
|
extra -= (
|
||||||
|
thread.name == "Announcer"
|
||||||
|
or thread.name.startswith("ReceiveQueue_"))
|
||||||
|
|
||||||
|
self.assertEqual(len(threads), 0)
|
||||||
|
self.assertEqual(extra, 0)
|
||||||
|
|
||||||
|
def test_stats(self):
|
||||||
|
"""Check that network starts connections and updates stats"""
|
||||||
|
pl = 0
|
||||||
|
for _ in range(30):
|
||||||
|
if pl == 0:
|
||||||
|
pl = len(self.pool)
|
||||||
|
if (
|
||||||
|
self.stats.receivedBytes() > 0 and self.stats.sentBytes() > 0
|
||||||
|
and pl > 0
|
||||||
|
# and len(self.stats.connectedHostsList()) > 0
|
||||||
|
):
|
||||||
|
break
|
||||||
|
time.sleep(1)
|
||||||
|
else:
|
||||||
|
self.fail('Have not started any connection in 30 sec')
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tearDownClass(cls):
|
||||||
|
super(TestNetwork, cls).tearDownClass()
|
||||||
|
for thread in threading.enumerate():
|
||||||
|
if thread.name == "Asyncore":
|
||||||
|
thread.stopThread()
|
Reference in New Issue
Block a user