"testing"
"time"
+ "github.com/stretchr/testify/assert"
+
"gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/teststub"
"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
"gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
type CountersToBeAdded []Counter
-var countersBeforeMap map[string]Counter
+var allCountersMap map[string]Counter
+var allCountersBeforeMap map[string]Counter
+var toBeAddedCountersBeforeMap map[string]Counter
var toBeAddedCountersMap map[string]Counter
func createSubmgrControl(srcId teststub.RmrSrcId, rtgSvc teststub.RmrRtgSvc) *testingSubmgrControl {
mainCtrl.RmrControl.Init("SUBMGRCTL", srcId, rtgSvc)
mainCtrl.c = NewControl()
mainCtrl.c.UTTesting = true
- mainCtrl.c.LoggerLevel = int(xapp.Logger.GetLevel())
+ mainCtrl.c.LoggerLevel = 4
+ mainCtrl.c.e2ap.SetASN1DebugPrintStatus(mainCtrl.c.LoggerLevel)
xapp.Logger.Debug("Test: LoggerLevel %v", mainCtrl.c.LoggerLevel)
xapp.Logger.Debug("Replacing real db with test db")
- mainCtrl.c.e2SubsDb = CreateMock() // This overrides real E2 Subscription database for testing
- mainCtrl.c.restSubsDb = CreateRestSubsDbMock() // This overrides real REST Subscription database for testing
+ mainCtrl.c.e2SubsDb = CreateMock() // This overrides real E2 Subscription database for testing
+ mainCtrl.c.restSubsDb = CreateRestSubsDbMock() // This overrides real REST Subscription database for testing
+ mainCtrl.c.e2IfStateDb = CreateXappRnibIfMock() // This overrides real RNIB database for testing
xapp.SetReadyCB(mainCtrl.ReadyCB, nil)
go xapp.RunWithParams(mainCtrl.c, false)
mainCtrl.WaitCB()
func (mc *testingSubmgrControl) SimulateRestart(t *testing.T) {
mc.TestLog(t, "Simulating submgr restart")
- mainCtrl.c.registry.subIds = nil
+
// Initialize subIds slice and subscription map
+ mainCtrl.c.registry.subIds = nil
mainCtrl.c.registry.Initialize()
mainCtrl.c.restDuplicateCtrl.Init()
+
// Read subIds and subscriptions from database
- subIds, register, err := mainCtrl.c.ReadAllSubscriptionsFromSdl()
- if err != nil {
- mc.TestError(t, "%v", err)
- } else {
- mainCtrl.c.registry.subIds = subIds
- mainCtrl.c.registry.register = register
- mc.TestLog(t, "mainCtrl.c.registry.register:")
+ go mainCtrl.c.ReadE2Subscriptions() // This needs to be run in own go routine when called from here <<--- improve this
+ mc.TestLog(t, "mainCtrl.c.registry.register:")
+ /*
for subId, subs := range mainCtrl.c.registry.register {
mc.TestLog(t, " subId=%v", subId)
mc.TestLog(t, " subs.SubRespRcvd=%v", subs.SubRespRcvd)
mc.TestLog(t, " subs=%v\n", subs)
}
- }
- restSubscriptions, err := mainCtrl.c.ReadAllRESTSubscriptionsFromSdl()
- if err != nil {
- mc.TestError(t, "%v", err)
- } else {
- mainCtrl.c.registry.restSubscriptions = restSubscriptions
- mc.TestLog(t, "mainCtrl.c.registry.restSubscriptions:")
- for restSubId, restSubs := range mainCtrl.c.registry.restSubscriptions {
- mc.TestLog(t, " restSubId=%v", restSubId)
- mc.TestLog(t, " restSubs=%v\n", restSubs)
- }
- }
-
- go mainCtrl.c.HandleUncompletedSubscriptions(mainCtrl.c.registry.register)
+ */
+ // Read REST subIds and REST subscriptions from database
+ mainCtrl.c.ReadRESTSubscriptions()
+ mc.TestLog(t, "mainCtrl.c.registry.restSubscriptions:")
+ for restSubId, restSubs := range mainCtrl.c.registry.restSubscriptions {
+ mc.TestLog(t, " restSubId=%v", restSubId)
+ mc.TestLog(t, " restSubs=%v\n", restSubs)
+ }
+ //go mainCtrl.c.HandleUncompletedSubscriptions(mainCtrl.c.registry.register) // This needs to be run in own go routine when called from here
}
func (mc *testingSubmgrControl) MakeTransactionNil(t *testing.T, subId uint32) {
return 0, false
}
+func (mc *testingSubmgrControl) VerifyAllClean(t *testing.T) {
+
+ // Verify that all resources are freed. Wait cleaning up to 10 seconds
+ for i := 0; i < 100; i++ {
+ if len(mainCtrl.c.registry.register) == 0 && len(mainCtrl.c.registry.restSubscriptions) == 0 {
+ RESTKeyCount, err := mainCtrl.c.GetRESTKeyCount()
+ if err != nil {
+ t.Errorf("TEST: %s", err.Error())
+ }
+ E2KeyCount, err := mainCtrl.c.GetE2KeyCount()
+ if err != nil {
+ t.Errorf("TEST: %s", err.Error())
+ }
+ if RESTKeyCount == 0 && E2KeyCount == 0 {
+ break
+ }
+ }
+ <-time.After(time.Millisecond * 100)
+ xapp.Logger.Debug("VerifyAllClean delay plus 100ms")
+ }
+
+ assert.Equal(t, 0, len(mainCtrl.c.registry.register))
+ if len(mainCtrl.c.registry.register) > 0 {
+ fmt.Printf("registry.register: %v\n", mainCtrl.c.registry.register)
+ }
+ assert.Equal(t, 0, len(mainCtrl.c.registry.restSubscriptions))
+ if len(mainCtrl.c.registry.restSubscriptions) > 0 {
+ fmt.Printf("registry.restSubscriptions: %v\n", mainCtrl.c.registry.restSubscriptions)
+ }
+ verifyRESTKeyCount(t, 0)
+ verifyE2KeyCount(t, 0)
+}
+
+func (mc *testingSubmgrControl) WaitOngoingRequestMapEmpty() {
+ for i := 0; i < 100; i++ {
+ if len(mainCtrl.c.restDuplicateCtrl.ongoingRequestMap) != 0 {
+ <-time.After(time.Millisecond * 100)
+ xapp.Logger.Debug("WaitOngoingRequestMapEmpty delay plus 100ms")
+ }
+ }
+}
+
func (mc *testingSubmgrControl) GetMetrics(t *testing.T) (string, error) {
req, err := http.NewRequest("GET", "http://localhost:8080/ric/v1/metrics", nil)
if err != nil {
return string(respBody[:]), nil
}
+func (mc *testingSubmgrControl) InitAllCounterMap() {
+ counterOpts := GetMetricsOpts()
+
+ allCountersMap = make(map[string]Counter)
+ for _, counterOpt := range counterOpts {
+ //fmt.Printf("counterOpt.Name: '%v'\n", counterOpt.Name)
+ counter := Counter{counterOpt.Name, 0}
+ allCountersMap[counterOpt.Name] = counter
+ }
+}
+
func (mc *testingSubmgrControl) CounterValuesToBeVeriefied(t *testing.T, countersToBeAdded CountersToBeAdded) {
if len(toBeAddedCountersMap) == 0 {
}
func (mc *testingSubmgrControl) GetCounterValuesBefore(t *testing.T) {
- countersBeforeMap = make(map[string]Counter)
- countersBeforeMap = mc.GetCurrentCounterValues(t, toBeAddedCountersMap)
+ toBeAddedCountersBeforeMap = make(map[string]Counter)
+ toBeAddedCountersBeforeMap = mc.GetCurrentCounterValues(t, toBeAddedCountersMap)
+ allCountersBeforeMap = make(map[string]Counter)
+ allCountersBeforeMap = mc.GetCurrentCounterValues(t, allCountersMap)
}
func (mc *testingSubmgrControl) VerifyCounterValues(t *testing.T) {
// Check that expected counters are added ok
+ // Get current values of counters exected to be added
currentCountersMap := mc.GetCurrentCounterValues(t, toBeAddedCountersMap)
for _, toBeAddedCounter := range toBeAddedCountersMap {
if currentCounter, ok := currentCountersMap[toBeAddedCounter.Name]; ok == true {
- if beforeCounter, ok := countersBeforeMap[toBeAddedCounter.Name]; ok == true {
+ if beforeCounter, ok := toBeAddedCountersBeforeMap[toBeAddedCounter.Name]; ok == true {
if currentCounter.Value != beforeCounter.Value+toBeAddedCounter.Value {
mc.TestError(t, "Error in expected counter value: counterName %v, current value %v, expected value %v",
currentCounter.Name, currentCounter.Value, beforeCounter.Value+toBeAddedCounter.Value)
-
- //fmt.Printf("beforeCounter.Value=%v, toBeAddedCounter.Value=%v, \n",beforeCounter.Value, toBeAddedCounter.Value)
}
} else {
- mc.TestError(t, "Counter %v not in countersBeforeMap", toBeAddedCounter.Name)
+ mc.TestError(t, "Counter %v not in toBeAddedCountersBeforeMap", toBeAddedCounter.Name)
}
} else {
mc.TestError(t, "Counter %v not in currentCountersMap", toBeAddedCounter.Name)
}
// Check that not any unexpected counter are added
+ // Get current values of all counters
+ currentCountersMap = mc.GetCurrentCounterValues(t, allCountersMap)
for _, currentCounter := range currentCountersMap {
if _, ok := toBeAddedCountersMap[currentCounter.Name]; ok == false {
- if beforeCounter, ok := countersBeforeMap[currentCounter.Name]; ok == true {
+ if beforeCounter, ok := allCountersBeforeMap[currentCounter.Name]; ok == true {
if currentCounter.Value != beforeCounter.Value {
- mc.TestError(t, "Error: unexpected counter value added: counterName %v, current value %v, expected value %v",
- currentCounter.Name, beforeCounter.Value, beforeCounter.Value)
-
- //fmt.Printf("beforeCounter.Value=%v, toBeAddedCounter.Value=%v, \n",beforeCounter.Value, toBeAddedCounter.Value)
+ mc.TestError(t, "Error: unexpected counter added: counterName %v, current value %v, expected value %v",
+ currentCounter.Name, currentCounter.Value, beforeCounter.Value)
}
- } else {
- mc.TestError(t, "Counter %v not in countersBeforeMap", beforeCounter.Name)
}
}
}
// Make map empty
- //fmt.Printf("toBeAddedCountersMap=%v\n",toBeAddedCountersMap)
toBeAddedCountersMap = make(map[string]Counter)
+ allCountersBeforeMap = make(map[string]Counter)
}
func (mc *testingSubmgrControl) GetCurrentCounterValues(t *testing.T, chekedCountersMap map[string]Counter) map[string]Counter {
if len(retCounterMap) != len(chekedCountersMap) {
mc.TestError(t, "Error: len(retCounterMap) != len(chekedCountersMap)")
-
}
return retCounterMap
}
mc.TestLog(t, "%s", respBody)
return
}
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+func (mc *testingSubmgrControl) SetE2State(t *testing.T, ranNameState string) {
+
+ if err := mc.c.e2IfStateDb.XappRnibStoreAndPublish("RAN_CONNECTION_STATUS_CHANGE", ranNameState, "key1", "data1"); err != nil {
+ t.Errorf("XappRnibStoreAndPublish failed: %v", err)
+ }
+}