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"
48 "github.com/go-openapi/swag"
51 var BasicXAppLists = []byte(`[
53 "name":"xapp-01","status":"unknown","version":"1.2.3",
55 {"name":"xapp-01-instance-01","status":"pending","ip":"172.16.1.103","port":4555,
56 "txMessages":["ControlIndication"],
57 "rxMessages":["LoadIndication","Reset"]
59 {"name":"xapp-01-instance-02","status":"pending","ip":"10.244.1.12","port":4561,
60 "txMessages":["ControlIndication","SNStatusTransfer"],
61 "rxMessages":["LoadIndication","HandoverPreparation"]
67 var SubscriptionResp = []byte(`{"ID":"deadbeef1234567890", "Version":0, "EventType":"all"}`)
69 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"]}]`)
71 var SubscriptionList = []byte(`[{"SubscriptionId":11,"Meid":"Test-Gnb","Endpoint":["127.0.0.1:4056"]}]`)
73 var InvalidSubResp = []byte(`{"Version":0, "EventType":all}`)
75 func TestValidateXappCallbackData_1(t *testing.T) {
76 data := models.XappCallbackData{
77 XApps: *swag.String("[]"),
78 Version: *swag.Int64(1),
79 Event: *swag.String("someevent"),
80 ID: *swag.String("123456")}
82 err := validateXappCallbackData(&data)
84 t.Error("Invalid XApp callback data: " + err.Error())
88 func TestValidateXappCallbackDataInvalid (t *testing.T) {
89 data := models.XappCallbackData{}
90 err := validateXappCallbackData(&data)
95 func TestValidateXappSubscriptionsData(t *testing.T) {
97 ep := make(map[string]*rtmgr.Endpoint)
98 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}
100 data := models.XappSubscriptionData{
101 Address: swag.String("10.1.1.1"),
103 SubscriptionID: swag.Int32(123456)}
106 err = validateXappSubscriptionData(&data)
111 data1 := models.XappSubscriptionData{
112 Address: swag.String(""),
114 SubscriptionID: swag.Int32(123456)}
115 err = validateXappSubscriptionData(&data1)
119 data2 := models.E2tData{
120 E2TAddress: swag.String(""),
122 /*err = validateE2tData(&data2)*/
124 e2tchannel := make(chan *models.E2tData, 10)
125 _ = createNewE2tHandleHandlerImpl(e2tchannel, &data2)
126 defer close(e2tchannel)
128 //test case for provideXappSubscriptionHandleImp
129 datachannel := make(chan *models.XappSubscriptionData, 10)
130 _ = provideXappSubscriptionHandleImpl(datachannel, &data1)
131 defer close(datachannel)
133 //test case for deleteXappSubscriptionHandleImpl
134 _ = deleteXappSubscriptionHandleImpl(datachannel, &data1)
136 data3 := models.XappSubscriptionData{
137 Address: swag.String("10.55.55.5"),
139 SubscriptionID: swag.Int32(123456)}
140 //test case for deleteXappSubscriptionHandleImpl
141 _ = deleteXappSubscriptionHandleImpl(datachannel, &data3)
144 func TestValidateE2tDataEmpty(t *testing.T) {
145 data := models.E2tData{
146 E2TAddress: swag.String(""),
148 err := validateE2tData(&data)
152 func TestValidateE2tDataDNSLookUPfails(t *testing.T) {
153 data := models.E2tData{
154 E2TAddress: swag.String("e2t.1com:1234"),
156 err := validateE2tData(&data)
160 func TestValidateE2tDataInvalid(t *testing.T) {
161 data := models.E2tData{
162 E2TAddress: swag.String("10.101.01.1"),
164 err := validateE2tData(&data)
168 func TestValidateE2tDatavalid(t *testing.T) {
169 data := models.E2tData{
170 E2TAddress: swag.String("10.101.01.1:8098"),
174 err := validateE2tData(&data)
179 func TestValidateE2tDatavalidEndpointPresent(t *testing.T) {
180 data := models.E2tData{
181 E2TAddress: swag.String("10.101.01.1:8098"),
184 // insert endpoint for testing purpose
185 uuid := "10.101.01.1:8098"
186 ep := &rtmgr.Endpoint{
191 err := validateE2tData(&data)
194 // delete endpoint for at end of test case
195 delete(rtmgr.Eps, uuid);
200 func TestValidateDeleteE2tData(t *testing.T) {
203 data := models.E2tDeleteData{
204 E2TAddress: swag.String(""),
207 err := validateDeleteE2tData(&data)
208 if (err.Error() != "E2TAddress is empty!!!") {
214 data = models.E2tDeleteData{
215 E2TAddress: swag.String("10.101.01.1:8098"),
218 err = validateDeleteE2tData(&data)
224 //################ Create End Point dummy entry
225 uuid := "10.101.01.1:8098"
226 ep := &rtmgr.Endpoint{
230 //#####################
232 data = models.E2tDeleteData{
233 E2TAddress: swag.String("10.101.01.1:8098"),
234 RanAssocList: models.RanE2tMap{
235 {E2TAddress: swag.String("10.101.01.1:8098")},
239 err = validateDeleteE2tData(&data)
244 // delete endpoint for at end of test case
245 //################ Delete End Point dummy entry
246 delete(rtmgr.Eps, uuid);
247 //#####################
251 //################ Create End Point dummy entry
252 uuid = "10.101.01.1:9991"
253 ep = &rtmgr.Endpoint{
258 uuid = "10.101.01.1:9992"
259 ep = &rtmgr.Endpoint{
263 //#####################
265 data = models.E2tDeleteData{
266 E2TAddress: swag.String("10.101.01:8098"),
267 RanAssocList: models.RanE2tMap{
268 {E2TAddress: swag.String("10.101.01.1:9991")},
269 {E2TAddress: swag.String("10.101.01.1:9992")},
273 err = validateDeleteE2tData(&data)
277 //################ Delete End Point dummy entry
278 delete(rtmgr.Eps, "10.101.01.1:9991")
279 delete(rtmgr.Eps, "10.101.01.1:9992")
280 //#####################
284 data = models.E2tDeleteData{
285 E2TAddress: swag.String("10.101.01:8098"),
286 RanAssocList: models.RanE2tMap{
287 {E2TAddress: swag.String("10.101.01.19991")},
291 err = validateDeleteE2tData(&data)
292 if ( err.Error() != "E2T Delete - RanAssocList E2TAddress is not a proper format like ip:port, 10.101.01.19991") {
298 func TestValidateE2TAddressRANListData(t *testing.T) {
300 data := models.RanE2tMap{
302 E2TAddress: swag.String(""),
305 err := validateE2TAddressRANListData(data)
310 data = models.RanE2tMap{
312 E2TAddress: swag.String("10.101.01.1:8098"),
315 err = validateE2TAddressRANListData(data)
322 func TestAssociateRanToE2THandlerImpl(t *testing.T) {
324 associateranchan := make(chan models.RanE2tMap, 10)
325 data := models.RanE2tMap{
327 E2TAddress: swag.String("10.101.01.1:8098"),
330 err := associateRanToE2THandlerImpl(associateranchan, data)
335 //################ Create End Point dummy entry
336 uuid := "10.101.01.1:8098"
337 ep := &rtmgr.Endpoint{
341 //#####################
343 data = models.RanE2tMap{
345 E2TAddress: swag.String("10.101.01.1:8098"),
348 err = associateRanToE2THandlerImpl(associateranchan, data)
352 data1 := <-associateranchan
355 //################ Delete End Point dummy entry
356 delete(rtmgr.Eps, uuid);
357 //#####################
360 func TestDisassociateRanToE2THandlerImpl(t *testing.T) {
362 disassranchan := make(chan models.RanE2tMap, 10)
364 data := models.RanE2tMap{
366 E2TAddress: swag.String("10.101.01.1:8098"),
369 err := disassociateRanToE2THandlerImpl(disassranchan, data)
373 //################ Create End Point dummy entry
374 uuid := "10.101.01.1:8098"
375 ep := &rtmgr.Endpoint{
379 //#####################
381 data = models.RanE2tMap{
383 E2TAddress: swag.String("10.101.01.1:8098"),
386 err = disassociateRanToE2THandlerImpl(disassranchan, data)
390 data1 := <-disassranchan
393 //################ Delete End Point dummy entry
394 delete(rtmgr.Eps, uuid);
395 //#####################
398 func TestDeleteE2tHandleHandlerImpl(t *testing.T) {
400 e2tdelchan := make(chan *models.E2tDeleteData, 10)
401 data := models.E2tDeleteData{
402 E2TAddress: swag.String(""),
404 err := deleteE2tHandleHandlerImpl(e2tdelchan, &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(e2tdelchan, &data)
424 data1 := <-e2tdelchan
427 //################ Delete End Point dummy entry
428 delete(rtmgr.Eps, uuid);
429 //#####################
432 func TestSubscriptionExists(t *testing.T) {
434 data := models.XappSubscriptionData{
435 Address: swag.String("10.0.0.0"),
437 SubscriptionID: swag.Int32(1234)}
439 rtmgr.Subs = *stub.ValidSubscriptions
441 yes_no := subscriptionExists(&data)
442 yes_no = addSubscription(&rtmgr.Subs, &data)
443 yes_no = addSubscription(&rtmgr.Subs, &data)
444 yes_no = delSubscription(&rtmgr.Subs, &data)
445 yes_no = delSubscription(&rtmgr.Subs, &data)
449 func TestAddSubscriptions(t *testing.T) {
451 subdata := models.XappSubscriptionData{
452 Address: swag.String("10.0.0.0"),
454 SubscriptionID: swag.Int32(1234)}
456 rtmgr.Subs = *stub.ValidSubscriptions
457 yes_no := addSubscription(&rtmgr.Subs, &subdata)
462 func TestHttpInstance(t *testing.T) {
463 sdlEngine, _ := sdl.GetSdl("file")
464 rpeEngine, _ := rpe.GetRpe("rmrpush")
465 httpinstance := NewHttpRestful()
466 err := httpinstance.Terminate()
469 triggerSBI := make(chan bool)
470 createMockPlatformComponents()
471 //ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil)
475 err = httpinstance.Initialize(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine, rpeEngine, triggerSBI, &m)
478 func TestXappCallbackDataChannelwithdata(t *testing.T) {
479 data := models.XappCallbackData{
480 XApps: *swag.String("[]"),
481 Version: *swag.Int64(1),
482 Event: *swag.String("someevent"),
483 ID: *swag.String("123456")}
484 datach := make(chan *models.XappCallbackData, 1)
485 go func() { _, _ = recvXappCallbackData(datach) }()
489 func TestXappCallbackDataChannelNodata(t *testing.T) {
490 datach := make(chan *models.XappCallbackData, 1)
491 go func() { _, _ = recvXappCallbackData(datach) }()
495 func TestE2TChannelwithData(t *testing.T) {
496 data2 := models.E2tData{
497 E2TAddress: swag.String("1.2.3.4"),
498 RanNamelist: []string{"ran1","ran2"},
500 dataChannel := make(chan *models.E2tData, 10)
501 go func() { _, _,_ = recvNewE2Tdata(dataChannel) }()
502 defer close(dataChannel)
503 dataChannel <- &data2
506 func TestE2TChannelwithNoData(t *testing.T) {
507 dataChannel := make(chan *models.E2tData, 10)
508 go func() { _, _ ,_= recvNewE2Tdata(dataChannel) }()
509 defer close(dataChannel)
512 func TestProvideXappSubscriptionHandleImpl(t *testing.T) {
514 data := models.XappSubscriptionData{
515 Address: swag.String("10.0.0.0"),
517 SubscriptionID: swag.Int32(1234)}
518 datachannel := make(chan *models.XappSubscriptionData, 10)
519 go func() { _ = provideXappSubscriptionHandleImpl(datachannel, &data) }()
520 defer close(datachannel)
526 func createMockAppmgrWithData(url string, g []byte, p []byte, t []byte) *httptest.Server {
527 l, err := net.Listen("tcp", url)
529 fmt.Println("Failed to create listener: " + err.Error())
531 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
532 if r.Method == "GET" && r.URL.String() == "/ric/v1/xapps" {
533 w.Header().Add("Content-Type", "application/json")
534 w.WriteHeader(http.StatusOK)
537 if r.Method == "POST" && r.URL.String() == "/ric/v1/subscriptions" {
538 w.Header().Add("Content-Type", "application/json")
539 w.WriteHeader(http.StatusCreated)
542 if r.Method == "GET" && r.URL.String() == "/ric/v1/e2t/list" {
543 w.Header().Add("Content-Type", "application/json")
544 w.WriteHeader(http.StatusOK)
554 func createMockSubmgrWithData(url string, t []byte) *httptest.Server {
555 l, err := net.Listen("tcp", url)
557 fmt.Println("Failed to create listener: " + err.Error())
559 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
561 if r.Method == "GET" && r.URL.String() == "//ric/v1/subscriptions" {
562 w.Header().Add("Content-Type", "application/json")
563 w.WriteHeader(http.StatusOK)
573 func createMockPlatformComponents() {
574 var filename = "config.json"
575 file, _ := json.MarshalIndent(stub.ValidPlatformComponents, "", "")
576 filestr := string(file)
577 filestr = "{\"PlatformComponents\":" + filestr + "}"
578 file = []byte(filestr)
579 _ = ioutil.WriteFile(filename, file, 644)
582 func TestRecvXappCallbackData(t *testing.T) {
583 data := models.XappCallbackData{
584 XApps: *swag.String("[]"),
585 Version: *swag.Int64(1),
586 Event: *swag.String("any"),
587 ID: *swag.String("123456"),
590 ch := make(chan *models.XappCallbackData)
592 httpRestful := NewHttpRestful()
593 go func() { ch <- &data }()
594 time.Sleep(1 * time.Second)
595 t.Log(string(len(ch)))
596 xappList, err := httpRestful.RecvXappCallbackData(ch)
598 t.Error("Receive failed: " + err.Error())
601 t.Error("Expected an XApp notification list")
608 func TestProvideXappHandleHandlerImpl(t *testing.T) {
609 datach := make(chan *models.XappCallbackData, 10)
611 data := models.XappCallbackData{
612 XApps: *swag.String("[]"),
613 Version: *swag.Int64(1),
614 Event: *swag.String("someevent"),
615 ID: *swag.String("123456")}
616 var httpRestful, _ = GetNbi("httpRESTful")
617 err := httpRestful.(*HttpRestful).ProvideXappHandleHandlerImpl(datach, &data)
619 t.Error("Error occured: " + err.Error())
623 t.Error("Something gone wrong: " + err.Error())
626 t.Error("Malformed data on channel")
631 //Empty XappCallbackdata
632 data1 := models.XappCallbackData{}
633 err = httpRestful.(*HttpRestful).ProvideXappHandleHandlerImpl(datach, &data1)
636 func TestValidateXappCallbackData(t *testing.T) {
637 data := models.XappCallbackData{
638 XApps: *swag.String("[]"),
639 Version: *swag.Int64(1),
640 Event: *swag.String("someevent"),
641 ID: *swag.String("123456")}
643 err := validateXappCallbackData(&data)
645 t.Error("Invalid XApp callback data: " + err.Error())
649 func TestValidateXappCallbackDataWithInvalidData(t *testing.T) {
650 data := models.XappCallbackData{
651 XApps: *swag.String("{}"),
652 Version: *swag.Int64(1),
653 Event: *swag.String("someevent"),
654 ID: *swag.String("123456")}
656 err := validateXappCallbackData(&data)
658 t.Error("Invalid XApp callback data: " + err.Error())
662 func TestHttpGetXAppsInvalidData(t *testing.T) {
663 _, err := httpGetXApps(XMURL)
665 t.Error("No XApp data received: " + err.Error())
669 func TestHttpGetXAppsWithValidData(t *testing.T) {
671 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil, nil)
675 xapplist, err := httpGetXApps(XMURL)
677 t.Error("Error occured: " + err.Error())
679 if len(*xapplist) != expected {
680 t.Error("Invalid XApp data: got " + string(len(*xapplist)) + ", expected " + string(expected))
686 func TestRetrieveStartupDataTimeout(t *testing.T) {
687 sdlEngine, _ := sdl.GetSdl("file")
688 createMockPlatformComponents()
689 err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine)
691 t.Error("Cannot retrieve startup data: " + err.Error())
694 os.Remove("config.json")
697 func TestRetrieveStartupData(t *testing.T) {
698 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, SubscriptionResp, nil)
702 ts1 := createMockAppmgrWithData("127.0.0.1:8080", nil, nil, E2TListResp)
706 ts2 := createMockSubmgrWithData("127.0.0.1:8089", SubscriptionList)
710 sdlEngine, _ := sdl.GetSdl("file")
711 var httpRestful, _ = GetNbi("httpRESTful")
712 createMockPlatformComponents()
713 httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine)
714 //err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
716 t.Error("Cannot retrieve startup data: " + err.Error())
719 os.Remove("config.json")
722 func TestRetrieveStartupDataWithInvalidSubResp(t *testing.T) {
723 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, InvalidSubResp, nil)
726 sdlEngine, _ := sdl.GetSdl("file")
727 var httpRestful, _ = GetNbi("httpRESTful")
728 createMockPlatformComponents()
729 err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine)
731 t.Error("Cannot retrieve startup data: " + err.Error())
734 os.Remove("config.json")
737 func TestInvalidarguments(t *testing.T) {
738 _ = PostSubReq("\n","nbifinterface")
739 _ = PostSubReq("xmurl","\n")