import Ġjava . net . Inet 4 Address Ċ Ċ import Ġio . kot lint est . matchers . shouldBe Ċ import Ġio . kot lint est . specs . Free Spec Ċ Ċ import Ġcom . github . c 0 va 2 3 . async S ocks Proxy . S ocks 4 Handshake Ċ import Ġcom . github . c 0 va 2 3 . async S ocks Proxy . S ocks 4 Request Data Ċ import Ġcom . github . c 0 va 2 3 . async S ocks Proxy . Command Ċ Ċ import Ġcom . github . c 0 va 2 3 . async S ocks Proxy . support . Byte Channel Mock Ċ import Ġio . kot lint est . matchers . should Equal Ċ Ċ class ĠS ocks 4 Handshake Spec Ġ: ĠFree Spec ({ ĊĠĠĠ Ġfun ĠInt . to Port Bytes () Ġ: ĠByteArray Ġ= ĊĠĠĠĠĠĠĠ Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this Ġ/ Ġ 2 5 6 ). to Byte (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( this Ġ% Ġ 2 5 6 ). to Byte () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġfun Ġbuild Buffer ( command : ĠCommand , Ġport : ĠInt , Ġaddress : ĠInet 4 Address , ĠuserId : ĠString Ġ= Ġ"") Ġ= ĊĠĠĠĠĠĠĠ Ġbyte ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand . code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* port . to Port Bytes (), Ġ// ĠPort ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* address . address , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ* userId . toByteArray (), Ġ 0 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ" parse Request ( byte Channel )" Ġ- Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= ĠInet 4 Address . get ByName (" 8 . 8 . 8 . 8 ") Ġas ĠInet 4 Address ĊĠĠĠĠĠĠĠ Ġ" when Ġinput Ġvalid Ġbuffer Ġwithout Ġuser " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġ 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Buffer Ġ= Ġbuild Buffer ( Command . CONNECT , Ġport , Ġaddress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Channel Ġ= ĠByte Channel Mock ( listOf ( input Buffer )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsock s 4 Handshake Ġ= ĠS ocks 4 Handshake () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Data Ġ= Ġsock s 4 Handshake . parse Request ( source Channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġvalid ĠS ocks 4 Request Data " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Data ĠshouldBe ĠS ocks 4 Request Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġ Ġaddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠCommand . CONNECT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġport ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" when Ġinput Ġvalid Ġbuffer Ġwith Ġhigh Ġport " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġ 0 xFFFF ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Buffer Ġ= Ġbuild Buffer ( Command . CONNECT , Ġport , Ġaddress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Channel Ġ= ĠByte Channel Mock ( listOf ( input Buffer )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsock s 4 Handshake Ġ= ĠS ocks 4 Handshake () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Data Ġ= Ġsock s 4 Handshake . parse Request ( source Channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġvalid ĠS ocks 4 Request Data " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Data ĠshouldBe ĠS ocks 4 Request Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġ Ġaddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠCommand . CONNECT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġport ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" when Ġinput Ġvalid Ġbuffer Ġwith Ġuser " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġ 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠuserName Ġ= Ġ" bob " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Buffer Ġ= Ġbuild Buffer ( Command . CONNECT , Ġport , Ġaddress , ĠuserName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Channel Ġ= ĠByte Channel Mock ( listOf ( input Buffer )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsock s 4 Handshake Ġ= ĠS ocks 4 Handshake () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Data Ġ= Ġsock s 4 Handshake . parse Request ( source Channel ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" return Ġvalid ĠS ocks 4 Request Data " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Data ĠshouldBe ĠS ocks 4 Request Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= Ġaddress , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠCommand . CONNECT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġ 8 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= ĠuserName ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ" write Response ()" Ġ- Ġ{ ĊĠĠĠĠĠĠĠ Ġ" when Ġconnected " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Channel Ġ= ĠByte Channel Mock ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsock s 4 Handshake Ġ= ĠS ocks 4 Handshake () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Data Ġ= ĠS ocks 4 Request Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= ĠInet 4 Address . get ByName (" 8 . 8 . 8 . 8 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġ 4 4 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠCommand . CONNECT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsock s 4 Handshake . write Response ( source Channel , true , Ġrequest Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" write Ġvalid Ġout Ġbuffer " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Channel . out Buffers . first (). toList () Ġshould Equal ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ocks 4 Handshake . Response . GRAN TED . code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 , Ġ 0 , Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ" when Ġnot Ġconnected " Ġ- Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Channel Ġ= ĠByte Channel Mock ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsock s 4 Handshake Ġ= ĠS ocks 4 Handshake () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Data Ġ= ĠS ocks 4 Request Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Ġ= ĠInet 4 Address . get ByName (" 0 . 0 . 0 . 0 "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġ 4 4 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommand Ġ= ĠCommand . BINDING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsock s 4 Handshake . write Response ( source Channel , false , Ġrequest Data ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" write Ġvalid Ġout Ġbuffer " Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Channel . out Buffers . first (). toList () Ġshould Equal ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS ocks 4 Handshake . Response . RE JECT ED . code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 , Ġ 0 , Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }) Ċ