From e3cf03d4443df4705fd987f47f4905a374af0bf8 Mon Sep 17 00:00:00 2001 From: Dnomd343 Date: Thu, 24 Feb 2022 20:35:54 +0800 Subject: [PATCH] update: Tester framework --- ProxyTester/Shadowsocks.py | 39 ++++++++--------- ProxyTester/tester.py | 10 +---- test.py | 88 +++++++++++++++++++++----------------- 3 files changed, 68 insertions(+), 69 deletions(-) diff --git a/ProxyTester/Shadowsocks.py b/ProxyTester/Shadowsocks.py index c219635..e81ff27 100644 --- a/ProxyTester/Shadowsocks.py +++ b/ProxyTester/Shadowsocks.py @@ -4,9 +4,7 @@ import copy import ProxyTester.Plugin as sip003 -defaultHost = 'dns.343.re' -defaultCert = '/etc/ssl/certs/dns.343.re/certificate.crt' -defaultKey = '/etc/ssl/certs/dns.343.re/private.key' +config = {} ssMethodList = [ 'aes-128-gcm', @@ -76,32 +74,28 @@ sip003PluginList = [ # SIP003插件列表 ] def __ssServerConfig(method: str, plugin: str or None) -> list: - port = 12345 rabbitPort = 20191 - passwd = 'dnomd343' - proxyInfo = { 'type': 'ss', 'server': '127.0.0.1', - 'port': port, - 'passwd': passwd, + 'port': config['port'], + 'passwd': config['passwd'], 'method': method } - serverCommand = [] caption = 'Shadowsocks method ' + method if method in ['plain', 'none']: # plain / none -> ss-rust serverCommand = [ 'ss-rust-server', - '-s', '0.0.0.0:' + str(port), - '-k', passwd, + '-s', '0.0.0.0:' + str(config['port']), + '-k', config['passwd'], '-m', method ] elif method == 'salsa20-ctr': # salsa20-ctr -> ss-python-legacy serverCommand = [ 'ss-bootstrap-server', '--no-udp', '--shadowsocks', 'ss-python-legacy-server', - '-p', str(port), - '-k', passwd, + '-p', str(config['port']), + '-k', config['passwd'], '-m', method ] else: # others -> ss-python @@ -118,8 +112,8 @@ def __ssServerConfig(method: str, plugin: str or None) -> list: serverCommand = [ 'ss-bootstrap-server', '--no-udp', '--shadowsocks', 'ss-python-server', - '-p', str(port), - '-k', passwd, + '-p', str(config['port']), + '-k', config['passwd'], '-m', method ] if method == 'idea-cfb' or method == 'seed-cfb': @@ -142,7 +136,7 @@ def __ssServerConfig(method: str, plugin: str or None) -> list: proxyInfo['port'] = rabbitPort proxyInfo['plugin'] = { 'type': 'rabbit-plugin', - 'param': 'serviceAddr=127.0.0.1:' + str(port) + ';password=' + passwd + 'param': 'serviceAddr=127.0.0.1:' + str(config['port']) + ';password=' + config['passwd'] } return [{ 'proxy': proxyInfo, @@ -157,7 +151,7 @@ def __ssServerConfig(method: str, plugin: str or None) -> list: 'startCommand': [ 'rabbit', '-mode', 's', - '-password', passwd, + '-password', config['passwd'], '-rabbit-addr', ':' + str(rabbitPort) ], 'fileContent': None, @@ -168,7 +162,7 @@ def __ssServerConfig(method: str, plugin: str or None) -> list: # others plugin result = [] - pluginConfig = sip003.loadPluginConfig(plugin, defaultHost, defaultCert, defaultKey) # 载入插件配置 + pluginConfig = sip003.loadPluginConfig(plugin, config['host'], config['cert'], config['key']) # 载入插件配置 serverBaseCommand = copy.deepcopy(serverCommand) for pluginOption in pluginConfig: serverCommand = copy.deepcopy(serverBaseCommand) @@ -190,11 +184,12 @@ def __ssServerConfig(method: str, plugin: str or None) -> list: })) return result -def ssTest() -> list: +def ssTest(ssConfig: dict) -> list: result = [] - for method in ssMethodList: + for key, value in ssConfig.items(): # ssConfig -> config + config[key] = value + for method in ssMethodList: # all Shadowsocks methods result += __ssServerConfig(method, None) - for plugin in sip003PluginList: + for plugin in sip003PluginList: # all SIP003 plugin result += __ssServerConfig('aes-256-ctr', plugin) - # result += __ssServerConfig('aes-256-gcm', None) return result diff --git a/ProxyTester/tester.py b/ProxyTester/tester.py index ec75cba..d50660a 100644 --- a/ProxyTester/tester.py +++ b/ProxyTester/tester.py @@ -3,15 +3,9 @@ from ProxyTester import Shadowsocks -testInfo = { - 'type': 'ss', - 'method': 'aes-256-ctr', - 'plugin': None -} - -def test(key: str) -> list: +def test(key: str, config: dict) -> list: if key == 'ss': - return Shadowsocks.ssTest() + return Shadowsocks.ssTest(config) elif key == 'ssr': pass elif key == 'vmess': diff --git a/test.py b/test.py index 53d7248..f09afdd 100644 --- a/test.py +++ b/test.py @@ -2,65 +2,75 @@ # -*- coding:utf-8 -*- import os +import sys import time import subprocess + import Checker import ProxyTester as Tester -def testBuild(config: dict): +testConfig = { + 'port': 12345, + 'passwd': 'dnomd343', + 'host': 'dns.343.re', + 'cert': '/etc/ssl/certs/dns.343.re/certificate.crt', + 'key': '/etc/ssl/certs/dns.343.re/private.key' +} + +def testBuild(config: dict): # load file and start process if config['filePath'] is not None: - with open(config['filePath'], 'w') as fileObject: # 保存文件 + with open(config['filePath'], 'w') as fileObject: # save file fileObject.write(config['fileContent']) - return subprocess.Popen( # 进程启动 + return subprocess.Popen( # start process config['startCommand'], env = config['envVar'], stdout = subprocess.DEVNULL, stderr = subprocess.DEVNULL ) -def testDestroy(config: dict, process): - if process.poll() is None: # 未死亡 - while process.poll() is None: # 等待退出 +def testDestroy(config: dict, process): # remove file and kill process + if process.poll() is None: # still alive + while process.poll() is None: # wait for exit process.terminate() # SIGTERM time.sleep(0.2) if config['filePath'] is not None: - os.remove(config['filePath']) # 删除文件 - -testList = Tester.test('ss') + os.remove(config['filePath']) # remove file -aiderProcess = None -serverProcess = None -for testMethod in testList: - # print() - # print() - # print(testMethod) - # continue - print(testMethod['caption'], end = ' -> ') +def testObject(option: dict) -> None: # test target object + aiderProcess = None + serverProcess = testBuild(option['server']) # start server process + if option['aider'] is not None: + aiderProcess = testBuild(option['aider']) # start aider process - serverProcess = testBuild(testMethod['server']) - if testMethod['aider'] is not None: - aiderProcess = testBuild(testMethod['aider']) - - ret = Checker.proxyTest({ + checkResult = Checker.proxyTest({ # http check 'check': ['http'], - 'info': testMethod['proxy'] + 'info': option['proxy'] }) - if not ret['success']: - print('check error') - delay = ret['check']['http']['delay'] + print(option['caption'], end=' -> ') + if not checkResult['success']: # client build error + print('\n----------------------------------------------------------------') + print(option) + print('----------------------------------------------------------------\n') + raise Exception('check error') + delay = checkResult['check']['http']['delay'] # get http delay print(str(delay) + 'ms') - testDestroy(testMethod['server'], serverProcess) - if testMethod['aider'] is not None: - testDestroy(testMethod['aider'], aiderProcess) + testDestroy(option['server'], serverProcess) # destroy server process + if option['aider'] is not None: + testDestroy(option['aider'], aiderProcess) # destroy aider process + +if len(sys.argv) == 1: # no param + print('Unknown test type') + sys.exit(1) +testList = Tester.test(sys.argv[1], testConfig) # get test list + +if len(sys.argv) == 2: # test all + for i in range(0, len(testList)): + print(str(i), end = ': ') + testObject(testList[i]) + sys.exit(0) -# testName = sys.argv[1] -# if testName == 'ss': -# testList = Tester.Shadowsocks(defaultPort, defaultPasswd) -# elif testName == 'ssr': -# testList = Tester.ShadowsocksR(defaultPort, defaultPasswd) -# else: -# print("unknown test name") -# sys.exit(1) -# -# startTest(testList) +if len(sys.argv) == 3: # test target index + testObject(testList[int(sys.argv[2])]) +else: + print('Too many options')