Browse Source

update: Tester framework

master
Dnomd343 2 years ago
parent
commit
e3cf03d444
  1. 39
      ProxyTester/Shadowsocks.py
  2. 10
      ProxyTester/tester.py
  3. 88
      test.py

39
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

10
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':

88
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')

Loading…
Cancel
Save