/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 1 7 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . coroutines . experimental . nio Ċ Ċ import Ġkotlinx . coroutines . experimental . launch Ċ import Ġkotlinx . coroutines . experimental . run Blocking Ċ import Ġorg . apache . commons . io . FileUtils Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Temporary Folder Ċ import Ġjava . net . Inet SocketAddress Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . nio . channels . As ynchronous File Channel Ċ import Ġjava . nio . channels . As ynchronous Server SocketChannel Ċ import Ġjava . nio . channels . As ynchronous SocketChannel Ċ import Ġjava . nio . file . Standard Open Option Ċ import Ġorg . junit . Assert .* Ċ Ċ class ĠAsync IO Test Ġ{ ĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġtmp Dir Ġ= ĠTemporary Folder () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest File Channels () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinput File Ġ= Ġtmp Dir . new File () ĊĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= Ġtmp Dir . new File () ĊĊĠĠĠĠĠĠĠ ĠFileUtils . writeString ToFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 1 .. 1 0 0 0 0 0 ). map ( Int :: toString ). join ToString ("")) ĊĊĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠAs ynchronous File Channel . open ( inputFile . to Path ()) ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAs ynchronous File Channel . open ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile . to Path (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStandard Open Option . CREATE , ĠStandard Open Option . WRITE ) ĊĠĠĠĠĠĠĠ Ġval Ġbuf Ġ= ĠByteBuffer . allocate ( 1 0 2 4 ) ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Bytes Read Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Bytes Written Ġ= Ġ 0 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( total Bytes Read Ġ< Ġinput . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( buf . has Remaining () Ġ&& Ġtotal Bytes Read Ġ< Ġinput . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġasync Ġread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Bytes Read Ġ+= Ġinput . a Read ( buf , Ġtotal Bytes Read ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . flip () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( buf . has Remaining ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġasync Ġwrite ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Bytes Written Ġ+= Ġoutput . a Write ( buf , Ġtotal Bytes Written ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( FileUtils . content Equals ( inputFile , ĠoutputFile )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Network Channels () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Channel Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAs ynchronous Server SocketChannel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. open () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. bind ( Inet SocketAddress ( 0 )) ĊĊĠĠĠĠĠĠĠ Ġval Ġserver Port Ġ= Ġ( server Channel . local Address Ġas ĠInet SocketAddress ). port ĊĊĠĠĠĠĠĠĠ Ġval Ġc 1 Ġ= Ġlaunch ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġserver Channel . a Accept () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . a Read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . flip () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" OK ", ĠChar sets . UTF _ 8 . decode ( buffer ). toString ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . a Write ( Charsets . UTF _ 8 . encode (" 1 2 3 ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġc 2 Ġ= Ġlaunch ( coroutine Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAs ynchronous SocketChannel . open () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġasync Ġcalls ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . a Connect ( Inet SocketAddress (" 1 2 7 . 0 . 0 . 1 ", Ġserver Port )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . a Write ( Charsets . UTF _ 8 . encode (" OK ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( 3 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġasync Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . a Read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . flip () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" 1 2 3 ", ĠChar sets . UTF _ 8 . decode ( buffer ). toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġc 1 . join () ĊĠĠĠĠĠĠĠ Ġc 2 . join () ĊĠĠĠ Ġ} Ċ } Ċ