/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 2 1 ĠAnt on ĠMal in sk iy Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . mal in sk iy . adam . request . sync . v 2 Ċ Ċ import Ġassert k . assertThat Ċ import Ġassert k . assertions . isEqualTo Ċ import Ġcom . mal in sk iy . adam . Const Ċ import Ġcom . mal in sk iy . adam . exception . Pull FailedException Ċ import Ġcom . mal in sk iy . adam . exception . Unsupported Sync Protocol Exception Ċ import Ġcom . mal in sk iy . adam . request . Feature Ċ import Ġcom . mal in sk iy . adam . server . Android Debug Bridge Server Ċ import Ġio . ktor . utils . io .* Ċ import Ġkotlinx . coroutines . channels . receive OrNull Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . rules . Temporary Folder Ċ import Ġjava . io . File Ċ Ċ class ĠPull File Request Test Ġ{ ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġval Ġtemp Ġ= ĠTemporary Folder () ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Serialize () Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThat ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPull File Request ("/ sd card / test file ", ĠFile ("/ tmp / test file "), ĠlistOf ( Feature . SEND REC V _ V 2 )). serialize (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConst . DEFAULT _ TRANSPORT _ ENCODING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. isEqualTo (" 0 0 0 5 sync :") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Single Chunk Happy Path () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠFile ( Pull File Request Test :: class . java . getResource ("/ fixture / sample . yaml "). file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= Ġtemp . new File () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠAndroid Debug Bridge Server () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġserver . start And Listen Ġ{ Ġinput , Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransport Cmd Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( transport Cmd ). isEqualTo (" host : transport : serial ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Command Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual Command ). isEqualTo (" sync :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Path Ġ= Ġinput . receive Stat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( stat Path ). isEqualTo ("/ sd card / test file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Stat ( fixture . length (). toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecv Path Ġ= Ġinput . receive Recv 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( recv Path ). isEqualTo ("/ sd card / test file ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Data ( fixture . read Bytes ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Done () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Done () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . discard () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPull File Request ("/ sd card / test file ", Ġtemp File , ĠlistOf ( Feature . SEND REC V _ V 2 ), Ġcoroutine Context Ġ= Ġcoroutine Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecute Ġ= Ġclient . execute ( request , Ġthis , Ġ" serial ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprogress Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! execute . is Closed For Receive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġexecute . receive OrNull () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( progress ). isEqualTo ( 1 . 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. join () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( temp File . read Bytes ()). isEqualTo ( fixture . read Bytes ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiple Chunks Happy Path () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠFile ( Pull File Request Test :: class . java . getResource ("/ fixture / sample . yaml "). file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= Ġtemp . new File () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠAndroid Debug Bridge Server () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġserver . start And Listen Ġ{ Ġinput , Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransport Cmd Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( transport Cmd ). isEqualTo (" host : transport : serial ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Command Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual Command ). isEqualTo (" sync :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Path Ġ= Ġinput . receive Stat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( stat Path ). isEqualTo ("/ sd card / test file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Stat ( fixture . length (). toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecv Path Ġ= Ġinput . receive Recv 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( recv Path ). isEqualTo ("/ sd card / test file ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Bytes Ġ= Ġfixture . read Bytes (). as Sequence (). chunk ed ( 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= Ġfile Bytes . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Data ( iterator . next (). toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Done () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Done () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPull File Request ("/ sd card / test file ", Ġtemp File , ĠlistOf ( Feature . SEND REC V _ V 2 ), Ġcoroutine Context Ġ= Ġcoroutine Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecute Ġ= Ġclient . execute ( request , Ġthis , Ġ" serial ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprogress Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! execute . is Closed For Receive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġexecute . receive OrNull () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( progress ). isEqualTo ( 1 . 0 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. join () ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( temp File . read Bytes ()). isEqualTo ( fixture . read Bytes ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠPull FailedException :: class ) ĊĠĠĠ Ġfun Ġtest Transport Fail () Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠFile ( Pull File Request Test :: class . java . getResource ("/ fixture / sample . yaml "). file ) ĊĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= Ġtemp . new File () ĊĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠAndroid Debug Bridge Server () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġserver . start And Listen Ġ{ Ġinput , Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransport Cmd Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( transport Cmd ). isEqualTo (" host : transport : serial ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Command Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual Command ). isEqualTo (" sync :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Path Ġ= Ġinput . receive Stat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( stat Path ). isEqualTo ("/ sd card / test file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Stat ( fixture . length (). toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecv Path Ġ= Ġinput . receive Recv 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( recv Path ). isEqualTo ("/ sd card / test file ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . FAIL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ" lo rem Ġipsum " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . writeInt LittleEndian ( message . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Data ( message . toByteArray ( Const . DEFAULT _ TRANSPORT _ ENCODING )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠPull File Request ("/ sd card / test file ", Ġtemp File , ĠlistOf ( Feature . SEND REC V _ V 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecute Ġ= Ġclient . execute ( request , Ġthis , Ġ" serial ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprogress Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! execute . is Closed For Receive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġexecute . receive OrNull () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . dispose () ĊĠĠĠĠĠĠĠ Ġ}. join () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠUnsupported Sync Protocol Exception :: class ) ĊĠĠĠ Ġfun Ġtest Transport Packet Size Failure () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠFile ( Pull File Request Test :: class . java . getResource ("/ fixture / sample . yaml "). file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= Ġtemp . new File () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠAndroid Debug Bridge Server () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġserver . start And Listen Ġ{ Ġinput , Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransport Cmd Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( transport Cmd ). isEqualTo (" host : transport : serial ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Command Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual Command ). isEqualTo (" sync :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Path Ġ= Ġinput . receive Stat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( stat Path ). isEqualTo ("/ sd card / test file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Stat ( fixture . length (). toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecv Path Ġ= Ġinput . receive Recv 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( recv Path ). isEqualTo ("/ sd card / test file ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Data ( ByteArray ( Const . MAX _ FILE _ PACKET _ LENGTH Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠPull File Request ("/ sd card / test file ", Ġtemp File , ĠlistOf ( Feature . SEND REC V _ V 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecute Ġ= Ġclient . execute ( request , Ġthis , Ġ" serial ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprogress Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! execute . is Closed For Receive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġexecute . receive OrNull () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. join () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠUnsupported Sync Protocol Exception :: class ) ĊĠĠĠ Ġfun Ġtest Transport Unsupported Packet () Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfixture Ġ= ĠFile ( Pull File Request Test :: class . java . getResource ("/ fixture / sample . yaml "). file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp File Ġ= Ġtemp . new File () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠAndroid Debug Bridge Server () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= Ġserver . start And Listen Ġ{ Ġinput , Ġoutput Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransport Cmd Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( transport Cmd ). isEqualTo (" host : transport : serial ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Command Ġ= Ġinput . receive Command () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( actual Command ). isEqualTo (" sync :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . OK AY ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstat Path Ġ= Ġinput . receive Stat () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( stat Path ). isEqualTo ("/ sd card / test file ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond Stat ( fixture . length (). toInt ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrecv Path Ġ= Ġinput . receive Recv 2 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertThat ( recv Path ). isEqualTo ("/ sd card / test file ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . SEND _ V 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . respond ( Const . Message . SEND _ V 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠPull File Request ("/ sd card / test file ", Ġtemp File , ĠlistOf ( Feature . SEND REC V _ V 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecute Ġ= Ġclient . execute ( request , Ġthis , Ġ" serial ") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprogress Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ(! execute . is Closed For Receive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprogress Ġ= Ġexecute . receive OrNull () Ġ?: Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . dispose () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. join () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ