// ĠCopyright Ġ 2 0 1 7 - 2 0 2 0 ĠFit bit , ĠInc Ċ // ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ċ package Ġcom . fit bit . gold eng ate . bindings . io Ċ Ċ import Ġcom . fit bit . gold eng ate . bindings . Base Test Ċ import Ġcom . fit bit . gold eng ate . bindings . mock Data Sink DataSource Ċ import Ġcom . fit bit . gold eng ate . bindings . util . Memory Data Sink Ċ import Ġcom . fit bit . gold eng ate . bindings . util . Memory DataSource Ċ import Ġcom . fit bit . gold eng ate . bindings . util . get Buffer With Sleep Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Test Ċ Ċ class ĠBl aster Test Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġ// Ġdata Ġof Ġsize Ġ 3 ĊĠĠĠ Ġprivate Ġval Ġdata Ġ= Ġbyte ArrayOf ( 0 x 0 1 , Ġ 0 x 0 2 , Ġ 0 x 0 3 ) ĊĠĠĠ Ġ// Ġwe Ġwant Ġto Ġsend Ġone Ġpacket Ġat Ġa Ġtime ĊĠĠĠ Ġprivate Ġval Ġchunk Size Ġ= Ġ 1 ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Deliver B last ed Packet sTo Attached Sink () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġa Ġbl aster Ġto Ġsend Ġ 1 0 Ġpacket Ġof Ġ 1 0 0 Ġbytes ĊĠĠĠĠĠĠĠ ĠBl aster ( packet Size Ġ= Ġ 1 0 0 , Ġsend Interval Ġ= Ġ 1 0 ). use Ġ{ Ġbl aster Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMemory Data Sink (). use Ġ{ Ġsink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġattach Ġstack Ġ( only Ġneed Ġto Ġattach ĠData Sink ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . attach ( mock Data Sink DataSource ( data Sink Ptr Ġ= Ġsink . this Pointer )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmethod Ġto Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġverify Ġattached Ġsink Ġreceived Ġall Ġpackets ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( sink . get Buffer With Sleep (). isNotEmpty ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetach Ġbefore Ġthe Ġsink Ġis Ġdestroyed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . detach () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Stop Bl aster () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġa Ġbl aster Ġto Ġsend Ġ 1 0 Ġpacket Ġof Ġ 1 0 0 Ġbytes ĊĠĠĠĠĠĠĠ ĠBl aster ( packet Size Ġ= Ġ 1 0 0 , Ġsend Interval Ġ= Ġ 1 0 ). use Ġ{ Ġbl aster Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMemory Data Sink (). use Ġ{ Ġsink Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġattach Ġstack Ġ( only Ġneed Ġto Ġattach ĠData Sink ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . attach ( mock Data Sink DataSource ( data Sink Ptr Ġ= Ġsink . this Pointer )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstart Ġb last ing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmethod Ġunder Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . stop () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġverify Ġattached Ġsink Ġhas Ġnon - empty Ġbuffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( sink . get Buffer With Sleep (). isNotEmpty ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetach Ġbefore Ġthe Ġsink Ġis Ġdestroyed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . detach () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Get Stats If Data Is Sent From Attached DataSource () Ġ{ ĊĠĠĠĠĠĠĠ ĠBl aster (). use Ġ{ Ġbl aster Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMemory DataSource ( data , Ġchunk Size ). use Ġ{ Ġsource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġattach Ġstack Ġ( only Ġneed Ġto Ġattach ĠDataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . attach ( mock Data Sink DataSource ( dataSource Ptr Ġ= Ġsource . this Pointer )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsend Ġdata Ġfrom Ġstack Ġ( will Ġsend Ġone Ġpacket Ġat Ġa Ġtime ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . start () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġverify Ġstats ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . get Stats () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThrough put Ġstarts Ġcounting Ġwhen Ġit Ġreceives Ġfirst Ġpacket , Ġhence Ġpacket Ġcount Ġis Ġone Ġless Ġthan Ġtotal Ġpacket Ġsent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . packets Received Ġ== Ġ(( data . size Ġ/ Ġchunk Size ). to Long () Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetach Ġbefore Ġthe Ġsink Ġis Ġdestroyed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . detach () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Get Empty Stats If Data Not Is Sent From Attached DataSource () Ġ{ ĊĠĠĠĠĠĠĠ ĠBl aster (). use Ġ{ Ġbl aster Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMemory DataSource ( data , Ġchunk Size ). use Ġ{ Ġsource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġattach Ġstack Ġ( only Ġneed Ġto Ġattach ĠDataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . attach ( mock Data Sink DataSource ( dataSource Ptr Ġ= Ġsource . this Pointer )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġverify Ġthat Ġreceived Ġdata Ġis Ġof Ġsame Ġsize ĠZERO Ġas Ġdata Ġwas ĠNE VER Ġsent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . get Stats () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . bytes Received Ġ== Ġ 0 L Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetach Ġbefore Ġthe Ġsink Ġis Ġdestroyed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . detach () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġfun Ġstart Should Emit Error If Stack IsNot Attached () Ġ{ ĊĠĠĠĠĠĠĠ ĠBl aster (). use Ġ{ Ġbl aster Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalStateException :: class ) ĊĠĠĠ Ġfun Ġstop Should Emit Error If Stack IsNot Attached () Ġ{ ĊĠĠĠĠĠĠĠ ĠBl aster (). use Ġ{ Ġbl aster Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . stop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget Stats Should Emit Error If Stack IsNot Attached () Ġ{ ĊĠĠĠĠĠĠĠ ĠBl aster (). use Ġ{ Ġbl aster Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . get Stats () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Error Ġ{ Ġit Ġis ĠException Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġdetach Should Ignore If Stack IsNot Attached () Ġ{ ĊĠĠĠĠĠĠĠ ĠBl aster (). use Ġ{ Ġbl aster Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . detach () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġclose Should Ignore If Stack IsNot Attached () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbl aster Ġ= ĠBl aster () ĊĠĠĠĠĠĠĠ Ġbl aster . close () ĊĠĠĠ Ġ} Ċ Ċ } Ċ