package Ġcom . mem fault . b ort . token bucket Ċ Ċ import Ġcom . mem fault . b ort . time . Boxed Duration Ċ import Ġio . mock k . spy k Ċ import Ġio . mock k . verify Ċ import Ġkotlin . time . milliseconds Ċ import Ġkotlin . time . minutes Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Assertions . assertNotNull Ċ import Ġorg . junit . jupiter . api . BeforeEach Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ data Ġclass ĠMock Token Bucket Storage ( ĊĠĠĠ Ġvar Ġmap : ĠStored Token Bucket Map , Ċ ) Ġ: ĠToken Bucket Storage Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġread Map (): ĠStored Token Bucket Map Ġ= Ġmap ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Map ( map : ĠStored Token Bucket Map ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . map Ġ= Ġmap ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠToken Bucket Store Test Ġ{ ĊĠĠĠ Ġval Ġkey Ġ= Ġ" x " ĊĠĠĠ Ġval Ġcapacity Ġ= Ġ 4 ĊĠĠĠ Ġval Ġperiod Ġ= Ġ 1 . milliseconds ĊĊĠĠĠ Ġlateinit Ġvar Ġtoken Bucket Factory : ĠToken Bucket Factory ĊĠĠĠ Ġlateinit Ġvar Ġmock Elapsed Realtime : ĠMock Elapsed Realtime ĊĊĠĠĠ Ġ@ BeforeEach ĊĠĠĠ Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġmock Elapsed Realtime Ġ= ĠMock Elapsed Realtime () ĊĠĠĠĠĠĠĠ Ġtoken Bucket Factory Ġ= ĠMock Token Bucket Factory ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Capacity Ġ= Ġcapacity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Period Ġ= Ġperiod , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmock Elapsed Realtime Ġ= Ġmock Elapsed Realtime , ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġedit No Change () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Provider Ġ= Ġspy k ( Mock Token Bucket Storage ( map Ġ= ĠStored Token Bucket Map ())) ĊĠĠĠĠĠĠĠ Ġval Ġblock Result Ġ= Ġ 1 2 3 4 ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Result , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken Bucket Store ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ġ= Ġstorage Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetMax Buckets Ġ= Ġ{ Ġ 1 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetToken Bucket Factory Ġ= Ġ{ Ġtoken Bucket Factory Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). edit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġmaking Ġany Ġchanges Ġto Ġthe Ġmap Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 0 ) Ġ{ Ġstorage Provider . write Map ( any ()) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġedit () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= Ġspy k ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Token Bucket Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ= ĠStored Token Bucket Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġto ĠStored Token Bucket ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapacity Ġ= Ġcapacity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Ġ= ĠBox ed Duration ( period ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Start Elapsed Realtime Ġ= ĠBox ed Duration ( mock Elapsed Realtime . now ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġblock Result Ġ= Ġ 1 2 3 4 ĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Result , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠToken Bucket Store ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ġ= Ġstorage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetMax Buckets Ġ= Ġ{ Ġ 1 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetToken Bucket Factory Ġ= Ġ{ Ġtoken Bucket Factory Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). edit Ġ{ Ġmap Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbucket Ġ= Ġmap . upsert Bucket ( key Ġ= Ġkey , Ġcapacity Ġ= Ġcapacity , Ġperiod Ġ= Ġperiod ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertNotNull ( bucket ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbucket ?. take ( tag Ġ= Ġ" test ") Ġ// Ġde crements Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Result ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . write Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStored Token Bucket Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġto ĠStored Token Bucket ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapacity Ġ= Ġcapacity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Ġ= ĠBox ed Duration ( period ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Start Elapsed Realtime Ġ= ĠBox ed Duration ( mock Elapsed Realtime . now ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhandle Boot () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Bucket Ġ= ĠStored Token Bucket ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapacity Ġ= Ġcapacity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Ġ= ĠBox ed Duration ( period ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Start Elapsed Realtime Ġ= ĠBox ed Duration ( 1 2 3 4 5 . milliseconds ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= Ġspy k ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Token Bucket Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ= ĠStored Token Bucket Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġto Ġinitial Bucket ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠToken Bucket Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ġ= Ġstorage , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetMax Buckets Ġ= Ġ{ Ġ 1 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetToken Bucket Factory Ġ= Ġ{ Ġtoken Bucket Factory Ġ}, ĊĠĠĠĠĠĠĠ Ġ). handle Linux Reboot ( previous U ptime Ġ= Ġ 3 8 8 4 2 . milliseconds ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . write Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStored Token Bucket Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġto Ġinitial Bucket . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Start Elapsed Realtime Ġ= ĠBox ed Duration ((- 2 0 6 4 9 7 ). milliseconds ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġhandle Boot _ uptime LessThan Previous Elapsed Timed () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Bucket Ġ= ĠStored Token Bucket ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 3 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcapacity Ġ= Ġcapacity , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Ġ= ĠBox ed Duration ( period ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Start Elapsed Realtime Ġ= ĠBox ed Duration ( 3 8 8 4 2 . milliseconds ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= Ġspy k ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMock Token Bucket Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ= ĠStored Token Bucket Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġto Ġinitial Bucket ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠToken Bucket Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ġ= Ġstorage , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetMax Buckets Ġ= Ġ{ Ġ 1 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetToken Bucket Factory Ġ= Ġ{ Ġtoken Bucket Factory Ġ}, ĊĠĠĠĠĠĠĠ Ġ). handle Linux Reboot ( previous U ptime Ġ= Ġ 1 2 3 4 5 . milliseconds ) ĊĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . write Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStored Token Bucket Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġto Ġinitial Bucket . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Start Elapsed Realtime Ġ= ĠBox ed Duration ((- 3 ). minutes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġread Cache () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Provider Ġ= Ġspy k ( Mock Token Bucket Storage ( map Ġ= ĠStored Token Bucket Map ())) ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠToken Bucket Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ġ= Ġstorage Provider , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetMax Buckets Ġ= Ġ{ Ġ 1 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetToken Bucket Factory Ġ= Ġ{ Ġtoken Bucket Factory Ġ}, ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġstore . edit Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġstore . edit Ġ{ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠOnly Ġread Ġonce Ġfrom Ġstore : ĊĠĠĠĠĠĠĠ Ġverify ( exact ly Ġ= Ġ 1 ) Ġ{ Ġstorage Provider . read Map () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġreset () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= ĠMock Token Bucket Storage ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Ġ= ĠStored Token Bucket Map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġto ĠStored Token Bucket ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapacity Ġ= Ġcapacity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Ġ= ĠBox ed Duration ( period ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġperiod Start Elapsed Realtime Ġ= ĠBox ed Duration ( mock Elapsed Realtime . now ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġstore Ġ= ĠToken Bucket Store ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Ġ= Ġstorage , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetMax Buckets Ġ= Ġ{ Ġ 1 Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetToken Bucket Factory Ġ= Ġ{ Ġtoken Bucket Factory Ġ}, ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( true , Ġstore . edit Ġ{ Ġit . is Full Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( false , Ġstore . edit Ġ{ Ġit . upsert Bucket ( key )?. take ( tag Ġ= Ġ" test ") Ġ}) ĊĠĠĠĠĠĠĠ Ġstore . reset () ĊĠĠĠĠĠĠĠ ĠassertEquals ( Stored Token Bucket Map (), Ġstorage . map ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( false , Ġstore . edit Ġ{ Ġit . is Full Ġ}) ĊĠĠĠĠĠĠĠ ĠassertEquals ( true , Ġstore . edit Ġ{ Ġit . upsert Bucket ( key )?. take ( tag Ġ= Ġ" test ") Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ