// Ġ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 . stack Ċ Ċ import Ġcom . fit bit . gold eng ate . bindings . Base Test Ċ import Ġcom . fit bit . gold eng ate . bindings . co ap . Co ap Endpoint Ċ import Ġcom . fit bit . gold eng ate . bindings . dt ls . D tls Protocol Status Ċ import Ġcom . fit bit . gold eng ate . bindings . io . Bl aster Ċ import Ġcom . fit bit . gold eng ate . bindings . io . Rx Source Ċ import Ġcom . fit bit . gold eng ate . bindings . io . Tx Sink Ċ import Ġcom . fit bit . gold eng ate . bindings . node . Node Key Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . do Return Ċ import Ġcom . n ha ar man . mock it ok otlin 2 . mock Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert . assertFalse Ċ import Ġorg . junit . Assert . assertNotNull Ċ import Ġorg . junit . Assert . assertNull Ċ import Ġorg . junit . Assert . assertTrue Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġkotlin . test . assert Fails With Ċ Ċ private Ġconst Ġval ĠONE _ MINUTE _ IN _ MILLISECONDS : ĠInt Ġ= Ġ 6 0 _ 0 0 0 Ċ Ċ class ĠStack Test Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġmock Node Key : Node Key < String > Ġ= Ġmock Ġ{ ĊĠĠĠĠĠĠĠ Ġon Ġ{ Ġvalue Ġ} Ġdo Return Ġ" node _ key _ 1 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġtx Sink : ĠTx Sink ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġrx Source : ĠRx Source ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup () Ġ{ ĊĠĠĠĠĠĠĠ Ġtx Sink Ġ= ĠTx Sink () ĊĠĠĠĠĠĠĠ Ġrx Source Ġ= ĠRx Source () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġtx Sink . close () ĊĠĠĠĠĠĠĠ Ġrx Source . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Create Stack () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( stack . this Pointer Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Can Start Stack () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Start Multiple Times () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Close Multiple Times () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . close () Ġ// ĠThis Ġshould Ġnot Ġcause Ġa Ġdouble - free ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget As Data Sink Pointer Throws After Close () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails With ( IllegalStateException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . getAs Data Sink Pointer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit Ġ// ĠDon 't Ġreturn Ġanything Ġfrom Ġthe Ġuse Ġblock ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġget As DataSource Pointer Throws After Close () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Fails With ( IllegalStateException :: class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstack . getAs DataSource Pointer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUnit Ġ// ĠDon 't Ġreturn Ġanything Ġfrom Ġthe Ġuse Ġblock ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġupdate M tu Returns False After Close () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . close () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( stack . update M tu ( 3 0 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Attach And Detach Co ap Endpoint () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġco ap Endpoint Ġ= ĠCo ap Endpoint () ĊĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco ap Endpoint . attach ( stack ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull (" Co ap Ġendpoint Ġnot Ġattached ", Ġco ap Endpoint . data Sink DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġco ap Endpoint . detach () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull (" Co ap Ġendpoint Ġnot Ġdet ached ", Ġco ap Endpoint . data Sink DataSource ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Attach Bl aster () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer , ĠSocket Net if Gatt link ()). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbl aster Ġ= ĠBl aster ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbl aster . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Not Emit Tls StateChange If Stack Not Started () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . dt ls Event Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert No Values () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Emit Tls StateChange To Handshake On Stack Start () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , tx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . dt ls Event Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . state Ġ== ĠD tls Protocol Status . Tls Protocol State . TLS _ STATE _ HAND SHA KE Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Emit Tls StateChange To Session () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , tx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . on D tls Status Change ( 2 , Ġ- 1 , Ġ" BOOT STR AP ". toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . dt ls Event Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . state Ġ== ĠD tls Protocol Status . Tls Protocol State . TLS _ STATE _ SESSION Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Emit Unknown Tls StateChange () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , tx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . on D tls Status Change ( 9 9 9 , Ġ- 1 , Ġ" BOOT STR AP ". toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . dt ls Event Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit . state Ġ== ĠD tls Protocol Status . Tls Protocol State . TLS _ STATE _ UNKNOWN Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Emit Stack Event () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , tx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . on Stack Event ( Stack Event . Gatt link Buffer Over Threshold . eventId , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . stack Event Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit Ġ== ĠStack Event . Gatt link Buffer Over Threshold Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġshould Emit Stack St alled Event () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , tx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . on Stack Event ( Stack Event . Gatt link Session St all ( ONE _ MINUTE _ IN _ MILLISECONDS ). eventId , ĠONE _ MINUTE _ IN _ MILLISECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstack . stack Event Observable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. test () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. assert Value Ġ{ Ġit Ġis ĠStack Event . Gatt link Session St all Ġ&& Ġit . st alled Time Ġ== ĠONE _ MINUTE _ IN _ MILLISECONDS } ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġcan Call M tu Change On Stack () Ġ{ ĊĠĠĠĠĠĠĠ ĠStack ( mock Node Key , Ġtx Sink . this Pointer , Ġrx Source . this Pointer ). use Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( stack . update M tu ( 1 8 2 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ