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.
19 This source code is part of the near-RT RIC (RAN Intelligent Controller)
20 platform project (RICP).
22 ==================================================================================
25 Mnemonic: httprestful_test.go
26 Abstract: HTTPRestful unit tests
40 "routing-manager/pkg/models"
41 "routing-manager/pkg/rpe"
42 "routing-manager/pkg/rtmgr"
43 "routing-manager/pkg/sdl"
44 "routing-manager/pkg/stub"
47 "github.com/go-openapi/swag"
50 var BasicXAppLists = []byte(`[
52 "name":"xapp-01","status":"unknown","version":"1.2.3",
54 {"name":"xapp-01-instance-01","status":"pending","ip":"172.16.1.103","port":4555,
55 "txMessages":["ControlIndication"],
56 "rxMessages":["LoadIndication","Reset"]
58 {"name":"xapp-01-instance-02","status":"pending","ip":"10.244.1.12","port":4561,
59 "txMessages":["ControlIndication","SNStatusTransfer"],
60 "rxMessages":["LoadIndication","HandoverPreparation"]
66 var SubscriptionResp = []byte(`{"ID":"deadbeef1234567890", "Version":0, "EventType":"all"}`)
68 var E2TListResp = []byte(`[{"e2tAddress":"127.0.0.1:0","ranNames":["RanM0","RanN0"]},{"e2tAddress":"127.0.0.1:1","ranNames":["RanM1","RanN1"]},{"e2tAddress":"127.0.0.1:2","ranNames":["RanM2","RanN2"]},{"e2tAddress":"127.0.0.1:3","ranNames":["RanM3","RanN3"]}]`)
70 var SubscriptionList = []byte(`[{"SubscriptionId":11,"Meid":"Test-Gnb","Endpoint":["127.0.0.1:4056"]}]`)
72 var InvalidSubResp = []byte(`{"Version":0, "EventType":all}`)
74 func TestValidateXappCallbackData_1(t *testing.T) {
75 data := models.XappCallbackData{
76 XApps: *swag.String("[]"),
77 Version: *swag.Int64(1),
78 Event: *swag.String("someevent"),
79 ID: *swag.String("123456")}
81 err := validateXappCallbackData(&data)
83 t.Error("Invalid XApp callback data: " + err.Error())
87 func TestValidateXappCallbackDataInvalid (t *testing.T) {
88 data := models.XappCallbackData{}
89 err := validateXappCallbackData(&data)
94 func TestValidateXappSubscriptionsData(t *testing.T) {
96 ep := make(map[string]*rtmgr.Endpoint)
97 ep["dummy"] = &rtmgr.Endpoint{Uuid: "10.0.0.1:0", Name: "E2TERM", XAppType: "app1", Ip: "", Port: 0, TxMessages: []string{"", ""}, RxMessages: []string{"", ""}, Socket: nil, IsReady: true, Keepalive: true}
99 data := models.XappSubscriptionData{
100 Address: swag.String("10.1.1.1"),
102 SubscriptionID: swag.Int32(123456)}
105 err = validateXappSubscriptionData(&data)
110 data1 := models.XappSubscriptionData{
111 Address: swag.String(""),
113 SubscriptionID: swag.Int32(123456)}
114 err = validateXappSubscriptionData(&data1)
117 data2 := models.E2tData{
118 E2TAddress: swag.String(""),
120 /*err = validateE2tData(&data2)*/
122 //e2tchannel := make(chan *models.E2tData, 10)
123 _ = createNewE2tHandleHandlerImpl(&data2)
124 //defer close(e2tchannel)
126 //test case for provideXappSubscriptionHandleImp
127 //datachannel := make(chan *models.XappSubscriptionData, 10)
128 sdlEngine, _ = sdl.GetSdl("file")
129 _ = provideXappSubscriptionHandleImpl( &data1)
130 //defer close(datachannel)
132 //test case for deleteXappSubscriptionHandleImpl
133 _ = deleteXappSubscriptionHandleImpl(&data1)
135 data3 := models.XappSubscriptionData{
136 Address: swag.String("10.55.55.5"),
138 SubscriptionID: swag.Int32(123456)}
139 //test case for deleteXappSubscriptionHandleImpl
140 _ = deleteXappSubscriptionHandleImpl(&data3)
141 data4 := models.XappSubscriptionData{
142 Address: swag.String("1.5.5.5"),
144 SubscriptionID: swag.Int32(1236)}
145 _ = deleteXappSubscriptionHandleImpl(&data4)
149 func TestValidateE2tDataEmpty(t *testing.T) {
150 data := models.E2tData{
151 E2TAddress: swag.String(""),
153 err := validateE2tData(&data)
157 func TestValidateE2tDataDNSLookUPfails(t *testing.T) {
158 data := models.E2tData{
159 E2TAddress: swag.String("e2t.1com:1234"),
161 err := validateE2tData(&data)
165 func TestValidateE2tDataInvalid(t *testing.T) {
166 data := models.E2tData{
167 E2TAddress: swag.String("10.101.01.1"),
169 err := validateE2tData(&data)
173 func TestValidateE2tDatavalid(t *testing.T) {
174 data := models.E2tData{
175 E2TAddress: swag.String("10.101.01.1:8098"),
179 err := validateE2tData(&data)
182 _ = createNewE2tHandleHandlerImpl(&data)
186 func TestValidateE2tDatavalidEndpointPresent(t *testing.T) {
187 data := models.E2tData{
188 E2TAddress: swag.String("10.101.01.1:8098"),
191 // insert endpoint for testing purpose
192 uuid := "10.101.01.1:8098"
193 ep := &rtmgr.Endpoint{
198 err := validateE2tData(&data)
201 // delete endpoint for at end of test case
202 delete(rtmgr.Eps, uuid);
207 func TestValidateDeleteE2tData(t *testing.T) {
210 data := models.E2tDeleteData{
211 E2TAddress: swag.String(""),
214 err := validateDeleteE2tData(&data)
215 if (err.Error() != "E2TAddress is empty!!!") {
221 data = models.E2tDeleteData{
222 E2TAddress: swag.String("10.101.01.1:8098"),
225 err = validateDeleteE2tData(&data)
231 //################ Create End Point dummy entry
232 uuid := "10.101.01.1:8098"
233 ep := &rtmgr.Endpoint{
237 //#####################
239 data = models.E2tDeleteData{
240 E2TAddress: swag.String("10.101.01.1:8098"),
241 RanAssocList: models.RanE2tMap{
242 {E2TAddress: swag.String("10.101.01.1:8098")},
246 err = validateDeleteE2tData(&data)
251 // delete endpoint for at end of test case
252 //################ Delete End Point dummy entry
253 delete(rtmgr.Eps, uuid);
254 //#####################
258 //################ Create End Point dummy entry
259 uuid = "10.101.01.1:9991"
260 ep = &rtmgr.Endpoint{
265 uuid = "10.101.01.1:9992"
266 ep = &rtmgr.Endpoint{
270 //#####################
272 data = models.E2tDeleteData{
273 E2TAddress: swag.String("10.101.01:8098"),
274 RanAssocList: models.RanE2tMap{
275 {E2TAddress: swag.String("10.101.01.1:9991")},
276 {E2TAddress: swag.String("10.101.01.1:9992")},
280 err = validateDeleteE2tData(&data)
284 //################ Delete End Point dummy entry
285 delete(rtmgr.Eps, "10.101.01.1:9991")
286 delete(rtmgr.Eps, "10.101.01.1:9992")
287 //#####################
291 data = models.E2tDeleteData{
292 E2TAddress: swag.String("10.101.01:8098"),
293 RanAssocList: models.RanE2tMap{
294 {E2TAddress: swag.String("10.101.01.19991")},
298 err = validateDeleteE2tData(&data)
299 if ( err.Error() != "E2T Delete - RanAssocList E2TAddress is not a proper format like ip:port, 10.101.01.19991") {
305 func TestValidateE2TAddressRANListData(t *testing.T) {
307 data := models.RanE2tMap{
309 E2TAddress: swag.String(""),
312 err := validateE2TAddressRANListData(data)
317 data = models.RanE2tMap{
319 E2TAddress: swag.String("10.101.01.1:8098"),
322 err = validateE2TAddressRANListData(data)
329 func TestAssociateRanToE2THandlerImpl(t *testing.T) {
331 data := models.RanE2tMap{
333 E2TAddress: swag.String("10.101.01.1:8098"),
336 err := associateRanToE2THandlerImpl( data)
341 //################ Create End Point dummy entry
342 uuid := "10.101.01.1:8098"
343 ep := &rtmgr.Endpoint{
347 //#####################
349 data = models.RanE2tMap{
351 E2TAddress: swag.String("10.101.01.1:8098"),
354 err = associateRanToE2THandlerImpl(data)
359 //################ Delete End Point dummy entry
360 delete(rtmgr.Eps, uuid);
361 //#####################
364 func TestDisassociateRanToE2THandlerImpl(t *testing.T) {
367 data := models.RanE2tMap{
369 E2TAddress: swag.String("10.101.01.1:8098"),
372 err := disassociateRanToE2THandlerImpl(data)
376 //################ Create End Point dummy entry
377 uuid := "10.101.01.1:8098"
378 ep := &rtmgr.Endpoint{
382 //#####################
384 data = models.RanE2tMap{
386 E2TAddress: swag.String("10.101.01.1:8098"),
389 err = disassociateRanToE2THandlerImpl(data)
394 //################ Delete End Point dummy entry
395 delete(rtmgr.Eps, uuid);
396 //#####################
399 func TestDeleteE2tHandleHandlerImpl(t *testing.T) {
401 data := models.E2tDeleteData{
402 E2TAddress: swag.String(""),
404 err := deleteE2tHandleHandlerImpl(&data)
409 //################ Create End Point dummy entry
410 uuid := "10.101.01.1:8098"
411 ep := &rtmgr.Endpoint{
415 //#####################
417 data = models.E2tDeleteData{
418 E2TAddress: swag.String("10.101.01.1:8098"),
420 err = deleteE2tHandleHandlerImpl(&data)
424 //################ Delete End Point dummy entry
425 delete(rtmgr.Eps, uuid);
426 //#####################
429 func TestSubscriptionExists(t *testing.T) {
431 data := models.XappSubscriptionData{
432 Address: swag.String("10.0.0.0"),
434 SubscriptionID: swag.Int32(1234)}
436 rtmgr.Subs = *stub.ValidSubscriptions
438 yes_no := subscriptionExists(&data)
439 yes_no = addSubscription(&rtmgr.Subs, &data)
440 yes_no = addSubscription(&rtmgr.Subs, &data)
441 yes_no = delSubscription(&rtmgr.Subs, &data)
442 yes_no = delSubscription(&rtmgr.Subs, &data)
446 func TestAddSubscriptions(t *testing.T) {
448 subdata := models.XappSubscriptionData{
449 Address: swag.String("10.0.0.0"),
451 SubscriptionID: swag.Int32(1234)}
453 rtmgr.Subs = *stub.ValidSubscriptions
454 yes_no := addSubscription(&rtmgr.Subs, &subdata)
459 func TestHttpInstance(t *testing.T) {
460 sdlEngine, _ := sdl.GetSdl("file")
461 rpeEngine, _ := rpe.GetRpe("rmrpush")
462 httpinstance := NewHttpRestful()
463 err := httpinstance.Terminate()
466 createMockPlatformComponents()
467 //ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil)
471 err = httpinstance.Initialize(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine, rpeEngine, &m)
474 func TestXappCallbackWithData(t *testing.T) {
475 data := models.XappCallbackData{
476 XApps: *swag.String("[]"),
477 Version: *swag.Int64(1),
478 Event: *swag.String("someevent"),
479 ID: *swag.String("123456")}
480 _, _ = recvXappCallbackData(&data)
483 func TestXappCallbackNodata(t *testing.T) {
484 //data := *models.XappCallbackData
485 _, _ = recvXappCallbackData(nil)
488 func TestE2TwithData(t *testing.T) {
489 data2 := models.E2tData{
490 E2TAddress: swag.String("1.2.3.4"),
491 RanNamelist: []string{"ran1","ran2"},
493 _, _,_ = recvNewE2Tdata(&data2)
496 func TestE2TwithNoData(t *testing.T) {
497 _, _,_ = recvNewE2Tdata(nil)
500 func TestProvideXappSubscriptionHandleImpl(t *testing.T) {
502 data := models.XappSubscriptionData{
503 Address: swag.String("10.0.0.0"),
505 SubscriptionID: swag.Int32(1234)}
506 _ = provideXappSubscriptionHandleImpl(&data)
509 func createMockAppmgrWithData(url string, g []byte, p []byte, t []byte) *httptest.Server {
510 l, err := net.Listen("tcp", url)
512 fmt.Println("Failed to create listener: " + err.Error())
514 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
515 if r.Method == "GET" && r.URL.String() == "/ric/v1/xapps" {
516 w.Header().Add("Content-Type", "application/json")
517 w.WriteHeader(http.StatusOK)
520 if r.Method == "POST" && r.URL.String() == "/ric/v1/subscriptions" {
521 w.Header().Add("Content-Type", "application/json")
522 w.WriteHeader(http.StatusCreated)
525 if r.Method == "GET" && r.URL.String() == "/ric/v1/e2t/list" {
526 w.Header().Add("Content-Type", "application/json")
527 w.WriteHeader(http.StatusOK)
537 func createMockSubmgrWithData(url string, t []byte) *httptest.Server {
538 l, err := net.Listen("tcp", url)
540 fmt.Println("Failed to create listener: " + err.Error())
542 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
544 if r.Method == "GET" && r.URL.String() == "//ric/v1/subscriptions" {
545 w.Header().Add("Content-Type", "application/json")
546 w.WriteHeader(http.StatusOK)
556 func createMockPlatformComponents() {
557 var filename = "config.json"
558 file, _ := json.MarshalIndent(stub.ValidPlatformComponents, "", "")
559 filestr := string(file)
560 filestr = "{\"PlatformComponents\":" + filestr + "}"
561 file = []byte(filestr)
562 _ = ioutil.WriteFile(filename, file, 644)
565 func TestProvideXappHandleHandlerImpl(t *testing.T) {
566 data := models.XappCallbackData{
567 XApps: *swag.String("[]"),
568 Version: *swag.Int64(1),
569 Event: *swag.String("someevent"),
570 ID: *swag.String("123456")}
571 err := provideXappHandleHandlerImpl( &data)
573 //Empty XappCallbackdata
574 data1 := models.XappCallbackData{}
575 err = provideXappHandleHandlerImpl(&data1)
579 func TestValidateXappCallbackData(t *testing.T) {
580 data := models.XappCallbackData{
581 XApps: *swag.String("[]"),
582 Version: *swag.Int64(1),
583 Event: *swag.String("someevent"),
584 ID: *swag.String("123456")}
586 err := validateXappCallbackData(&data)
588 t.Error("Invalid XApp callback data: " + err.Error())
592 func TestValidateXappCallbackDataWithInvalidData(t *testing.T) {
593 data := models.XappCallbackData{
594 XApps: *swag.String("{}"),
595 Version: *swag.Int64(1),
596 Event: *swag.String("someevent"),
597 ID: *swag.String("123456")}
599 err := validateXappCallbackData(&data)
601 t.Error("Invalid XApp callback data: " + err.Error())
605 func TestHttpGetXAppsInvalidData(t *testing.T) {
606 _, err := httpGetXApps(XMURL)
608 t.Error("No XApp data received: " + err.Error())
612 func TestHttpGetXAppsWithValidData(t *testing.T) {
614 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil, nil)
618 xapplist, err := httpGetXApps(XMURL)
620 t.Error("Error occured: " + err.Error())
622 if len(*xapplist) != expected {
623 t.Error("Invalid XApp data: got " + string(len(*xapplist)) + ", expected " + string(expected))
629 func TestRetrieveStartupDataTimeout(t *testing.T) {
630 sdlEngine, _ := sdl.GetSdl("file")
631 createMockPlatformComponents()
632 err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine)
634 t.Error("Cannot retrieve startup data: " + err.Error())
637 os.Remove("config.json")
640 func TestRetrieveStartupData(t *testing.T) {
641 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, SubscriptionResp, nil)
645 ts1 := createMockAppmgrWithData("127.0.0.1:8080", nil, nil, E2TListResp)
649 ts2 := createMockSubmgrWithData("127.0.0.1:8089", SubscriptionList)
653 sdlEngine, _ := sdl.GetSdl("file")
654 var httpRestful, _ = GetNbi("httpRESTful")
655 createMockPlatformComponents()
656 httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine)
657 //err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
659 t.Error("Cannot retrieve startup data: " + err.Error())
662 os.Remove("config.json")
665 func TestRetrieveStartupDataWithInvalidSubResp(t *testing.T) {
666 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, InvalidSubResp, nil)
669 sdlEngine, _ := sdl.GetSdl("file")
670 var httpRestful, _ = GetNbi("httpRESTful")
671 createMockPlatformComponents()
672 err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine)
674 t.Error("Cannot retrieve startup data: " + err.Error())
677 os.Remove("config.json")
680 func TestInvalidarguments(t *testing.T) {
681 _ = PostSubReq("\n","nbifinterface")
682 _ = PostSubReq("xmurl","\n")
685 func TestInitEngine(t *testing.T) {
689 func TestUpdateXappSubscription(t *testing.T) {
690 ep := make(map[string]*rtmgr.Endpoint)
691 ep["dummy"] = &rtmgr.Endpoint{Uuid: "10.0.0.1:0", Name: "E2TERM", XAppType: "app1", Ip: "10.1.1.1", Port: 1234, TxMessages: []string{"", ""}, RxMessages: []string{"", ""}, Socket: nil, IsReady: true, Keepalive: true}
697 xapp := models.XappElement{
698 Address: swag.String("10.1.1.1"),
702 var b models.XappList
704 _ = updateXappSubscriptionHandleImpl(&b, 10)
706 //Test case when subscriptions already exist
707 data := models.XappSubscriptionData{
708 Address: swag.String("10.0.0.0"),
710 SubscriptionID: swag.Int32(12345)}
712 rtmgr.Subs = *stub.ValidSubscriptions
714 subscriptionExists(&data)
715 addSubscription(&rtmgr.Subs, &data)
716 _ = updateXappSubscriptionHandleImpl(&b, 10)
721 func TestDumpDebugdata(t *testing.T) {
722 _,_ = dumpDebugData()