Improve channel allocation and write basic tests for it
parent
6306231098
commit
065fe94cbd
@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
#pre-commit run -a
|
||||
python -m unittest discover -s tests -p 'test_*.py'
|
@ -0,0 +1,109 @@
|
||||
import logging
|
||||
from unittest import TestCase
|
||||
from unittest.mock import MagicMock, patch
|
||||
from random import randint
|
||||
from modules import chankeep
|
||||
from math import ceil
|
||||
import heapq
|
||||
|
||||
class TestChanKeep(TestCase):
|
||||
def setUp(self):
|
||||
self.net = "testnet"
|
||||
self.num = 1
|
||||
self.chanlimit = 100
|
||||
chankeep.main.initConf()
|
||||
chankeep.main.r = MagicMock()
|
||||
chankeep.main.g = MagicMock()
|
||||
chankeep.main.g.pipeline = MagicMock()
|
||||
chankeep.main.config["ChanKeep"]["Provision"] = False
|
||||
|
||||
self.listinfo = self.generate_listinfo()
|
||||
self.chan_name_list = [x[0] for x in self.listinfo]
|
||||
self.chan_member_list = [x[1] for x in self.listinfo]
|
||||
|
||||
def generate_listinfo(self, ranges=None):
|
||||
"""
|
||||
Create a fake listinfo.
|
||||
Where #channel has 192 users, and #channel2 has 188 users.
|
||||
listinfo = [["#channel", 192], ["#channel2", 188]]
|
||||
"""
|
||||
if not ranges:
|
||||
ranges = [[100, 5, 10], [400, 100, 200], [2, 500, 1000]]
|
||||
listinfo = []
|
||||
for channum, min, max in ranges:
|
||||
for i in range(channum):
|
||||
chan_name = f"#num-{channum}-{i}"
|
||||
chan_users = randint(min, max)
|
||||
listinfo.append([chan_name, chan_users])
|
||||
return listinfo
|
||||
|
||||
def percent_diff(self, a, b):
|
||||
return (abs(b - a) / a) * 100.0
|
||||
|
||||
def test_alt_listinfo(self):
|
||||
# We're looking for a perc of 1000-1100
|
||||
# And a sigrelay of 2
|
||||
# We only want those 10 big channels
|
||||
instances = 1
|
||||
chanlimit = 5
|
||||
max_chans = instances * chanlimit
|
||||
listinfo = self.generate_listinfo(ranges=[[1000, 1, 2], [200, 400, 800], [10, 1000, 2000]])
|
||||
listinfo_num = [x[1] for x in listinfo]
|
||||
|
||||
listlength = len(listinfo)
|
||||
cumul = 0
|
||||
try:
|
||||
cumul += sum(int(i[1]) for i in listinfo)
|
||||
except TypeError:
|
||||
return
|
||||
mean = round(cumul / listlength, 2)
|
||||
siglength = 0
|
||||
insiglength = 0
|
||||
sigcumul = 0
|
||||
insigcumul = 0
|
||||
for i in listinfo:
|
||||
if int(i[1]) > mean:
|
||||
siglength += 1
|
||||
sigcumul += int(i[1])
|
||||
elif int(i[1]) < mean:
|
||||
insiglength += 1
|
||||
insigcumul += int(i[1])
|
||||
|
||||
sigrelay = ceil(siglength / chanlimit)
|
||||
relay = ceil(listlength / chanlimit)
|
||||
print(f"len:{listlength} cumul:{cumul} mean:{mean} siglength:{siglength} insiglength:{insiglength} sigrelay:{sigrelay} relay:{relay} sigcumul:{sigcumul} insigcumul:{insigcumul}")
|
||||
# We want a return between 1000 and 1100
|
||||
|
||||
list_insig = [x for x in listinfo_num if x < mean]
|
||||
list_sig = [x for x in listinfo if x[1] > mean]
|
||||
chosen = sorted(list_sig, reverse=True, key=lambda x: x[1])[:max_chans]
|
||||
print("CHOSEN", chosen)
|
||||
self.assertEqual(len(chosen), 5)
|
||||
|
||||
@patch("modules.chankeep.keepChannels")
|
||||
def test__initialList(self, keepchannels):
|
||||
chankeep._initialList(self.net, self.num, self.listinfo, self.chanlimit)
|
||||
net, passed_list, mean, sigrelay, relay, chanlimit = keepchannels.call_args_list[0][0]
|
||||
self.assertEqual(net, self.net)
|
||||
self.assertEqual(passed_list, self.listinfo)
|
||||
self.assertEqual(chanlimit, self.chanlimit)
|
||||
# print(net, mean, sigrelay, relay)
|
||||
|
||||
@patch("modules.chankeep.getChanFree")
|
||||
def test_empty_chan_allocate(self, getchanfree):
|
||||
getchanfree.return_value = ({1: 600}, 600) # pretend we have 600 channels free
|
||||
eca = chankeep.emptyChanAllocate(self.net, self.chan_name_list, [])
|
||||
self.assertEqual(len(eca), 1)
|
||||
num = list(eca.keys())[0]
|
||||
chans = eca[list(eca.keys())[0]]
|
||||
self.assertEqual(num, self.num)
|
||||
self.assertCountEqual(chans, self.chan_name_list)
|
||||
|
||||
getchanfree.return_value = ({1: 100}, 10)
|
||||
eca = chankeep.emptyChanAllocate(self.net, self.chan_name_list, [])
|
||||
self.assertEqual(len(eca), 1)
|
||||
num = list(eca.keys())[0]
|
||||
chans = eca[list(eca.keys())[0]]
|
||||
self.assertEqual(num, self.num)
|
||||
self.assertEqual(len(chans), 100)
|
||||
#self.assertCountEqual(chans, self.chan_name_list)
|
Loading…
Reference in New Issue