@@ -181,3 +181,91 @@ def run(self):
181
181
182
182
def run (config ):
183
183
Manager (config ).run ()
184
+
185
+
186
+ def test ():
187
+ import time
188
+ import threading
189
+ import os
190
+ import struct
191
+ from shadowsocks import encrypt
192
+
193
+ logging .basicConfig (level = logging .DEBUG ,
194
+ format = '%(asctime)s %(levelname)-8s %(message)s' ,
195
+ datefmt = '%Y-%m-%d %H:%M:%S' )
196
+ enc = []
197
+
198
+ def run_server ():
199
+ config = {
200
+ 'server' : '127.0.0.1' ,
201
+ 'local_port' : 1081 ,
202
+ 'port_password' : {
203
+ '8381' : 'foobar1' ,
204
+ '8382' : 'foobar2'
205
+ },
206
+ 'method' : 'aes-256-cfb' ,
207
+ 'manager_address' : '127.0.0.1:6001' ,
208
+ 'timeout' : 60 ,
209
+ 'fast_open' : False ,
210
+ 'verbose' : 2
211
+ }
212
+ manager = Manager (config )
213
+ enc .append (manager )
214
+ manager .run ()
215
+
216
+ t = threading .Thread (target = run_server ).start ()
217
+ time .sleep (2 )
218
+ manager = enc [0 ]
219
+ cli = socket .socket (socket .AF_INET , socket .SOCK_DGRAM )
220
+ cli .connect (('127.0.0.1' , 6001 ))
221
+
222
+ # test add and remove
223
+ time .sleep (1 )
224
+ cli .send (b'add: {"server_port":7001, "password":"1234"}' )
225
+ time .sleep (1 )
226
+ assert 7001 in manager ._relays
227
+ cli .send (b'remove: {"server_port":8381}' )
228
+ time .sleep (1 )
229
+ assert 8381 not in manager ._relays
230
+ logging .info ('add and remove test passed' )
231
+
232
+ # test statistics for TCP
233
+ header = common .pack_addr (b'google.com' ) + struct .pack ('>H' , 80 )
234
+ data = encrypt .encrypt_all (b'1234' , 'aes-256-cfb' , 1 ,
235
+ header + b'GET /\r \n \r \n ' )
236
+ tcp_cli = socket .socket ()
237
+ tcp_cli .connect (('127.0.0.1' , 7001 ))
238
+ tcp_cli .send (data )
239
+ rdata = tcp_cli .recv (4096 )
240
+ tcp_cli .close ()
241
+ rdata = encrypt .encrypt_all (b'1234' , 'aes-256-cfb' , 0 , rdata )
242
+
243
+ data , addr = cli .recvfrom (1506 )
244
+ data = common .to_str (data )
245
+ assert data .startswith ('stat: ' )
246
+ data = data .split ('stat:' )[1 ]
247
+ stats = json .loads (data )
248
+ assert '7001' in stats
249
+ logging .info ('TCP statistics test passed' )
250
+
251
+ # test statistics for UDP
252
+ header = common .pack_addr (b'127.0.0.1' ) + struct .pack ('>H' , 80 )
253
+ data = encrypt .encrypt_all (b'foobar2' , 'aes-256-cfb' , 1 ,
254
+ header + b'test' )
255
+ udp_cli = socket .socket (type = socket .SOCK_DGRAM )
256
+ udp_cli .sendto (data , ('127.0.0.1' , 8382 ))
257
+ tcp_cli .close ()
258
+
259
+ data , addr = cli .recvfrom (1506 )
260
+ data = common .to_str (data )
261
+ assert data .startswith ('stat: ' )
262
+ data = data .split ('stat:' )[1 ]
263
+ stats = json .loads (data )
264
+ assert '8382' in stats
265
+ logging .info ('UDP statistics test passed' )
266
+
267
+ os ._exit (0 )
268
+
269
+
270
+ if __name__ == '__main__' :
271
+ test ()
0 commit comments