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  }