// Ċ // Ġ ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠCouch base , ĠInc . ĠAll Ġrights Ġreserved . Ċ // Ċ // Ġ ĠLicensed Ġunder Ġthe ĠCouch base ĠLicense ĠAgreement Ġ( the Ġ" License "); Ċ // Ġ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ // Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ // Ġ Ġhttps :// info . couch base . com / rs / 3 0 2 - GJ Y - 0 3 4 / images / 2 0 1 7 - 1 0 - 3 0 _ License _ Agreement . pdf Ċ // Ċ // Ġ Ġ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 . couch base . lite Ċ Ċ import Ġcom . couch base . lite . internal . Abstract TLS Identity Ċ import Ġcom . couch base . lite . internal . Security Base Test Ċ import Ġcom . couch base . lite . internal . utils . Fl aky Test Ċ import Ġcom . couch base . lite . internal . utils . Fn Ċ import Ġcom . couch base . lite . internal . utils . Platform Utils Ċ import Ġcom . couch base . lite . internal . utils . Report Ċ import Ġcom . couch base . lite . internal . utils . Slow Test Ċ import Ġorg . junit . After Ċ import Ġorg . junit . Assert . assertEquals Ċ 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 Ġjava . net . NetworkInterface Ċ import Ġjava . net . URI Ċ import Ġjava . security . KeyStore Ċ import Ġjava . security . cert . Certificate Ċ import Ġjava . util . Arrays Ċ import Ġjava . util . Calendar Ċ import Ġjava . util . concurrent . Broken Barrier Exception Ċ import Ġjava . util . concurrent . Count DownLatch Ċ import Ġjava . util . concurrent . Cyc lic Barrier Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġjava . util . concurrent . TimeoutException Ċ import Ġjava . util . concurrent . atomic . Atomic Integer Ċ import Ġjava . util . regex . Pattern Ċ import Ġkotlin . math . max Ċ Ċ class ĠURL Endpoint Listener Test Ġ: ĠBase Replic ator Test () Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġport Factory Ġ= ĠAtomicInteger ( 3 0 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġfun Ġget Port () Ġ= Ġport Factory . get And Increment () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= Ġmutable ListOf < URL Endpoint Listener >() ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġsetup URL Endpoint Listener Test () Ġ{ ĊĠĠĠĠĠĠĠ ĠSecurity Base Test . delete Test Aliases () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ After ĊĠĠĠ Ġfun Ġcleanup URL Endpoint Listener Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġalias Ġ= ĠAbstract TLS Identity . get Alias ( it . tls Identity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( alias Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform Security Test . delete Entries Ġ{ Ġa Ġ-> Ġalias Ġ== Ġa Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlisteners . clear () ĊĠĠĠĠĠĠĠ ĠSecurity Base Test . delete Test Aliases () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// //////// ////// Ġ ĠB ĠA ĠS ĠI ĠC ĠĠ ĠF ĠU ĠN ĠC ĠT ĠI ĠO ĠN ĠA ĠL ĠI ĠT ĠY Ġ// //////// ////// ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġshould Ġreport Ġrunning Ġon Ġthe Ġconfigured Ġport ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Port () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġget Port () ĊĊĠĠĠĠĠĠĠ Ġconfig . port Ġ= Ġport ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠ ĠassertEquals (- 1 , Ġlistener . port ) ĊĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĠĠĠĠĠĠĠ ĠassertEquals ( port , Ġlistener . port ) ĊĊĠĠĠĠĠĠĠ Ġlistener . stop ( /** /) ĊĠĠĠĠĠĠĠ ĠassertEquals (- 1 , Ġlistener . port ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith Ġno Ġport Ġconfigured Ġshould Ġreport Ġrunning Ġon Ġa Ġlegal Ġport ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Empty Port () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠ ĠassertEquals (- 1 , Ġlistener . port ) ĊĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĠĠĠĠĠĠĠ ĠassertTrue ( listener . port Ġ> Ġ 1 0 2 4 ) ĊĊĠĠĠĠĠĠĠ Ġlistener . stop () ĊĠĠĠĠĠĠĠ ĠassertEquals (- 1 , Ġlistener . port ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠAn Ġattempt Ġto Ġrun Ġtwo Ġlisteners Ġon Ġthe Ġsame Ġport Ġshould Ġfail ĊĠĠĠ Ġ@ Test ( expected Ġ= ĠCouch base Lite Exception :: class ) ĊĠĠĠ Ġfun Ġtest Busy Port () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġget Port () ĊĊĠĠĠĠĠĠĠ Ġconfig . port Ġ= Ġport ĊĠĠĠĠĠĠĠ Ġval Ġlistener 1 Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener 1 ) ĊĠĠĠĠĠĠĠ Ġlistener 1 . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener 2 Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener 2 ) ĊĠĠĠĠĠĠĠ Ġlistener 2 . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Legal NetworkInterface () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġtest Ġfails Ġon ĠWindows Ġbecause ĠJava Ġcan 't Ġfind Ġaccurate Ġinterface Ġnames ĊĠĠĠĠĠĠĠ Ġif Ġ( handle Platform Spec ially (" windows ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReport . log ( LogLevel . WARNING , Ġ" TEST ĠIG NO RED : ĠUnable Ġto Ġget Ġnetwork Ġinterface Ġnames Ġon ĠWindows ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġif aces Ġ= ĠNetwork Interface . get Network Interfaces (). as Sequence (). filter Ġ{ Ġit . is Loop back Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġiface Ġ= Ġif aces . first OrNull ()?. name ĊĠĠĠĠĠĠĠ Ġif Ġ( iface Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReport . log ( LogLevel . INFO , Ġ" Cannot Ġfind Ġa Ġloop back Ġinterface Ġfor Ġtest Legal NetworkInterface ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconfig . network Interface Ġ= Ġiface ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠCouch base Lite Exception :: class ) ĊĠĠĠ Ġfun Ġtest Illegal NetworkInterface () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĠĠĠĠĠĠĠ Ġconfig . network Interface Ġ= Ġ" 1 . 1 . 1 . 2 5 6 " ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠCouch base Lite Exception :: class ) ĊĠĠĠ Ġfun Ġtest R id iculo us NetworkInterface () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĠĠĠĠĠĠĠ Ġconfig . network Interface Ġ= Ġ" blah " ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġtest Ġfails Ġif Ġno Ġnetwork Ġis Ġavailable ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest URLs () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġlistener . urls . count ()) ĊĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĠĠĠĠĠĠĠ ĠassertTrue ( 0 Ġ< Ġlistener . urls . count ()); ĊĊĠĠĠĠĠĠĠ Ġlistener . stop () ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġlistener . urls . count ()) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// //////// ////// Ġ ĠH ĠT ĠT ĠP ĠĠ ĠA ĠU ĠT ĠH ĠE ĠN ĠT ĠI ĠC ĠA ĠT ĠI ĠO ĠN ĠĠ Ġ// //////// ////// ĊĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġdisabled Ġand Ġno Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġclient Ġthat Ġpresents Ġno Ġcredentials ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Null Listener Authenticator With Null Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint ()) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġdisabled Ġand Ġno Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġclient Ġthat Ġpresents Ġpassword Ġcredentials ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Null Listener Authenticator With Password Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint (), ĠBasic Authenticator (" Band ers n atch ", Ġ" tw as Ġbr ill ig ". toCharArray ())) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġdisabled Ġand Ġno Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġclient Ġthat Ġpresents Ġcertificate Ġcredentials ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Null Listener Authenticator With Client Cert Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint (), ĠClient Certificate Authenticator ( create Identity ( false ))) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġdisabled Ġand Ġa Ġpassword Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġclient Ġthat Ġpresents Ġmatching Ġpassword Ġcredentials ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Password Listener Authenticator With Matching Password Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Password Authenticator Ġ{ Ġuser , Ġpwd Ġ-> Ġ( user Ġ== Ġ" daniel ") Ġ&& Ġ( String ( pwd ) Ġ== Ġ" 1 2 3 ") Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint (), ĠBasic Authenticator (" daniel ", Ġ" 1 2 3 ". toCharArray ())) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġdisabled Ġand Ġa Ġpassword Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġclient Ġthat Ġpresents Ġno Ġcredentials ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Password Listener Authenticator With Null Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Password Authenticator Ġ{ Ġuser , Ġpwd Ġ-> Ġ(" daniel " Ġ== Ġuser ) Ġ&& Ġ(" 1 2 3 " Ġ== ĠString ( pwd )) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( CB LError . Code . HTTP _ AUTH _ REQUIRED , ĠC BLE rror . Domain . C BL ITE , Ġlistener . endpoint ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġdisabled Ġand Ġa Ġpassword Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġclient Ġthat Ġpresents Ġnon - matching Ġcredentials Ġ( user ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Password Listener Authenticator With Non Matching User Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Password Authenticator Ġ{ Ġuser , Ġpwd Ġ-> Ġ" daniel " Ġ== Ġuser Ġ&& Ġ(" 1 2 3 " Ġ== ĠString ( pwd )) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . HTTP _ AUTH _ REQUIRED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Authenticator (" d ane il ", Ġ" 1 2 3 ". toCharArray ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġdisabled Ġand Ġa Ġpassword Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġclient Ġthat Ġpresents Ġnon - matching Ġcredentials Ġ( password ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Password Listener Authenticator With Non Matching Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Password Authenticator Ġ{ Ġuser , Ġpwd Ġ-> Ġ" daniel " Ġ== Ġuser Ġ&& Ġ(" 1 2 3 " Ġ== ĠString ( pwd )) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . HTTP _ AUTH _ REQUIRED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Authenticator (" daniel ", Ġ" 4 5 6 ". toCharArray ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġdisabled Ġand Ġa Ġpassword Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġclient Ġthat Ġpresents Ġonly Ġcertificate Ġcredentials ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Password Listener Authenticator Certificate Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Password Authenticator Ġ{ Ġuser , Ġpwd Ġ-> Ġ" daniel " Ġ== Ġuser Ġ&& Ġ(" 1 2 3 " Ġ== ĠString ( pwd )) Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . HTTP _ AUTH _ REQUIRED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Certificate Authenticator ( create Identity ( false )) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// //////// ////// Ġ ĠT ĠL ĠS ĠĠ ĠA ĠU ĠT ĠH ĠE ĠN ĠT ĠI ĠC ĠA ĠT ĠI ĠO ĠN ĠĠ Ġ// //////// ////// ĊĊĠĠĠ Ġ// ĠTLS ĠCLIENT ĠAUTH ENT IC ATES ĠSERVER : ĠPIN N ED ĠCERT ĊĊĠĠĠ Ġ// ĠA Ġclient Ġwith Ġa Ġpinned Ġcertificate ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġserver Ġthat Ġpresents Ġthat Ġcertificate ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP in ned Cert Client Authenticator With Matching Server Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint (), Ġnull , Ġserver Identity . certs [ 0 ]) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġclient Ġwith Ġa Ġpinned Ġcertificate ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġserver Ġthat Ġpresents Ġa Ġnon - matching Ġcertificate Ġ( anonymous ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP in ned Cert Client Authenticator With Anonymous Server Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls () ĊĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . TLS _ CERT _ UN TR UST ED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Identity . certs [ 0 ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġclient Ġwith Ġa Ġpinned Ġcertificate ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġserver Ġthat Ġpresents Ġa Ġnon - matching Ġcertificate Ġ( explicit , Ġself Ġsigned ) ĊĠĠĠ Ġ// Ġthis Ġis Ġa Ġredundant Ġtest ... ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP in ned Cert Client Authenticator With Non Matching Self Signed Server Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĠĠĠĠĠĠĠ Ġval Ġb og us Identity Ġ= Ġcreate Identity () ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( bo gus Identity ) ĊĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . TLS _ CERT _ UN TR UST ED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Identity . certs [ 0 ] ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġclient Ġwith Ġa Ġpinned Ġcertificate ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġserver Ġthat Ġpresents Ġcertificate Ġchain Ġ( even Ġif Ġthe Ġroot Ġis Ġthe Ġpinned Ġcert ) ĊĠĠĠ Ġ@ Slow Test ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP in ned Cert Client Authenticator With Chain ed Server Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġca Cert Ġ= Ġget Test CAC ertificate () ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġget Test Chain Identity () ĊĊĠĠĠĠĠĠĠ Ġval Ġcerts Ġ= Ġserver Identity ?. certs !! ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcerts . size ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ca Cert , Ġcerts [ 1 ]) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . TLS _ CERT _ UN TR UST ED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Test CAC ertificate () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġclient Ġwith Ġa Ġpinned Ġcertificate , Ġalso Ġconfigured Ġto Ġaccept Ġself - signed Ġcerts ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġserver Ġthat Ġpresents Ġa Ġmatching Ġself - signed Ġcertificate ĊĠĠĠ Ġ// ĠPin ning Ġtakes Ġprecedence ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP in ned And Self Signed Cert Client Authenticator With Matching Server Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint (), Ġnull , Ġserver Identity . certs [ 0 ]) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġclient Ġwith Ġa Ġpinned Ġcertificate , Ġalso Ġconfigured Ġto Ġaccept Ġself - signed Ġcerts ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġserver Ġthat Ġpresents Ġa Ġnon - matching Ġself - signed Ġcertificate ĊĠĠĠ Ġ// ĠPin ning Ġtakes Ġprecedence ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP in ned And Self Signed Cert Client Authenticator With Non Matching Self Signed Server Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġpin Ġthe Ġwrong Ġcert . ĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . TLS _ CERT _ UN TR UST ED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Identity (). certs [ 0 ] ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCLIENT ĠAUTH ENT IC ATES ĠSERVER : ĠS ELF _ SIGNED ĠCERT ĊĊĠĠĠ Ġ// ĠA Ġclient Ġwith Ġconfigured Ġto Ġaccept Ġself - signed Ġcerts ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġserver Ġthat Ġpresents Ġa Ġself - signed Ġcert Ġ( anonymous ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SS elf Signed Client Authenticator With Anonymous Server Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls () ĊĊĠĠĠĠĠĠĠ Ġval Ġidentity Ġ= Ġlistener . tls Identity ĊĠĠĠĠĠĠĠ ĠassertNotNull ( identity ) ĊĠĠĠĠĠĠĠ Ġval Ġcerts Ġ= Ġidentity !!. certs ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcerts . size ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint ()) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġclient Ġwith Ġconfigured Ġto Ġaccept Ġself - signed Ġcerts ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġserver Ġthat Ġpresents Ġa Ġself - signed Ġcert Ġ( explicit ) ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SS elf Signed Client Authenticator With Explicit Self Signed Server Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĠĠĠĠĠĠĠ Ġval Ġcerts Ġ= Ġserver Identity . certs ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġcerts . size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint ()) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġclient Ġwith Ġconfigured Ġto Ġaccept Ġself - signed Ġcerts ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġserver Ġthat Ġpresents Ġa Ġcert Ġthat Ġis Ġnot Ġself - signed ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SS elf Signed Client Authenticator With Chain ed Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġget Test Chain Identity () ĊĠĠĠĠĠĠĠ Ġval Ġcerts Ġ= Ġserver Identity !!. certs ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcerts . size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . TLS _ CERT _ UN TR UST ED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCLIENT ĠAUTH ENT IC ATES ĠSERVER : ĠDEFAULT ĊĊĠĠĠ Ġ// Ġwe Ġdo Ġnot Ġhave Ġan Ġactual ĠTr usted ĠCA Ġsigned Ġcert , Ġwith Ġwhich Ġto Ġtest . ĊĊĠĠĠ Ġ// ĠTLS ĠSERVER ĠAUTH ENT IC ATES ĠCLIENT : ĠPASSWORD ĊĠĠĠ Ġ// ĠFor Ġall Ġof Ġthese Ġtests , Ġthe Ġclient Ġauthentic ates Ġthe Ġserver Ġwith Ġa Ġself - signed Ġcert ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġenabled Ġand Ġa Ġpassword Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġclient Ġthat Ġpresents Ġmatching Ġcredentials ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP assword Listener Authenticator With Matching Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Password Authenticator Ġ{ Ġuser , Ġpwd Ġ-> Ġ( user Ġ== Ġ" daniel ") Ġ&& Ġ( String ( pwd ) Ġ== Ġ" 1 2 3 ") Ġ}) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint (), ĠBasic Authenticator (" daniel ", Ġ" 1 2 3 ". toCharArray ())) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġenabled Ġand Ġa Ġpassword Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġclient Ġthat Ġpresents Ġno Ġcredentials ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP assword Listener Authenticator With Null Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Password Authenticator Ġ{ Ġuser , Ġpwd Ġ-> Ġ( user Ġ== Ġ" daniel ") Ġ&& Ġ( String ( pwd ) Ġ== Ġ" 1 2 3 ") Ġ}) ĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( CB LError . Code . HTTP _ AUTH _ REQUIRED , ĠC BLE rror . Domain . C BL ITE , Ġlistener . endpoint ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġenabled Ġand Ġa Ġpassword Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġclient Ġthat Ġpresents Ġnon - matching Ġcredentials ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP assword Listener Authenticator With Non Matching Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Password Authenticator Ġ{ Ġuser , Ġpwd Ġ-> Ġ( user Ġ== Ġ" daniel ") Ġ&& Ġ( String ( pwd ) Ġ== Ġ" 1 2 3 ") Ġ}) ĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . HTTP _ AUTH _ REQUIRED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBasic Authenticator (" daniel ", Ġ" 1 2 ". toCharArray ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTLS ĠSERVER ĠAUTH ENT IC ATES ĠCLIENT : ĠTR UST ED ĠC ER TS ĊĊĠĠĠ Ġ// Ġwe Ġdo Ġnot Ġhave Ġan Ġactual ĠTr usted ĠCA Ġsigned Ġcert , Ġwith Ġwhich Ġto Ġtest . ĊĊĠĠĠ Ġ// ĠTLS ĠSERVER ĠAUTH ENT IC ATES ĠCLIENT : ĠROOT ĠC ER TS ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġenabled Ġand Ġa Ġclient Ġauth enticator Ġpin ning Ġcertificates ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġclient Ġthat Ġpresents Ġpinned Ġcredentials ĊĠĠĠ Ġ@ Fl aky Test ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP in ned Certificate Listener Authenticator With Matching Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Identity Ġ= Ġcreate Identity () ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Certificate Authenticator ( client Identity . certs ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint (), ĠClient Certificate Authenticator ( client Identity )) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġenabled Ġand Ġa Ġclient Ġauth enticator Ġpin ning Ġcertificates ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġclient Ġthat Ġpresents Ġa Ġcert Ġchain Ġwhose Ġroot Ġis Ġpinned ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP in ned Certificate Listener Authenticator With Matching Chain Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Identity Ġ= Ġget Test Chain Identity () ĊĠĠĠĠĠĠĠ Ġval Ġcerts Ġ= Ġclient Identity !!. certs ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġcerts . size ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Certificate Authenticator ( listOf ( certs [ 1 ])) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint (), ĠClient Certificate Authenticator ( client Identity )) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġenabled Ġand Ġa Ġclient Ġauth enticator Ġpin ning Ġcertificates ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġclient Ġthat Ġpresents Ġnon - matching Ġcredentials . ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TL SP in ned Certificate Listener Authenticator With Non Matching Client Credentials () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Certificate Authenticator ( create Identity (). certs ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . TLS _ HAND SHA KE _ FAILED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Certificate Authenticator ( create Identity ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTLS ĠSERVER ĠAUTH ENT IC ATES ĠCLIENT : ĠCALL BACK ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġenabled Ġand Ġa Ġcallback Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġaccept Ġa Ġclient Ġthat Ġpresents Ġcredentials Ġthat Ġcause Ġthe Ġauth enticator Ġto Ġreturn Ġtrue . ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cert Authenticator With Callback Suc ceeds () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Identity Ġ= Ġcreate Identity ( false ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" auth ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠListener Certificate Authenticator Ġ{ Ġcerts Ġ-> Ġcerts [ 0 ] Ġ== Ġclient Identity . certs [ 0 ] Ġ}) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint (), ĠClient Certificate Authenticator ( client Identity )) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġenabled Ġand Ġa Ġcallback Ġclient Ġauth enticator ĊĠĠĠ Ġ// Ġshould Ġref use Ġa Ġclient Ġthat Ġpresents Ġcredentials Ġthat Ġcause Ġthe Ġauth enticator Ġto Ġreturn Ġtrue . ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Cert Authenticator With Callback Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclient Identity Ġ= Ġcreate Identity ( false ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( null , ĠListener Certificate Authenticator Ġ{ Ġcerts Ġ-> Ġcerts [ 0 ] Ġ== Ġnull Ġ}) ĊĊĠĠĠĠĠĠĠ Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . TLS _ HAND SHA KE _ FAILED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠClient Certificate Authenticator ( client Identity ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// //////// ////// Ġ ĠC ĠO ĠN ĠN ĠE ĠC ĠT ĠE ĠD ĠĠ ĠF ĠU ĠN ĠC ĠT ĠI ĠO ĠN ĠA ĠL ĠI ĠT ĠY ĠĠ Ġ// //////// ////// ĊĊĠĠĠ Ġ@ Fl aky Test ĊĠĠĠ Ġ@ Test ( expected Ġ= ĠCouch base Lite Exception :: class ) ĊĠĠĠ Ġfun Ġtest ReadOnly Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĠĠĠĠĠĠĠ Ġconfig . is ReadOnly Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĊĠĠĠĠĠĠĠ Ġmake One Doc (" read - only ", Ġbase Test Db ) ĊĊĠĠĠĠĠĠĠ Ġrun Repl ( listener . endpoint ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġtest Ġfails Ġif Ġno Ġnetwork Ġis Ġavailable ĊĠĠĠ Ġ@ Fl aky Test ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Network Interfaces () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġip V 6 Pattern Ġ= ĠPattern . compile (". local | (([ a - f 0 - 9 ]{ 1 , 4 }:{ 1 , 2 }) + )") ĊĠĠĠĠĠĠĠ Ġval Ġurl Key Ġ= Ġ" URL " ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls () ĊĠĠĠĠĠĠĠ Ġval Ġlocal Urls Ġ= Ġlistener . urls . filter Ġ{ Ġ! ip V 6 Pattern . matcher ( it . host ). find () Ġ} ĊĊĠĠĠĠĠĠĠ Ġlocal Urls . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġit . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠReport . log (" Testing Ġinterface : Ġ${ url }") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdb Ġ= Ġcreate Db ( it . host ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= ĠMutable Document () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . setString ( url Key , Ġurl ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . save ( doc ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun ( make Repl Config ( URL Endpoint ( it ), Ġdb , Ġnull , Ġfalse )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdb . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdb Urls Ġ= ĠQuery Builder . select ( Select Result . property ( url Key )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. from ( DataSource . database ( other DB )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Results () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . getString ( url Key ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠReport . log (" Local ĠURLs : Ġ${ local Urls }, Ġdb Ġurls : Ġ${ db Urls }") ĊĠĠĠĠĠĠĠ ĠassertEquals ( local Urls . size , Ġdb Urls . size ) ĊĠĠĠĠĠĠĠ Ġlocal Urls . forEach Ġ{ ĠassertTrue ( db Urls . contains ( it . toString ())) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Slow Test ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Status () Ġ{ ĊĠĠĠĠĠĠĠ Ġmake One Doc (" connection Status ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĠĠĠĠĠĠĠ Ġconfig . set Disable Tls ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĊĠĠĠĠĠĠĠ ĠassertNull ( listener . status ?. connection Count ) ĊĠĠĠĠĠĠĠ ĠassertNull ( listener . status ?. active Connection Count ) ĊĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġlistener . status ?. connection Count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġlistener . status ?. active Connection Count ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmax Vals Ġ= Ġmutable ListOf ( 0 , Ġ 0 ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġtoken : ĠListener Token ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġrepl Ġ= Ġrun ( make Repl Config ( listener . endpoint (), Ġother DB )) Ġ{ Ġrepl : ĠRep lic ator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġrepl . add ChangeListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . status ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon ĠAndroid Ġ< Ġ 2 4 , Ġwe Ġcannot Ġuse ĠAtomicInteger . get And Accum ulate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( max Vals ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Vals [ 0 ] Ġ= Ġmax ( max Vals [ 0 ], Ġactive Connection Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Vals [ 1 ] Ġ= Ġmax ( max Vals [ 1 ], Ġconnection Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepl . remove ChangeListener ( token !! ) ĊĊĠĠĠĠĠĠĠ Ġlistener . stop () ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġother DB . count ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġcount Ġof Ġactive Ġconnections Ġis , Ġapparently , Ġso Ġinc red ibly Ġf le eting Ġas Ġto Ġbe Ġpretty Ġmuch Ġuseless . ĊĠĠĠĠĠĠĠ Ġ// ĠassertEquals ( 1 , Ġmax Vals [ 0 ]) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġmax Vals [ 1 ]) ĊĊĠĠĠĠĠĠĠ ĠassertNull ( listener . status ?. connection Count ) ĊĠĠĠĠĠĠĠ ĠassertNull ( listener . status ?. active Connection Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġlistener Ġwith ĠTLS Ġdisabled Ġshould Ġnot Ġcreate Ġan Ġanonymous Ġidentity ĊĠĠĠ Ġ@ Slow Test ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Listener Identity () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http () ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĊĠĠĠĠĠĠĠ ĠassertNull ( listener . tls Identity ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġbusy Identity : ĠTLS Identity ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġtoken : ĠListener Token ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġrepl Ġ= Ġrun ( make Repl Config ( listener . endpoint ())) Ġ{ Ġrepl : ĠRep lic ator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġrepl . add ChangeListener Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( change . status . activity Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . BUSY Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( busy Identity Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy Identity Ġ= Ġlistener . tls Identity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepl . remove ChangeListener ( token !! ) ĊĊĠĠĠĠĠĠĠ Ġlistener . stop () ĊĊĠĠĠĠĠĠĠ ĠassertNull ( busy Identity ) ĊĠĠĠĠĠĠĠ ĠassertNull ( listener . tls Identity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġreplic ator Ġshould Ġreport Ġthat Ġno Ġcertificate Ġwas Ġsupplied Ġby Ġa Ġserver Ġwith ĠTLS Ġdisabled ĊĠĠĠ Ġ@ Slow Test ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest HTTP Listener Replic ator Get Certificate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Http () ĊĊĠĠĠĠĠĠĠ Ġvar Ġbusy Certs : ĠList < Certificate >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġvar Ġtoken : ĠListener Token ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġrepl Ġ= Ġrun ( make Repl Config ( listener . endpoint ())) Ġ{ Ġrepl : ĠRep lic ator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( repl . server Certificates ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġrepl . add ChangeListener Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( change . status . activity Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . BUSY Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( busy Certs Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy Certs Ġ= Ġrepl . server Certificates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepl . remove ChangeListener ( token !! ) ĊĊĠĠĠĠĠĠĠ Ġlistener . stop () ĊĊĠĠĠĠĠĠĠ ĠassertNull ( busy Certs ) ĊĠĠĠĠĠĠĠ ĠassertNull ( listener . tls Identity ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġreplic ator Ġshould Ġreport Ġthe Ġserver 's Ġcertificate Ġon Ġconnection Ġsuccess ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TLS Listener Replic ator Get Certificate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĠĠĠĠĠĠĠ Ġval Ġcert Ġ= Ġserver Identity . certs [ 0 ] ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġbusy Certs : ĠList < Certificate >? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġvar Ġtoken : ĠListener Token ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġrepl Ġ= Ġrun ( make Repl Config ( listener . endpoint (), Ġbase Test Db , Ġcert , Ġfalse )) Ġ{ Ġrepl : ĠRep lic ator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( repl . server Certificates ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Ġ= Ġrepl . add ChangeListener Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( change . status . activity Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . BUSY Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( busy Certs Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbusy Certs Ġ= Ġrepl . server Certificates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepl . remove ChangeListener ( token !! ) ĊĊĠĠĠĠĠĠĠ Ġval Ġencoded Cert Ġ= Ġcert . encoded ĊĠĠĠĠĠĠĠ ĠassertTrue ( Arrays . equals ( encoded Cert , Ġbusy Certs ! ![ 0 ]. encoded )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( Arrays . equals ( encoded Cert , Ġrepl . server Certificates ! ![ 0 ]. encoded )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠA Ġreplic ator Ġshould Ġreport Ġthe Ġserver 's Ġcertificate Ġon Ġconnection Ġfailure ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TLS Listener Replic ator Get Certificate OnError () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrepl Ġ= Ġrun ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Repl Config ( listener . endpoint (), Ġbase Test Db , Ġcreate Identity (). certs [ 0 ], Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Code . TLS _ CERT _ UN TR UST ED , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC BLE rror . Domain . C BL ITE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ) Ġ{ Ġrepl : ĠRep lic ator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( repl . server Certificates ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( Arrays . equals ( server Identity . certs [ 0 ]. encoded , Ġrepl . server Certificates ! ![ 0 ]. encoded )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠClosing Ġa Ġdatabase Ġshould Ġshutdown Ġall Ġlisteners ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Close Db With Active Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Docs In Db ( 1 0 0 0 , Ġ 7 , Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġcreate Docs In Db ( 2 0 0 0 , Ġ 1 1 , Ġbase Test Db ) ĊĊĠĠĠĠĠĠĠ Ġval Ġserver Id Ġ= Ġcreate Identity () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Id ) ĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġidle Latch 1 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġstop Latch 1 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġrepl 1 Ġ= Ġtest Replic ator ( make Repl Config ( listener . endpoint (), Ġbase Test Db , Ġserver Id . certs [ 0 ])) ĊĠĠĠĠĠĠĠ Ġrepl 1 . add ChangeListener Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( change . status . activity Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . IDLE Ġ-> Ġidle Latch 1 . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . STOP PED Ġ-> Ġstop Latch 1 . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepl 1 . start ( false ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdb 2 Ġ= Ġcreate Db (" other - other - db ") ĊĠĠĠĠĠĠĠ Ġval Ġidle Latch 2 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġstop Latch 2 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġrepl 2 Ġ= Ġtest Replic ator ( make Repl Config ( listener . endpoint (), Ġdb 2 , Ġserver Id . certs [ 0 ])) ĊĠĠĠĠĠĠĠ Ġrepl 1 . add ChangeListener Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( change . status . activity Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . IDLE Ġ-> Ġidle Latch 2 . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . STOP PED Ġ-> Ġstop Latch 2 . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepl 2 . start ( false ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( idle Latch 1 . await ( LONG _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( idle Latch 2 . await ( LONG _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġlistener . status ?. connection Count ) ĊĊĠĠĠĠĠĠĠ Ġdb 2 . close () ĊĠĠĠĠĠĠĠ Ġbase Test Db . close () ĊĠĠĠĠĠĠĠ Ġother DB . close () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( stop Latch 1 . await ( LONG _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( stop Latch 2 . await ( LONG _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( listener . isRunning ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠDe leting Ġa Ġdatabase Ġshould Ġshutdown Ġall Ġlisteners ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Delete Db With Active Listeners () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Docs In Db ( 1 0 0 0 , Ġ 7 , Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġcreate Docs In Db ( 2 0 0 0 , Ġ 1 1 , Ġbase Test Db ) ĊĊĠĠĠĠĠĠĠ Ġval Ġserver Id Ġ= Ġcreate Identity () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Id ) ĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġidle Latch 1 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġstop Latch 1 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġrepl 1 Ġ= Ġtest Replic ator ( make Repl Config ( listener . endpoint (), Ġbase Test Db , Ġserver Id . certs [ 0 ])) ĊĠĠĠĠĠĠĠ Ġrepl 1 . add ChangeListener Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( change . status . activity Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . IDLE Ġ-> Ġidle Latch 1 . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . STOP PED Ġ-> Ġstop Latch 1 . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepl 1 . start ( false ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdb 2 Ġ= Ġcreate Db (" other - other - db ") ĊĠĠĠĠĠĠĠ Ġval Ġidle Latch 2 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġstop Latch 2 Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġrepl 2 Ġ= ĠRep lic ator ( make Repl Config ( listener . endpoint (), Ġdb 2 , Ġserver Id . certs [ 0 ])) ĊĠĠĠĠĠĠĠ Ġrepl 1 . add ChangeListener Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( change . status . activity Level ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . IDLE Ġ-> Ġidle Latch 2 . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Activity Level . STOP PED Ġ-> Ġstop Latch 2 . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepl 2 . start ( false ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( idle Latch 1 . await ( LONG _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( idle Latch 2 . await ( LONG _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġlistener . status ?. connection Count ) ĊĊĠĠĠĠĠĠĠ Ġdb 2 . delete () ĊĠĠĠĠĠĠĠ Ġbase Test Db . delete () ĊĠĠĠĠĠĠĠ Ġother DB . delete () ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( stop Latch 1 . await ( LONG _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĠĠĠĠĠĠĠ ĠassertTrue ( stop Latch 2 . await ( LONG _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĠĠĠĠĠĠĠ ĠassertFalse ( listener . isRunning ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġhttps :// issues . couch base . com / browse / C BL - 1 1 1 6 ĊĠĠĠ Ġ// ĠA Ġdocument Ġlistener Ġon Ġa Ġreplic ator Ġconnected Ġto Ġa ĠURL Endpoint Listener Ġshould Ġobserve Ġde letions ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Delete Event () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Docs In Db ( 2 0 0 , Ġ 7 , Ġbase Test Db ) ĊĠĠĠĠĠĠĠ Ġcreate Docs In Db ( 3 0 0 , Ġ 1 1 , Ġother DB ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 7 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 1 , Ġother DB . count ) ĊĊĠĠĠĠĠĠĠ Ġval Ġrepl Ġ= Ġrun ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisten Http (). endpoint (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Type . PUSH _ AND _ PULL , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 8 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 8 , Ġother DB . count ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġdeleted Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġrepl . add Document Replication Listener Ġ{ Ġreplication Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( doc Ġin Ġreplication . documents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( doc . flags (). contains ( Document Flag . Document Flags Deleted )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleted ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġother DB . delete ( other DB . get NonNull Doc (" doc - 3 0 3 ")) ĊĠĠĠĠĠĠĠ Ġother DB . delete ( other DB . get NonNull Doc (" doc - 3 0 7 ")) ĊĊĠĠĠĠĠĠĠ Ġval Ġl atch Ġ= ĠCount DownLatch ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġrepl . add ChangeListener Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . status . activity Level Ġ== ĠRep lic ator Activity Level . STOP PED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġl atch . count Down () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrepl . start ( false ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( latch . await ( STD _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĊĠĠĠĠĠĠĠ Ġrepl . remove ChangeListener ( token ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 6 , Ġbase Test Db . count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 6 , Ġother DB . count ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġdeleted ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// //////////////// // ĠĠ ĠL ĠO ĠA ĠD ĠĠ ĠT ĠE ĠS ĠT ĠS ĠĠ Ġ// //////////////// // ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiple Listeners On Same Database () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġbase Test Db . count ) ĊĊĠĠĠĠĠĠĠ Ġconfig . tls Identity Ġ= Ġcreate Identity ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener 1 Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener 1 ) ĊĠĠĠĠĠĠĠ Ġlistener 1 . start () ĊĊĠĠĠĠĠĠĠ Ġconfig . tls Identity Ġ= Ġcreate Identity ( false ) ĊĠĠĠĠĠĠĠ Ġval Ġlistener 2 Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener 2 ) ĊĠĠĠĠĠĠĠ Ġlistener 2 . start () ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" endpoint - test ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġrun Repl ( listener 1 . endpoint ()) ĊĠĠĠĠĠĠĠ Ġrun Repl ( listener 2 . endpoint ()) ĊĊĠĠĠĠĠĠĠ Ġassert One Doc ( doc Id , Ġbase Test Db ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Fl aky Test ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Multiple Replic ators To Listener () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshould Wait Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġbarrier Ġ= ĠC yc lic Barrier ( 2 ) Ġ{ Ġshould Wait Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstop Latch Ġ= ĠCount DownLatch ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfilters Ġcan Ġactually Ġhang Ġthe Ġreplication ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠRep lication Filter Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Wait ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbarrier . await ( STD _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠBroken Barrier Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġchange Listener Ġ= Ġ{ Ġchange : ĠRep lic ator Change Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . status . activity Level Ġ== ĠRep lic ator Activity Level . STOP PED ) Ġstop Latch . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" multi - repl ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdb 1 Ġ= Ġcreate Db (" db 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id 1 Ġ= Ġmake One Doc (" db 1 ", Ġdb 1 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRep lic ator # 1 Ġ( DB # 1 Ġ< -> ĠListener ( other DB )) ĊĠĠĠĠĠĠĠ Ġval Ġconfig 1 Ġ= Ġmake Repl Config ( listener . endpoint (), Ġdb 1 , Ġserver Identity . certs [ 0 ], Ġfalse ) ĊĠĠĠĠĠĠĠ Ġconfig 1 . pull Filter Ġ= Ġfilter ĊĠĠĠĠĠĠĠ Ġval Ġrepl 1 Ġ= Ġtest Replic ator ( config 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġtoken 1 Ġ= Ġrepl 1 . add ChangeListener ( change Listener ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdb 2 Ġ= Ġcreate Db (" db 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id 2 Ġ= Ġmake One Doc (" db 2 ", Ġdb 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRep lic ator # 2 Ġ( DB # 2 Ġ< -> ĠListener ( other DB )) ĊĠĠĠĠĠĠĠ Ġval Ġconfig 2 Ġ= Ġmake Repl Config ( listener . endpoint (), Ġdb 2 , Ġserver Identity . certs [ 0 ], Ġfalse ) ĊĠĠĠĠĠĠĠ Ġconfig 2 . pull Filter Ġ= Ġfilter ĊĠĠĠĠĠĠĠ Ġval Ġrepl 2 Ġ= Ġtest Replic ator ( config 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġtoken 2 Ġ= Ġrepl 2 . add ChangeListener ( change Listener ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġdb 1 . count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġdb 2 . count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġother DB . count ) ĊĊĠĠĠĠĠĠĠ Ġrepl 1 . start ( false ) ĊĠĠĠĠĠĠĠ Ġrepl 2 . start ( false ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( stop Latch . await ( STD _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĊĠĠĠĠĠĠĠ Ġrepl 1 . stop () ĊĠĠĠĠĠĠĠ Ġrepl 1 . remove ChangeListener ( token 1 ) ĊĊĠĠĠĠĠĠĠ Ġrepl 2 . stop () ĊĠĠĠĠĠĠĠ Ġrepl 2 . remove ChangeListener ( token 2 ) ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( barrier . is Broken ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġdb 1 . count ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( db 1 . getDocument ( doc Id )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( db 1 . getDocument ( doc Id 1 )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġdb 2 . count ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( db 2 . getDocument ( doc Id )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( db 2 . getDocument ( doc Id 2 )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġother DB . count ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( other DB . getDocument ( doc Id )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( other DB . getDocument ( doc Id 1 )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( other DB . getDocument ( doc Id 2 )) ĊĊĠĠĠĠĠĠĠ Ġrepl 1 . remove ChangeListener ( token 1 ) ĊĠĠĠĠĠĠĠ Ġrepl 2 . remove ChangeListener ( token 2 ) ĊĊĠĠĠĠĠĠĠ Ġdb 2 . close () ĊĠĠĠĠĠĠĠ Ġdb 1 . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Replic ator And Listener On Same Database () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshould Wait Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġbarrier Ġ= ĠC yc lic Barrier ( 2 ) Ġ{ Ġshould Wait Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstop Latch Ġ= ĠCount DownLatch ( 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġfilters Ġcan Ġactually Ġhang Ġthe Ġreplication ĊĠĠĠĠĠĠĠ Ġval Ġfilter Ġ= ĠRep lication Filter Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( should Wait ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbarrier . await ( STD _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠTimeout Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġchange Listener Ġ= ĠRep lic ator ChangeListener Ġ{ Ġchange Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( change . status . activity Level Ġ== ĠRep lic ator Activity Level . STOP PED ) Ġstop Latch . count Down () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġmake One Doc (" repl _ listener ", Ġother DB ) ĊĊĠĠĠĠĠĠĠ Ġval Ġserver Identity Ġ= Ġcreate Identity () ĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= Ġlisten Tls ( server Identity ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdb 1 Ġ= Ġcreate Db (" db 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id 1 Ġ= Ġmake One Doc (" db 1 ", Ġdb 1 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRep lic ator # 1 Ġ( DB # 1 Ġ< -> ĠListener ( other DB )) ĊĠĠĠĠĠĠĠ Ġval Ġconfig 1 Ġ= Ġmake Repl Config ( listener . endpoint (), Ġdb 1 , Ġserver Identity . certs [ 0 ], Ġfalse ) ĊĠĠĠĠĠĠĠ Ġconfig 1 . pull Filter Ġ= Ġfilter ĊĠĠĠĠĠĠĠ Ġval Ġrepl 1 Ġ= Ġtest Replic ator ( config 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġtoken 1 Ġ= Ġrepl 1 . add ChangeListener ( change Listener ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdb 2 Ġ= Ġcreate Db (" db 2 ") ĊĠĠĠĠĠĠĠ Ġval Ġdoc Id 2 Ġ= Ġmake One Doc (" db 2 ", Ġdb 2 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRep lic ator # 2 Ġ( other DB Ġ< -> ĠDB # 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġconfig 2 Ġ= Ġmake Repl Config ( Database Endpoint ( db 2 ), Ġother DB , Ġnull , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġconfig 2 . push Filter Ġ= Ġfilter ĊĠĠĠĠĠĠĠ Ġval Ġrepl 2 Ġ= Ġtest Replic ator ( config 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġtoken 2 Ġ= Ġrepl 1 . add ChangeListener ( change Listener ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġdb 1 . count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġdb 2 . count ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġother DB . count ) ĊĊĠĠĠĠĠĠĠ Ġrepl 1 . start ( false ) ĊĠĠĠĠĠĠĠ Ġrepl 2 . start ( false ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( stop Latch . await ( STD _ TIMEOUT _ SEC , ĠTimeUnit . SECONDS )) ĊĊĠĠĠĠĠĠĠ Ġrepl 1 . stop () ĊĠĠĠĠĠĠĠ Ġrepl 1 . remove ChangeListener ( token 1 ) ĊĊĠĠĠĠĠĠĠ Ġrepl 2 . stop () ĊĠĠĠĠĠĠĠ Ġrepl 2 . remove ChangeListener ( token 2 ) ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( barrier . is Broken ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġdb 1 . count ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( db 1 . getDocument ( doc Id )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( db 1 . getDocument ( doc Id 1 )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 , Ġdb 2 . count ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( db 2 . getDocument ( doc Id )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( db 2 . getDocument ( doc Id 2 )) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 3 , Ġother DB . count ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( other DB . getDocument ( doc Id )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( other DB . getDocument ( doc Id 1 )) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( other DB . getDocument ( doc Id 2 )) ĊĊĠĠĠĠĠĠĠ Ġdb 1 . close () ĊĠĠĠĠĠĠĠ Ġdb 2 . close () ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ// //////// ////// Ġ ĠH ĠE ĠL ĠP ĠE ĠR ĠĠ ĠF ĠU ĠN ĠC ĠT ĠI ĠO ĠN ĠS ĠĠ Ġ// //////// ////// ĊĊĠĠĠ Ġprivate Ġfun Ġlisten Http ( auth : ĠListener Password Authenticator ? Ġ= Ġnull ): ĠURL Endpoint Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĠĠĠĠĠĠĠ Ġconfig . port Ġ= Ġget Port () ĊĠĠĠĠĠĠĠ Ġconfig . set Disable Tls ( true ) ĊĠĠĠĠĠĠĠ Ġconfig . set Authenticator ( auth ) ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlisten Tls ( ĊĠĠĠĠĠĠĠ Ġidentity : ĠTLS Identity ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġauth : ĠListener Authenticator ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠURL Endpoint Listener Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠListener : ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠURL Endpoint Listener Configuration ( other DB ) ĊĠĠĠĠĠĠĠ Ġconfig . port Ġ= Ġget Port () ĊĠĠĠĠĠĠĠ Ġconfig . set Authenticator ( auth ) ĊĠĠĠĠĠĠĠ Ġidentity ?. let Ġ{ Ġconfig . tls Identity Ġ= Ġit Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlistener Ġ= ĠURL Endpoint Listener ( config ) ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĊĠĠĠĠĠĠĠ Ġlistener . start () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlistener ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠThis Ġcreates Ġan Ġidentity Ġfor Ġan Ġimported Ġkeystore Ġalias Ġwith Ġa Ġcert Ġchain Ġof Ġlength Ġtwo ĊĠĠĠ Ġ// Ġand Ġwhose Ġroot Ġis Ġthe Ġcertificate Ġobtained Ġfrom Ġget Test CAC ertificate Ġbelow . ĊĠĠĠ Ġprivate Ġfun Ġget Test Chain Identity (): ĠTLS Identity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalias Ġ= ĠSecurity Base Test . new Key Alias () ĊĠĠĠĠĠĠĠ ĠPlatform Security Test . import Test Entry ( Security Base Test . EXTERNAL _ KEY _ ALIAS _ TEST _ CHAIN , Ġalias ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPlatform Security Test . get Identity ( alias ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Test CAC ertificate (): ĠCertificate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexternal Store Ġ= ĠKey Store . getInstance ( Security Base Test . EXTERNAL _ KEY _ STORE _ TYPE ) ĊĠĠĠĠĠĠĠ ĠPlatform Utils . get Asset ( Security Base Test . EXTERNAL _ KEY _ STORE ). use Ġ{ Ġks Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Store . load ( ks , ĠSecurity Base Test . EXTERNAL _ KEY _ PASSWORD . toCharArray ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġexternal Store . get Certificate ( Security Base Test . EXTERNAL _ KEY _ ALIAS _ TEST _ CA ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Identity ( is Server : ĠBoolean Ġ= Ġtrue ): ĠTLS Identity Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġalias Ġ= ĠSecurity Base Test . new Key Alias () ĊĊĠĠĠĠĠĠĠ Ġval Ġattributes Ġ= ĠSecurity Base Test . X 5 0 9 _ ATTRIBUTES ĊĊĠĠĠĠĠĠĠ Ġval Ġexpiration Ġ= ĠCalendar . getInstance () ĊĠĠĠĠĠĠĠ Ġexpiration . add ( Calendar . YEAR , Ġ 3 ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPlatform Security Test . create Identity ( is Server , Ġattributes , Ġexpiration . time , Ġalias ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Repl Config ( ĊĠĠĠĠĠĠĠ Ġtarget : ĠEndpoint , ĊĠĠĠĠĠĠĠ Ġsource : ĠDatabase Ġ= Ġbase Test Db , ĊĠĠĠĠĠĠĠ Ġpinned Server Cert : ĠCertificate ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġcontinuous : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠRep lic ator Configuration Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmake Repl Config ( target , Ġsource , Ġnull , Ġpinned Server Cert , Ġcontinuous ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake Repl Config ( ĊĠĠĠĠĠĠĠ Ġtarget : ĠEndpoint , ĊĠĠĠĠĠĠĠ Ġsource : ĠDatabase , ĊĠĠĠĠĠĠĠ Ġauth : ĠAuth enticator ?, ĊĠĠĠĠĠĠĠ Ġpinned Server Cert : ĠCertificate ?, ĊĠĠĠĠĠĠĠ Ġcontinuous : ĠBoolean ĊĠĠĠ Ġ): ĠRep lic ator Configuration Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġmake Config ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRep lic ator Type . PUSH _ AND _ PULL , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinuous , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpinned Server Cert ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġconfig . is Accept Only Self Signed Server Certificate Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( auth Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . set Authenticator ( auth ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġconfig ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Repl ( ĊĠĠĠĠĠĠĠ Ġtarget : ĠEndpoint , ĊĠĠĠĠĠĠĠ Ġauth : ĠAuth enticator ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġpinned Server Cert : ĠCertificate ? Ġ= Ġnull ĊĠĠĠ Ġ): ĠRep lic ator Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun ( make Repl Config ( target , Ġbase Test Db , Ġauth , Ġpinned Server Cert , Ġfalse )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Repl WithError ( ĊĠĠĠĠĠĠĠ Ġcode : ĠInt , ĊĠĠĠĠĠĠĠ Ġdomain : ĠString , ĊĠĠĠĠĠĠĠ Ġtarget : ĠEndpoint , ĊĠĠĠĠĠĠĠ Ġauth : ĠAuth enticator ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġpinned Server Cert : ĠCertificate ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġcontinuous : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġon Ready : ĠFn . Consumer < Replic ator >? Ġ= Ġnull ĊĠĠĠ Ġ): ĠRep lic ator Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Repl Config ( target , Ġbase Test Db , Ġauth , Ġpinned Server Cert , Ġcontinuous ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomain , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Ready ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmake One Doc ( id : ĠString , Ġdb : ĠDatabase ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 0 , Ġdb . count ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdoc Id Ġ= Ġget Unique Name ( id ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Doc Ġ= ĠMutable Document ( doc Id ) ĊĠĠĠĠĠĠĠ Ġtest Doc . setString (" species ", Ġ" T iger ") ĊĠĠĠĠĠĠĠ Ġdb . save ( test Doc ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdoc Id ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert One Doc ( id : ĠString , Ġdb : ĠDatabase ) Ġ{ ĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 , Ġdb . count ) ĊĠĠĠĠĠĠĠ ĠassertNotNull ( db . getDocument ( id )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠURL Endpoint Listener . endpoint Uri () Ġ= ĊĠĠĠ ĠURI ( ĊĠĠĠĠĠĠĠ Ġif Ġ( config . is Tls Disabled ) Ġ" ws " Ġelse Ġ" wss ", ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠ Ġ" localhost ", ĊĠĠĠĠĠĠĠ Ġport , ĊĠĠĠĠĠĠĠ Ġ"/ ${ config . database . name }", ĊĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ) Ċ Ċ private Ġfun ĠURL Endpoint Listener . endpoint () Ġ= ĠURL Endpoint ( endpoint Uri ()) Ċ Ċ private Ġfun ĠDatabase . get NonNull Doc ( id : ĠString ) Ġ= ĊĠĠĠ Ġthis . getDocument ( id ) Ġ?: Ġthrow ĠIllegalStateException (" document Ġ${ id } Ġis Ġnull ") ĊĊ