Generic TTL cache with Eio
at main 47 lines 1.7 kB view raw
1let test_basic () = 2 Eio_main.run @@ fun env -> 3 let clock = Eio.Stdenv.clock env in 4 let cache = Cache.String.create ~clock ~base_ttl:10.0 ~jitter:0.0 () in 5 Cache.String.set cache "key1" "value1"; 6 Alcotest.(check (option string)) 7 "get after set" (Some "value1") 8 (Cache.String.get cache "key1"); 9 Alcotest.(check (option string)) 10 "get missing" None 11 (Cache.String.get cache "key2") 12 13let test_get_or_compute () = 14 Eio_main.run @@ fun env -> 15 let clock = Eio.Stdenv.clock env in 16 let cache = Cache.String.create ~clock ~base_ttl:10.0 ~jitter:0.0 () in 17 let computed = ref 0 in 18 let compute () = 19 incr computed; 20 "computed" 21 in 22 let v1 = Cache.String.get_or_compute cache "key" compute in 23 let v2 = Cache.String.get_or_compute cache "key" compute in 24 Alcotest.(check string) "first call" "computed" v1; 25 Alcotest.(check string) "second call cached" "computed" v2; 26 Alcotest.(check int) "compute called once" 1 !computed 27 28let test_stats () = 29 Eio_main.run @@ fun env -> 30 let clock = Eio.Stdenv.clock env in 31 let cache = Cache.String.create ~clock ~base_ttl:10.0 ~jitter:0.0 () in 32 let total, valid = Cache.String.stats cache in 33 Alcotest.(check int) "empty total" 0 total; 34 Alcotest.(check int) "empty valid" 0 valid; 35 Cache.String.set cache "k1" "v1"; 36 Cache.String.set cache "k2" "v2"; 37 let total, valid = Cache.String.stats cache in 38 Alcotest.(check int) "total after set" 2 total; 39 Alcotest.(check int) "valid after set" 2 valid 40 41let suite = 42 ( "cache", 43 [ 44 Alcotest.test_case "get/set" `Quick test_basic; 45 Alcotest.test_case "get_or_compute" `Quick test_get_or_compute; 46 Alcotest.test_case "stats" `Quick test_stats; 47 ] )