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 xapp.Logger.Debug("Replacing real db with test db")
59 mainCtrl.c.db = CreateMock() // This overrides real database for testing
60 xapp.SetReadyCB(mainCtrl.ReadyCB, nil)
61 go xapp.RunWithParams(mainCtrl.c, false)
63 mainCtrl.c.ReadyCB(nil)
67 func (mc *testingSubmgrControl) SimulateRestart(t *testing.T) {
68 mc.TestLog(t, "Simulating submgr restart")
69 mainCtrl.c.registry.subIds = nil
70 // Initialize subIds slice and subscription map
71 mainCtrl.c.registry.Initialize()
72 // Read subIds and subscriptions from database
73 subIds, register, err := mainCtrl.c.ReadAllSubscriptionsFromSdl()
75 mc.TestError(t, "%v", err)
77 mainCtrl.c.registry.register = nil
78 mainCtrl.c.registry.subIds = subIds
79 mainCtrl.c.registry.register = register
81 mc.TestLog(t, "register:")
82 for subId, subs := range register {
83 mc.TestLog(t, " subId=%v", subId)
84 mc.TestLog(t, " subs.SubRespRcvd=%v", subs.SubRespRcvd)
85 mc.TestLog(t, " subs=%v\n", subs)
88 mc.TestLog(t, "mainCtrl.c.registry.register:")
89 for subId, subs := range mainCtrl.c.registry.register {
90 mc.TestLog(t, " subId=%v", subId)
91 mc.TestLog(t, " subs.SubRespRcvd=%v", subs.SubRespRcvd)
92 mc.TestLog(t, " subs=%v\n", subs)
95 go mainCtrl.c.HandleUncompletedSubscriptions(mainCtrl.c.registry.register)
98 func (mc *testingSubmgrControl) SetResetTestFlag(t *testing.T, status bool) {
99 mc.TestLog(t, "ResetTestFlag set to %v=", status)
100 mainCtrl.c.ResetTestFlag = status
103 func (mc *testingSubmgrControl) removeExistingSubscriptions(t *testing.T) {
105 mc.TestLog(t, "Removing existing subscriptions")
106 mainCtrl.c.RemoveAllSubscriptionsFromSdl()
107 mainCtrl.c.registry.subIds = nil
108 // Initialize subIds slice and subscription map
109 mainCtrl.c.registry.Initialize()
112 func PringSubscriptionQueryResult(resp models.SubscriptionList) {
113 for _, item := range resp {
114 fmt.Printf("item.SubscriptionID=%v\n", item.SubscriptionID)
115 fmt.Printf("item.Meid=%v\n", item.Meid)
116 fmt.Printf("item.ClientEndpoint=%v\n", item.ClientEndpoint)
120 func (mc *testingSubmgrControl) wait_registry_empty(t *testing.T, secs int) bool {
123 for ; i <= secs*2; i++ {
124 cnt = len(mc.c.registry.register)
128 time.Sleep(500 * time.Millisecond)
130 mc.TestError(t, "(submgr) no registry empty within %d secs: %d", secs, cnt)
134 func (mc *testingSubmgrControl) get_registry_next_subid(t *testing.T) uint32 {
135 mc.c.registry.mutex.Lock()
136 defer mc.c.registry.mutex.Unlock()
137 return mc.c.registry.subIds[0]
140 func (mc *testingSubmgrControl) wait_registry_next_subid_change(t *testing.T, origSubId uint32, secs int) (uint32, bool) {
142 for ; i <= secs*2; i++ {
143 mc.c.registry.mutex.Lock()
144 currSubId := mc.c.registry.subIds[0]
145 mc.c.registry.mutex.Unlock()
146 if currSubId != origSubId {
147 return currSubId, true
149 time.Sleep(500 * time.Millisecond)
151 mc.TestError(t, "(submgr) no subId change within %d secs", secs)
155 func (mc *testingSubmgrControl) wait_subs_clean(t *testing.T, e2SubsId uint32, secs int) bool {
156 var subs *Subscription
158 for ; i <= secs*2; i++ {
159 subs = mc.c.registry.GetSubscription(e2SubsId)
163 time.Sleep(500 * time.Millisecond)
166 mc.TestError(t, "(submgr) no clean within %d secs: %s", secs, subs.String())
168 mc.TestError(t, "(submgr) no clean within %d secs: subs(N/A)", secs)
173 func (mc *testingSubmgrControl) wait_subs_trans_clean(t *testing.T, e2SubsId uint32, secs int) bool {
174 var trans TransactionIf
176 for ; i <= secs*2; i++ {
177 subs := mc.c.registry.GetSubscription(e2SubsId)
181 trans = subs.GetTransaction()
185 time.Sleep(500 * time.Millisecond)
188 mc.TestError(t, "(submgr) no clean within %d secs: %s", secs, trans.String())
190 mc.TestError(t, "(submgr) no clean within %d secs: trans(N/A)", secs)
195 func (mc *testingSubmgrControl) get_subs_entrypoint_cnt(t *testing.T, origSubId uint32) int {
196 subs := mc.c.registry.GetSubscription(origSubId)
198 mc.TestError(t, "(submgr) no subs %d exists during entrypoint cnt get", origSubId)
201 return subs.EpList.Size()
204 func (mc *testingSubmgrControl) wait_subs_entrypoint_cnt_change(t *testing.T, origSubId uint32, orig int, secs int) (int, bool) {
206 subs := mc.c.registry.GetSubscription(origSubId)
208 mc.TestError(t, "(submgr) no subs %d exists during entrypoint cnt wait", origSubId)
213 for ; i <= secs*2; i++ {
214 curr := subs.EpList.Size()
218 time.Sleep(500 * time.Millisecond)
220 mc.TestError(t, "(submgr) no subs %d entrypoint cnt change within %d secs", origSubId, secs)
225 // Counter check for received message. Note might not be yet handled
227 func (mc *testingSubmgrControl) get_msgcounter(t *testing.T) uint64 {
228 return mc.c.CntRecvMsg
231 func (mc *testingSubmgrControl) wait_msgcounter_change(t *testing.T, orig uint64, secs int) (uint64, bool) {
233 for ; i <= secs*2; i++ {
234 curr := mc.c.CntRecvMsg
238 time.Sleep(500 * time.Millisecond)
240 mc.TestError(t, "(submgr) no msg counter change within %d secs", secs)
244 func (mc *testingSubmgrControl) GetMetrics(t *testing.T) (string, error) {
245 req, err := http.NewRequest("GET", "http://localhost:8080/ric/v1/metrics", nil)
247 return "", fmt.Errorf("Error reading request. %v", err)
249 client := &http.Client{Timeout: time.Second * 10}
250 resp, err := client.Do(req)
252 return "", fmt.Errorf("Error reading response. %v", err)
254 defer resp.Body.Close()
256 respBody, err := ioutil.ReadAll(resp.Body)
258 return "", fmt.Errorf("Error reading body. %v", err)
260 return string(respBody[:]), nil
263 func (mc *testingSubmgrControl) CounterValuesToBeVeriefied(t *testing.T, countersToBeAdded CountersToBeAdded) {
265 if len(toBeAddedCountersMap) == 0 {
266 toBeAddedCountersMap = make(map[string]Counter)
268 for _, counter := range countersToBeAdded {
269 toBeAddedCountersMap[counter.Name] = counter
271 mc.GetCounterValuesBefore(t)
274 func (mc *testingSubmgrControl) GetCounterValuesBefore(t *testing.T) {
275 countersBeforeMap = make(map[string]Counter)
276 countersBeforeMap = mc.GetCurrentCounterValues(t, toBeAddedCountersMap)
279 func (mc *testingSubmgrControl) VerifyCounterValues(t *testing.T) {
280 currentCountersMap := mc.GetCurrentCounterValues(t, toBeAddedCountersMap)
281 for _, toBeAddedCounter := range toBeAddedCountersMap {
282 if currentCounter, ok := currentCountersMap[toBeAddedCounter.Name]; ok == true {
283 if beforeCounter, ok := countersBeforeMap[toBeAddedCounter.Name]; ok == true {
284 if currentCounter.Value != beforeCounter.Value+toBeAddedCounter.Value {
285 mc.TestError(t, "Error in expected counter value: counterName %v, current value %v, expected value %v",
286 currentCounter.Name, currentCounter.Value, beforeCounter.Value+toBeAddedCounter.Value)
288 //fmt.Printf("beforeCounter.Value=%v, toBeAddedCounter.Value=%v, \n",beforeCounter.Value, toBeAddedCounter.Value)
291 mc.TestError(t, "Counter %v not in countersBeforeMap", toBeAddedCounter.Name)
294 mc.TestError(t, "Counter %v not in currentCountersMap", toBeAddedCounter.Name)
299 //fmt.Printf("toBeAddedCountersMap=%v\n",toBeAddedCountersMap)
300 toBeAddedCountersMap = make(map[string]Counter)
303 func (mc *testingSubmgrControl) GetCurrentCounterValues(t *testing.T, chekedCountersMap map[string]Counter) map[string]Counter {
304 countersString, err := mc.GetMetrics(t)
306 mc.TestError(t, "Error GetMetrics() failed %v", err)
310 retCounterMap := make(map[string]Counter)
311 stringsTable := strings.Split(countersString, "\n")
312 for _, counter := range chekedCountersMap {
313 for _, counterString := range stringsTable {
314 if !strings.Contains(counterString, "#") && strings.Contains(counterString, counter.Name) {
315 counterString := strings.Split(counterString, " ")
316 if strings.Contains(counterString[0], counter.Name) {
317 val, err := strconv.ParseUint(counterString[1], 10, 64)
319 mc.TestError(t, "Error: strconv.ParseUint failed %v", err)
322 //fmt.Printf("counter=%v\n", counter)
323 retCounterMap[counter.Name] = counter
329 if len(retCounterMap) != len(chekedCountersMap) {
330 mc.TestError(t, "Error: len(retCounterMap) != len(chekedCountersMap)")