UOE:7907: Implement keyState data structure (#2)

* Added Async Cache in pkg cache with Get and Set methods

* UOE-7907:Added KeyStateDS with Operation Functions and Tests Cases

* UOE-7907: Renamed state to status, removed get,set and changed test cases according to PR comments

* UOE-7907:Changes based on CR and Comments
This commit is contained in:
pm-aadit-patil 2022-07-11 19:14:17 +05:30 committed by GitHub
parent 46f4078530
commit 52cfb5e748
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 176 additions and 0 deletions

55
async_cache.go Normal file
View File

@ -0,0 +1,55 @@
package cache
import (
"sync"
)
//status is signal which helps to identify in which state the current process with a specific key is
type status int
//status for keys/process declared in constants
const (
STATUS_NOTPRESENT status = iota //current key is not present in KeyMap
STATUS_INPROCESS // current key/process is already INPROCESS to fetch data from data source
STATUS_DONE //current key/process have DONE fetching data and updated in cache
STATUS_STATUS_INTERNAL_ERROR //current key/process recieved internal_error while fetching data
STATUS_INVALID_KEY // current key is invalid to be fetched
)
type keyStatus struct {
keyMap map[string]status //status{INPROCESS,DONE,INVALID,NOPRESENT,INVALID_KEY}
mu *sync.RWMutex
}
//To Create A New keyStatus
func NewKeyStatus() *keyStatus {
return &keyStatus{
keyMap: make(map[string]status),
mu: &sync.RWMutex{},
}
}
//Set status/status with respective key in keyStatus
func (ks *keyStatus) Set(key string, status status) {
if len(key) > 0 {
ks.mu.Lock()
ks.keyMap[key] = status //updating status in keyMap for particular "key"
ks.mu.Unlock()
}
}
//Get status/status of respective key in keyStatus
func (ks *keyStatus) Get(key string) status {
if len(key) == 0 {
return STATUS_INVALID_KEY
}
ks.mu.RLock()
status, found := ks.keyMap[key]
ks.mu.RUnlock()
if !found {
return STATUS_NOTPRESENT
}
return status
}

121
async_cache_test.go Normal file
View File

@ -0,0 +1,121 @@
package cache
import (
"sync"
"testing"
)
func Test_keyStatus_Set(t *testing.T) {
type fields struct {
keyMap map[string]status
mu *sync.RWMutex
}
type args struct {
key string
status status
}
tests := []struct {
name string
fields fields
args args
wantStatus status
}{
{
name: "With Valid key and state",
fields: fields(*NewKeyStatus()),
args: args{
key: "prof_123",
status: STATUS_INPROCESS,
},
wantStatus: STATUS_INPROCESS,
},
{
name: "With InValid key and state",
fields: fields(*NewKeyStatus()),
args: args{
key: "",
status: STATUS_INPROCESS,
},
wantStatus: STATUS_INVALID_KEY,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
ks := NewKeyStatus()
t.Parallel()
ks.Set(tt.args.key, tt.args.status)
if ks.Get(tt.args.key) != tt.wantStatus {
t.Log(tt.fields.keyMap)
t.Errorf("KeyStatys.Set() sets status %v, want status %v", tt.args.status, tt.wantStatus)
}
})
}
}
func Test_keyStatus_Get(t *testing.T) {
type args struct {
key string
}
tests := []struct {
name string
KeyS keyStatus
args args
want status
}{
{
name: "With Valid key and state as DONE",
KeyS: func() keyStatus {
ks := NewKeyStatus()
ks.Set("prof_123", STATUS_DONE)
return *ks
}(),
args: args{
key: "prof_123",
},
want: STATUS_DONE,
},
{
name: "With Valid key and state as INPROCESS",
KeyS: func() keyStatus {
ks := NewKeyStatus()
ks.Set("prof_123", STATUS_INPROCESS)
return *ks
}(),
args: args{
key: "prof_123",
},
want: STATUS_INPROCESS,
},
{
name: "With Valid key but not present in keyMap",
KeyS: *NewKeyStatus(),
args: args{
key: "getAdUnit_5890",
},
want: STATUS_NOTPRESENT,
},
{
name: "With Invalid key and state as INPROCESS",
KeyS: *NewKeyStatus(),
args: args{
key: "",
},
want: STATUS_INVALID_KEY,
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
ks := NewKeyStatus()
ks.keyMap = tt.KeyS.keyMap
t.Parallel()
if got := ks.Get(tt.args.key); got != tt.want {
t.Errorf("keyStatus.Get() = %v, want %v", got, tt.want)
}
})
}
}