decaymap_test.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package decaymap
  2. import (
  3. "testing"
  4. "time"
  5. )
  6. func TestImpl(t *testing.T) {
  7. dm := New[string, string]()
  8. t.Cleanup(dm.Close)
  9. dm.Set("test", "hi", 5*time.Minute)
  10. val, ok := dm.Get("test")
  11. if !ok {
  12. t.Error("somehow the test key was not set")
  13. }
  14. if val != "hi" {
  15. t.Errorf("wanted value %q, got: %q", "hi", val)
  16. }
  17. ok = dm.expire("test")
  18. if !ok {
  19. t.Error("somehow could not force-expire the test key")
  20. }
  21. _, ok = dm.Get("test")
  22. if ok {
  23. t.Error("got value even though it was supposed to be expired")
  24. }
  25. // Deletion of expired entries after Get is deferred to a background worker.
  26. // Assert it eventually disappears from the map.
  27. deadline := time.Now().Add(700 * time.Millisecond)
  28. for time.Now().Before(deadline) {
  29. if dm.Len() == 0 {
  30. break
  31. }
  32. time.Sleep(5 * time.Millisecond)
  33. }
  34. if dm.Len() != 0 {
  35. t.Fatalf("expected background cleanup to remove expired key; len=%d", dm.Len())
  36. }
  37. }
  38. func TestCleanup(t *testing.T) {
  39. dm := New[string, string]()
  40. t.Cleanup(dm.Close)
  41. dm.Set("test1", "hi1", 1*time.Second)
  42. dm.Set("test2", "hi2", 2*time.Second)
  43. dm.Set("test3", "hi3", 3*time.Second)
  44. dm.expire("test1") // Force expire test1
  45. dm.expire("test2") // Force expire test2
  46. dm.Cleanup()
  47. finalLen := dm.Len() // Get the length after cleanup
  48. if finalLen != 1 { // "test3" should be the only one left
  49. t.Errorf("Cleanup failed to remove expired entries. Expected length 1, got %d", finalLen)
  50. }
  51. if _, ok := dm.Get("test1"); ok { // Verify Get still behaves correctly after Cleanup
  52. t.Error("test1 should not be found after cleanup")
  53. }
  54. if _, ok := dm.Get("test2"); ok {
  55. t.Error("test2 should not be found after cleanup")
  56. }
  57. if val, ok := dm.Get("test3"); !ok || val != "hi3" {
  58. t.Error("test3 should still be found after cleanup")
  59. }
  60. }