package Ġio . runtime . mc um gr . transport . ble Ċ Ċ import Ġio . runtime . mc um gr . M cu Manager Ċ import Ġio . runtime . mc um gr . M cu Mgr Header Ċ import Ġio . runtime . mc um gr . M cu Mgr Scheme Ċ import Ġio . runtime . mc um gr . ble . callback . S mp Protocol Session Ċ import Ġio . runtime . mc um gr . ble . callback . S mp Transaction Ċ import Ġio . runtime . mc um gr . ble . callback . Transaction TimeoutException Ċ import Ġio . runtime . mc um gr . response . M cu Mgr Response Ċ import Ġio . runtime . mc um gr . response . d flt . M cu Mgr Echo Response Ċ import Ġio . runtime . mc um gr . util . CB OR Ċ import Ġkotlinx . coroutines . channels . Channel Ċ import Ġkotlinx . coroutines . delay Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġno . n ord ic semi . android . ble . exception . Device Disconnected Exception Ċ import Ġorg . junit . Test Ċ import Ġjava . lang . IllegalStateException Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assert Fails With Ċ Ċ class ĠS mp Protocol Session Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsession Ġ= ĠS mp Protocol Session () ĊĊĠĠĠ Ġprivate Ġabstract Ġclass ĠTest Transaction Ġ: ĠS mp Transaction Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠChannel < ByteArray >( Channel . REN DE Z VO US ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Response ( data : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . offer ( data ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Failure ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . close ( e ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġecho Transaction Ġ= Ġobject Ġ: ĠTest Transaction () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsend ( data : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Ġ= ĠM cu Mgr Header . from Bytes ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġdata . copyOf Range ( 8 , Ġdata . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġecho Ġ= ĠCB OR . getString ( payload , Ġ" d ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠM cu Manager . build Packet ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM cu Mgr Scheme . BLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 3 , Ġheader . flags , Ġheader . groupId , Ġheader . sequence Num , Ġheader . command Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" r " Ġto Ġecho ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . receive ( response ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` send Ġand Ġreceive , Ġsuccess `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġ" Hello !" ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠM cu Manager . build Packet ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM cu Mgr Scheme . BLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" d " Ġto Ġecho ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsession . send ( request , Ġecho Transaction ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Data Ġ= Ġecho Transaction . result . receive () ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠM cu Mgr Response . build Response ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM cu Mgr Scheme . BLE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Data , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM cu Mgr Echo Response :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( echo , Ġresponse . r ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` send Ġand Ġreceive , Ġsuccess , Ġno Ġtimeout `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġ" Hello !" ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠM cu Manager . build Packet ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM cu Mgr Scheme . BLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of (" d " Ġto Ġecho ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsession . send ( request , Ġecho Transaction ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Data Ġ= Ġecho Transaction . result . receive () ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠM cu Mgr Response . build Response ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM cu Mgr Scheme . BLE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Data , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠM cu Mgr Echo Response :: class . java ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( echo , Ġresponse . r ) ĊĠĠĠĠĠĠĠ Ġdelay ( 1 1 _ 0 0 0 ) Ġ// Ġ 1 0 Ġsec Ġtimeout Ġin Ġs mp Ġsession ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` send , Ġcounter Ġincrease Ġand Ġrol lover `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġ" Hello !" ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġnew Echo Request ( echo ) ĊĠĠĠĠĠĠĠ Ġrepeat ( 2 5 6 ) Ġ{ Ġi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . send ( request , Ġecho Transaction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Data Ġ= Ġecho Transaction . result . receive () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= ĠM cu Mgr Response . build Response ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM cu Mgr Scheme . BLE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠM cu Mgr Echo Response :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( echo , Ġresponse . r ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġif Ġ( i Ġ< Ġ 2 5 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected , Ġresponse . header ?. sequence Num ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` send , Ġresponse Ġtimeout `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġ" Hello !" ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġnew Echo Request ( echo ) ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġobject Ġ: ĠTest Transaction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsend ( data : ĠByteArray ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsession . send ( request , Ġtransaction ) ĊĠĠĠĠĠĠĠ Ġassert Fails With ( Transaction TimeoutException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . result . receive () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` close Ġfails Ġactive Ġtransactions `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġ" Hello !" ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġnew Echo Request ( echo ) ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġobject Ġ: ĠTest Transaction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsend ( data : ĠByteArray ) Ġ{} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsession . send ( request , Ġtransaction ) ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 0 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . close ( Device Disconnected Exception ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert Fails With ( Device Disconnected Exception :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtransaction . result . receive () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` send Ġoverflow s Ġtransmit Ġbuffer `() Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġecho Ġ= Ġ" Hello !" ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġnew Echo Request ( echo ) ĊĠĠĠĠĠĠĠ Ġval Ġtransaction Ġ= Ġobject Ġ: ĠTest Transaction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsend ( data : ĠByteArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġdelay Ġ( 1 0 0 0 0 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠFirst Ġrequest Ġis Ġconsumed Ġwhich Ġblocks Ġthe Ġchannel , Ġremaining Ġ 2 5 6 ĊĠĠĠĠĠĠĠ Ġ// Ġfill s Ġthe Ġchannel Ġbuffer Ġto Ġcapacity ĊĠĠĠĠĠĠĠ Ġrepeat ( 2 5 7 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . send ( request , Ġtransaction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails With ( IllegalStateException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession . send ( request , Ġtransaction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġnew Echo Request ( echo : ĠString ): ĠByteArray Ġ{ ĊĠĠĠ Ġreturn ĠM cu Manager . build Packet ( ĊĠĠĠĠĠĠĠ ĠM cu Mgr Scheme . BLE , ĊĠĠĠĠĠĠĠĠ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , ĊĠĠĠĠĠĠĠ Ġmap Of (" d " Ġto Ġecho ) ĊĠĠĠ Ġ) Ċ } Ċ