package Ġdb . f enn ec . api . grpc . client ; Ċ Ċ import Ġcom . google . common . f logger . Fluent Logger Ċ import Ġdb . f enn ec . api . grpc . client . error . F enn ec Exception Ċ import Ġdb . f enn ec . api . grpc . server . F enn ec Grpc Server Ċ import Ġdb . f enn ec . common . Log Definition Ċ import Ġdb . f enn ec . f ql . F Data Ċ import Ġdb . f enn ec . f ql . F Selection Ċ import Ġdb . f enn ec . f ql . InRange Ċ import Ġdb . f enn ec . f ql . Key Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġjava . time . Instant Ċ import Ġjava . util . logging . Level Ċ Ċ class ĠF enn ec Client Test Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġval Ġlog Ġ= ĠFluent Logger . for En closing Class () ĊĊĠĠĠĠĠĠĠ Ġval ĠGRPC _ TEST _ PORT Ġ= Ġ 5 1 2 3 4 ĊĠĠĠĠĠĠĠ Ġval ĠREST _ TEST _ PORT Ġ= Ġ 5 1 2 3 5 ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static Ġval ĠTEST _ NS Ġ= Ġ" jvm _ client _ test " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġd One Ġ= ĠF Data ( 1 . 0 , Ġ 1 5 4 4 9 1 2 2 4 6 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġd Two Ġ= ĠF Data ( 2 . 0 , Ġ 1 5 4 4 9 1 2 2 4 8 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġd Three Ġ= ĠF Data ( 3 . 0 , Ġ 1 5 4 4 9 1 2 2 5 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġd Four Ġ= ĠF Data ( 4 . 0 , Ġ 1 5 4 4 9 1 2 2 4 6 0 3 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġd Five Ġ= ĠF Data ( 5 . 0 , Ġ 1 5 4 4 9 1 2 2 4 6 0 3 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun Ġbefore () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog Definition . BASE _ LOG _ LEVEL Ġ= ĠLevel . INFO ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsetup ( body : Ġ( F enn ec Client ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġstart Ġserver ĊĠĠĠĠĠĠĠ Ġval Ġserver Ġ= ĠF enn ec Grpc Server ( GRPC _ TEST _ PORT , ĠREST _ TEST _ PORT , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġval Ġserver Thread Ġ= ĠThread ( server , Ġ" f enn ec - client - test ") ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Thread . start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtest Ġcode ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclient Ġ= ĠF enn ec Client (" localhost ", ĠGRPC _ TEST _ PORT , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . connect () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . invoke ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstop Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver . stop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserver Thread . interrupt () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( F enn ec Exception :: class ) ĊĠĠĠ Ġfun Ġtest Query () Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠInstant . now (). to Epoch Milli () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . query ( F Selection (" x ", ĠTEST _ NS , ĠIn Range ( now Ġ- Ġ 1 0 0 0 Ġ* Ġ 6 0 Ġ* Ġ 5 , Ġnow )). to Query ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . at Info (). log (" Result : Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" Should 've Ġreceived Ġempty Ġresult ", Ġ 0 , Ġresult . data . size ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( F enn ec Exception :: class ) ĊĠĠĠ Ġfun Ġtest Insert () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġ" a " ĊĠĠĠĠĠĠĠ Ġsetup Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġfind Range () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Data Ġ= ĠlistOf ( d One , Ġd Two , Ġd Three , Ġd Four ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . insert ( initial Data , Ġfield , ĠTEST _ NS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . insert ( listOf ( d Five ), Ġfield , ĠTEST _ NS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Written Data ( client , Ġfield , Ġrange , Ġinitial Data , ĠlistOf ( d Five )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( F enn ec Exception :: class ) ĊĠĠĠ Ġfun Ġtest Up sert () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġ" b " ĊĠĠĠĠĠĠĠ Ġsetup Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġfind Range () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . upsert ( listOf ( d One , Ġd Two , Ġd Three , Ġd Four ), Ġfield , ĠTEST _ NS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . upsert ( listOf ( d Five ), Ġfield , ĠTEST _ NS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Written Data ( client , Ġfield , Ġrange , ĠlistOf ( d One , Ġd Two , Ġd Three , Ġd Five ), ĠlistOf ( d Four )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( F enn ec Exception :: class ) ĊĠĠĠ Ġfun Ġtest Batch Insert () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġ" a " ĊĠĠĠĠĠĠĠ Ġsetup Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġfind Range () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitial Data Ġ= ĠlistOf ( d One , Ġd Two , Ġd Three , Ġd Four ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . batch Up sert ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF Batch ( d One , Ġfield , ĠTEST _ NS ), ĠF Batch ( d Two , Ġfield , ĠTEST _ NS ), ĠF Batch ( d Three , Ġfield , ĠTEST _ NS ), ĠF Batch ( d Four , Ġfield , ĠTEST _ NS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . batch Insert ( listOf ( F Batch ( d Five , Ġfield , ĠTEST _ NS ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Written Data ( client , Ġfield , Ġrange , Ġinitial Data , ĠlistOf ( d Five )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( F enn ec Exception :: class ) ĊĠĠĠ Ġfun Ġtest Batch Up sert () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġ" b " ĊĠĠĠĠĠĠĠ Ġsetup Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġfind Range () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . batch Up sert ( listOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF Batch ( d One , Ġfield , ĠTEST _ NS ), ĠF Batch ( d Two , Ġfield , ĠTEST _ NS ), ĠF Batch ( d Three , Ġfield , ĠTEST _ NS ), ĠF Batch ( d Four , Ġfield , ĠTEST _ NS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . batch Up sert ( listOf ( F Batch ( d Five , Ġfield , ĠTEST _ NS ))) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Written Data ( client , Ġfield , Ġrange , ĠlistOf ( d One , Ġd Two , Ġd Three , Ġd Five ), ĠlistOf ( d Four )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( F enn ec Exception :: class ) ĊĠĠĠ Ġfun Ġtest Remove Namespace () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġ" c " ĊĠĠĠĠĠĠĠ Ġsetup Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . insert ( listOf ( d One ), Ġfield , ĠTEST _ NS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . remove Namespace ( TEST _ NS ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Written Data ( client , Ġfield , ĠLong Range ( 0 , ĠLong . MAX _ VALUE ), ĠlistOf (), ĠlistOf ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Throws ( F enn ec Exception :: class ) ĊĠĠĠ Ġfun Ġtest Remove () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġ" d " ĊĠĠĠĠĠĠĠ Ġsetup Ġ{ Ġclient Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= ĠlistOf ( d One , Ġd Two , Ġd Three ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġfind Range ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . insert ( input , Ġfield , ĠTEST _ NS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . remove ( range . first , Ġrange . last , Ġfield , ĠTEST _ NS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Written Data ( client , Ġfield , Ġrange , ĠlistOf (), Ġinput ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Written Data ( client : ĠF enn ec Client , Ġfield : ĠString , Ġrange : ĠLong Range , Ġwanted : ĠList < F Data >, Ġnot W anted : ĠList < F Data >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġclient . query ( F Selection ( field , ĠTEST _ NS , ĠIn Range ( range . first , Ġrange . last )). to Query ()) ĊĠĠĠĠĠĠĠ Ġlog . at Info (). log (" Result :$ result ") ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġresult . data . get ( Key ( field , ĠTEST _ NS )). toSet () ĊĠĠĠĠĠĠĠ ĠassertEquals (" Got Ġmore Ġdata Ġthan Ġwanted ", Ġwanted . size , Ġdata . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( d Ġin Ġwanted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (" Could Ġnot Ġfind Ġwanted Ġdata Ġ$ d ", Ġdata . contains ( d )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( d Ġin Ġnot W anted ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue (" Date Ġ$ d Ġshould Ġnot Ġbe Ġpresent ", Ġ! data . contains ( d )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Range ( of : ĠList < F Data > Ġ= ĠlistOf ( d One , Ġd Two , Ġd Three , Ġd Four , Ġd Five )): ĠLong Range Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmin Ġ= Ġd One . timestamp ĊĠĠĠĠĠĠĠ Ġvar Ġmax Ġ= Ġd One . timestamp ĊĠĠĠĠĠĠĠ Ġfor Ġ( d Ġin Ġof ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d . timestamp Ġ< Ġmin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmin Ġ= Ġd . timestamp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( d . timestamp Ġ> Ġmax ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Ġ= Ġd . timestamp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . at Info (). log (" Min :$ min , ĠMax :$ max ") ĊĠĠĠĠĠĠĠ Ġreturn ĠLong Range ( min , Ġmax ) ĊĠĠĠ Ġ} ĊĊĊ Ċ } Ċ