github.com/xmidt-org/webpa-common@v1.11.9/concurrent/keyValue_test.go (about) 1 package concurrent 2 3 import ( 4 "github.com/stretchr/testify/assert" 5 "sort" 6 "sync" 7 "testing" 8 "time" 9 ) 10 11 func TestKeyValueEmpty(t *testing.T) { 12 assert := assert.New(t) 13 testWaitGroup := &sync.WaitGroup{} 14 15 keyValue := NewKeyValue() 16 if !assert.NotNil(keyValue) { 17 return 18 } 19 20 assert.Nil(<-keyValue.Get(1)) 21 22 testWaitGroup.Add(1) 23 keyValue.Do( 24 KeyValueOperationFunc(func(storage KeyValueStorage) { 25 defer testWaitGroup.Done() 26 assert.Equal(0, len(storage)) 27 }), 28 ) 29 testWaitGroup.Wait() 30 31 for range <-keyValue.Keys() { 32 t.Error("Should not have received any keys in an empty KeyValue") 33 } 34 35 for range <-keyValue.Values() { 36 t.Error("Should not have received any values in an empty KeyValue") 37 } 38 } 39 40 func TestKeyValueBasics(t *testing.T) { 41 assert := assert.New(t) 42 testWaitGroup := &sync.WaitGroup{} 43 44 keyValue := NewKeyValue() 45 if !assert.NotNil(keyValue) { 46 return 47 } 48 49 keyValue.Add(1, "one") 50 keyValue.Add(2, "two") 51 keyValue.Add(3, "three") 52 time.Sleep(50 * time.Millisecond) 53 54 assert.Equal("one", <-keyValue.Get(1)) 55 assert.Equal("two", <-keyValue.Get(2)) 56 assert.Equal("three", <-keyValue.Get(3)) 57 assert.Nil(<-keyValue.Get(-192347192874918273)) 58 59 testWaitGroup.Add(1) 60 keyValue.Do( 61 KeyValueOperationFunc(func(storage KeyValueStorage) { 62 defer testWaitGroup.Done() 63 assert.Equal( 64 KeyValueStorage(map[interface{}]interface{}{ 65 1: "one", 66 2: "two", 67 3: "three", 68 }), 69 storage, 70 ) 71 }), 72 ) 73 testWaitGroup.Wait() 74 75 { 76 expectedKeys := []int{1, 2, 3} 77 sort.Ints(expectedKeys) 78 actualKeys := []int{} 79 for key := range <-keyValue.Keys() { 80 actualKeys = append(actualKeys, key.(int)) 81 } 82 83 sort.Ints(actualKeys) 84 assert.Equal(expectedKeys, actualKeys) 85 } 86 87 { 88 expectedValues := []string{"one", "two", "three"} 89 sort.Strings(expectedValues) 90 actualValues := []string{} 91 for value := range <-keyValue.Values() { 92 actualValues = append(actualValues, value.(string)) 93 } 94 95 sort.Strings(actualValues) 96 assert.Equal(expectedValues, actualValues) 97 } 98 99 keyValue.Delete(1, 2) 100 time.Sleep(50 * time.Millisecond) 101 102 assert.Nil(<-keyValue.Get(1)) 103 assert.Nil(<-keyValue.Get(2)) 104 assert.Equal("three", <-keyValue.Get(3)) 105 106 testWaitGroup.Add(1) 107 keyValue.Do( 108 KeyValueOperationFunc(func(storage KeyValueStorage) { 109 defer testWaitGroup.Done() 110 assert.Equal( 111 KeyValueStorage(map[interface{}]interface{}{ 112 3: "three", 113 }), 114 storage, 115 ) 116 }), 117 ) 118 testWaitGroup.Wait() 119 120 { 121 expectedKeys := []int{3} 122 actualKeys := []int{} 123 for key := range <-keyValue.Keys() { 124 actualKeys = append(actualKeys, key.(int)) 125 } 126 127 assert.Equal(expectedKeys, actualKeys) 128 } 129 130 { 131 expectedValues := []string{"three"} 132 actualValues := []string{} 133 for value := range <-keyValue.Values() { 134 actualValues = append(actualValues, value.(string)) 135 } 136 137 assert.Equal(expectedValues, actualValues) 138 } 139 } 140 141 func BenchmarkKeyValueConcurrency(b *testing.B) { 142 keyValue := NewKeyValue() 143 144 b.RunParallel( 145 func(pb *testing.PB) { 146 key := 0 147 for pb.Next() { 148 keyValue.Add(key, "value") 149 key++ 150 } 151 }, 152 ) 153 154 b.RunParallel( 155 func(pb *testing.PB) { 156 key := b.N 157 for pb.Next() { 158 keyValue.Delete(key) 159 key-- 160 } 161 }, 162 ) 163 164 b.RunParallel( 165 func(pb *testing.PB) { 166 key := 0 167 for pb.Next() { 168 <-keyValue.Get(key) 169 key++ 170 } 171 }, 172 ) 173 174 b.RunParallel( 175 func(pb *testing.PB) { 176 for pb.Next() { 177 <-keyValue.Keys() 178 } 179 }, 180 ) 181 182 b.RunParallel( 183 func(pb *testing.PB) { 184 for pb.Next() { 185 <-keyValue.Values() 186 } 187 }, 188 ) 189 190 b.RunParallel( 191 func(pb *testing.PB) { 192 for pb.Next() { 193 keyValue.Do( 194 KeyValueOperationFunc(func(storage KeyValueStorage) { 195 storage[239847129] = "another value" 196 }), 197 ) 198 } 199 }, 200 ) 201 }