0f207e833cb0c05e65b1cd81635fa3fcb2471ffa
[ric-plt/submgr.git] / pkg / teststub / controlRmrStub.go
1 /*
2 ==================================================================================
3   Copyright (c) 2019 AT&T Intellectual Property.
4   Copyright (c) 2019 Nokia
5
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
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
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 ==================================================================================
18 */
19 package teststub
20
21 import (
22         "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/xapptweaks"
23         "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
24         "strconv"
25         "strings"
26         "testing"
27         "time"
28 )
29
30 //-----------------------------------------------------------------------------
31 //
32 //-----------------------------------------------------------------------------
33 type RmrStubControl struct {
34         RmrControl
35         xapptweaks.RmrWrapper
36         RecvChan chan *xapptweaks.RMRParams
37         Active   bool
38         InitMsg  int
39         CheckXid bool
40 }
41
42 func (tc *RmrStubControl) SetActive() {
43         tc.Active = true
44 }
45
46 func (tc *RmrStubControl) IsActive() bool {
47         return tc.Active
48 }
49
50 func (tc *RmrStubControl) SetCheckXid(val bool) {
51         tc.CheckXid = val
52 }
53
54 func (tc *RmrStubControl) IsCheckXid() bool {
55         return tc.CheckXid
56 }
57
58 func (tc *RmrStubControl) IsChanEmpty() bool {
59         if len(tc.RecvChan) > 0 {
60                 return false
61         }
62         return true
63 }
64
65 func (tc *RmrStubControl) TestMsgChanEmpty(t *testing.T) {
66         if tc.IsChanEmpty() == false {
67                 tc.TestError(t, "message channel not empty")
68         }
69 }
70
71 func (tc *RmrStubControl) Init(desc string, srcId RmrSrcId, rtgSvc RmrRtgSvc, stat string, initMsg int) {
72         tc.InitMsg = initMsg
73         tc.Active = false
74         tc.RecvChan = make(chan *xapptweaks.RMRParams)
75         tc.RmrControl.Init(desc, srcId, rtgSvc)
76         tc.RmrWrapper.Init()
77
78         tc.Rmr = xapp.NewRMRClientWithParams("tcp:"+strconv.FormatUint(uint64(srcId.Port), 10), 65534, 1, 0, stat)
79         tc.Rmr.SetReadyCB(tc.ReadyCB, nil)
80         go tc.Rmr.Start(tc)
81
82         tc.WaitCB()
83         allRmrStubs = append(allRmrStubs, tc)
84 }
85
86 func (tc *RmrStubControl) Consume(params *xapp.RMRParams) (err error) {
87         defer tc.Rmr.Free(params.Mbuf)
88         msg := xapptweaks.NewParams(params)
89         tc.CntRecvMsg++
90
91         if msg.Mtype == tc.InitMsg {
92                 tc.Logger.Info("Testing message ignore %s", msg.String())
93                 tc.SetActive()
94                 return
95         }
96
97         if tc.IsCheckXid() == true && strings.Contains(msg.Xid, tc.GetDesc()) == false {
98                 tc.Logger.Info("Ignore %s", msg.String())
99                 return
100         }
101
102         tc.Logger.Info("Consume %s", msg.String())
103         tc.PushMsg(msg)
104         return
105 }
106
107 func (tc *RmrStubControl) PushMsg(msg *xapptweaks.RMRParams) {
108         tc.Logger.Debug("RmrStubControl PushMsg ... msg(%d) waiting", msg.Mtype)
109         tc.RecvChan <- msg
110         tc.Logger.Debug("RmrStubControl PushMsg ... done")
111 }
112
113 func (tc *RmrStubControl) WaitMsg(secs time.Duration) *xapptweaks.RMRParams {
114         tc.Logger.Debug("RmrStubControl WaitMsg ... waiting")
115         if secs == 0 {
116                 msg := <-tc.RecvChan
117                 tc.Logger.Debug("RmrStubControl WaitMsg ... msg(%d) done", msg.Mtype)
118                 return msg
119         }
120         select {
121         case msg := <-tc.RecvChan:
122                 tc.Logger.Debug("RmrStubControl WaitMsg ... msg(%d) done", msg.Mtype)
123                 return msg
124         case <-time.After(secs * time.Second):
125                 tc.Logger.Debug("RmrStubControl WaitMsg ... timeout")
126                 return nil
127         }
128         tc.Logger.Debug("RmrStubControl WaitMsg ... error")
129         return nil
130 }
131
132 var allRmrStubs []*RmrStubControl
133
134 //-----------------------------------------------------------------------------
135 //
136 //-----------------------------------------------------------------------------
137
138 func RmrStubControlWaitAlive(seconds int, mtype int, rmr xapptweaks.XAppWrapperIf) bool {
139
140         var dummyBuf []byte = make([]byte, 100)
141
142         params := xapptweaks.NewParams(nil)
143         params.Mtype = mtype
144         params.SubId = -1
145         params.Payload = dummyBuf
146         params.PayloadLen = 100
147         params.Meid = &xapp.RMRMeid{RanName: "TESTPING"}
148         params.Xid = "TESTPING"
149         params.Mbuf = nil
150
151         if len(allRmrStubs) == 0 {
152                 rmr.GetLogger().Info("No rmr stubs so no need to wait those to be alive")
153                 return true
154         }
155         status := false
156         i := 1
157         for ; i <= seconds*2 && status == false; i++ {
158
159                 rmr.GetLogger().Info("SEND TESTPING: %s", params.String())
160                 rmr.RmrSend(params, 0)
161
162                 status = true
163                 for _, val := range allRmrStubs {
164                         if val.IsActive() == false {
165                                 status = false
166                                 break
167                         }
168                 }
169                 if status == true {
170                         break
171                 }
172                 rmr.GetLogger().Info("Sleep 0.5 secs and try routes again")
173                 time.Sleep(500 * time.Millisecond)
174         }
175
176         if status == false {
177                 rmr.GetLogger().Error("Could not initialize routes")
178         }
179         return status
180 }