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 //-----------------------------------------------------------------------------
120 //-----------------------------------------------------------------------------
122 //-----------------------------------------------------------------------------
123 type xappTransaction struct {
124 tc *testingXappControl
129 type testingXappControl struct {
131 testingMessageChannel
136 func (tc *testingXappControl) newXid() string {
138 xid = tc.desc + "_XID_" + strconv.FormatUint(uint64(tc.xid_seq), 10)
143 func (tc *testingXappControl) newXappTransaction(xid *string, ranname string) *xappTransaction {
144 trans := &xappTransaction{}
147 trans.xid = tc.newXid()
151 trans.meid = &xapp.RMRMeid{RanName: ranname}
155 func (tc *testingXappControl) Consume(msg *xapp.RMRParams) (err error) {
157 if strings.Contains(msg.Xid, tc.desc) {
158 xapp.Logger.Info("(%s) Consume mtype=%s subid=%d xid=%s", tc.desc, xapp.RicMessageTypeToName[msg.Mtype], msg.SubId, msg.Xid)
161 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)
166 func createNewXappControl(desc string, rtfile string, port string, stat string, ranname string) *testingXappControl {
167 xappCtrl := &testingXappControl{}
168 xappCtrl.testingRmrControl = initTestingRmrControl(desc, rtfile, port, stat, xappCtrl)
169 xappCtrl.testingMessageChannel = initTestingMessageChannel()
170 xappCtrl.meid = &xapp.RMRMeid{RanName: ranname}
175 //-----------------------------------------------------------------------------
177 //-----------------------------------------------------------------------------
178 type testingE2termControl struct {
180 testingMessageChannel
183 func (tc *testingE2termControl) Consume(msg *xapp.RMRParams) (err error) {
184 xapp.Logger.Info("(%s) Consume mtype=%s subid=%d xid=%s", tc.desc, xapp.RicMessageTypeToName[msg.Mtype], msg.SubId, msg.Xid)
189 func createNewE2termControl(desc string, rtfile string, port string, stat string) *testingE2termControl {
190 e2termCtrl := &testingE2termControl{}
191 e2termCtrl.testingRmrControl = initTestingRmrControl(desc, rtfile, port, stat, e2termCtrl)
192 e2termCtrl.testingMessageChannel = initTestingMessageChannel()
196 //-----------------------------------------------------------------------------
198 //-----------------------------------------------------------------------------
199 type testingMainControl struct {
204 func createNewMainControl(desc string, rtfile string, port string) *testingMainControl {
205 mainCtrl = &testingMainControl{}
206 mainCtrl.testingControl = initTestingControl(desc, rtfile, port)
207 mainCtrl.c = NewControl()
208 xapp.SetReadyCB(mainCtrl.ReadyCB, nil)
209 go xapp.RunWithParams(mainCtrl.c, false)
214 //-----------------------------------------------------------------------------
216 //-----------------------------------------------------------------------------
218 func testError(t *testing.T, pattern string, args ...interface{}) {
219 xapp.Logger.Error(fmt.Sprintf(pattern, args...))
220 t.Errorf(fmt.Sprintf(pattern, args...))
223 func testLog(t *testing.T, pattern string, args ...interface{}) {
224 xapp.Logger.Info(fmt.Sprintf(pattern, args...))
225 t.Logf(fmt.Sprintf(pattern, args...))
228 func testCreateTmpFile(str string) (string, error) {
229 file, err := ioutil.TempFile("/tmp", "*.rt")
233 _, err = file.WriteString(str)
238 return file.Name(), nil
241 //-----------------------------------------------------------------------------
243 //-----------------------------------------------------------------------------
245 var xappConn1 *testingXappControl
246 var xappConn2 *testingXappControl
247 var e2termConn *testingE2termControl
248 var mainCtrl *testingMainControl
250 func TestMain(m *testing.M) {
251 xapp.Logger.Info("TestMain start")
254 //Cfg creation won't work like this as xapp-frame reads it during init.
265 "protPort": "tcp:14560",
268 "txMessages": ["RIC_SUB_REQ", "RIC_SUB_DEL_REQ"],
269 "rxMessages": ["RIC_SUB_RESP", "RIC_SUB_FAILURE", "RIC_SUB_DEL_RESP", "RIC_SUB_DEL_FAILURE", "RIC_INDICATION"]
274 "namespaces": ["sdl", "rnib"]
277 "HostAddr" : "localhost",
283 cfgfilename,_ := testCreateTmpFile(cfgstr)
284 defer os.Remove(cfgfilename)
285 os.Setenv("CFG_FILE", cfgfilename)
287 xapp.Logger.Info("Using cfg file %s", os.Getenv("CFG_FILE"))
289 //---------------------------------
290 // NOTE: Routing table is configured so, that responses
291 // are duplicated to xapp1 and xapp2 instances.
292 // If XID is not matching xapp stub will just
293 // drop message. (Messages 12011, 12012, 12021, 12022)
294 //---------------------------------
295 xapp.Logger.Info("### submgr main run ###")
297 subsrt := `newrt|start
298 mse|12010|-1|localhost:14560
299 mse|12010,localhost:14560|-1|localhost:15560
300 mse|12011,localhost:15560|-1|localhost:14560
301 mse|12011|-1|localhost:13560;localhost:13660
302 mse|12012,localhost:15560|-1|localhost:14560
303 mse|12012|-1|localhost:13560;localhost:13660
304 mse|12020|-1|localhost:14560
305 mse|12020,localhost:14560|-1|localhost:15560
306 mse|12021,localhost:15560|-1|localhost:14560
307 mse|12021|-1|localhost:13560;localhost:13660
308 mse|12022,localhost:15560|-1|localhost:14560
309 mse|12022|-1|localhost:13560;localhost:13660
312 subrtfilename, _ := testCreateTmpFile(subsrt)
313 defer os.Remove(subrtfilename)
314 mainCtrl = createNewMainControl("main", subrtfilename, "14560")
316 //---------------------------------
318 //---------------------------------
319 xapp.Logger.Info("### xapp1 rmr run ###")
321 xapprt1 := `newrt|start
322 mse|12010|-1|localhost:14560
323 mse|12011|-1|localhost:13560
324 mse|12012|-1|localhost:13560
325 mse|12020|-1|localhost:14560
326 mse|12021|-1|localhost:13560
327 mse|12022|-1|localhost:13560
331 xapprtfilename1, _ := testCreateTmpFile(xapprt1)
332 defer os.Remove(xapprtfilename1)
333 xappConn1 = createNewXappControl("xappConn1", xapprtfilename1, "13560", "RMRXAPP1STUB", "RAN_NAME_1")
335 //---------------------------------
337 //---------------------------------
339 xapp.Logger.Info("### xapp2 rmr run ###")
341 xapprt2 := `newrt|start
342 mse|12010|-1|localhost:14560
343 mse|12011|-1|localhost:13660
344 mse|12012|-1|localhost:13660
345 mse|12020|-1|localhost:14560
346 mse|12021|-1|localhost:13660
347 mse|12022|-1|localhost:13660
351 xapprtfilename2, _ := testCreateTmpFile(xapprt2)
352 defer os.Remove(xapprtfilename2)
353 xappConn2 = createNewXappControl("xappConn2", xapprtfilename2, "13660", "RMRXAPP2STUB", "RAN_NAME_1")
355 //---------------------------------
357 //---------------------------------
358 xapp.Logger.Info("### e2term rmr run ###")
360 e2termrt := `newrt|start
361 mse|12010|-1|localhost:15560
362 mse|12011|-1|localhost:14560
363 mse|12012|-1|localhost:14560
364 mse|12020|-1|localhost:15560
365 mse|12021|-1|localhost:14560
366 mse|12022|-1|localhost:14560
370 e2termrtfilename, _ := testCreateTmpFile(e2termrt)
371 defer os.Remove(e2termrtfilename)
372 e2termConn = createNewE2termControl("e2termConn", e2termrtfilename, "15560", "RMRE2TERMSTUB")
374 //---------------------------------
376 //---------------------------------
377 http_handler := func(w http.ResponseWriter, r *http.Request) {
378 var req rtmgr_models.XappSubscriptionData
379 err := json.NewDecoder(r.Body).Decode(&req)
381 xapp.Logger.Error("%s", err.Error())
383 xapp.Logger.Info("(http handler) handling Address=%s Port=%d SubscriptionID=%d", *req.Address, *req.Port, *req.SubscriptionID)
389 http.HandleFunc("/", http_handler)
390 http.ListenAndServe("localhost:8989", nil)
393 //---------------------------------
395 //---------------------------------