named_cache_test.go (1709B)
1 // Copyright 2018 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package namedmemcache 15 16 import ( 17 "fmt" 18 "sync" 19 "testing" 20 21 qt "github.com/frankban/quicktest" 22 ) 23 24 func TestNamedCache(t *testing.T) { 25 t.Parallel() 26 c := qt.New(t) 27 28 cache := New() 29 30 counter := 0 31 create := func() (any, error) { 32 counter++ 33 return counter, nil 34 } 35 36 for i := 0; i < 5; i++ { 37 v1, err := cache.GetOrCreate("a1", create) 38 c.Assert(err, qt.IsNil) 39 c.Assert(v1, qt.Equals, 1) 40 v2, err := cache.GetOrCreate("a2", create) 41 c.Assert(err, qt.IsNil) 42 c.Assert(v2, qt.Equals, 2) 43 } 44 45 cache.Clear() 46 47 v3, err := cache.GetOrCreate("a2", create) 48 c.Assert(err, qt.IsNil) 49 c.Assert(v3, qt.Equals, 3) 50 } 51 52 func TestNamedCacheConcurrent(t *testing.T) { 53 t.Parallel() 54 55 c := qt.New(t) 56 57 var wg sync.WaitGroup 58 59 cache := New() 60 61 create := func(i int) func() (any, error) { 62 return func() (any, error) { 63 return i, nil 64 } 65 } 66 67 for i := 0; i < 10; i++ { 68 wg.Add(1) 69 go func() { 70 defer wg.Done() 71 for j := 0; j < 100; j++ { 72 id := fmt.Sprintf("id%d", j) 73 v, err := cache.GetOrCreate(id, create(j)) 74 c.Assert(err, qt.IsNil) 75 c.Assert(v, qt.Equals, j) 76 } 77 }() 78 } 79 wg.Wait() 80 }