5072cf4fbc96d8af3d8b00849a2898277b3bf28f
[ric-plt/submgr.git] / pkg / control / ut_test.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
20 package control
21
22 import (
23         "os"
24         "testing"
25         "time"
26
27         "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/teststub"
28         "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/teststubdummy"
29         "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/teststube2ap"
30         "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
31 )
32
33 //-----------------------------------------------------------------------------
34 //
35 //-----------------------------------------------------------------------------
36 func CaseBegin(desc string) *teststub.TestWrapper {
37         tent := teststub.NewTestWrapper(desc)
38         tent.Info(desc)
39         return tent
40 }
41
42 //-----------------------------------------------------------------------------
43 //
44 //-----------------------------------------------------------------------------
45 const teststubPortSeed int = 55555
46
47 //-----------------------------------------------------------------------------
48 //
49 //-----------------------------------------------------------------------------
50
51 var xappConn1 *teststube2ap.E2Stub
52 var xappConn2 *teststube2ap.E2Stub
53 var e2termConn1 *teststube2ap.E2Stub
54 var e2termConn2 *teststube2ap.E2Stub
55 var rtmgrHttp *testingHttpRtmgrStub
56 var mainCtrl *testingSubmgrControl
57
58 var dummystub *teststubdummy.RmrDummyStub
59
60 func ut_test_init() func() {
61         tent := CaseBegin("ut_test_init")
62
63         //---------------------------------
64         //
65         //---------------------------------
66         rtmgrHttp = createNewHttpRtmgrStub("RTMGRSTUB", "8989")
67         go rtmgrHttp.run()
68
69         //---------------------------------
70         //
71         //---------------------------------
72
73         //
74         //Cfg creation won't work like this as xapp-frame reads it during init.
75         //
76         /*
77             cfgstr:=`{
78               "local": {
79                   "host": ":8080"
80               },
81               "logger": {
82                   "level": 4
83               },
84               "rmr": {
85                  "protPort": "tcp:14560",
86                  "maxSize": 4096,
87                  "numWorkers": 1,
88                  "txMessages": ["RIC_SUB_REQ", "RIC_SUB_DEL_REQ"],
89                  "rxMessages": ["RIC_SUB_RESP", "RIC_SUB_FAILURE", "RIC_SUB_DEL_RESP", "RIC_SUB_DEL_FAILURE", "RIC_INDICATION"]
90               },
91               "db": {
92                   "host": "localhost",
93                   "port": 6379,
94                   "namespaces": ["sdl", "rnib"]
95               },
96                  "rtmgr" : {
97                    "HostAddr" : "localhost",
98                    "port" : "8989",
99                    "baseUrl" : "/"
100                  }
101            `
102
103            cfgfilename,_ := testCreateTmpFile(cfgstr)
104            defer os.Remove(cfgfilename)
105            os.Setenv("CFG_FILE", cfgfilename)
106         */
107         tent.Info("Using cfg file %s", os.Getenv("CFG_FILE"))
108
109         //---------------------------------
110         // Static routetable for rmr
111         //
112         // NOTE: Routing table is configured so, that responses
113         //       are duplicated to xapp1 and xapp2 instances.
114         //       If XID is not matching xapp stub will just
115         //       drop message. (Messages 12011, 12012, 12021, 12022)
116         //
117         // NOTE2: teststubPortSeed message type is for stub rmr connectivity probing
118         //
119         // NOTE3: Ports per entity:
120         //
121         // Entity
122         // -------------------
123
124         mainsrc := teststub.RmrSrcId{xapp.RmrEndpoint{"localhost", 14560}}
125         xapp1src := teststub.RmrSrcId{xapp.RmrEndpoint{"localhost", 13560}}
126         xapp2src := teststub.RmrSrcId{xapp.RmrEndpoint{"localhost", 13660}}
127         e2term1src := teststub.RmrSrcId{xapp.RmrEndpoint{"localhost", 15560}}
128         e2term2src := teststub.RmrSrcId{xapp.RmrEndpoint{"localhost", 15660}}
129         dummysrc := teststub.RmrSrcId{xapp.RmrEndpoint{"localhost", 16560}}
130
131         //---------------------------------
132         rt := &teststub.RmrRouteTable{}
133         rt.AddRoute(12010, "", -1, mainsrc.String())
134         rt.AddRoute(12010, mainsrc.String(), -1, "%meid")
135         rt.AddRoute(12011, e2term1src.String(), -1, mainsrc.String())
136         rt.AddRoute(12012, e2term1src.String(), -1, mainsrc.String())
137         rt.AddRoute(12011, e2term2src.String(), -1, mainsrc.String())
138         rt.AddRoute(12012, e2term2src.String(), -1, mainsrc.String())
139         rt.AddRoute(12011, mainsrc.String(), -1, xapp2src.String()+";"+xapp1src.String())
140         rt.AddRoute(12012, mainsrc.String(), -1, xapp2src.String()+";"+xapp1src.String())
141         rt.AddRoute(12020, "", -1, mainsrc.String())
142         rt.AddRoute(12020, mainsrc.String(), -1, "%meid")
143         rt.AddRoute(12021, e2term1src.String(), -1, mainsrc.String())
144         rt.AddRoute(12022, e2term1src.String(), -1, mainsrc.String())
145         rt.AddRoute(12021, e2term2src.String(), -1, mainsrc.String())
146         rt.AddRoute(12022, e2term2src.String(), -1, mainsrc.String())
147         rt.AddRoute(12021, mainsrc.String(), -1, xapp2src.String()+";"+xapp1src.String())
148         rt.AddRoute(12022, mainsrc.String(), -1, xapp2src.String()+";"+xapp1src.String())
149         rt.AddRoute(teststubPortSeed, "", -1, xapp2src.String()+";"+xapp1src.String()+";"+e2term1src.String()+";"+e2term2src.String()+";"+dummysrc.String())
150
151         rt.AddMeid(e2term1src.String(), []string{"RAN_NAME_1", "RAN_NAME_2"})
152         rt.AddMeid(e2term2src.String(), []string{"RAN_NAME_11", "RAN_NAME_12"})
153
154         rt.Enable()
155         tent.Info("rttable[%s]", rt.Table())
156
157         //---------------------------------
158         //
159         //---------------------------------
160         tent.Info("### submgr ctrl run ###")
161         mainCtrl = createSubmgrControl(mainsrc, teststub.RmrRtgSvc{})
162
163         //
164         // Tweak to get around with fact that alarm package alternates RMR_SEED_RT environment variable
165         //
166         //xapp-frame inits alarms when readycb is coming from xapps rmr
167         //alarm will make new rmr instance and overrides RMR_SEED_RT and RMR_RTG_SVC
168         //env variables. Re-create rt info.
169         for i := 0; i < int(10)*2; i++ {
170                 if os.Getenv("RMR_SEED_RT") == rt.FileName() {
171                         tent.Info("Waiting that alarm alternates RMR_SEED_RT=%s", os.Getenv("RMR_SEED_RT"))
172                         time.Sleep(500 * time.Millisecond)
173                 } else {
174                         tent.Info("Alarm has alternated RMR_SEED_RT=%s, so waiting 0.5 secs before restoring it", os.Getenv("RMR_SEED_RT"))
175                         time.Sleep(500 * time.Millisecond)
176                         rt.Enable()
177                         tent.Info("rttable[%s]", rt.Table())
178                         break
179                 }
180         }
181
182         if os.Getenv("RMR_SEED_RT") != rt.FileName() {
183                 tent.Error("Unittest timing issue with alarm RMR_SEED_RT=%s", os.Getenv("RMR_SEED_RT"))
184                 os.Exit(1)
185         }
186
187         //---------------------------------
188         //
189         //---------------------------------
190         tent.Info("### xapp1 stub run ###")
191         xappConn1 = teststube2ap.CreateNewE2Stub("xappstub1", xapp1src, teststub.RmrRtgSvc{}, "RMRXAPP1STUB", teststubPortSeed, "RAN_NAME_1", "localhost", 13560, 8080)
192
193         //---------------------------------
194         //
195         //---------------------------------
196         tent.Info("### xapp2 stub run ###")
197         xappConn2 = teststube2ap.CreateNewE2Stub("xappstub2", xapp2src, teststub.RmrRtgSvc{}, "RMRXAPP2STUB", teststubPortSeed, "RAN_NAME_2", "localhost", 13660, 8080)
198
199         //---------------------------------
200         //
201         //---------------------------------
202         tent.Info("### e2term1 stub run ###")
203         e2termConn1 = teststube2ap.CreateNewE2termStub("e2termstub1", e2term1src, teststub.RmrRtgSvc{}, "RMRE2TERMSTUB1", teststubPortSeed)
204
205         //---------------------------------
206         //
207         //---------------------------------
208         tent.Info("### e2term2 stub run ###")
209         e2termConn2 = teststube2ap.CreateNewE2termStub("e2termstub2", e2term2src, teststub.RmrRtgSvc{}, "RMRE2TERMSTUB2", teststubPortSeed)
210
211         //---------------------------------
212         // Just to test dummy stub
213         //---------------------------------
214         tent.Info("### dummy stub run ###")
215         dummystub = teststubdummy.CreateNewRmrDummyStub("dummystub", dummysrc, teststub.RmrRtgSvc{}, "DUMMYSTUB", teststubPortSeed)
216
217         //---------------------------------
218         // Testing message sending
219         //---------------------------------
220         if teststub.RmrStubControlWaitAlive(10, teststubPortSeed, mainCtrl.c.RMRClient, tent) == false {
221                 os.Exit(1)
222         }
223
224         if os.Getenv("RMR_SEED_RT") != rt.FileName() {
225                 tent.Error("Unittest timing issue with alarm RMR_SEED_RT=%s", os.Getenv("RMR_SEED_RT"))
226                 os.Exit(1)
227         }
228
229         return func() { rt.Disable() }
230 }
231
232 //-----------------------------------------------------------------------------
233 //
234 //-----------------------------------------------------------------------------
235 func TestMain(m *testing.M) {
236         CaseBegin("TestMain start")
237         cleanfn := ut_test_init()
238         code := m.Run()
239         cleanfn()
240         os.Exit(code)
241 }