package Ġcom . sin ch . sms verification Ċ Ċ import Ġandroid . app . Application Ċ import Ġandroid . os . Build Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġcom . google . android . gms . common . api . Status Ċ import Ġcom . sin ch . verification . core . internal . error . Code Inter ception Exception Ċ import Ġcom . sin ch . verification . core . verification . interceptor . Basic Code Interceptor Ċ import Ġcom . sin ch . verification . core . verification . interceptor . Code Inter ception Listener Ċ import Ġcom . sin ch . verification . core . verification . interceptor . Interceptor State Ċ import Ġcom . sin ch . verification . sms . verification . interceptor . Sms Broadcast Receiver Ċ import Ġcom . sin ch . verification . sms . verification . interceptor . Sms Code Interceptor Ċ import Ġcom . sin ch . verification . utils . MAX _ TIMEOUT Ċ import Ġio . mock k . Mock K Annotations Ċ import Ġio . mock k . impl . annotations . Mock K Ċ import Ġio . mock k . verify Ċ import Ġorg . junit . Assert Ċ import Ġorg . junit . Before Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . ro bo lectric . Ro bo lectric Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġorg . ro bo lectric . Shadow s Ċ import Ġorg . ro bo lectric . annotation . Config Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ @ RunWith ( ĊĠĠĠ ĠRo bo lectric TestRunner :: class Ċ ) Ċ @ Config ( sdk Ġ= Ġ[ Build . VERSION _ CODES . O _ MR 1 ]) Ċ class ĠS ms Code Interceptor Tests Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCODE Ġ= Ġ"{{ CODE }}" ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġsimple Template Ġ= Ġ" Your Ġcode Ġis Ġ$ CODE " ĊĠĠĠĠĠĠĠ Ġconst Ġval Ġexample Code Ġ= Ġ" 1 2 3 4 " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcontext Ġ= ĠApplication Provider . getApplicationContext < Application >() ĊĠĠĠ Ġprivate Ġval Ġshadow Application Ġ= ĠShadow s . shadow Of ( context ) ĊĊĠĠĠ Ġ@ Mock K ( relax ed Ġ= Ġtrue ) ĊĠĠĠ Ġlateinit Ġvar Ġmocked Inter ception Listener : ĠCode Inter ception Listener ĊĊĠĠĠ Ġ@ Before ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ ĠMock K Annotations . init ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Broadcast Receiver Registered After Start Called () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Interceptor ( simple Template ). apply Ġ{ Ġstart () Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertTrue ( shadow Application . registered Re ceiv ers . map Ġ{ Ġit . broadcast Receiver :: class . simple Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains ( Sms Broadcast Receiver :: class . simple Name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Broadcast Receiver Un registered After Stop Called () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Interceptor ( simple Template ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( shadow Application . registered Re ceiv ers . map Ġ{ Ġit . broadcast Receiver :: class . simple Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains ( Sms Broadcast Receiver :: class . simple Name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Failed Retriever Client Initialization () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexample Error Ġ= ĠException () ĊĠĠĠĠĠĠĠ Ġval Ġinterceptor Ġ= Ġcreate Interceptor ( simple Template ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Failure ( example Error ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmocked Inter ception Listener . on Code Inter ception Error ( any < Code Inter ception Exception >()) Ġ} ĊĠĠĠĠĠĠĠ Ġinterceptor . assert IsIn State ( Interceptor State . DONE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest TimeoutException Thrown () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtimeout : ĠLong Ġ= Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠ Ġcreate Interceptor ( inter ception Timeout Ġ= Ġtimeout ). apply Ġ{ Ġstart () Ġ} ĊĠĠĠĠĠĠĠ ĠRo bo lectric . get Foreground Thread Scheduler (). advance By ( timeout Ġ/ Ġ 2 , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmocked Inter ception Listener . on Code Inter ception Error ( any < Code Inter ception Exception >()) Ġ} ĊĠĠĠĠĠĠĠ ĠRo bo lectric . get Foreground Thread Scheduler (). advance By ( timeout , ĠTimeUnit . MILLISECONDS ) ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmocked Inter ception Listener . on Code Inter ception Error ( any < Code Inter ception Exception >()) Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( shadow Application . registered Re ceiv ers . map Ġ{ Ġit . broadcast Receiver :: class . simple Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains ( Sms Broadcast Receiver :: class . simple Name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Listener Not ified About Successful Inter ception () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinterceptor Ġ= Ġcreate Interceptor (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Message Received ( simple Template . replace ( CODE , Ġexample Code )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmocked Inter ception Listener . on Code Intercept ed ( example Code ) Ġ} ĊĠĠĠĠĠĠĠ Ġinterceptor . assert IsIn State ( Interceptor State . DONE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Receiver Un registered After Successful Inter ception () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Interceptor (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Message Received ( simple Template . replace ( CODE , Ġexample Code )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠAssert . assertFalse ( shadow Application . registered Re ceiv ers . map Ġ{ Ġit . broadcast Receiver :: class . simple Name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains ( Sms Broadcast Receiver :: class . simple Name )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Listener Not ified About Inter ception Error () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexample Exception Ġ= ĠCode Inter ception Exception (" Example Ġmessage ") ĊĠĠĠĠĠĠĠ Ġval Ġinterceptor Ġ= Ġcreate Interceptor (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Message Failed To Receive ( example Exception ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmocked Inter ception Listener . on Code Inter ception Error ( example Exception ) Ġ} ĊĠĠĠĠĠĠĠ Ġinterceptor . assert IsIn State ( Interceptor State . DONE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Listener Not ified About Successful Broadcast Inter ception () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinterceptor Ġ= Ġcreate Interceptor (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS ms Broadcast Receiver Tests . mocked Broadcast Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsimple Template . replace ( CODE , Ġexample Code ), ĠStatus . RESULT _ SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmocked Inter ception Listener . on Code Intercept ed ( example Code ) Ġ} ĊĠĠĠĠĠĠĠ Ġinterceptor . assert IsIn State ( Interceptor State . DONE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Listener Not ified When Timeout Status Reached () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Interceptor (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS ms Broadcast Receiver Tests . mocked Broadcast Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsimple Template . replace ( CODE , Ġexample Code ), ĠStatus . RESULT _ TIMEOUT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmocked Inter ception Listener . on Code Intercept ed ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmocked Inter ception Listener . on Code Inter ception Error ( any < Code Inter ception Exception >()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Listener Not ified When Malformed Message Received () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmalformed Message Ġ= Ġ" 1 2 3 4 Ġis Ġyour Ġcode " ĊĠĠĠĠĠĠĠ Ġcreate Interceptor (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS ms Broadcast Receiver Tests . mocked Broadcast Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmalformed Message , ĠStatus . RESULT _ SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmocked Inter ception Listener . on Code Intercept ed ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify Ġ{ Ġmocked Inter ception Listener . on Code Inter ception Error ( any < Code Inter ception Exception >()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Sms Message Ignored After Stop Called () Ġ{ ĊĠĠĠĠĠĠĠ Ġcreate Interceptor (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontext . send Broadcast ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS ms Broadcast Receiver Tests . mocked Broadcast Intent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsimple Template . replace ( CODE , Ġexample Code ), ĠStatus . RESULT _ TIMEOUT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġmocked Inter ception Listener . on Code Intercept ed ( any ()) Ġ} ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġmocked Inter ception Listener . on Code Inter ception Stopped () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Manual Interceptor States Flow () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinterceptor Ġ= Ġcreate Interceptor () ĊĠĠĠĠĠĠĠ Ġinterceptor . assert IsIn State ( Interceptor State . IDLE ) ĊĠĠĠĠĠĠĠ Ġinterceptor . start () ĊĠĠĠĠĠĠĠ Ġinterceptor . assert IsIn State ( Interceptor State . STARTED ) ĊĠĠĠĠĠĠĠ Ġinterceptor . stop () ĊĠĠĠĠĠĠĠ Ġinterceptor . assert IsIn State ( Interceptor State . DONE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Interceptor ( ĊĠĠĠĠĠĠĠ Ġtemplate : ĠString Ġ= Ġsimple Template , ĊĠĠĠĠĠĠĠ Ġinter ception Timeout : ĠLong Ġ= ĠLong . MAX _ TIMEOUT ĊĠĠĠ Ġ): ĠS ms Code Interceptor Ġ= ĠS ms Code Interceptor ( ĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext , ĊĠĠĠĠĠĠĠ Ġinter ception Timeout Ġ= Ġinter ception Timeout , ĊĠĠĠĠĠĠĠ Ġinter ception Listener Ġ= Ġmocked Inter ception Listener ĊĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġsms Template Ġ= Ġtemplate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠBasic Code Interceptor . assert IsIn State ( state : ĠInter ceptor State ) Ġ{ ĊĠĠĠĠĠĠĠ ĠAssert . assertEquals ( this . state , Ġstate ) ĊĠĠĠ Ġ} Ċ Ċ }