E2 restart handling added
[ric-plt/submgr.git] / pkg / control / e2if_state_test.go
diff --git a/pkg/control/e2if_state_test.go b/pkg/control/e2if_state_test.go
new file mode 100644 (file)
index 0000000..e4ee848
--- /dev/null
@@ -0,0 +1,247 @@
+/*
+==================================================================================
+  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
+}