--- /dev/null
+/*
+==================================================================================
+ 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)
+
+ 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)
+ }
+}
+
+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 {
+ 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
+}