vmess_test.go 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330
  1. package scenarios
  2. import (
  3. "crypto/rand"
  4. "os"
  5. "sync"
  6. "testing"
  7. "time"
  8. "github.com/google/go-cmp/cmp"
  9. "golang.org/x/sync/errgroup"
  10. "v2ray.com/core"
  11. "v2ray.com/core/app/log"
  12. "v2ray.com/core/app/proxyman"
  13. "v2ray.com/core/common"
  14. clog "v2ray.com/core/common/log"
  15. "v2ray.com/core/common/net"
  16. "v2ray.com/core/common/protocol"
  17. "v2ray.com/core/common/serial"
  18. "v2ray.com/core/common/uuid"
  19. "v2ray.com/core/proxy/dokodemo"
  20. "v2ray.com/core/proxy/freedom"
  21. "v2ray.com/core/proxy/vmess"
  22. "v2ray.com/core/proxy/vmess/inbound"
  23. "v2ray.com/core/proxy/vmess/outbound"
  24. "v2ray.com/core/testing/servers/tcp"
  25. "v2ray.com/core/testing/servers/udp"
  26. "v2ray.com/core/transport/internet"
  27. "v2ray.com/core/transport/internet/kcp"
  28. . "v2ray.com/ext/assert"
  29. )
  30. func TestVMessDynamicPort(t *testing.T) {
  31. tcpServer := tcp.Server{
  32. MsgProcessor: xor,
  33. }
  34. dest, err := tcpServer.Start()
  35. common.Must(err)
  36. defer tcpServer.Close()
  37. userID := protocol.NewID(uuid.New())
  38. serverPort := tcp.PickPort()
  39. serverConfig := &core.Config{
  40. App: []*serial.TypedMessage{
  41. serial.ToTypedMessage(&log.Config{
  42. ErrorLogLevel: clog.Severity_Debug,
  43. ErrorLogType: log.LogType_Console,
  44. }),
  45. },
  46. Inbound: []*core.InboundHandlerConfig{
  47. {
  48. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  49. PortRange: net.SinglePortRange(serverPort),
  50. Listen: net.NewIPOrDomain(net.LocalHostIP),
  51. }),
  52. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  53. User: []*protocol.User{
  54. {
  55. Account: serial.ToTypedMessage(&vmess.Account{
  56. Id: userID.String(),
  57. }),
  58. },
  59. },
  60. Detour: &inbound.DetourConfig{
  61. To: "detour",
  62. },
  63. }),
  64. },
  65. {
  66. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  67. PortRange: &net.PortRange{
  68. From: uint32(serverPort + 1),
  69. To: uint32(serverPort + 100),
  70. },
  71. Listen: net.NewIPOrDomain(net.LocalHostIP),
  72. AllocationStrategy: &proxyman.AllocationStrategy{
  73. Type: proxyman.AllocationStrategy_Random,
  74. Concurrency: &proxyman.AllocationStrategy_AllocationStrategyConcurrency{
  75. Value: 2,
  76. },
  77. Refresh: &proxyman.AllocationStrategy_AllocationStrategyRefresh{
  78. Value: 5,
  79. },
  80. },
  81. }),
  82. ProxySettings: serial.ToTypedMessage(&inbound.Config{}),
  83. Tag: "detour",
  84. },
  85. },
  86. Outbound: []*core.OutboundHandlerConfig{
  87. {
  88. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  89. },
  90. },
  91. }
  92. clientPort := tcp.PickPort()
  93. clientConfig := &core.Config{
  94. App: []*serial.TypedMessage{
  95. serial.ToTypedMessage(&log.Config{
  96. ErrorLogLevel: clog.Severity_Debug,
  97. ErrorLogType: log.LogType_Console,
  98. }),
  99. },
  100. Inbound: []*core.InboundHandlerConfig{
  101. {
  102. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  103. PortRange: net.SinglePortRange(clientPort),
  104. Listen: net.NewIPOrDomain(net.LocalHostIP),
  105. }),
  106. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  107. Address: net.NewIPOrDomain(dest.Address),
  108. Port: uint32(dest.Port),
  109. NetworkList: &net.NetworkList{
  110. Network: []net.Network{net.Network_TCP},
  111. },
  112. }),
  113. },
  114. },
  115. Outbound: []*core.OutboundHandlerConfig{
  116. {
  117. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  118. Receiver: []*protocol.ServerEndpoint{
  119. {
  120. Address: net.NewIPOrDomain(net.LocalHostIP),
  121. Port: uint32(serverPort),
  122. User: []*protocol.User{
  123. {
  124. Account: serial.ToTypedMessage(&vmess.Account{
  125. Id: userID.String(),
  126. }),
  127. },
  128. },
  129. },
  130. },
  131. }),
  132. },
  133. },
  134. }
  135. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  136. common.Must(err)
  137. defer CloseAllServers(servers)
  138. for i := 0; i < 10; i++ {
  139. if err := testTCPConn(clientPort, 1024, time.Second*2)(); err != nil {
  140. t.Error(err)
  141. }
  142. }
  143. }
  144. func TestVMessGCM(t *testing.T) {
  145. tcpServer := tcp.Server{
  146. MsgProcessor: xor,
  147. }
  148. dest, err := tcpServer.Start()
  149. common.Must(err)
  150. defer tcpServer.Close()
  151. userID := protocol.NewID(uuid.New())
  152. serverPort := tcp.PickPort()
  153. serverConfig := &core.Config{
  154. App: []*serial.TypedMessage{
  155. serial.ToTypedMessage(&log.Config{
  156. ErrorLogLevel: clog.Severity_Debug,
  157. ErrorLogType: log.LogType_Console,
  158. }),
  159. },
  160. Inbound: []*core.InboundHandlerConfig{
  161. {
  162. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  163. PortRange: net.SinglePortRange(serverPort),
  164. Listen: net.NewIPOrDomain(net.LocalHostIP),
  165. }),
  166. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  167. User: []*protocol.User{
  168. {
  169. Account: serial.ToTypedMessage(&vmess.Account{
  170. Id: userID.String(),
  171. AlterId: 64,
  172. }),
  173. },
  174. },
  175. }),
  176. },
  177. },
  178. Outbound: []*core.OutboundHandlerConfig{
  179. {
  180. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  181. },
  182. },
  183. }
  184. clientPort := tcp.PickPort()
  185. clientConfig := &core.Config{
  186. App: []*serial.TypedMessage{
  187. serial.ToTypedMessage(&log.Config{
  188. ErrorLogLevel: clog.Severity_Debug,
  189. ErrorLogType: log.LogType_Console,
  190. }),
  191. },
  192. Inbound: []*core.InboundHandlerConfig{
  193. {
  194. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  195. PortRange: net.SinglePortRange(clientPort),
  196. Listen: net.NewIPOrDomain(net.LocalHostIP),
  197. }),
  198. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  199. Address: net.NewIPOrDomain(dest.Address),
  200. Port: uint32(dest.Port),
  201. NetworkList: &net.NetworkList{
  202. Network: []net.Network{net.Network_TCP},
  203. },
  204. }),
  205. },
  206. },
  207. Outbound: []*core.OutboundHandlerConfig{
  208. {
  209. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  210. Receiver: []*protocol.ServerEndpoint{
  211. {
  212. Address: net.NewIPOrDomain(net.LocalHostIP),
  213. Port: uint32(serverPort),
  214. User: []*protocol.User{
  215. {
  216. Account: serial.ToTypedMessage(&vmess.Account{
  217. Id: userID.String(),
  218. AlterId: 64,
  219. SecuritySettings: &protocol.SecurityConfig{
  220. Type: protocol.SecurityType_AES128_GCM,
  221. },
  222. }),
  223. },
  224. },
  225. },
  226. },
  227. }),
  228. },
  229. },
  230. }
  231. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  232. if err != nil {
  233. t.Fatal("Failed to initialize all servers: ", err.Error())
  234. }
  235. defer CloseAllServers(servers)
  236. var errg errgroup.Group
  237. for i := 0; i < 10; i++ {
  238. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40))
  239. }
  240. if err := errg.Wait(); err != nil {
  241. t.Error(err)
  242. }
  243. }
  244. func TestVMessGCMReadv(t *testing.T) {
  245. tcpServer := tcp.Server{
  246. MsgProcessor: xor,
  247. }
  248. dest, err := tcpServer.Start()
  249. common.Must(err)
  250. defer tcpServer.Close()
  251. userID := protocol.NewID(uuid.New())
  252. serverPort := tcp.PickPort()
  253. serverConfig := &core.Config{
  254. App: []*serial.TypedMessage{
  255. serial.ToTypedMessage(&log.Config{
  256. ErrorLogLevel: clog.Severity_Debug,
  257. ErrorLogType: log.LogType_Console,
  258. }),
  259. },
  260. Inbound: []*core.InboundHandlerConfig{
  261. {
  262. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  263. PortRange: net.SinglePortRange(serverPort),
  264. Listen: net.NewIPOrDomain(net.LocalHostIP),
  265. }),
  266. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  267. User: []*protocol.User{
  268. {
  269. Account: serial.ToTypedMessage(&vmess.Account{
  270. Id: userID.String(),
  271. AlterId: 64,
  272. }),
  273. },
  274. },
  275. }),
  276. },
  277. },
  278. Outbound: []*core.OutboundHandlerConfig{
  279. {
  280. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  281. },
  282. },
  283. }
  284. clientPort := tcp.PickPort()
  285. clientConfig := &core.Config{
  286. App: []*serial.TypedMessage{
  287. serial.ToTypedMessage(&log.Config{
  288. ErrorLogLevel: clog.Severity_Debug,
  289. ErrorLogType: log.LogType_Console,
  290. }),
  291. },
  292. Inbound: []*core.InboundHandlerConfig{
  293. {
  294. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  295. PortRange: net.SinglePortRange(clientPort),
  296. Listen: net.NewIPOrDomain(net.LocalHostIP),
  297. }),
  298. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  299. Address: net.NewIPOrDomain(dest.Address),
  300. Port: uint32(dest.Port),
  301. NetworkList: &net.NetworkList{
  302. Network: []net.Network{net.Network_TCP},
  303. },
  304. }),
  305. },
  306. },
  307. Outbound: []*core.OutboundHandlerConfig{
  308. {
  309. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  310. Receiver: []*protocol.ServerEndpoint{
  311. {
  312. Address: net.NewIPOrDomain(net.LocalHostIP),
  313. Port: uint32(serverPort),
  314. User: []*protocol.User{
  315. {
  316. Account: serial.ToTypedMessage(&vmess.Account{
  317. Id: userID.String(),
  318. AlterId: 64,
  319. SecuritySettings: &protocol.SecurityConfig{
  320. Type: protocol.SecurityType_AES128_GCM,
  321. },
  322. }),
  323. },
  324. },
  325. },
  326. },
  327. }),
  328. },
  329. },
  330. }
  331. const envName = "V2RAY_BUF_READV"
  332. common.Must(os.Setenv(envName, "enable"))
  333. defer os.Unsetenv(envName)
  334. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  335. if err != nil {
  336. t.Fatal("Failed to initialize all servers: ", err.Error())
  337. }
  338. defer CloseAllServers(servers)
  339. var errg errgroup.Group
  340. for i := 0; i < 10; i++ {
  341. errg.Go(testTCPConn(clientPort, 10240*1024, time.Second*40))
  342. }
  343. if err := errg.Wait(); err != nil {
  344. t.Error(err)
  345. }
  346. }
  347. func TestVMessGCMUDP(t *testing.T) {
  348. assert := With(t)
  349. udpServer := udp.Server{
  350. MsgProcessor: xor,
  351. }
  352. dest, err := udpServer.Start()
  353. assert(err, IsNil)
  354. defer udpServer.Close()
  355. userID := protocol.NewID(uuid.New())
  356. serverPort := tcp.PickPort()
  357. serverConfig := &core.Config{
  358. App: []*serial.TypedMessage{
  359. serial.ToTypedMessage(&log.Config{
  360. ErrorLogLevel: clog.Severity_Debug,
  361. ErrorLogType: log.LogType_Console,
  362. }),
  363. },
  364. Inbound: []*core.InboundHandlerConfig{
  365. {
  366. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  367. PortRange: net.SinglePortRange(serverPort),
  368. Listen: net.NewIPOrDomain(net.LocalHostIP),
  369. }),
  370. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  371. User: []*protocol.User{
  372. {
  373. Account: serial.ToTypedMessage(&vmess.Account{
  374. Id: userID.String(),
  375. AlterId: 64,
  376. }),
  377. },
  378. },
  379. }),
  380. },
  381. },
  382. Outbound: []*core.OutboundHandlerConfig{
  383. {
  384. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  385. },
  386. },
  387. }
  388. clientPort := tcp.PickPort()
  389. clientConfig := &core.Config{
  390. App: []*serial.TypedMessage{
  391. serial.ToTypedMessage(&log.Config{
  392. ErrorLogLevel: clog.Severity_Debug,
  393. ErrorLogType: log.LogType_Console,
  394. }),
  395. },
  396. Inbound: []*core.InboundHandlerConfig{
  397. {
  398. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  399. PortRange: net.SinglePortRange(clientPort),
  400. Listen: net.NewIPOrDomain(net.LocalHostIP),
  401. }),
  402. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  403. Address: net.NewIPOrDomain(dest.Address),
  404. Port: uint32(dest.Port),
  405. NetworkList: &net.NetworkList{
  406. Network: []net.Network{net.Network_UDP},
  407. },
  408. }),
  409. },
  410. },
  411. Outbound: []*core.OutboundHandlerConfig{
  412. {
  413. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  414. Receiver: []*protocol.ServerEndpoint{
  415. {
  416. Address: net.NewIPOrDomain(net.LocalHostIP),
  417. Port: uint32(serverPort),
  418. User: []*protocol.User{
  419. {
  420. Account: serial.ToTypedMessage(&vmess.Account{
  421. Id: userID.String(),
  422. AlterId: 64,
  423. SecuritySettings: &protocol.SecurityConfig{
  424. Type: protocol.SecurityType_AES128_GCM,
  425. },
  426. }),
  427. },
  428. },
  429. },
  430. },
  431. }),
  432. },
  433. },
  434. }
  435. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  436. assert(err, IsNil)
  437. var wg sync.WaitGroup
  438. wg.Add(10)
  439. for i := 0; i < 10; i++ {
  440. go func() {
  441. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  442. IP: []byte{127, 0, 0, 1},
  443. Port: int(clientPort),
  444. })
  445. assert(err, IsNil)
  446. payload := make([]byte, 1024)
  447. rand.Read(payload)
  448. nBytes, err := conn.Write([]byte(payload))
  449. assert(err, IsNil)
  450. assert(nBytes, Equals, len(payload))
  451. payload1 := make([]byte, 1024)
  452. rand.Read(payload1)
  453. nBytes, err = conn.Write([]byte(payload1))
  454. assert(err, IsNil)
  455. assert(nBytes, Equals, len(payload1))
  456. response := readFrom(conn, time.Second*5, 1024)
  457. assert(response, Equals, xor([]byte(payload)))
  458. response = readFrom(conn, time.Second*5, 1024)
  459. assert(response, Equals, xor([]byte(payload1)))
  460. assert(conn.Close(), IsNil)
  461. wg.Done()
  462. }()
  463. }
  464. wg.Wait()
  465. CloseAllServers(servers)
  466. }
  467. func TestVMessChacha20(t *testing.T) {
  468. assert := With(t)
  469. tcpServer := tcp.Server{
  470. MsgProcessor: xor,
  471. }
  472. dest, err := tcpServer.Start()
  473. assert(err, IsNil)
  474. defer tcpServer.Close()
  475. userID := protocol.NewID(uuid.New())
  476. serverPort := tcp.PickPort()
  477. serverConfig := &core.Config{
  478. App: []*serial.TypedMessage{
  479. serial.ToTypedMessage(&log.Config{
  480. ErrorLogLevel: clog.Severity_Debug,
  481. ErrorLogType: log.LogType_Console,
  482. }),
  483. },
  484. Inbound: []*core.InboundHandlerConfig{
  485. {
  486. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  487. PortRange: net.SinglePortRange(serverPort),
  488. Listen: net.NewIPOrDomain(net.LocalHostIP),
  489. }),
  490. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  491. User: []*protocol.User{
  492. {
  493. Account: serial.ToTypedMessage(&vmess.Account{
  494. Id: userID.String(),
  495. AlterId: 64,
  496. }),
  497. },
  498. },
  499. }),
  500. },
  501. },
  502. Outbound: []*core.OutboundHandlerConfig{
  503. {
  504. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  505. },
  506. },
  507. }
  508. clientPort := tcp.PickPort()
  509. clientConfig := &core.Config{
  510. App: []*serial.TypedMessage{
  511. serial.ToTypedMessage(&log.Config{
  512. ErrorLogLevel: clog.Severity_Debug,
  513. ErrorLogType: log.LogType_Console,
  514. }),
  515. },
  516. Inbound: []*core.InboundHandlerConfig{
  517. {
  518. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  519. PortRange: net.SinglePortRange(clientPort),
  520. Listen: net.NewIPOrDomain(net.LocalHostIP),
  521. }),
  522. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  523. Address: net.NewIPOrDomain(dest.Address),
  524. Port: uint32(dest.Port),
  525. NetworkList: &net.NetworkList{
  526. Network: []net.Network{net.Network_TCP},
  527. },
  528. }),
  529. },
  530. },
  531. Outbound: []*core.OutboundHandlerConfig{
  532. {
  533. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  534. Receiver: []*protocol.ServerEndpoint{
  535. {
  536. Address: net.NewIPOrDomain(net.LocalHostIP),
  537. Port: uint32(serverPort),
  538. User: []*protocol.User{
  539. {
  540. Account: serial.ToTypedMessage(&vmess.Account{
  541. Id: userID.String(),
  542. AlterId: 64,
  543. SecuritySettings: &protocol.SecurityConfig{
  544. Type: protocol.SecurityType_CHACHA20_POLY1305,
  545. },
  546. }),
  547. },
  548. },
  549. },
  550. },
  551. }),
  552. },
  553. },
  554. }
  555. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  556. assert(err, IsNil)
  557. var wg sync.WaitGroup
  558. wg.Add(10)
  559. for i := 0; i < 10; i++ {
  560. go func() {
  561. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  562. IP: []byte{127, 0, 0, 1},
  563. Port: int(clientPort),
  564. })
  565. assert(err, IsNil)
  566. payload := make([]byte, 10240*1024)
  567. rand.Read(payload)
  568. nBytes, err := conn.Write([]byte(payload))
  569. assert(err, IsNil)
  570. assert(nBytes, Equals, len(payload))
  571. response := readFrom(conn, time.Second*20, 10240*1024)
  572. assert(response, Equals, xor([]byte(payload)))
  573. assert(conn.Close(), IsNil)
  574. wg.Done()
  575. }()
  576. }
  577. wg.Wait()
  578. CloseAllServers(servers)
  579. }
  580. func TestVMessNone(t *testing.T) {
  581. assert := With(t)
  582. tcpServer := tcp.Server{
  583. MsgProcessor: xor,
  584. }
  585. dest, err := tcpServer.Start()
  586. assert(err, IsNil)
  587. defer tcpServer.Close()
  588. userID := protocol.NewID(uuid.New())
  589. serverPort := tcp.PickPort()
  590. serverConfig := &core.Config{
  591. App: []*serial.TypedMessage{
  592. serial.ToTypedMessage(&log.Config{
  593. ErrorLogLevel: clog.Severity_Debug,
  594. ErrorLogType: log.LogType_Console,
  595. }),
  596. },
  597. Inbound: []*core.InboundHandlerConfig{
  598. {
  599. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  600. PortRange: net.SinglePortRange(serverPort),
  601. Listen: net.NewIPOrDomain(net.LocalHostIP),
  602. }),
  603. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  604. User: []*protocol.User{
  605. {
  606. Account: serial.ToTypedMessage(&vmess.Account{
  607. Id: userID.String(),
  608. AlterId: 64,
  609. }),
  610. },
  611. },
  612. }),
  613. },
  614. },
  615. Outbound: []*core.OutboundHandlerConfig{
  616. {
  617. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  618. },
  619. },
  620. }
  621. clientPort := tcp.PickPort()
  622. clientConfig := &core.Config{
  623. App: []*serial.TypedMessage{
  624. serial.ToTypedMessage(&log.Config{
  625. ErrorLogLevel: clog.Severity_Debug,
  626. ErrorLogType: log.LogType_Console,
  627. }),
  628. },
  629. Inbound: []*core.InboundHandlerConfig{
  630. {
  631. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  632. PortRange: net.SinglePortRange(clientPort),
  633. Listen: net.NewIPOrDomain(net.LocalHostIP),
  634. }),
  635. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  636. Address: net.NewIPOrDomain(dest.Address),
  637. Port: uint32(dest.Port),
  638. NetworkList: &net.NetworkList{
  639. Network: []net.Network{net.Network_TCP},
  640. },
  641. }),
  642. },
  643. },
  644. Outbound: []*core.OutboundHandlerConfig{
  645. {
  646. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  647. Receiver: []*protocol.ServerEndpoint{
  648. {
  649. Address: net.NewIPOrDomain(net.LocalHostIP),
  650. Port: uint32(serverPort),
  651. User: []*protocol.User{
  652. {
  653. Account: serial.ToTypedMessage(&vmess.Account{
  654. Id: userID.String(),
  655. AlterId: 64,
  656. SecuritySettings: &protocol.SecurityConfig{
  657. Type: protocol.SecurityType_NONE,
  658. },
  659. }),
  660. },
  661. },
  662. },
  663. },
  664. }),
  665. },
  666. },
  667. }
  668. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  669. assert(err, IsNil)
  670. var wg sync.WaitGroup
  671. wg.Add(10)
  672. for i := 0; i < 10; i++ {
  673. go func() {
  674. defer wg.Done()
  675. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  676. IP: []byte{127, 0, 0, 1},
  677. Port: int(clientPort),
  678. })
  679. assert(err, IsNil)
  680. payload := make([]byte, 1024*1024)
  681. rand.Read(payload)
  682. nBytes, err := conn.Write(payload)
  683. assert(err, IsNil)
  684. assert(nBytes, Equals, len(payload))
  685. response := readFrom(conn, time.Second*30, 1024*1024)
  686. assert(response, Equals, xor(payload))
  687. assert(conn.Close(), IsNil)
  688. }()
  689. }
  690. wg.Wait()
  691. CloseAllServers(servers)
  692. }
  693. func TestVMessKCP(t *testing.T) {
  694. assert := With(t)
  695. tcpServer := tcp.Server{
  696. MsgProcessor: xor,
  697. }
  698. dest, err := tcpServer.Start()
  699. assert(err, IsNil)
  700. defer tcpServer.Close()
  701. userID := protocol.NewID(uuid.New())
  702. serverPort := udp.PickPort()
  703. serverConfig := &core.Config{
  704. App: []*serial.TypedMessage{
  705. serial.ToTypedMessage(&log.Config{
  706. ErrorLogLevel: clog.Severity_Debug,
  707. ErrorLogType: log.LogType_Console,
  708. }),
  709. },
  710. Inbound: []*core.InboundHandlerConfig{
  711. {
  712. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  713. PortRange: net.SinglePortRange(serverPort),
  714. Listen: net.NewIPOrDomain(net.LocalHostIP),
  715. StreamSettings: &internet.StreamConfig{
  716. Protocol: internet.TransportProtocol_MKCP,
  717. },
  718. }),
  719. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  720. User: []*protocol.User{
  721. {
  722. Account: serial.ToTypedMessage(&vmess.Account{
  723. Id: userID.String(),
  724. AlterId: 64,
  725. }),
  726. },
  727. },
  728. }),
  729. },
  730. },
  731. Outbound: []*core.OutboundHandlerConfig{
  732. {
  733. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  734. },
  735. },
  736. }
  737. clientPort := tcp.PickPort()
  738. clientConfig := &core.Config{
  739. App: []*serial.TypedMessage{
  740. serial.ToTypedMessage(&log.Config{
  741. ErrorLogLevel: clog.Severity_Debug,
  742. ErrorLogType: log.LogType_Console,
  743. }),
  744. },
  745. Inbound: []*core.InboundHandlerConfig{
  746. {
  747. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  748. PortRange: net.SinglePortRange(clientPort),
  749. Listen: net.NewIPOrDomain(net.LocalHostIP),
  750. }),
  751. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  752. Address: net.NewIPOrDomain(dest.Address),
  753. Port: uint32(dest.Port),
  754. NetworkList: &net.NetworkList{
  755. Network: []net.Network{net.Network_TCP},
  756. },
  757. }),
  758. },
  759. },
  760. Outbound: []*core.OutboundHandlerConfig{
  761. {
  762. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  763. Receiver: []*protocol.ServerEndpoint{
  764. {
  765. Address: net.NewIPOrDomain(net.LocalHostIP),
  766. Port: uint32(serverPort),
  767. User: []*protocol.User{
  768. {
  769. Account: serial.ToTypedMessage(&vmess.Account{
  770. Id: userID.String(),
  771. AlterId: 64,
  772. SecuritySettings: &protocol.SecurityConfig{
  773. Type: protocol.SecurityType_AES128_GCM,
  774. },
  775. }),
  776. },
  777. },
  778. },
  779. },
  780. }),
  781. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  782. StreamSettings: &internet.StreamConfig{
  783. Protocol: internet.TransportProtocol_MKCP,
  784. },
  785. }),
  786. },
  787. },
  788. }
  789. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  790. assert(err, IsNil)
  791. defer CloseAllServers(servers)
  792. var wg sync.WaitGroup
  793. for i := 0; i < 10; i++ {
  794. wg.Add(1)
  795. go func() {
  796. defer wg.Done()
  797. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  798. IP: []byte{127, 0, 0, 1},
  799. Port: int(clientPort),
  800. })
  801. assert(err, IsNil)
  802. defer conn.Close()
  803. payload := make([]byte, 10240*1024)
  804. rand.Read(payload)
  805. nBytes, err := conn.Write(payload)
  806. assert(err, IsNil)
  807. assert(nBytes, Equals, len(payload))
  808. response := readFrom(conn, time.Minute*2, 10240*1024)
  809. if r := cmp.Diff(response, xor(payload)); r != "" {
  810. t.Error(r)
  811. }
  812. }()
  813. }
  814. wg.Wait()
  815. }
  816. func TestVMessKCPLarge(t *testing.T) {
  817. tcpServer := tcp.Server{
  818. MsgProcessor: xor,
  819. }
  820. dest, err := tcpServer.Start()
  821. common.Must(err)
  822. defer tcpServer.Close()
  823. userID := protocol.NewID(uuid.New())
  824. serverPort := udp.PickPort()
  825. serverConfig := &core.Config{
  826. App: []*serial.TypedMessage{
  827. serial.ToTypedMessage(&log.Config{
  828. ErrorLogLevel: clog.Severity_Debug,
  829. ErrorLogType: log.LogType_Console,
  830. }),
  831. },
  832. Inbound: []*core.InboundHandlerConfig{
  833. {
  834. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  835. PortRange: net.SinglePortRange(serverPort),
  836. Listen: net.NewIPOrDomain(net.LocalHostIP),
  837. StreamSettings: &internet.StreamConfig{
  838. Protocol: internet.TransportProtocol_MKCP,
  839. TransportSettings: []*internet.TransportConfig{
  840. {
  841. Protocol: internet.TransportProtocol_MKCP,
  842. Settings: serial.ToTypedMessage(&kcp.Config{
  843. ReadBuffer: &kcp.ReadBuffer{
  844. Size: 4096,
  845. },
  846. WriteBuffer: &kcp.WriteBuffer{
  847. Size: 4096,
  848. },
  849. UplinkCapacity: &kcp.UplinkCapacity{
  850. Value: 20,
  851. },
  852. DownlinkCapacity: &kcp.DownlinkCapacity{
  853. Value: 20,
  854. },
  855. }),
  856. },
  857. },
  858. },
  859. }),
  860. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  861. User: []*protocol.User{
  862. {
  863. Account: serial.ToTypedMessage(&vmess.Account{
  864. Id: userID.String(),
  865. AlterId: 64,
  866. }),
  867. },
  868. },
  869. }),
  870. },
  871. },
  872. Outbound: []*core.OutboundHandlerConfig{
  873. {
  874. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  875. },
  876. },
  877. }
  878. clientPort := tcp.PickPort()
  879. clientConfig := &core.Config{
  880. App: []*serial.TypedMessage{
  881. serial.ToTypedMessage(&log.Config{
  882. ErrorLogLevel: clog.Severity_Debug,
  883. ErrorLogType: log.LogType_Console,
  884. }),
  885. },
  886. Inbound: []*core.InboundHandlerConfig{
  887. {
  888. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  889. PortRange: net.SinglePortRange(clientPort),
  890. Listen: net.NewIPOrDomain(net.LocalHostIP),
  891. }),
  892. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  893. Address: net.NewIPOrDomain(dest.Address),
  894. Port: uint32(dest.Port),
  895. NetworkList: &net.NetworkList{
  896. Network: []net.Network{net.Network_TCP},
  897. },
  898. }),
  899. },
  900. },
  901. Outbound: []*core.OutboundHandlerConfig{
  902. {
  903. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  904. Receiver: []*protocol.ServerEndpoint{
  905. {
  906. Address: net.NewIPOrDomain(net.LocalHostIP),
  907. Port: uint32(serverPort),
  908. User: []*protocol.User{
  909. {
  910. Account: serial.ToTypedMessage(&vmess.Account{
  911. Id: userID.String(),
  912. AlterId: 64,
  913. SecuritySettings: &protocol.SecurityConfig{
  914. Type: protocol.SecurityType_AES128_GCM,
  915. },
  916. }),
  917. },
  918. },
  919. },
  920. },
  921. }),
  922. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  923. StreamSettings: &internet.StreamConfig{
  924. Protocol: internet.TransportProtocol_MKCP,
  925. TransportSettings: []*internet.TransportConfig{
  926. {
  927. Protocol: internet.TransportProtocol_MKCP,
  928. Settings: serial.ToTypedMessage(&kcp.Config{
  929. ReadBuffer: &kcp.ReadBuffer{
  930. Size: 4096,
  931. },
  932. WriteBuffer: &kcp.WriteBuffer{
  933. Size: 4096,
  934. },
  935. UplinkCapacity: &kcp.UplinkCapacity{
  936. Value: 20,
  937. },
  938. DownlinkCapacity: &kcp.DownlinkCapacity{
  939. Value: 20,
  940. },
  941. }),
  942. },
  943. },
  944. },
  945. }),
  946. },
  947. },
  948. }
  949. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  950. common.Must(err)
  951. defer CloseAllServers(servers)
  952. var errg errgroup.Group
  953. for i := 0; i < 2; i++ {
  954. errg.Go(testTCPConn(clientPort, 10240*1024, time.Minute*5))
  955. }
  956. if err := errg.Wait(); err != nil {
  957. t.Error(err)
  958. }
  959. }
  960. func TestVMessGCMMux(t *testing.T) {
  961. tcpServer := tcp.Server{
  962. MsgProcessor: xor,
  963. }
  964. dest, err := tcpServer.Start()
  965. common.Must(err)
  966. defer tcpServer.Close()
  967. userID := protocol.NewID(uuid.New())
  968. serverPort := tcp.PickPort()
  969. serverConfig := &core.Config{
  970. App: []*serial.TypedMessage{
  971. serial.ToTypedMessage(&log.Config{
  972. ErrorLogLevel: clog.Severity_Debug,
  973. ErrorLogType: log.LogType_Console,
  974. }),
  975. },
  976. Inbound: []*core.InboundHandlerConfig{
  977. {
  978. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  979. PortRange: net.SinglePortRange(serverPort),
  980. Listen: net.NewIPOrDomain(net.LocalHostIP),
  981. }),
  982. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  983. User: []*protocol.User{
  984. {
  985. Account: serial.ToTypedMessage(&vmess.Account{
  986. Id: userID.String(),
  987. AlterId: 64,
  988. }),
  989. },
  990. },
  991. }),
  992. },
  993. },
  994. Outbound: []*core.OutboundHandlerConfig{
  995. {
  996. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  997. },
  998. },
  999. }
  1000. clientPort := tcp.PickPort()
  1001. clientConfig := &core.Config{
  1002. App: []*serial.TypedMessage{
  1003. serial.ToTypedMessage(&log.Config{
  1004. ErrorLogLevel: clog.Severity_Debug,
  1005. ErrorLogType: log.LogType_Console,
  1006. }),
  1007. },
  1008. Inbound: []*core.InboundHandlerConfig{
  1009. {
  1010. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1011. PortRange: net.SinglePortRange(clientPort),
  1012. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1013. }),
  1014. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1015. Address: net.NewIPOrDomain(dest.Address),
  1016. Port: uint32(dest.Port),
  1017. NetworkList: &net.NetworkList{
  1018. Network: []net.Network{net.Network_TCP},
  1019. },
  1020. }),
  1021. },
  1022. },
  1023. Outbound: []*core.OutboundHandlerConfig{
  1024. {
  1025. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  1026. MultiplexSettings: &proxyman.MultiplexingConfig{
  1027. Enabled: true,
  1028. Concurrency: 4,
  1029. },
  1030. }),
  1031. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  1032. Receiver: []*protocol.ServerEndpoint{
  1033. {
  1034. Address: net.NewIPOrDomain(net.LocalHostIP),
  1035. Port: uint32(serverPort),
  1036. User: []*protocol.User{
  1037. {
  1038. Account: serial.ToTypedMessage(&vmess.Account{
  1039. Id: userID.String(),
  1040. AlterId: 64,
  1041. SecuritySettings: &protocol.SecurityConfig{
  1042. Type: protocol.SecurityType_AES128_GCM,
  1043. },
  1044. }),
  1045. },
  1046. },
  1047. },
  1048. },
  1049. }),
  1050. },
  1051. },
  1052. }
  1053. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  1054. common.Must(err)
  1055. defer CloseAllServers(servers)
  1056. for range "abcd" {
  1057. var errg errgroup.Group
  1058. for i := 0; i < 16; i++ {
  1059. errg.Go(testTCPConn(clientPort, 10240, time.Second*20))
  1060. }
  1061. if err := errg.Wait(); err != nil {
  1062. t.Fatal(err)
  1063. }
  1064. time.Sleep(time.Second)
  1065. }
  1066. }
  1067. func TestVMessGCMMuxUDP(t *testing.T) {
  1068. assert := With(t)
  1069. tcpServer := tcp.Server{
  1070. MsgProcessor: xor,
  1071. }
  1072. dest, err := tcpServer.Start()
  1073. assert(err, IsNil)
  1074. defer tcpServer.Close()
  1075. udpServer := udp.Server{
  1076. MsgProcessor: xor,
  1077. }
  1078. udpDest, err := udpServer.Start()
  1079. assert(err, IsNil)
  1080. defer udpServer.Close()
  1081. userID := protocol.NewID(uuid.New())
  1082. serverPort := tcp.PickPort()
  1083. serverConfig := &core.Config{
  1084. App: []*serial.TypedMessage{
  1085. serial.ToTypedMessage(&log.Config{
  1086. ErrorLogLevel: clog.Severity_Debug,
  1087. ErrorLogType: log.LogType_Console,
  1088. }),
  1089. },
  1090. Inbound: []*core.InboundHandlerConfig{
  1091. {
  1092. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1093. PortRange: net.SinglePortRange(serverPort),
  1094. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1095. }),
  1096. ProxySettings: serial.ToTypedMessage(&inbound.Config{
  1097. User: []*protocol.User{
  1098. {
  1099. Account: serial.ToTypedMessage(&vmess.Account{
  1100. Id: userID.String(),
  1101. AlterId: 64,
  1102. }),
  1103. },
  1104. },
  1105. }),
  1106. },
  1107. },
  1108. Outbound: []*core.OutboundHandlerConfig{
  1109. {
  1110. ProxySettings: serial.ToTypedMessage(&freedom.Config{}),
  1111. },
  1112. },
  1113. }
  1114. clientPort := tcp.PickPort()
  1115. clientUDPPort := udp.PickPort()
  1116. clientConfig := &core.Config{
  1117. App: []*serial.TypedMessage{
  1118. serial.ToTypedMessage(&log.Config{
  1119. ErrorLogLevel: clog.Severity_Debug,
  1120. ErrorLogType: log.LogType_Console,
  1121. }),
  1122. },
  1123. Inbound: []*core.InboundHandlerConfig{
  1124. {
  1125. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1126. PortRange: net.SinglePortRange(clientPort),
  1127. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1128. }),
  1129. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1130. Address: net.NewIPOrDomain(dest.Address),
  1131. Port: uint32(dest.Port),
  1132. NetworkList: &net.NetworkList{
  1133. Network: []net.Network{net.Network_TCP},
  1134. },
  1135. }),
  1136. },
  1137. {
  1138. ReceiverSettings: serial.ToTypedMessage(&proxyman.ReceiverConfig{
  1139. PortRange: net.SinglePortRange(clientUDPPort),
  1140. Listen: net.NewIPOrDomain(net.LocalHostIP),
  1141. }),
  1142. ProxySettings: serial.ToTypedMessage(&dokodemo.Config{
  1143. Address: net.NewIPOrDomain(udpDest.Address),
  1144. Port: uint32(udpDest.Port),
  1145. NetworkList: &net.NetworkList{
  1146. Network: []net.Network{net.Network_UDP},
  1147. },
  1148. }),
  1149. },
  1150. },
  1151. Outbound: []*core.OutboundHandlerConfig{
  1152. {
  1153. SenderSettings: serial.ToTypedMessage(&proxyman.SenderConfig{
  1154. MultiplexSettings: &proxyman.MultiplexingConfig{
  1155. Enabled: true,
  1156. Concurrency: 4,
  1157. },
  1158. }),
  1159. ProxySettings: serial.ToTypedMessage(&outbound.Config{
  1160. Receiver: []*protocol.ServerEndpoint{
  1161. {
  1162. Address: net.NewIPOrDomain(net.LocalHostIP),
  1163. Port: uint32(serverPort),
  1164. User: []*protocol.User{
  1165. {
  1166. Account: serial.ToTypedMessage(&vmess.Account{
  1167. Id: userID.String(),
  1168. AlterId: 64,
  1169. SecuritySettings: &protocol.SecurityConfig{
  1170. Type: protocol.SecurityType_AES128_GCM,
  1171. },
  1172. }),
  1173. },
  1174. },
  1175. },
  1176. },
  1177. }),
  1178. },
  1179. },
  1180. }
  1181. servers, err := InitializeServerConfigs(serverConfig, clientConfig)
  1182. assert(err, IsNil)
  1183. for range "abcd" {
  1184. var wg sync.WaitGroup
  1185. const nConnection = 16
  1186. wg.Add(nConnection * 2)
  1187. for i := 0; i < nConnection; i++ {
  1188. go func() {
  1189. conn, err := net.DialTCP("tcp", nil, &net.TCPAddr{
  1190. IP: []byte{127, 0, 0, 1},
  1191. Port: int(clientPort),
  1192. })
  1193. assert(err, IsNil)
  1194. payload := make([]byte, 10240)
  1195. rand.Read(payload)
  1196. xorpayload := xor(payload)
  1197. nBytes, err := conn.Write(payload)
  1198. assert(err, IsNil)
  1199. assert(nBytes, Equals, len(payload))
  1200. response := readFrom(conn, time.Second*20, 10240)
  1201. assert(response, Equals, xorpayload)
  1202. assert(conn.Close(), IsNil)
  1203. wg.Done()
  1204. }()
  1205. }
  1206. for i := 0; i < nConnection; i++ {
  1207. go func() {
  1208. conn, err := net.DialUDP("udp", nil, &net.UDPAddr{
  1209. IP: []byte{127, 0, 0, 1},
  1210. Port: int(clientUDPPort),
  1211. })
  1212. assert(err, IsNil)
  1213. conn.SetDeadline(time.Now().Add(time.Second * 10))
  1214. payload := make([]byte, 1024)
  1215. rand.Read(payload)
  1216. xorpayload := xor(payload)
  1217. for j := 0; j < 2; j++ {
  1218. nBytes, _, err := conn.WriteMsgUDP(payload, nil, nil)
  1219. assert(err, IsNil)
  1220. assert(nBytes, Equals, len(payload))
  1221. }
  1222. response := make([]byte, 1024)
  1223. oob := make([]byte, 16)
  1224. for j := 0; j < 2; j++ {
  1225. nBytes, _, _, _, err := conn.ReadMsgUDP(response, oob)
  1226. assert(err, IsNil)
  1227. assert(nBytes, Equals, 1024)
  1228. assert(response, Equals, xorpayload)
  1229. }
  1230. assert(conn.Close(), IsNil)
  1231. wg.Done()
  1232. }()
  1233. }
  1234. wg.Wait()
  1235. time.Sleep(time.Second)
  1236. }
  1237. CloseAllServers(servers)
  1238. }