go-micro.dev/v5@v5.12.0/cache/memory_test.go (about)

     1  package cache
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  )
     8  
     9  var (
    10  	ctx             = context.TODO()
    11  	key string      = "test"
    12  	val interface{} = "hello go-micro"
    13  )
    14  
    15  // TestMemCache tests the in-memory cache implementation.
    16  func TestCache(t *testing.T) {
    17  	t.Run("CacheGetMiss", func(t *testing.T) {
    18  		if _, _, err := NewCache().Get(ctx, key); err == nil {
    19  			t.Error("expected to get no value from cache")
    20  		}
    21  	})
    22  
    23  	t.Run("CacheGetHit", func(t *testing.T) {
    24  		c := NewCache()
    25  
    26  		if err := c.Put(ctx, key, val, 0); err != nil {
    27  			t.Error(err)
    28  		}
    29  
    30  		if a, _, err := c.Get(ctx, key); err != nil {
    31  			t.Errorf("Expected a value, got err: %s", err)
    32  		} else if a != val {
    33  			t.Errorf("Expected '%v', got '%v'", val, a)
    34  		}
    35  	})
    36  
    37  	t.Run("CacheGetExpired", func(t *testing.T) {
    38  		c := NewCache()
    39  		e := 20 * time.Millisecond
    40  
    41  		if err := c.Put(ctx, key, val, e); err != nil {
    42  			t.Error(err)
    43  		}
    44  
    45  		<-time.After(25 * time.Millisecond)
    46  		if _, _, err := c.Get(ctx, key); err == nil {
    47  			t.Error("expected to get no value from cache")
    48  		}
    49  	})
    50  
    51  	t.Run("CacheGetValid", func(t *testing.T) {
    52  		c := NewCache()
    53  		e := 25 * time.Millisecond
    54  
    55  		if err := c.Put(ctx, key, val, e); err != nil {
    56  			t.Error(err)
    57  		}
    58  
    59  		<-time.After(20 * time.Millisecond)
    60  		if _, _, err := c.Get(ctx, key); err != nil {
    61  			t.Errorf("expected a value, got err: %s", err)
    62  		}
    63  	})
    64  
    65  	t.Run("CacheDeleteMiss", func(t *testing.T) {
    66  		if err := NewCache().Delete(ctx, key); err == nil {
    67  			t.Error("expected to delete no value from cache")
    68  		}
    69  	})
    70  
    71  	t.Run("CacheDeleteHit", func(t *testing.T) {
    72  		c := NewCache()
    73  
    74  		if err := c.Put(ctx, key, val, 0); err != nil {
    75  			t.Error(err)
    76  		}
    77  
    78  		if err := c.Delete(ctx, key); err != nil {
    79  			t.Errorf("Expected to delete an item, got err: %s", err)
    80  		}
    81  
    82  		if _, _, err := c.Get(ctx, key); err == nil {
    83  			t.Errorf("Expected error")
    84  		}
    85  	})
    86  }
    87  
    88  func TestCacheWithOptions(t *testing.T) {
    89  	t.Run("CacheWithExpiration", func(t *testing.T) {
    90  		c := NewCache(Expiration(20 * time.Millisecond))
    91  
    92  		if err := c.Put(ctx, key, val, 0); err != nil {
    93  			t.Error(err)
    94  		}
    95  
    96  		<-time.After(25 * time.Millisecond)
    97  		if _, _, err := c.Get(ctx, key); err == nil {
    98  			t.Error("expected to get no value from cache")
    99  		}
   100  	})
   101  
   102  	t.Run("CacheWithItems", func(t *testing.T) {
   103  		c := NewCache(Items(map[string]Item{key: {val, 0}}))
   104  
   105  		if a, _, err := c.Get(ctx, key); err != nil {
   106  			t.Errorf("Expected a value, got err: %s", err)
   107  		} else if a != val {
   108  			t.Errorf("Expected '%v', got '%v'", val, a)
   109  		}
   110  	})
   111  }