/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠQ I WI Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġcom . qi wi . feature toggle Ċ Ċ import Ġapp . cash . tur bine . test Ċ import Ġcom . qi wi . feature toggle . converter . Jack son Feature Flag Converter Ċ import Ġcom . qi wi . feature toggle . creator . Real Feature Creator Ċ import Ġcom . qi wi . feature toggle . model . Feature Flags Container Ċ import Ġcom . qi wi . feature toggle . model . Feature Flags Source Type Ċ import Ġcom . qi wi . feature toggle . storage . InMemory Flags Storage Ċ import Ġcom . qi wi . feature toggle . test . datasource . Test Cached DataSource Ċ import Ġcom . qi wi . feature toggle . test . datasource . Test Local DataSource Ċ import Ġcom . qi wi . feature toggle . test . datasource . Test Remote DataSource Ċ import Ġcom . qi wi . feature toggle . test . feature . Boolean Feature Ċ import Ġcom . qi wi . feature toggle . test . feature . String Feature Ċ import Ġcom . qi wi . feature toggle . test . flag . BOOLEAN _ FEATURE _ KEY Ċ import Ġcom . qi wi . feature toggle . test . flag . Boolean Feature Flag Ċ import Ġcom . qi wi . feature toggle . test . flag . STRING _ FEATURE _ KEY Ċ import Ġcom . qi wi . feature toggle . test . flag . String Feature Flag Ċ import Ġcom . qi wi . feature toggle . test . logger . Test Logger Ċ import Ġcom . qi wi . feature toggle . test . registry . Test Factory Registry Ċ import Ġcom . qi wi . feature toggle . test . registry . Test Flag Registry Ċ import Ġcom . qi wi . feature toggle . test . repository . Test Feature Repository Ċ import Ġkotlinx . coroutines . Experimental Cor outines Api Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . test . Test Coroutine Dispatcher Ċ import Ġkotlinx . coroutines . test . run Blocking Test Ċ import Ġorg . junit . Assert .* Ċ import Ġorg . junit . Test Ċ import Ġkotlin . time . Experimental Time Ċ Ċ @ Experimental Time Ċ @ Experimental Cor outines Api Ċ class ĠFeature Manager Test Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġflag Registry Ġ= ĠTest Flag Registry () ĊĠĠĠ Ġprivate Ġval Ġfactory Registry Ġ= ĠTest Factory Registry () ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠTest Logger () ĊĠĠĠ Ġprivate Ġval Ġconverter Ġ= ĠJack son Feature Flag Converter () ĊĠĠĠ Ġprivate Ġval Ġstorage Ġ= ĠIn Memory Flags Storage () ĊĠĠĠ Ġprivate Ġval Ġcreator Ġ= ĠReal Feature Creator ( flag Registry , Ġfactory Registry , Ġstorage , Ġlogger ) ĊĠĠĠ Ġprivate Ġval Ġrepository Ġ= ĠTest Feature Repository () ĊĊĠĠĠ Ġprivate Ġval Ġtest Dispatcher Ġ= ĠTest Coroutine Dispatcher () ĊĊĠĠĠ Ġprivate Ġval Ġfeature Manager Ġ= ĠReal Feature Manager ( ĊĠĠĠĠĠĠĠ Ġflag Registry , ĊĠĠĠĠĠĠĠ Ġrepository , ĊĠĠĠĠĠĠĠ Ġcreator , ĊĠĠĠĠĠĠĠ Ġstorage , ĊĠĠĠĠĠĠĠ Ġconverter , ĊĠĠĠĠĠĠĠ Ġlogger , ĊĠĠĠĠĠĠĠ Ġtest Dispatcher ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreturns Default Feature When Flags Not Loaded () Ġ= Ġtest Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . set DataSource Keys ( set Of ( Test Local DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġfeature Manager . fetch Flags () ĊĠĠĠĠĠĠĠ Ġval Ġfeature Ġ= Ġfeature Manager . get Feature ( Boolean Feature :: class . java ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( false , Ġfeature . isEnabled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreturns Same Feature After Flags Changed () Ġ= Ġtest Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . set DataSource Keys ( set Of ( Test Local DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġfeature Manager . fetch Flags () ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġfalse Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= ĠString Feature Flag (" Android ", Ġ" Kit K at "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Android ĠKit K at ", Ġfeature Manager . get Feature ( String Feature :: class . java ). info ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( feature Manager . get Feature ( Boolean Feature :: class . java ). isEnabled ) ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġtrue Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= ĠString Feature Flag (" Android ", Ġ" L ol lip op "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL , ĠFeature Flags Source Type . REMOTE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY , ĠTest Remote DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Android ĠKit K at ", Ġfeature Manager . get Feature ( String Feature :: class . java ). info ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( feature Manager . get Feature ( Boolean Feature :: class . java ). isEnabled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreturns Updated Feature After Used Flags Reset () Ġ= Ġtest Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . set DataSource Keys ( set Of ( Test Local DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġfeature Manager . fetch Flags () ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġtrue Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= ĠString Feature Flag (" Android ", Ġ" Kit K at "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals (" Android ĠKit K at ", Ġfeature Manager . get Feature ( String Feature :: class . java ). info ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( feature Manager . get Feature ( Boolean Feature :: class . java ). isEnabled ) ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġtrue Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= ĠString Feature Flag (" Android ", Ġ" L ol lip op "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL , ĠFeature Flags Source Type . REMOTE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY , ĠTest Remote DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġfeature Manager . reset Used Flags () ĊĠĠĠĠĠĠĠ ĠassertEquals (" Android ĠL ol lip op ", Ġfeature Manager . get Feature ( String Feature :: class . java ). info ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( feature Manager . get Feature ( Boolean Feature :: class . java ). isEnabled ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreturns Same Flags After Flags Changed () Ġ= Ġtest Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocal String Flag Ġ= ĠString Feature Flag (" Android ", Ġ" Mar shm allow ") ĊĠĠĠĠĠĠĠ Ġval Ġlocal Boolean Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote String Flag Ġ= ĠString Feature Flag (" Android ", Ġ" N ou gat ") ĊĠĠĠĠĠĠĠ Ġval Ġremote Boolean Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġrepository . set DataSource Keys ( set Of ( Test Local DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġfeature Manager . fetch Flags () ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= Ġlocal Boolean Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= Ġlocal String Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( local String Flag , Ġfeature Manager . get Feature Flag ( String Feature Flag :: class . java )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( local Boolean Flag , Ġfeature Manager . get Feature Flag ( Boolean Feature Flag :: class . java )) ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= Ġremote Boolean Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= Ġremote String Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( local String Flag , Ġfeature Manager . get Feature Flag ( String Feature Flag :: class . java )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( local Boolean Flag , Ġfeature Manager . get Feature Flag ( Boolean Feature Flag :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreturns Update Flags After Flags Changed () Ġ= Ġtest Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocal String Flag Ġ= ĠString Feature Flag (" Android ", Ġ" Mar shm allow ") ĊĠĠĠĠĠĠĠ Ġval Ġlocal Boolean Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote String Flag Ġ= ĠString Feature Flag (" Android ", Ġ" N ou gat ") ĊĠĠĠĠĠĠĠ Ġval Ġremote Boolean Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġrepository . set DataSource Keys ( set Of ( Test Local DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġfeature Manager . fetch Flags () ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= Ġlocal Boolean Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= Ġlocal String Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( local String Flag , Ġfeature Manager . get Feature Flag ( String Feature Flag :: class . java )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( local Boolean Flag , Ġfeature Manager . get Feature Flag ( Boolean Feature Flag :: class . java )) ĊĠĠĠĠĠĠĠ Ġfeature Manager . reset Used Flags () ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= Ġremote Boolean Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= Ġremote String Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( remote String Flag , Ġfeature Manager . get Feature Flag ( String Feature Flag :: class . java )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( remote Boolean Flag , Ġfeature Manager . get Feature Flag ( Boolean Feature Flag :: class . java )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreturns Feature When Specified DataSource Processed () Ġ= Ġtest Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . set DataSource Keys ( set Of ( Test Local DataSource . KEY , ĠTest Cached DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( feature Manager . await Feature ( Boolean Feature :: class . java , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġ}. test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Manager . fetch Flags () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Flag ( Boolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġfalse Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect No Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Flag ( Boolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġtrue Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL , ĠFeature Flags Source Type . REMOTE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( await Item (). isEnabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait Complete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreturns Feature When OneOf Source Types Processed () Ġ= Ġtest Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . set DataSource Keys ( set Of ( Test Local DataSource . KEY , ĠTest Cached DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġflow Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġemit ( feature Manager . await Feature ( Boolean Feature :: class . java , ĠFeature Flags Source Type . REMOTE )) ĊĠĠĠĠĠĠĠ Ġ}. test Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Manager . fetch Flags () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Flag ( Boolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġfalse Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpect No Events () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Flag ( Boolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġtrue Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL , ĠFeature Flags Source Type . REMOTE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( await Item (). isEnabled ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġawait Complete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreturns Available Data Sources () Ġ= Ġtest Dispatcher . run Blocking Test Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . set DataSource Keys ( set Of ( Test Local DataSource . KEY , ĠTest Cached DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġfeature Manager . fetch Flags () ĊĠĠĠĠĠĠĠ Ġupdate Flags ( sources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY )) ĊĠĠĠĠĠĠĠ ĠassertEquals ( set Of ( Test Local DataSource . KEY ), Ġfeature Manager . available Data Sources ()) ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL , ĠFeature Flags Source Type . CACHE , ĠFeature Flags Source Type . REMOTE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY , ĠTest Cached DataSource . KEY , ĠTest Remote DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( Test Local DataSource . KEY , ĠTest Cached DataSource . KEY , ĠTest Remote DataSource . KEY ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfeature Manager . available Data Sources () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġflags Saved To Cache After Fetch Remote And Cached Flags () Ġ= Ġtest Dispatcher . run Blocking Test { ĊĠĠĠĠĠĠĠ Ġval Ġlocal String Flag Ġ= ĠString Feature Flag (" Android ", Ġ" Mar shm allow ") ĊĠĠĠĠĠĠĠ Ġval Ġlocal Boolean Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġfalse Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġremote String Flag Ġ= ĠString Feature Flag (" Android ", Ġ" N ou gat ") ĊĠĠĠĠĠĠĠ Ġval Ġremote Boolean Flag Ġ= ĠBoolean Feature Flag (). apply Ġ{ Ġis Enabled Ġ= Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġrepository . set DataSource Keys ( set Of ( Test Local DataSource . KEY , ĠTest Cached DataSource . KEY , ĠTest Remote DataSource . KEY )) ĊĠĠĠĠĠĠĠ Ġfeature Manager . fetch Flags () ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= Ġlocal Boolean Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= Ġlocal String Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( repository . flags Cache . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= Ġlocal Boolean Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= Ġlocal String Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL , ĠFeature Flags Source Type . CACHE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY , ĠTest Cached DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( repository . flags Cache . isEmpty ()) ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġboolean Feature Flag Ġ= Ġremote Boolean Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Feature Flag Ġ= Ġremote String Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġset Of ( Feature Flags Source Type . LOCAL , ĠFeature Flags Source Type . CACHE , ĠFeature Flags Source Type . REMOTE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġset Of ( Test Local DataSource . KEY , ĠTest Cached DataSource . KEY , ĠTest Remote DataSource . KEY ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBOOLEAN _ FEATURE _ KEY Ġto Ġremote Boolean Flag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTRING _ FEATURE _ KEY Ġto Ġremote String Flag ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġrepository . flags Cache ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Flag ( boolean Feature Flag : ĠBoolean Feature Flag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources : ĠSet < Feature Flags Source Type >, Ġdata Sources : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBOOLEAN _ FEATURE _ KEY Ġto Ġboolean Feature Flag , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġsources , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġdata Sources ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Flags ( boolean Feature Flag : ĠBoolean Feature Flag , Ġstring Feature Flag : ĠString Feature Flag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources : ĠSet < Feature Flags Source Type >, Ġdata Sources : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġupdate Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBOOLEAN _ FEATURE _ KEY Ġto Ġboolean Feature Flag , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTRING _ FEATURE _ KEY Ġto Ġstring Feature Flag ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsources Ġ= Ġsources , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Sources Ġ= Ġdata Sources ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġupdate Flags ( flags : ĠMap < String , ĠAny > Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources : ĠSet < Feature Flags Source Type >, Ġdata Sources : ĠSet < String >) Ġ{ ĊĠĠĠĠĠĠĠ Ġrepository . update Flags ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFeature Flags Container ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= Ġflags , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Types Ġ= Ġsources , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdataSource Keys Ġ= Ġdata Sources ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ Ċ }