2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
31 "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/teststub"
32 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/models"
33 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
36 //-----------------------------------------------------------------------------
38 //-----------------------------------------------------------------------------
39 type testingSubmgrControl struct {
49 type CountersToBeAdded []Counter
51 var countersBeforeMap map[string]Counter
52 var toBeAddedCountersMap map[string]Counter
54 func createSubmgrControl(srcId teststub.RmrSrcId, rtgSvc teststub.RmrRtgSvc) *testingSubmgrControl {
55 mainCtrl = &testingSubmgrControl{}
56 mainCtrl.RmrControl.Init("SUBMGRCTL", srcId, rtgSvc)
57 mainCtrl.c = NewControl()
58 mainCtrl.c.LoggerLevel = int(xapp.Logger.GetLevel())
59 xapp.Logger.Debug("Test: LoggerLevel %v", mainCtrl.c.LoggerLevel)
60 xapp.Logger.Debug("Replacing real db with test db")
61 mainCtrl.c.e2SubsDb = CreateMock() // This overrides real E2 Subscription database for testing
62 mainCtrl.c.restSubsDb = CreateRestSubsDbMock() // This overrides real REST Subscription database for testing
63 xapp.SetReadyCB(mainCtrl.ReadyCB, nil)
64 go xapp.RunWithParams(mainCtrl.c, false)
66 mainCtrl.c.ReadyCB(nil)
70 func (mc *testingSubmgrControl) SimulateRestart(t *testing.T) {
71 mc.TestLog(t, "Simulating submgr restart")
72 mainCtrl.c.registry.subIds = nil
73 // Initialize subIds slice and subscription map
74 mainCtrl.c.registry.Initialize()
75 restDuplicateCtrl.Init()
76 // Read subIds and subscriptions from database
77 subIds, register, err := mainCtrl.c.ReadAllSubscriptionsFromSdl()
79 mc.TestError(t, "%v", err)
81 mainCtrl.c.registry.subIds = subIds
82 mainCtrl.c.registry.register = register
83 mc.TestLog(t, "mainCtrl.c.registry.register:")
84 for subId, subs := range mainCtrl.c.registry.register {
85 mc.TestLog(t, " subId=%v", subId)
86 mc.TestLog(t, " subs.SubRespRcvd=%v", subs.SubRespRcvd)
87 mc.TestLog(t, " subs=%v\n", subs)
90 restSubscriptions, err := mainCtrl.c.ReadAllRESTSubscriptionsFromSdl()
92 mc.TestError(t, "%v", err)
94 mainCtrl.c.registry.restSubscriptions = restSubscriptions
95 mc.TestLog(t, "mainCtrl.c.registry.restSubscriptions:")
96 for restSubId, restSubs := range mainCtrl.c.registry.restSubscriptions {
97 mc.TestLog(t, " restSubId=%v", restSubId)
98 mc.TestLog(t, " restSubs=%v\n", restSubs)
102 go mainCtrl.c.HandleUncompletedSubscriptions(mainCtrl.c.registry.register)
105 func (mc *testingSubmgrControl) MakeTransactionNil(t *testing.T, subId uint32) {
107 mc.TestLog(t, "Makin transaction nil for SubId=%v", subId)
108 subs := mainCtrl.c.registry.GetSubscription(subId)
112 func (mc *testingSubmgrControl) SetResetTestFlag(t *testing.T, status bool) {
113 mc.TestLog(t, "ResetTestFlag set to %v", status)
114 mainCtrl.c.ResetTestFlag = status
117 func (mc *testingSubmgrControl) removeExistingSubscriptions(t *testing.T) {
119 mc.TestLog(t, "Removing existing subscriptions")
120 mainCtrl.c.RemoveAllSubscriptionsFromSdl()
121 mainCtrl.c.registry.subIds = nil
122 // Initialize subIds slice and subscription map
123 mainCtrl.c.registry.Initialize()
126 func PringSubscriptionQueryResult(resp models.SubscriptionList) {
127 for _, item := range resp {
128 fmt.Printf("item.SubscriptionID=%v\n", item.SubscriptionID)
129 fmt.Printf("item.Meid=%v\n", item.Meid)
130 fmt.Printf("item.ClientEndpoint=%v\n", item.ClientEndpoint)
134 func (mc *testingSubmgrControl) wait_registry_empty(t *testing.T, secs int) bool {
137 for ; i <= secs*10; i++ {
138 cnt = len(mc.c.registry.register)
142 time.Sleep(100 * time.Millisecond)
144 mc.TestError(t, "(submgr) no registry empty within %d secs: %d, register: %v", secs, cnt, mc.c.registry.register)
148 func (mc *testingSubmgrControl) get_registry_next_subid(t *testing.T) uint32 {
149 mc.c.registry.mutex.Lock()
150 defer mc.c.registry.mutex.Unlock()
151 return mc.c.registry.subIds[0]
154 func (mc *testingSubmgrControl) wait_registry_next_subid_change(t *testing.T, origSubId uint32, secs int) (uint32, bool) {
156 for ; i <= secs*10; i++ {
157 mc.c.registry.mutex.Lock()
158 currSubId := mc.c.registry.subIds[0]
159 mc.c.registry.mutex.Unlock()
160 if currSubId != origSubId {
161 return currSubId, true
163 time.Sleep(100 * time.Millisecond)
165 mc.TestError(t, "(submgr) no subId change within %d secs", secs)
169 func (mc *testingSubmgrControl) wait_subs_clean(t *testing.T, e2SubsId uint32, secs int) bool {
170 var subs *Subscription
172 for ; i <= secs*10; i++ {
173 subs = mc.c.registry.GetSubscription(e2SubsId)
177 time.Sleep(100 * time.Millisecond)
180 mc.TestError(t, "(submgr) no clean within %d secs: %s", secs, subs.String())
182 mc.TestError(t, "(submgr) no clean within %d secs: subs(N/A)", secs)
187 func (mc *testingSubmgrControl) wait_multi_subs_clean(t *testing.T, e2SubsIds []uint32, secs int) bool {
189 purgedSubscriptions := 0
191 for i := 1; i <= secs*10; i++ {
192 purgedSubscriptions = 0
193 for k := 0; k <= len(e2SubsIds); i++ {
194 subs := mc.c.registry.GetSubscription(e2SubsIds[k])
196 mc.TestLog(t, "(submgr) subscriber purged for esSubsId %v", e2SubsIds[k])
197 purgedSubscriptions += 1
198 if purgedSubscriptions == len(e2SubsIds) {
203 mc.TestLog(t, "(submgr) subscriptions pending purging %v/%v after %d msecs", purgedSubscriptions, len(e2SubsIds), i+500)
204 time.Sleep(100 * time.Millisecond)
207 mc.TestError(t, "(submgr) no clean within %d secs: subs(N/A) - %v/%v subscriptions found still", secs, purgedSubscriptions, len(e2SubsIds))
212 func (mc *testingSubmgrControl) wait_subs_trans_clean(t *testing.T, e2SubsId uint32, secs int) bool {
213 var trans TransactionIf
215 for ; i <= secs*10; i++ {
216 subs := mc.c.registry.GetSubscription(e2SubsId)
220 trans = subs.GetTransaction()
224 time.Sleep(100 * time.Millisecond)
227 mc.TestError(t, "(submgr) no clean within %d secs: %s", secs, trans.String())
229 mc.TestError(t, "(submgr) no clean within %d secs: trans(N/A)", secs)
234 func (mc *testingSubmgrControl) get_subs_entrypoint_cnt(t *testing.T, origSubId uint32) int {
235 subs := mc.c.registry.GetSubscription(origSubId)
237 mc.TestError(t, "(submgr) no subs %d exists during entrypoint cnt get", origSubId)
240 return subs.EpList.Size()
243 func (mc *testingSubmgrControl) wait_subs_entrypoint_cnt_change(t *testing.T, origSubId uint32, orig int, secs int) (int, bool) {
245 subs := mc.c.registry.GetSubscription(origSubId)
247 mc.TestError(t, "(submgr) no subs %d exists during entrypoint cnt wait", origSubId)
252 for ; i <= secs*10; i++ {
253 curr := subs.EpList.Size()
257 time.Sleep(100 * time.Millisecond)
259 mc.TestError(t, "(submgr) no subs %d entrypoint cnt change within %d secs", origSubId, secs)
264 // Counter check for received message. Note might not be yet handled
266 func (mc *testingSubmgrControl) get_msgcounter(t *testing.T) uint64 {
267 return mc.c.CntRecvMsg
270 func (mc *testingSubmgrControl) wait_msgcounter_change(t *testing.T, orig uint64, secs int) (uint64, bool) {
272 for ; i <= secs*10; i++ {
273 curr := mc.c.CntRecvMsg
277 time.Sleep(100 * time.Millisecond)
279 mc.TestError(t, "(submgr) no msg counter change within %d secs", secs)
283 func (mc *testingSubmgrControl) GetMetrics(t *testing.T) (string, error) {
284 req, err := http.NewRequest("GET", "http://localhost:8080/ric/v1/metrics", nil)
286 return "", fmt.Errorf("Error reading request. %v", err)
288 client := &http.Client{Timeout: time.Second * 10}
289 resp, err := client.Do(req)
291 return "", fmt.Errorf("Error reading response. %v", err)
293 defer resp.Body.Close()
295 respBody, err := ioutil.ReadAll(resp.Body)
297 return "", fmt.Errorf("Error reading body. %v", err)
299 return string(respBody[:]), nil
302 func (mc *testingSubmgrControl) CounterValuesToBeVeriefied(t *testing.T, countersToBeAdded CountersToBeAdded) {
304 if len(toBeAddedCountersMap) == 0 {
305 toBeAddedCountersMap = make(map[string]Counter)
307 for _, counter := range countersToBeAdded {
308 toBeAddedCountersMap[counter.Name] = counter
310 mc.GetCounterValuesBefore(t)
313 func (mc *testingSubmgrControl) GetCounterValuesBefore(t *testing.T) {
314 countersBeforeMap = make(map[string]Counter)
315 countersBeforeMap = mc.GetCurrentCounterValues(t, toBeAddedCountersMap)
318 func (mc *testingSubmgrControl) VerifyCounterValues(t *testing.T) {
320 // Check that expected counters are added ok
321 currentCountersMap := mc.GetCurrentCounterValues(t, toBeAddedCountersMap)
322 for _, toBeAddedCounter := range toBeAddedCountersMap {
323 if currentCounter, ok := currentCountersMap[toBeAddedCounter.Name]; ok == true {
324 if beforeCounter, ok := countersBeforeMap[toBeAddedCounter.Name]; ok == true {
325 if currentCounter.Value != beforeCounter.Value+toBeAddedCounter.Value {
326 mc.TestError(t, "Error in expected counter value: counterName %v, current value %v, expected value %v",
327 currentCounter.Name, currentCounter.Value, beforeCounter.Value+toBeAddedCounter.Value)
329 //fmt.Printf("beforeCounter.Value=%v, toBeAddedCounter.Value=%v, \n",beforeCounter.Value, toBeAddedCounter.Value)
332 mc.TestError(t, "Counter %v not in countersBeforeMap", toBeAddedCounter.Name)
335 mc.TestError(t, "Counter %v not in currentCountersMap", toBeAddedCounter.Name)
339 // Check that not any unexpected counter are added
340 for _, currentCounter := range currentCountersMap {
341 if _, ok := toBeAddedCountersMap[currentCounter.Name]; ok == false {
342 if beforeCounter, ok := countersBeforeMap[currentCounter.Name]; ok == true {
343 if currentCounter.Value != beforeCounter.Value {
344 mc.TestError(t, "Error: unexpected counter value added: counterName %v, current value %v, expected value %v",
345 currentCounter.Name, beforeCounter.Value, beforeCounter.Value)
347 //fmt.Printf("beforeCounter.Value=%v, toBeAddedCounter.Value=%v, \n",beforeCounter.Value, toBeAddedCounter.Value)
350 mc.TestError(t, "Counter %v not in countersBeforeMap", beforeCounter.Name)
356 //fmt.Printf("toBeAddedCountersMap=%v\n",toBeAddedCountersMap)
357 toBeAddedCountersMap = make(map[string]Counter)
360 func (mc *testingSubmgrControl) GetCurrentCounterValues(t *testing.T, chekedCountersMap map[string]Counter) map[string]Counter {
361 countersString, err := mc.GetMetrics(t)
363 mc.TestError(t, "Error GetMetrics() failed %v", err)
367 retCounterMap := make(map[string]Counter)
368 stringsTable := strings.Split(countersString, "\n")
369 for _, counter := range chekedCountersMap {
370 for _, counterString := range stringsTable {
371 if !strings.Contains(counterString, "#") && strings.Contains(counterString, counter.Name) {
372 counterString := strings.Split(counterString, " ")
373 if strings.Contains(counterString[0], counter.Name) {
374 val, err := strconv.ParseUint(counterString[1], 10, 64)
376 mc.TestError(t, "Error: strconv.ParseUint failed %v", err)
379 //fmt.Printf("counter=%v\n", counter)
380 retCounterMap[counter.Name] = counter
386 if len(retCounterMap) != len(chekedCountersMap) {
387 mc.TestError(t, "Error: len(retCounterMap) != len(chekedCountersMap)")
393 func (mc *testingSubmgrControl) sendGetRequest(t *testing.T, addr string, path string) {
395 mc.TestLog(t, "GET http://"+addr+"%v", path)
396 req, err := http.NewRequest("GET", "http://"+addr+path, nil)
398 mc.TestError(t, "Error reading request. %v", err)
401 req.Header.Set("Cache-Control", "no-cache")
402 client := &http.Client{Timeout: time.Second * 2}
403 resp, err := client.Do(req)
405 mc.TestError(t, "Error reading response. %v", err)
408 defer resp.Body.Close()
410 mc.TestLog(t, "Response status: %v", resp.Status)
411 mc.TestLog(t, "Response Headers: %v", resp.Header)
412 if !strings.Contains(resp.Status, "200 OK") {
413 mc.TestError(t, "Wrong response status")
417 respBody, err := ioutil.ReadAll(resp.Body)
419 mc.TestError(t, "Error reading body. %v", err)
422 mc.TestLog(t, "%s", respBody)
426 func (mc *testingSubmgrControl) sendPostRequest(t *testing.T, addr string, path string) {
428 mc.TestLog(t, "POST http://"+addr+"%v", path)
429 req, err := http.NewRequest("POST", "http://"+addr+path, nil)
431 mc.TestError(t, "Error reading request. %v", err)
434 client := &http.Client{Timeout: time.Second * 2}
435 resp, err := client.Do(req)
437 mc.TestError(t, "Error reading response. %v", err)
440 defer resp.Body.Close()
442 mc.TestLog(t, "Response status: %v", resp.Status)
443 mc.TestLog(t, "Response Headers: %v", resp.Header)
444 if !strings.Contains(resp.Status, "200 OK") {
445 mc.TestError(t, "Wrong response status")
449 respBody, err := ioutil.ReadAll(resp.Body)
451 mc.TestError(t, "Error reading body. %v", err)
454 mc.TestLog(t, "%s", respBody)