blob: 5e1db6025b4e786e5ba9d96b6c0de2d65ec0a009 [file] [log] [blame]
/*
==================================================================================
Copyright (c) 2019 AT&T Intellectual Property.
Copyright (c) 2019 Nokia
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================================
*/
package control
import (
"encoding/json"
"fmt"
"reflect"
"strings"
"sync"
"testing"
"github.com/segmentio/ksuid"
"github.com/stretchr/testify/assert"
)
var sdlRestShouldReturnError bool = false
const sdlRestTestErrorString string = "Test sdl REST returned error on purpose"
type RestSubsDbMock struct {
restSubsDb map[string]string // Store information as a string like real db does.
restSubscriptions map[string]*RESTSubscription
lastAllocatedRestSubId string
restSubIdsInDb []string
marshalLock sync.Mutex
}
var restSubsDbMock *RestSubsDbMock
func CreateRestSubsDbMock() *RestSubsDbMock {
fmt.Println("Test CreateRestSubsDbMock()")
restSubsDbMock = new(RestSubsDbMock)
restSubsDbMock.ResetTestSettings()
restSubsDbMock.lastAllocatedRestSubId = ""
return restSubsDbMock
}
func (m *RestSubsDbMock) ResetTestSettings() {
m.restSubsDb = make(map[string]string)
m.restSubscriptions = make(map[string]*RESTSubscription)
}
func (m *RestSubsDbMock) AllocNextRestSubId() string {
m.lastAllocatedRestSubId = ksuid.New().String()
return m.lastAllocatedRestSubId
}
func (m *RestSubsDbMock) GetLastAllocatedRestSubId() string {
return m.lastAllocatedRestSubId
}
func (m *RestSubsDbMock) AddRestSubIdsInDb(restSubId string) {
m.restSubIdsInDb = append(m.restSubIdsInDb, restSubId)
}
func (m *RestSubsDbMock) DeleteRestSubIdsFromDb(restSubId string) {
newrestSubIdsInDb := []string{}
for _, i := range m.restSubIdsInDb {
if i != restSubId {
newrestSubIdsInDb = append(newrestSubIdsInDb, i)
}
}
m.restSubIdsInDb = newrestSubIdsInDb
}
func (m *RestSubsDbMock) EmptyRestSubIdsFromDb() {
m.restSubIdsInDb = nil
}
func CreateRESTSubscription(t *testing.T) *RESTSubscription {
t.Log("TEST: Creating REST subscription")
restSubscription := &RESTSubscription{}
restSubscription.xAppServiceName = "localhost"
restSubscription.xAppRmrEndPoint = "localhost:13560"
restSubscription.Meid = "RAN_NAME_1"
restSubscription.SubReqOngoing = true
restSubscription.SubDelReqOngoing = false
restSubscription.xAppIdToE2Id = make(map[int64]int64)
restSubscription.lastReqMd5sum = "856e9546f6f7b65b13a86956f2e16f6a"
return restSubscription
}
func PrintRESTSubscriptionData(t *testing.T, restSubs *RESTSubscription) {
t.Log("TEST: RESTSubscription data")
t.Logf("TEST: restSubs.xAppServiceName = %v", restSubs.xAppServiceName)
t.Logf("TEST: restSubs.xAppRmrEndPoint = %v", restSubs.xAppRmrEndPoint)
t.Logf("TEST: restSubs.Meid = %v", restSubs.Meid)
t.Logf("TEST: restSubs.InstanceIds = %v", restSubs.InstanceIds)
t.Logf("TEST: restSubs.xAppIdToE2Id = %v", restSubs.xAppIdToE2Id)
t.Logf("TEST: restSubs.SubReqOngoing = %v", restSubs.SubReqOngoing)
t.Logf("TEST: restSubs.SubDelReqOngoing = %v", restSubs.SubDelReqOngoing)
}
func TestWriteRESTSubscriptionToSdl(t *testing.T) {
// Write one subscription
restSubId := restSubsDbMock.AllocNextRestSubId()
restSubs := CreateRESTSubscription(t)
PrintRESTSubscriptionData(t, restSubs)
t.Logf("TEST: Writing subId = %v\n", restSubId)
err := mainCtrl.c.WriteRESTSubscriptionToSdl(restSubId, restSubs)
if err != nil {
t.Errorf("TEST: %s", err.Error())
}
restSubsDbMock.AddRestSubIdsInDb(restSubId)
verifyRESTKeyCount(t, 1)
}
func verifyRESTKeyCount(t *testing.T, expectedCount int) {
count, err := mainCtrl.c.GetRESTKeyCount()
if err != nil {
t.Errorf("TEST: %s", err.Error())
} else {
assert.Equal(t, expectedCount, count)
}
}
func TestReadRESTSubscriptionFromSdl(t *testing.T) {
restSubId := restSubsDbMock.GetLastAllocatedRestSubId()
t.Logf("Reading restSubId = %v\n", restSubId)
restSubs, err := mainCtrl.c.ReadRESTSubscriptionFromSdl(restSubId)
if err != nil {
t.Errorf("TEST: %s", err.Error())
return
}
PrintRESTSubscriptionData(t, restSubs)
assert.Equal(t, restSubsDbMock.restSubscriptions[restSubId], restSubs)
}
func TestRemoveRESTSubscriptionFromSdl(t *testing.T) {
restSubId := restSubsDbMock.GetLastAllocatedRestSubId()
err := mainCtrl.c.RemoveRESTSubscriptionFromSdl(restSubId)
if err != nil {
t.Errorf("TEST: %s", err.Error())
return
}
delete(restSubsDbMock.restSubscriptions, restSubId)
t.Logf("TEST: REST subscription removed from db. subId = %v", restSubId)
restSubsDbMock.DeleteRestSubIdsFromDb(restSubId)
}
func TestReadNotExistingRESTSubscriptionFromSdl(t *testing.T) {
restSubId := ""
restSubs, err := mainCtrl.c.ReadRESTSubscriptionFromSdl(restSubId)
if err != nil {
t.Logf("TEST: REST subscription not found from db. restSubId = %v", restSubId)
return
}
t.Errorf("TEST: REST subscription read from db. %v", restSubs)
PrintRESTSubscriptionData(t, restSubs)
}
func TestReadNotExistingRESTSubscriptionFromSdl2(t *testing.T) {
restSubId := "NotExistingSubsId"
restSubs, err := mainCtrl.c.ReadRESTSubscriptionFromSdl(restSubId)
if err != nil {
t.Logf("TEST: REST subscription not found from db. restSubId = %v", restSubId)
return
}
t.Errorf("TEST: REST subscription read from db. %v", restSubs)
PrintRESTSubscriptionData(t, restSubs)
}
func TestRemoveNotExistingRESTSubscriptionFromSdl(t *testing.T) {
restSubId := ""
err := mainCtrl.c.RemoveRESTSubscriptionFromSdl(restSubId)
if err != nil {
t.Logf("TEST: %s", err.Error())
return
}
t.Logf("TEST: REST subscription removed from db. subId = %v", restSubId)
}
func TestWriteRESTSubscriptionsToSdl(t *testing.T) {
// Write 1st subscription
restSubId := restSubsDbMock.AllocNextRestSubId()
t.Logf("TEST: Writing restSubId = %v\n", restSubId)
restSubs := CreateRESTSubscription(t)
PrintRESTSubscriptionData(t, restSubs)
err := mainCtrl.c.WriteRESTSubscriptionToSdl(restSubId, restSubs)
if err != nil {
t.Errorf("TEST: %s", err.Error())
return
}
restSubsDbMock.AddRestSubIdsInDb(restSubId)
t.Logf("TEST: REST subscription written in db = %v", restSubs)
// Write 2nd subscription
restSubId = restSubsDbMock.AllocNextRestSubId()
t.Logf("TEST:Writing restSubId = %v\n", restSubId)
restSubs = CreateRESTSubscription(t)
PrintRESTSubscriptionData(t, restSubs)
err = mainCtrl.c.WriteRESTSubscriptionToSdl(restSubId, restSubs)
if err != nil {
t.Errorf("TEST: %s", err.Error())
return
}
restSubsDbMock.AddRestSubIdsInDb(restSubId)
t.Logf("TEST: REST subscription written in db = %v", restSubs)
// Write 3rd subscription
restSubId = restSubsDbMock.AllocNextRestSubId()
t.Logf("TEST: Writing restSubId = %v\n", restSubId)
restSubs = CreateRESTSubscription(t)
PrintRESTSubscriptionData(t, restSubs)
err = mainCtrl.c.WriteRESTSubscriptionToSdl(restSubId, restSubs)
if err != nil {
t.Errorf("TEST: %s", err.Error())
return
}
restSubsDbMock.AddRestSubIdsInDb(restSubId)
t.Logf("TEST: REST subscription written in db = %v", restSubs)
}
func TestReadRESTSubscriptionsFromSdl(t *testing.T) {
for _, restSubId := range restSubsDbMock.restSubIdsInDb {
restSubs, err := mainCtrl.c.ReadRESTSubscriptionFromSdl(restSubId)
if err != nil {
t.Errorf("TEST: %s", err.Error())
return
}
PrintRESTSubscriptionData(t, restSubs)
}
}
func TestReadAllRESTSubscriptionsFromSdl(t *testing.T) {
register, err := mainCtrl.c.ReadAllRESTSubscriptionsFromSdl()
if err != nil {
t.Errorf("TEST: %s", err.Error())
return
}
for _, restSubs := range register {
PrintRESTSubscriptionData(t, restSubs)
}
assert.Equal(t, len(register), 3)
}
func TestRemoveAllRESTSubscriptionsFromSdl(t *testing.T) {
err := mainCtrl.c.RemoveAllRESTSubscriptionsFromSdl()
if err != nil {
t.Errorf("TEST: %s", err.Error())
return
}
t.Log("TEST: All subscription removed from db")
restSubsDbMock.EmptyRestSubIdsFromDb()
}
func TestReadAllRESTSubscriptionsFromSdl2(t *testing.T) {
register, err := mainCtrl.c.ReadAllRESTSubscriptionsFromSdl()
if err != nil {
t.Errorf("TEST: %s", err.Error())
return
}
for _, restSubs := range restSubsDbMock.restSubscriptions {
PrintRESTSubscriptionData(t, restSubs)
}
assert.Equal(t, len(register), 0)
}
func TestWriteRESTSubscriptionToSdlFail(t *testing.T) {
// Try to write one subscription.
// Test db should return test error string
MakeNextSdlRestCallFail()
restsubId := restSubsDbMock.AllocNextRestSubId()
restSubs := CreateRESTSubscription(t)
PrintRESTSubscriptionData(t, restSubs)
t.Logf("TEST: Writing subId = %v\n", restsubId)
err := mainCtrl.c.WriteRESTSubscriptionToSdl(restsubId, restSubs)
if err != nil {
if !strings.Contains(fmt.Sprintf("%s", err), sdlRestTestErrorString) {
t.Errorf("TEST: %s", err.Error())
}
} else {
t.Errorf("TEST: This test case should return error")
}
}
func TestReadRESTSubscriptionFromSdlFail(t *testing.T) {
// Try to read one subscription.
// Test db should return test error string
MakeNextSdlRestCallFail()
restSubId := restSubsDbMock.GetLastAllocatedRestSubId()
t.Logf("Reading restSubId = %v\n", restSubId)
restSubs, err := mainCtrl.c.ReadRESTSubscriptionFromSdl(restSubId)
if err != nil {
if !strings.Contains(fmt.Sprintf("%s", err), sdlRestTestErrorString) {
t.Errorf("TEST: %s", err.Error())
}
return
} else {
t.Errorf("TEST: This test case should return error")
}
PrintRESTSubscriptionData(t, restSubs)
}
func TestRemoveRESTSubscriptionFromSdlFail(t *testing.T) {
// Try to remove one subscription.
// Test db should return test error string
MakeNextSdlRestCallFail()
restSubId := restSubsDbMock.GetLastAllocatedRestSubId()
err := mainCtrl.c.RemoveRESTSubscriptionFromSdl(restSubId)
if err != nil {
if !strings.Contains(fmt.Sprintf("%s", err), sdlRestTestErrorString) {
t.Errorf("TEST: %s", err.Error())
}
return
} else {
t.Errorf("TEST: This test case should return error")
}
t.Logf("TEST: subscription removed from db. subId = %v", restSubId)
}
func TestReadAllRESTSubscriptionsFromSdlFail(t *testing.T) {
// Try to read all subscriptions.
// Test db should return test error string
MakeNextSdlRestCallFail()
register, err := mainCtrl.c.ReadAllRESTSubscriptionsFromSdl()
if err != nil {
if !strings.Contains(fmt.Sprintf("%s", err), sdlRestTestErrorString) {
t.Errorf("TEST: %s", err.Error())
}
return
} else {
t.Errorf("TEST: This test case should return error")
}
for _, restSubs := range register {
PrintRESTSubscriptionData(t, restSubs)
}
}
func TestRemoveAllRESTSubscriptionsFromSdlFail(t *testing.T) {
// Try to remove all subscriptions.
// Test db should return test error string
MakeNextSdlRestCallFail()
err := mainCtrl.c.RemoveAllRESTSubscriptionsFromSdl()
if err != nil {
if !strings.Contains(fmt.Sprintf("%s", err), sdlRestTestErrorString) {
t.Errorf("TEST: %s", err.Error())
}
return
} else {
t.Errorf("TEST: This test case should return error")
}
t.Log("TEST: All subscription removed from db")
}
func (m *RestSubsDbMock) Set(ns string, pairs ...interface{}) error {
var key string
var val string
m.marshalLock.Lock()
defer m.marshalLock.Unlock()
if ns != restSubSdlNs {
return fmt.Errorf("Unexpected namespace '%s' error\n", ns)
}
if sdlRestShouldReturnError == true {
return GetSdlRestError()
}
for _, v := range pairs {
reflectType := reflect.TypeOf(v)
switch reflectType.Kind() {
case reflect.Slice:
val = fmt.Sprintf("%s", v.([]uint8))
default:
switch v.(type) {
case string:
key = v.(string)
default:
return fmt.Errorf("Set() error: Unexpected type\n")
}
}
}
if key != "" {
m.restSubsDb[key] = val
restSubId := key
restSubscriptionInfo := &RESTSubscriptionInfo{}
err := json.Unmarshal([]byte(val), restSubscriptionInfo)
if err != nil {
return fmt.Errorf("Set() json.unmarshal error: %s\n", err.Error())
}
restSubs := mainCtrl.c.CreateRESTSubscription(restSubscriptionInfo, &val)
m.restSubscriptions[restSubId] = restSubs
} else {
return fmt.Errorf("Set() error: key == ''\n")
}
return nil
}
func (m *RestSubsDbMock) Get(ns string, keys []string) (map[string]interface{}, error) {
retMap := make(map[string]interface{})
if ns != restSubSdlNs {
return nil, fmt.Errorf("Unexpected namespace '%s' error\n", ns)
}
if len(keys) == 0 {
return nil, fmt.Errorf("Get() error: len(key) == 0\n")
}
if sdlRestShouldReturnError == true {
return nil, GetSdlRestError()
}
for _, key := range keys {
if key != "" {
retMap[key] = m.restSubsDb[key]
} else {
return nil, fmt.Errorf("Get() error: key == ''\n")
}
}
return retMap, nil
}
func (m *RestSubsDbMock) GetAll(ns string) ([]string, error) {
if ns != restSubSdlNs {
return nil, fmt.Errorf("Unexpected namespace '%s' error\n", ns)
}
if sdlRestShouldReturnError == true {
return nil, GetSdlRestError()
}
keys := []string{}
for key, _ := range m.restSubsDb {
keys = append(keys, key)
}
return keys, nil
}
func (m *RestSubsDbMock) Remove(ns string, keys []string) error {
if ns != restSubSdlNs {
return fmt.Errorf("Unexpected namespace '%s' error\n", ns)
}
if len(keys) == 0 {
return fmt.Errorf("Remove() error: len(key) == 0\n")
}
if sdlRestShouldReturnError == true {
return GetSdlRestError()
}
restSubId := keys[0]
delete(m.restSubsDb, restSubId)
delete(m.restSubscriptions, restSubId)
return nil
}
func (m *RestSubsDbMock) RemoveAll(ns string) error {
if ns != restSubSdlNs {
return fmt.Errorf("Unexpected namespace '%s' error\n", ns)
}
for key := range m.restSubsDb {
restSubId := key
delete(m.restSubsDb, restSubId)
delete(m.restSubscriptions, restSubId)
}
if sdlRestShouldReturnError == true {
return GetSdlRestError()
}
return nil
}
func MakeNextSdlRestCallFail() {
sdlRestShouldReturnError = true
}
func GetSdlRestError() error {
sdlRestShouldReturnError = false
return fmt.Errorf(sdlRestTestErrorString)
}