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 ==================================================================================
26 "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/rtmgr_models"
27 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
37 //-----------------------------------------------------------------------------
39 //-----------------------------------------------------------------------------
40 type testingControl struct {
42 syncChan chan struct{}
45 func (tc *testingControl) ReadyCB(data interface{}) {
46 xapp.Logger.Info("testingControl(%s) ReadyCB", tc.desc)
47 tc.syncChan <- struct{}{}
51 func (tc *testingControl) WaitCB() {
55 func initTestingControl(desc string, rtfile string, port string) testingControl {
56 tc := testingControl{}
57 os.Setenv("RMR_SEED_RT", rtfile)
58 os.Setenv("RMR_SRC_ID", "localhost:"+port)
59 xapp.Logger.Info("Using rt file %s", os.Getenv("RMR_SEED_RT"))
60 xapp.Logger.Info("Using src id %s", os.Getenv("RMR_SRC_ID"))
61 tc.desc = strings.ToUpper(desc)
62 tc.syncChan = make(chan struct{})
66 //-----------------------------------------------------------------------------
68 //-----------------------------------------------------------------------------
69 type testingRmrControl struct {
71 rmrClientTest *xapp.RMRClient
74 func (tc *testingRmrControl) RmrSend(params *xapp.RMRParams) (err error) {
76 //NOTE: Do this way until xapp-frame sending is improved
80 for ; i <= 10 && status == false; i++ {
81 status = tc.rmrClientTest.SendMsg(params)
83 xapp.Logger.Info("rmr.Send() failed. Retry count %v, Mtype: %v, SubId: %v, Xid %s", i, params.Mtype, params.SubId, params.Xid)
84 time.Sleep(500 * time.Millisecond)
88 err = errors.New("rmr.Send() failed")
89 tc.rmrClientTest.Free(params.Mbuf)
94 func initTestingRmrControl(desc string, rtfile string, port string, stat string, consumer xapp.MessageConsumer) testingRmrControl {
95 tc := testingRmrControl{}
96 tc.testingControl = initTestingControl(desc, rtfile, port)
97 tc.rmrClientTest = xapp.NewRMRClientWithParams("tcp:"+port, 4096, 1, stat)
98 tc.rmrClientTest.SetReadyCB(tc.ReadyCB, nil)
99 go tc.rmrClientTest.Start(consumer)
104 //-----------------------------------------------------------------------------
106 //-----------------------------------------------------------------------------
107 type testingMessageChannel struct {
108 rmrConChan chan *xapp.RMRParams
111 func initTestingMessageChannel() testingMessageChannel {
112 mc := testingMessageChannel{}
113 mc.rmrConChan = make(chan *xapp.RMRParams)
117 //-----------------------------------------------------------------------------
119 //-----------------------------------------------------------------------------
121 type testingXappControl struct {
123 testingMessageChannel
129 func (tc *testingXappControl) newXid() string {
130 tc.xid = tc.desc + "_XID_" + strconv.FormatUint(uint64(tc.xid_seq), 10)
135 func (tc *testingXappControl) Consume(msg *xapp.RMRParams) (err error) {
137 //if msg.Xid == tc.xid {
138 if strings.Contains(msg.Xid, tc.desc) {
139 xapp.Logger.Info("(%s) Consume mtype=%s subid=%d xid=%s", tc.desc, xapp.RicMessageTypeToName[msg.Mtype], msg.SubId, msg.Xid)
142 xapp.Logger.Info("(%s) Ignore mtype=%s subid=%d xid=%s, Expected xid to contain %s", tc.desc, xapp.RicMessageTypeToName[msg.Mtype], msg.SubId, msg.Xid, tc.desc)
147 func createNewXappControl(desc string, rtfile string, port string, stat string, ranname string) *testingXappControl {
148 xappCtrl := &testingXappControl{}
149 xappCtrl.testingRmrControl = initTestingRmrControl(desc, rtfile, port, stat, xappCtrl)
150 xappCtrl.testingMessageChannel = initTestingMessageChannel()
151 xappCtrl.meid = &xapp.RMRMeid{RanName: ranname}
157 //-----------------------------------------------------------------------------
159 //-----------------------------------------------------------------------------
160 type testingE2termControl struct {
162 testingMessageChannel
165 func (tc *testingE2termControl) Consume(msg *xapp.RMRParams) (err error) {
166 xapp.Logger.Info("(%s) Consume mtype=%s subid=%d xid=%s", tc.desc, xapp.RicMessageTypeToName[msg.Mtype], msg.SubId, msg.Xid)
171 func createNewE2termControl(desc string, rtfile string, port string, stat string) *testingE2termControl {
172 e2termCtrl := &testingE2termControl{}
173 e2termCtrl.testingRmrControl = initTestingRmrControl(desc, rtfile, port, stat, e2termCtrl)
174 e2termCtrl.testingMessageChannel = initTestingMessageChannel()
178 //-----------------------------------------------------------------------------
180 //-----------------------------------------------------------------------------
181 type testingMainControl struct {
186 func createNewMainControl(desc string, rtfile string, port string) *testingMainControl {
187 mainCtrl = &testingMainControl{}
188 mainCtrl.testingControl = initTestingControl(desc, rtfile, port)
189 mainCtrl.c = NewControl()
190 xapp.SetReadyCB(mainCtrl.ReadyCB, nil)
191 go xapp.RunWithParams(mainCtrl.c, false)
196 //-----------------------------------------------------------------------------
198 //-----------------------------------------------------------------------------
200 func testError(t *testing.T, pattern string, args ...interface{}) {
201 xapp.Logger.Error(fmt.Sprintf(pattern, args...))
202 t.Errorf(fmt.Sprintf(pattern, args...))
205 func testLog(t *testing.T, pattern string, args ...interface{}) {
206 xapp.Logger.Info(fmt.Sprintf(pattern, args...))
207 t.Logf(fmt.Sprintf(pattern, args...))
210 func testCreateTmpFile(str string) (string, error) {
211 file, err := ioutil.TempFile("/tmp", "*.rt")
215 _, err = file.WriteString(str)
220 return file.Name(), nil
223 //-----------------------------------------------------------------------------
225 //-----------------------------------------------------------------------------
227 var xappConn1 *testingXappControl
228 var xappConn2 *testingXappControl
229 var e2termConn *testingE2termControl
230 var mainCtrl *testingMainControl
232 func TestMain(m *testing.M) {
233 xapp.Logger.Info("TestMain start")
236 //Cfg creation won't work like this as xapp-frame reads it during init.
247 "protPort": "tcp:14560",
250 "txMessages": ["RIC_SUB_REQ", "RIC_SUB_DEL_REQ"],
251 "rxMessages": ["RIC_SUB_RESP", "RIC_SUB_FAILURE", "RIC_SUB_DEL_RESP", "RIC_SUB_DEL_FAILURE", "RIC_INDICATION"]
256 "namespaces": ["sdl", "rnib"]
259 "HostAddr" : "localhost",
265 cfgfilename,_ := testCreateTmpFile(cfgstr)
266 defer os.Remove(cfgfilename)
267 os.Setenv("CFG_FILE", cfgfilename)
269 xapp.Logger.Info("Using cfg file %s", os.Getenv("CFG_FILE"))
271 //---------------------------------
272 // NOTE: Routing table is configured so, that responses
273 // are duplicated to xapp1 and xapp2 instances.
274 // If XID is not matching xapp stub will just
275 // drop message. (Messages 12011, 12012, 12021, 12022)
276 //---------------------------------
277 xapp.Logger.Info("### submgr main run ###")
279 subsrt := `newrt|start
280 mse|12010|-1|localhost:14560
281 mse|12010,localhost:14560|-1|localhost:15560
282 mse|12011,localhost:15560|-1|localhost:14560
283 mse|12011|-1|localhost:13560;localhost:13660
284 mse|12012,localhost:15560|-1|localhost:14560
285 mse|12012|-1|localhost:13560;localhost:13660
286 mse|12020|-1|localhost:14560
287 mse|12020,localhost:14560|-1|localhost:15560
288 mse|12021,localhost:15560|-1|localhost:14560
289 mse|12021|-1|localhost:13560;localhost:13660
290 mse|12022,localhost:15560|-1|localhost:14560
291 mse|12022|-1|localhost:13560;localhost:13660
294 subrtfilename, _ := testCreateTmpFile(subsrt)
295 defer os.Remove(subrtfilename)
296 mainCtrl = createNewMainControl("main", subrtfilename, "14560")
298 //---------------------------------
300 //---------------------------------
301 xapp.Logger.Info("### xapp1 rmr run ###")
303 xapprt1 := `newrt|start
304 mse|12010|-1|localhost:14560
305 mse|12011|-1|localhost:13560
306 mse|12012|-1|localhost:13560
307 mse|12020|-1|localhost:14560
308 mse|12021|-1|localhost:13560
309 mse|12022|-1|localhost:13560
313 xapprtfilename1, _ := testCreateTmpFile(xapprt1)
314 defer os.Remove(xapprtfilename1)
315 xappConn1 = createNewXappControl("xappConn1", xapprtfilename1, "13560", "RMRXAPP1STUB", "RAN_NAME_1")
317 //---------------------------------
319 //---------------------------------
321 xapp.Logger.Info("### xapp2 rmr run ###")
323 xapprt2 := `newrt|start
324 mse|12010|-1|localhost:14560
325 mse|12011|-1|localhost:13660
326 mse|12012|-1|localhost:13660
327 mse|12020|-1|localhost:14560
328 mse|12021|-1|localhost:13660
329 mse|12022|-1|localhost:13660
333 xapprtfilename2, _ := testCreateTmpFile(xapprt2)
334 defer os.Remove(xapprtfilename2)
335 xappConn2 = createNewXappControl("xappConn2", xapprtfilename2, "13660", "RMRXAPP2STUB", "RAN_NAME_1")
337 //---------------------------------
339 //---------------------------------
340 xapp.Logger.Info("### e2term rmr run ###")
342 e2termrt := `newrt|start
343 mse|12010|-1|localhost:15560
344 mse|12011|-1|localhost:14560
345 mse|12012|-1|localhost:14560
346 mse|12020|-1|localhost:15560
347 mse|12021|-1|localhost:14560
348 mse|12022|-1|localhost:14560
352 e2termrtfilename, _ := testCreateTmpFile(e2termrt)
353 defer os.Remove(e2termrtfilename)
354 e2termConn = createNewE2termControl("e2termConn", e2termrtfilename, "15560", "RMRE2TERMSTUB")
356 //---------------------------------
358 //---------------------------------
359 http_handler := func(w http.ResponseWriter, r *http.Request) {
360 var req rtmgr_models.XappSubscriptionData
361 err := json.NewDecoder(r.Body).Decode(&req)
363 xapp.Logger.Error("%s", err.Error())
365 xapp.Logger.Info("(http handler) handling Address=%s Port=%d SubscriptionID=%d", *req.Address, *req.Port, *req.SubscriptionID)
371 http.HandleFunc("/", http_handler)
372 http.ListenAndServe("localhost:8989", nil)
375 //---------------------------------
377 //---------------------------------