blob: 09ee212d9f7ca3c5865dc57fb7ba324c131a673e [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 (
"fmt"
"gerrit.o-ran-sc.org/r/ric-plt/nodeb-rnib.git/entities"
"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
"strings"
"sync"
"testing"
)
var xappRnibMock *XappRnibMock
type XappRnibMock struct {
Mutex sync.Mutex
nbIdentityMap map[string]xapp.RNIBNbIdentity
RNIBNodebInfoMap map[string]xapp.RNIBNodebInfo
RnibSubscription RnibSubscription // Submgr can have only one subscription
}
type RnibSubscription struct {
Channel string // Subscribed channel/topic "RAN_CONNECTION_STATUS_CHANGE"
cb func(ch string, events ...string) // Submgr's call back function
}
func CreateXappRnibIfMock() *XappRnibMock {
fmt.Println("XappRnibMock: CreateXappRnibIfMock()")
xappRnibMock = new(XappRnibMock)
xappRnibMock.Init()
return xappRnibMock
}
func (x *XappRnibMock) Init() {
x.nbIdentityMap = make(map[string]xapp.RNIBNbIdentity, 0)
x.RNIBNodebInfoMap = make(map[string]xapp.RNIBNodebInfo, 0)
}
func TestMock(t *testing.T) {
// Current UT test cases use these ran names
xappRnibMock.CreateGnb("RAN_NAME_1", entities.ConnectionStatus_CONNECTED)
xappRnibMock.CreateGnb("RAN_NAME_11", entities.ConnectionStatus_CONNECTED)
xappRnibMock.CreateGnb("RAN_NAME_2", entities.ConnectionStatus_CONNECTED)
xappRnibMock.CreateGnb("gnb_208_092_303030", entities.ConnectionStatus_CONNECTED) // This same value is used in gnb simulator!
xappRnibMock.CreateGnb("gnb_208_092_303030", entities.ConnectionStatus_DISCONNECTED)
xappRnibMock.CreateGnb("gnb_369_11105_aaaaa3", entities.ConnectionStatus_UNKNOWN_CONNECTION_STATUS)
xappRnibMock.CreateGnb("gnb_369_11105_aaaaa3", entities.ConnectionStatus_CONNECTED_SETUP_FAILED)
xappRnibMock.CreateGnb("gnb_369_11105_aaaaa3", entities.ConnectionStatus_CONNECTING)
xappRnibMock.CreateGnb("gnb_369_11105_aaaaa3", entities.ConnectionStatus_CONNECTED)
xappRnibMock.CreateGnb("gnb_369_11105_aaaaa3", entities.ConnectionStatus_SHUTTING_DOWN)
xappRnibMock.CreateGnb("gnb_369_11105_aaaaa3", entities.ConnectionStatus_SHUT_DOWN)
xappRnibMock.CreateGnb("gnb_369_11105_aaaaa3", entities.ConnectionStatus_DISCONNECTED)
xappRnibMock.CreateGnb("gnb_369_11105_aaaaa3", entities.ConnectionStatus_UNDER_RESET)
mainCtrl.c.e2IfState.ReadE2ConfigurationFromRnib()
mainCtrl.c.e2IfState.SubscribeChannels()
if err := xappRnibMock.XappRnibStoreAndPublish("RAN_CONNECTION_STATUS_CHANGE", "gnb_369_11105_aaaaa3_UNKNOWN_CONNECTION_STATUS", "key1", "data1"); err != nil {
t.Errorf("XappRnibStoreAndPublish failed: %v", err)
}
if err := xappRnibMock.XappRnibStoreAndPublish("RAN_CONNECTION_STATUS_CHANGE", "gnb_369_11105_aaaaa3_CONNECTED_SETUP_FAILED", "key1", "data1"); err != nil {
t.Errorf("XappRnibStoreAndPublish failed: %v", err)
}
if err := xappRnibMock.XappRnibStoreAndPublish("RAN_CONNECTION_STATUS_CHANGE", "gnb_369_11105_aaaaa3_CONNECTING", "key1", "data1"); err != nil {
t.Errorf("XappRnibStoreAndPublish failed: %v", err)
}
if err := xappRnibMock.XappRnibStoreAndPublish("RAN_CONNECTION_STATUS_CHANGE", "gnb_369_11105_aaaaa3_CONNECTED", "key1", "data1"); err != nil {
t.Errorf("XappRnibStoreAndPublish failed: %v", err)
}
if err := xappRnibMock.XappRnibStoreAndPublish("RAN_CONNECTION_STATUS_CHANGE", "gnb_369_11105_aaaaa3_SHUTTING_DOWN", "key1", "data1"); err != nil {
t.Errorf("XappRnibStoreAndPublish failed: %v", err)
}
if err := xappRnibMock.XappRnibStoreAndPublish("RAN_CONNECTION_STATUS_CHANGE", "gnb_369_11105_aaaaa3_DISCONNECTED", "key1", "data1"); err != nil {
t.Errorf("XappRnibStoreAndPublish failed: %v", err)
}
if err := xappRnibMock.XappRnibStoreAndPublish("RAN_CONNECTION_STATUS_CHANGE", "gnb_369_11105_aaaaa3_UNDER_RESET", "key1", "data1"); err != nil {
t.Errorf("XappRnibStoreAndPublish failed: %v", err)
}
}
func (x *XappRnibMock) CreateGnb(gnbId string, connectionStatus entities.ConnectionStatus) {
xapp.Logger.Debug("XappRnibMock: CreateGnb() gnbId=%v, ConnectionStatus=%v", gnbId, connectionStatus)
nb := xapp.RNIBNodebInfo{}
nb.NodeType = xapp.RNIBNodeGNB
nb.ConnectionStatus = connectionStatus
if nb.ConnectionStatus < 0 || nb.ConnectionStatus > 6 {
xapp.Logger.Error("XappRnibMock: CreateGnb() Incorrect connectionStatus=%v", nb.ConnectionStatus)
return
}
nb.Ip = "localhost"
nb.Port = 5656
gnb := xapp.RNIBGnb{}
gnb.ServedNrCells = nil
nb.Configuration = &xapp.RNIBNodebInfoGnb{Gnb: &gnb}
nbIdentity := &xapp.RNIBNbIdentity{
InventoryName: gnbId,
GlobalNbId: &xapp.RNIBGlobalNbId{
PlmnId: "001EF5",
NbId: "0045FE50",
},
}
err := xappRnibMock.XappRnibSaveNodeb(nbIdentity, &nb)
if err != nil {
xapp.Logger.Error("XappRnibMock: XappRnibSaveNodeb() failed. Error: %v", err)
}
}
func (x *XappRnibMock) XappRnibSaveNodeb(nbIdentity *xapp.RNIBNbIdentity, nodeb *xapp.RNIBNodebInfo) xapp.RNIBIRNibError {
xapp.Logger.Debug("XappRnibMock: XappRnibSaveNodeb() inventoryName=%v, ConnectionStatus=%v", nbIdentity.InventoryName, nodeb.ConnectionStatus)
x.Mutex.Lock()
defer x.Mutex.Unlock()
x.nbIdentityMap[nbIdentity.InventoryName] = *nbIdentity
x.RNIBNodebInfoMap[nbIdentity.InventoryName] = *nodeb
return nil
}
func (x *XappRnibMock) XappRnibGetNodeb(inventoryName string) (*xapp.RNIBNodebInfo, xapp.RNIBIRNibError) {
x.Mutex.Lock()
defer x.Mutex.Unlock()
xapp.Logger.Debug("XappRnibMock: XappRnibGetNodeb() inventoryName=%v", inventoryName)
nodebInfo, ok := x.RNIBNodebInfoMap[inventoryName]
if ok {
return &nodebInfo, nil
} else {
return nil, fmt.Errorf("XappRnibMock: XappRnibGetNodeb() failed: inventoryName=%s:", inventoryName)
}
}
func (x *XappRnibMock) XappRnibSubscribe(cb func(string, ...string), channel string) error {
if x.RnibSubscription.Channel == "RAN_CONNECTION_STATUS_CHANGE" {
xapp.Logger.Debug("XappRnibMock: RAN_CONNECTION_STATUS_CHANGE channel already subscribed")
return nil
}
if x.RnibSubscription.Channel == "" {
x.RnibSubscription.cb = cb
x.RnibSubscription.Channel = channel
xapp.Logger.Debug("XappRnibMock: RAN_CONNECTION_STATUS_CHANGE subscribed")
return nil
} else {
return fmt.Errorf("XappRnibMock: Invalid channel/topic to subscribe: channel = %s", channel)
}
}
func (x *XappRnibMock) XappRnibGetListGnbIds() ([]*xapp.RNIBNbIdentity, xapp.RNIBIRNibError) {
xapp.Logger.Debug("XappRnibMock: XappRnibGetListGnbIds()")
x.Mutex.Lock()
defer x.Mutex.Unlock()
var nbIdentities []*xapp.RNIBNbIdentity
for _, nbIdentity := range x.nbIdentityMap {
newNbIdentity := entities.NbIdentity{}
newNbIdentity = nbIdentity
nbIdentities = append(nbIdentities, &newNbIdentity)
}
xapp.Logger.Debug("XappRnibMock: XappRnibGetListGnbIds(). len(nbIdentities) = %v", len(nbIdentities))
return nbIdentities, nil
}
func (x *XappRnibMock) XappRnibStoreAndPublish(channel string, event string, pairs ...interface{}) error {
x.Mutex.Lock()
defer x.Mutex.Unlock()
xapp.Logger.Debug("XappRnibMock: Change published. channel=%s, event=%s", channel, event)
if channel != "RAN_CONNECTION_STATUS_CHANGE" || channel == "" || event == "" {
xapp.Logger.Debug("XappRnibMock: Invalid change published. channel=%s, event=%s", channel, event)
}
nbId, connectionStatus, err := ExtratNbIdAndConnectionStatus(event)
if err != nil {
xapp.Logger.Error("XappRnibMock: ExtratNbIdAndConnectionStatus. Err=%s", err)
}
nbIdentity, ok := x.nbIdentityMap[nbId]
if ok {
nbIdentity.ConnectionStatus = connectionStatus
}
if x.RnibSubscription.cb != nil {
x.RnibSubscription.cb(channel, event)
} else {
xapp.Logger.Error("XappRnibMock: x.RnibSubscription.cb == nil")
}
return nil
}
func ExtratNbIdAndConnectionStatus(s string) (string, entities.ConnectionStatus, error) {
var connectionStatus entities.ConnectionStatus
var nbId string
if strings.Contains(s, "_UNKNOWN_CONNECTION_STATUS") {
connectionStatus = entities.ConnectionStatus_UNKNOWN_CONNECTION_STATUS
splitStringTbl := strings.Split(s, "_UNKNOWN_CONNECTION_STATUS")
nbId = splitStringTbl[0]
} else if strings.Contains(s, "_CONNECTED") {
connectionStatus = entities.ConnectionStatus_CONNECTED
splitStringTbl := strings.Split(s, "_CONNECTED")
nbId = splitStringTbl[0]
} else if strings.Contains(s, "_DISCONNECTED") {
connectionStatus = entities.ConnectionStatus_DISCONNECTED
splitStringTbl := strings.Split(s, "_DISCONNECTED")
nbId = splitStringTbl[0]
} else if strings.Contains(s, "_CONNECTED_SETUP_FAILED") {
connectionStatus = entities.ConnectionStatus_CONNECTED_SETUP_FAILED
splitStringTbl := strings.Split(s, "_CONNECTED_SETUP_FAILED")
nbId = splitStringTbl[0]
} else if strings.Contains(s, "_CONNECTING") {
connectionStatus = entities.ConnectionStatus_CONNECTING
splitStringTbl := strings.Split(s, "_CONNECTING")
nbId = splitStringTbl[0]
} else if strings.Contains(s, "_SHUTTING_DOWN") {
connectionStatus = entities.ConnectionStatus_SHUTTING_DOWN
splitStringTbl := strings.Split(s, "_SHUTTING_DOWN")
nbId = splitStringTbl[0]
} else if strings.Contains(s, "_SHUT_DOWN") {
connectionStatus = entities.ConnectionStatus_SHUT_DOWN
splitStringTbl := strings.Split(s, "_SHUT_DOWN")
nbId = splitStringTbl[0]
} else if strings.Contains(s, "_UNDER_RESET") {
connectionStatus = entities.ConnectionStatus_UNDER_RESET
splitStringTbl := strings.Split(s, "_UNDER_RESET")
nbId = splitStringTbl[0]
} else {
return "", 0, fmt.Errorf("XappRnibMock: Invalid connection status. %s", s)
}
if len(nbId) == 0 {
return "", 0, fmt.Errorf("ExtractNbiIdFromString(): len(nbId) == 0 ")
}
return nbId, connectionStatus, nil
}