package Ġcom . minder a . s ke leto id . logs . append ers Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . os . Build Ċ import Ġandroidx . core . content . File Provider Ċ import Ġandroidx . test . core . app . Application Provider Ċ import Ġcom . minder a . s ke leto id . generic . Android Utils Ċ import Ġcom . minder a . s ke leto id . logs . LOG Ċ import Ġorg . junit . Ignore Ċ import Ġorg . junit . Rule Ċ import Ġorg . junit . Test Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . mockito . Argument Matchers . any Ċ import Ġorg . mockito . Mockito .` when ` Ċ import Ġorg . mockito . Mockito . mock Ċ import Ġorg . mockito . Mockito . times Ċ import Ġorg . mockito . Mockito . verify Ċ import Ġorg . mockito . Mockito . verify No More Interactions Ċ import Ġorg . power mock . api . mockito . Power Mockito Ċ import Ġorg . power mock . core . class loader . annotations . Power Mock Ignore Ċ import Ġorg . power mock . core . class loader . annotations . Prepare For Test Ċ import Ġorg . power mock . modules . junit 4 . rule . Power Mock Rule Ċ import Ġorg . ro bo lectric . Ro bo lectric TestRunner Ċ import Ġorg . ro bo lectric . Runtime Environment Ċ import Ġorg . ro bo lectric . annotation . Config Ċ import Ġjava . io . File Ċ import Ġjava . util . logging . File Handler Ċ import Ġjava . util . logging . Level Ċ import Ġjava . util . logging . Log Record Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . assertTrue Ċ Ċ @ RunWith ( Ro bo lectric TestRunner :: class ) Ċ @ Config ( sdk Ġ= Ġ[ Build . VERSION _ CODES . O _ MR 1 ]) Ċ @ Power Mock Ignore (" org . mockito .* ", Ġ" org . ro bo lectric .* ", Ġ" android .* ") Ċ @ Prepare For Test ( File Provider :: class , ĠIntent :: class , ĠAndroid Utils :: class ) Ċ class ĠLog File Appender UnitTest Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPACK AGE _ NAME Ġ= Ġ" my . package . name " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFILE _ NAME Ġ= Ġ" FILENAME " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Rule ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġrule Ġ= ĠPower Mock Rule () ĊĊĠĠĠ Ġ@ Test ( expected Ġ= ĠIllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġtest Constructor FileName Invalid () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog File Appender ( PACKAGE _ NAME , Ġ"* ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest FileName IsValid Empty () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( appender . is Filename Valid ("")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest FileName IsValid Invalid () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( appender . is Filename Valid ("// ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest FileName IsValid () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( appender . is Filename Valid ( FILE _ NAME )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Constructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals (" LogFile Appender ", Ġapp ender . logger Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Enable Appender () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠRuntime Environment . application ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ Ġapp ender . enable Appender ( context ) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( appender . can Write ToFile ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Disable Appender () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠRuntime Environment . application ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġapp ender . enable Appender ( context ) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġapp ender . disable Appender () ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( appender . can Write ToFile ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Can Write ToFile () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( appender . can Write ToFile ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Format Log () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . format Log ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . PRIORITY . DEBUG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Hello ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" My Ġfriend " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). matches ( ("\\ d \\ d \\ d \\ d - \\ d \\ d - \\ d \\ d Ġ\\ d \\ d :\\ d \\ d :\\ d \\ d : ĠD /" Ġ+ ĠPACK AGE _ NAME Ġ+ Ġ"\\ (" Ġ+ ĠThread . currentThread (). id Ġ+ Ġ"\\ ): Ġ ĠHello ĠMy Ġfriend "). to Regex ()) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Set Max Line Length () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ Ġapp ender . log FileSize Ġ= Ġ 1 0 0 0 ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 1 0 0 0 , Ġapp ender . log FileSize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Set NumberOf Log Files () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ Ġapp ender . numberOf Log Files Ġ= Ġ 5 ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( 5 , Ġapp ender . numberOf Log Files ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Set Min LogLevel () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ Ġapp ender . min LogLevel Ġ= ĠLOG . PRIORITY . DEBUG ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( LOG . PRIORITY . DEBUG , Ġapp ender . min LogLevel ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠtestGet File Log Path () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠRuntime Environment . application ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĠĠĠĠĠĠĠ ĠPower Mockito . mock Static ( Android Utils :: class . java ) ĊĠĠĠĠĠĠĠ Ġ` when `( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Utils . getFile DirPath ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% s % s . log ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile . separator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). thenReturn (" internal / com / minder a / s ke leto id / FILENAME . log ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" internal / com / minder a / s ke leto id / FILENAME . log ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . getFile Log Path ( context ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun ĠtestGet External File Log Path () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠRuntime Environment . application ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME , Ġtrue ) ĊĠĠĠĠĠĠĠ ĠPower Mockito . mock Static ( Android Utils :: class . java ) ĊĠĠĠĠĠĠĠ Ġ` when `( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAndroid Utils . get External Public Directory ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"% s % s . log ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile . separator , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFILE _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ). thenReturn (" external / com / minder a / s ke leto id / FILENAME . log ") ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" external / com / minder a / s ke leto id / FILENAME . log ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapp ender . getFile Log Path ( context ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest File Handler Level Debug () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Level . SEVERE , Ġapp ender . getFile Handler Level ( LOG . PRIORITY . ERROR )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest File Handler Level Fatal () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Level . SEVERE , Ġapp ender . getFile Handler Level ( LOG . PRIORITY . FATAL )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest File Handler Level Info () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Level . INFO , Ġapp ender . getFile Handler Level ( LOG . PRIORITY . INFO )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest File Handler Level Verbose () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Level . ALL , Ġapp ender . getFile Handler Level ( LOG . PRIORITY . VERBOSE )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest File Handler Level Warn () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( Level . WARNING , Ġapp ender . getFile Handler Level ( LOG . PRIORITY . WARN )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Is ThreadPool Running When Appender Enabled () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠRuntime Environment . application ĊĊĠĠĠĠĠĠĠ Ġapp ender . enable Appender ( context ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( appender . is ThreadPool Running ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Is ThreadPool Not Running When Appender Initial ised () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( appender . is ThreadPool Running ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Is ThreadPool Not Running When Appender Disabled () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠRuntime Environment . application ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġapp ender . enable Appender ( context ) ĊĊĠĠĠĠĠĠĠ Ġapp ender . disable Appender () ĊĊĠĠĠĠĠĠĠ ĠassertFalse ( appender . is ThreadPool Running ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġ@ Ignore ĊĠĠĠ Ġfun Ġtest Log () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠApplication Provider . getApplicationContext < Context >() ĊĠĠĠĠĠĠĠ Ġval Ġfile Handler Ġ= Ġmock ( File Handler :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġapp ender . enable Appender ( context ) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 5 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġapp ender . file Handler Ġ= Ġfile Handler ĊĊĠĠĠĠĠĠĠ Ġapp ender . log ( LOG . PRIORITY . DEBUG , ĠThrowable (" o ops "), Ġ" hello ") ĊĊĠĠĠĠĠĠĠ Ġverify ( file Handler ). publish ( any ( Log Record :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest No Log If Writing Not Enabled () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Handler Ġ= Ġmock ( File Handler :: class . java ) ĊĠĠĠĠĠĠĠ Ġapp ender . file Handler Ġ= Ġfile Handler ĊĊĠĠĠĠĠĠĠ Ġapp ender . log ( LOG . PRIORITY . DEBUG , Ġnull , Ġ" hello ") ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( file Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest No Log If Appender Not Enabled () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Handler Ġ= Ġmock ( File Handler :: class . java ) ĊĠĠĠĠĠĠĠ Ġapp ender . file Handler Ġ= Ġfile Handler ĊĊĠĠĠĠĠĠĠ Ġapp ender . log ( LOG . PRIORITY . DEBUG , Ġnull , Ġ" hello ") ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( file Handler ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest No Log If Appender Disabled () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Handler Ġ= Ġmock ( File Handler :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠRuntime Environment . application ĊĠĠĠĠĠĠĠ Ġapp ender . enable Appender ( context ) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġapp ender . file Handler Ġ= Ġfile Handler ĊĠĠĠĠĠĠĠ Ġapp ender . disable Appender () ĊĊĠĠĠĠĠĠĠ Ġapp ender . log ( LOG . PRIORITY . DEBUG , Ġnull , Ġ" hello ") ĊĊĠĠĠĠĠĠĠ Ġverify ( file Handler , Ġtimes ( 0 )). publish ( any ( Log Record :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest No Log If LogLevel Below Min LogLevel () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp ender Ġ= ĠLog File Appender ( PACKAGE _ NAME , ĠFILE _ NAME ) ĊĠĠĠĠĠĠĠ Ġapp ender . min LogLevel Ġ= ĠLOG . PRIORITY . ERROR ĊĠĠĠĠĠĠĠ Ġval Ġfile Handler Ġ= Ġmock ( File Handler :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠRuntime Environment . application ĊĠĠĠĠĠĠĠ Ġapp ender . enable Appender ( context ) ĊĠĠĠĠĠĠĠ ĠThread . sleep ( 2 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġapp ender . file Handler Ġ= Ġfile Handler ĊĊĠĠĠĠĠĠĠ Ġapp ender . log ( LOG . PRIORITY . DEBUG , Ġnull , Ġ" hello ") ĊĊĠĠĠĠĠĠĠ Ġverify No More Interactions ( file Handler ) ĊĠĠĠ Ġ} Ċ } Ċ