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 InvalidSubResp = []byte(`{"Version":0, "EventType":all}`)
73 func TestValidateXappCallbackData_1(t *testing.T) {
74 data := models.XappCallbackData{
75 XApps: *swag.String("[]"),
76 Version: *swag.Int64(1),
77 Event: *swag.String("someevent"),
78 ID: *swag.String("123456")}
80 err := validateXappCallbackData(&data)
82 t.Error("Invalid XApp callback data: " + err.Error())
86 func TestValidateXappCallbackDataInvalid (t *testing.T) {
87 data := models.XappCallbackData{}
88 err := validateXappCallbackData(&data)
93 func TestValidateXappSubscriptionsData(t *testing.T) {
95 ep := make(map[string]*rtmgr.Endpoint)
96 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}
98 data := models.XappSubscriptionData{
99 Address: swag.String("10.1.1.1"),
101 SubscriptionID: swag.Int32(123456)}
104 err = validateXappSubscriptionData(&data)
109 data1 := models.XappSubscriptionData{
110 Address: swag.String(""),
112 SubscriptionID: swag.Int32(123456)}
113 err = validateXappSubscriptionData(&data1)
117 data2 := models.E2tData{
118 E2TAddress: swag.String(""),
120 /*err = validateE2tData(&data2)*/
122 e2tchannel := make(chan *models.E2tData, 10)
123 _ = createNewE2tHandleHandlerImpl(e2tchannel, &data2)
124 defer close(e2tchannel)
126 //test case for provideXappSubscriptionHandleImp
127 datachannel := make(chan *models.XappSubscriptionData, 10)
128 _ = provideXappSubscriptionHandleImpl(datachannel, &data1)
129 defer close(datachannel)
131 //test case for deleteXappSubscriptionHandleImpl
132 _ = deleteXappSubscriptionHandleImpl(datachannel, &data1)
134 data3 := models.XappSubscriptionData{
135 Address: swag.String("10.55.55.5"),
137 SubscriptionID: swag.Int32(123456)}
138 //test case for deleteXappSubscriptionHandleImpl
139 _ = deleteXappSubscriptionHandleImpl(datachannel, &data3)
142 func TestValidateE2tDataEmpty(t *testing.T) {
143 data := models.E2tData{
144 E2TAddress: swag.String(""),
146 err := validateE2tData(&data)
150 func TestValidateE2tDataDNSLookUPfails(t *testing.T) {
151 data := models.E2tData{
152 E2TAddress: swag.String("e2t.1com:1234"),
154 err := validateE2tData(&data)
158 func TestValidateE2tDataInvalid(t *testing.T) {
159 data := models.E2tData{
160 E2TAddress: swag.String("10.101.01.1"),
162 err := validateE2tData(&data)
166 func TestValidateE2tDatavalid(t *testing.T) {
167 data := models.E2tData{
168 E2TAddress: swag.String("10.101.01.1:8098"),
172 err := validateE2tData(&data)
177 func TestValidateE2tDatavalidEndpointPresent(t *testing.T) {
178 data := models.E2tData{
179 E2TAddress: swag.String("10.101.01.1:8098"),
182 // insert endpoint for testing purpose
183 uuid := "10.101.01.1:8098"
184 ep := &rtmgr.Endpoint{
189 err := validateE2tData(&data)
192 // delete endpoint for at end of test case
193 delete(rtmgr.Eps, uuid);
198 func TestValidateDeleteE2tData(t *testing.T) {
201 data := models.E2tDeleteData{
202 E2TAddress: swag.String(""),
205 err := validateDeleteE2tData(&data)
206 if (err.Error() != "E2TAddress is empty!!!") {
212 data = models.E2tDeleteData{
213 E2TAddress: swag.String("10.101.01.1:8098"),
216 err = validateDeleteE2tData(&data)
222 //################ Create End Point dummy entry
223 uuid := "10.101.01.1:8098"
224 ep := &rtmgr.Endpoint{
228 //#####################
230 data = models.E2tDeleteData{
231 E2TAddress: swag.String("10.101.01.1:8098"),
232 RanAssocList: models.RanE2tMap{
233 {E2TAddress: swag.String("10.101.01.1:8098")},
237 err = validateDeleteE2tData(&data)
242 // delete endpoint for at end of test case
243 //################ Delete End Point dummy entry
244 delete(rtmgr.Eps, uuid);
245 //#####################
249 //################ Create End Point dummy entry
250 uuid = "10.101.01.1:9991"
251 ep = &rtmgr.Endpoint{
256 uuid = "10.101.01.1:9992"
257 ep = &rtmgr.Endpoint{
261 //#####################
263 data = models.E2tDeleteData{
264 E2TAddress: swag.String("10.101.01:8098"),
265 RanAssocList: models.RanE2tMap{
266 {E2TAddress: swag.String("10.101.01.1:9991")},
267 {E2TAddress: swag.String("10.101.01.1:9992")},
271 err = validateDeleteE2tData(&data)
275 //################ Delete End Point dummy entry
276 delete(rtmgr.Eps, "10.101.01.1:9991")
277 delete(rtmgr.Eps, "10.101.01.1:9992")
278 //#####################
282 data = models.E2tDeleteData{
283 E2TAddress: swag.String("10.101.01:8098"),
284 RanAssocList: models.RanE2tMap{
285 {E2TAddress: swag.String("10.101.01.19991")},
289 err = validateDeleteE2tData(&data)
290 if ( err.Error() != "E2T Delete - RanAssocList E2TAddress is not a proper format like ip:port, 10.101.01.19991") {
296 func TestValidateE2TAddressRANListData(t *testing.T) {
298 data := models.RanE2tMap{
300 E2TAddress: swag.String(""),
303 err := validateE2TAddressRANListData(data)
308 data = models.RanE2tMap{
310 E2TAddress: swag.String("10.101.01.1:8098"),
313 err = validateE2TAddressRANListData(data)
320 func TestAssociateRanToE2THandlerImpl(t *testing.T) {
322 associateranchan := make(chan models.RanE2tMap, 10)
323 data := models.RanE2tMap{
325 E2TAddress: swag.String("10.101.01.1:8098"),
328 err := associateRanToE2THandlerImpl(associateranchan, data)
333 //################ Create End Point dummy entry
334 uuid := "10.101.01.1:8098"
335 ep := &rtmgr.Endpoint{
339 //#####################
341 data = models.RanE2tMap{
343 E2TAddress: swag.String("10.101.01.1:8098"),
346 err = associateRanToE2THandlerImpl(associateranchan, data)
350 data1 := <-associateranchan
353 //################ Delete End Point dummy entry
354 delete(rtmgr.Eps, uuid);
355 //#####################
358 func TestDisassociateRanToE2THandlerImpl(t *testing.T) {
360 disassranchan := make(chan models.RanE2tMap, 10)
362 data := models.RanE2tMap{
364 E2TAddress: swag.String("10.101.01.1:8098"),
367 err := disassociateRanToE2THandlerImpl(disassranchan, data)
371 //################ Create End Point dummy entry
372 uuid := "10.101.01.1:8098"
373 ep := &rtmgr.Endpoint{
377 //#####################
379 data = models.RanE2tMap{
381 E2TAddress: swag.String("10.101.01.1:8098"),
384 err = disassociateRanToE2THandlerImpl(disassranchan, data)
388 data1 := <-disassranchan
391 //################ Delete End Point dummy entry
392 delete(rtmgr.Eps, uuid);
393 //#####################
396 func TestDeleteE2tHandleHandlerImpl(t *testing.T) {
398 e2tdelchan := make(chan *models.E2tDeleteData, 10)
399 data := models.E2tDeleteData{
400 E2TAddress: swag.String(""),
402 err := deleteE2tHandleHandlerImpl(e2tdelchan, &data)
407 //################ Create End Point dummy entry
408 uuid := "10.101.01.1:8098"
409 ep := &rtmgr.Endpoint{
413 //#####################
415 data = models.E2tDeleteData{
416 E2TAddress: swag.String("10.101.01.1:8098"),
418 err = deleteE2tHandleHandlerImpl(e2tdelchan, &data)
422 data1 := <-e2tdelchan
425 //################ Delete End Point dummy entry
426 delete(rtmgr.Eps, uuid);
427 //#####################
430 func TestSubscriptionExists(t *testing.T) {
432 data := models.XappSubscriptionData{
433 Address: swag.String("10.0.0.0"),
435 SubscriptionID: swag.Int32(1234)}
437 rtmgr.Subs = *stub.ValidSubscriptions
439 yes_no := subscriptionExists(&data)
440 yes_no = addSubscription(&rtmgr.Subs, &data)
441 yes_no = addSubscription(&rtmgr.Subs, &data)
442 yes_no = delSubscription(&rtmgr.Subs, &data)
443 yes_no = delSubscription(&rtmgr.Subs, &data)
447 func TestAddSubscriptions(t *testing.T) {
449 subdata := models.XappSubscriptionData{
450 Address: swag.String("10.0.0.0"),
452 SubscriptionID: swag.Int32(1234)}
454 rtmgr.Subs = *stub.ValidSubscriptions
455 yes_no := addSubscription(&rtmgr.Subs, &subdata)
460 func TestHttpInstance(t *testing.T) {
461 sdlEngine, _ := sdl.GetSdl("file")
462 rpeEngine, _ := rpe.GetRpe("rmrpush")
463 httpinstance := NewHttpRestful()
464 err := httpinstance.Terminate()
467 triggerSBI := make(chan bool)
468 createMockPlatformComponents()
469 //ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil)
473 err = httpinstance.Initialize(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine, rpeEngine, triggerSBI, &m)
476 func TestXappCallbackDataChannelwithdata(t *testing.T) {
477 data := models.XappCallbackData{
478 XApps: *swag.String("[]"),
479 Version: *swag.Int64(1),
480 Event: *swag.String("someevent"),
481 ID: *swag.String("123456")}
482 datach := make(chan *models.XappCallbackData, 1)
483 go func() { _, _ = recvXappCallbackData(datach) }()
487 func TestXappCallbackDataChannelNodata(t *testing.T) {
488 datach := make(chan *models.XappCallbackData, 1)
489 go func() { _, _ = recvXappCallbackData(datach) }()
493 func TestE2TChannelwithData(t *testing.T) {
494 data2 := models.E2tData{
495 E2TAddress: swag.String("1.2.3.4"),
496 RanNamelist: []string{"ran1","ran2"},
498 dataChannel := make(chan *models.E2tData, 10)
499 go func() { _, _,_ = recvNewE2Tdata(dataChannel) }()
500 defer close(dataChannel)
501 dataChannel <- &data2
504 func TestE2TChannelwithNoData(t *testing.T) {
505 dataChannel := make(chan *models.E2tData, 10)
506 go func() { _, _ ,_= recvNewE2Tdata(dataChannel) }()
507 defer close(dataChannel)
510 func TestProvideXappSubscriptionHandleImpl(t *testing.T) {
512 data := models.XappSubscriptionData{
513 Address: swag.String("10.0.0.0"),
515 SubscriptionID: swag.Int32(1234)}
516 datachannel := make(chan *models.XappSubscriptionData, 10)
517 go func() { _ = provideXappSubscriptionHandleImpl(datachannel, &data) }()
518 defer close(datachannel)
524 func createMockAppmgrWithData(url string, g []byte, p []byte, t []byte) *httptest.Server {
525 l, err := net.Listen("tcp", url)
527 fmt.Println("Failed to create listener: " + err.Error())
529 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
530 if r.Method == "GET" && r.URL.String() == "/ric/v1/xapps" {
531 w.Header().Add("Content-Type", "application/json")
532 w.WriteHeader(http.StatusOK)
535 if r.Method == "POST" && r.URL.String() == "/ric/v1/subscriptions" {
536 w.Header().Add("Content-Type", "application/json")
537 w.WriteHeader(http.StatusCreated)
540 if r.Method == "GET" && r.URL.String() == "/ric/v1/e2t/list" {
541 w.Header().Add("Content-Type", "application/json")
542 w.WriteHeader(http.StatusOK)
552 func createMockPlatformComponents() {
553 var filename = "config.json"
554 file, _ := json.MarshalIndent(stub.ValidPlatformComponents, "", "")
555 filestr := string(file)
556 filestr = "{\"PlatformComponents\":" + filestr + "}"
557 file = []byte(filestr)
558 _ = ioutil.WriteFile(filename, file, 644)
561 func TestRecvXappCallbackData(t *testing.T) {
562 data := models.XappCallbackData{
563 XApps: *swag.String("[]"),
564 Version: *swag.Int64(1),
565 Event: *swag.String("any"),
566 ID: *swag.String("123456"),
569 ch := make(chan *models.XappCallbackData)
571 httpRestful := NewHttpRestful()
572 go func() { ch <- &data }()
573 time.Sleep(1 * time.Second)
574 t.Log(string(len(ch)))
575 xappList, err := httpRestful.RecvXappCallbackData(ch)
577 t.Error("Receive failed: " + err.Error())
580 t.Error("Expected an XApp notification list")
587 func TestProvideXappHandleHandlerImpl(t *testing.T) {
588 datach := make(chan *models.XappCallbackData, 10)
590 data := models.XappCallbackData{
591 XApps: *swag.String("[]"),
592 Version: *swag.Int64(1),
593 Event: *swag.String("someevent"),
594 ID: *swag.String("123456")}
595 var httpRestful, _ = GetNbi("httpRESTful")
596 err := httpRestful.(*HttpRestful).ProvideXappHandleHandlerImpl(datach, &data)
598 t.Error("Error occured: " + err.Error())
602 t.Error("Something gone wrong: " + err.Error())
605 t.Error("Malformed data on channel")
610 //Empty XappCallbackdata
611 data1 := models.XappCallbackData{}
612 err = httpRestful.(*HttpRestful).ProvideXappHandleHandlerImpl(datach, &data1)
615 func TestValidateXappCallbackData(t *testing.T) {
616 data := models.XappCallbackData{
617 XApps: *swag.String("[]"),
618 Version: *swag.Int64(1),
619 Event: *swag.String("someevent"),
620 ID: *swag.String("123456")}
622 err := validateXappCallbackData(&data)
624 t.Error("Invalid XApp callback data: " + err.Error())
628 func TestValidateXappCallbackDataWithInvalidData(t *testing.T) {
629 data := models.XappCallbackData{
630 XApps: *swag.String("{}"),
631 Version: *swag.Int64(1),
632 Event: *swag.String("someevent"),
633 ID: *swag.String("123456")}
635 err := validateXappCallbackData(&data)
637 t.Error("Invalid XApp callback data: " + err.Error())
641 func TestHttpGetXAppsInvalidData(t *testing.T) {
642 _, err := httpGetXApps(XMURL)
644 t.Error("No XApp data received: " + err.Error())
648 func TestHttpGetXAppsWithValidData(t *testing.T) {
650 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, nil, nil)
654 xapplist, err := httpGetXApps(XMURL)
656 t.Error("Error occured: " + err.Error())
658 if len(*xapplist) != expected {
659 t.Error("Invalid XApp data: got " + string(len(*xapplist)) + ", expected " + string(expected))
665 func TestRetrieveStartupDataTimeout(t *testing.T) {
666 sdlEngine, _ := sdl.GetSdl("file")
667 createMockPlatformComponents()
668 err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine)
670 t.Error("Cannot retrieve startup data: " + err.Error())
673 os.Remove("config.json")
676 func TestRetrieveStartupData(t *testing.T) {
677 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, SubscriptionResp, nil)
681 ts1 := createMockAppmgrWithData("127.0.0.1:8080", nil, nil, E2TListResp)
685 sdlEngine, _ := sdl.GetSdl("file")
686 var httpRestful, _ = GetNbi("httpRESTful")
687 createMockPlatformComponents()
688 err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine)
689 //err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
691 t.Error("Cannot retrieve startup data: " + err.Error())
694 os.Remove("config.json")
697 func TestRetrieveStartupDataWithInvalidSubResp(t *testing.T) {
698 ts := createMockAppmgrWithData("127.0.0.1:3000", BasicXAppLists, InvalidSubResp, nil)
701 sdlEngine, _ := sdl.GetSdl("file")
702 var httpRestful, _ = GetNbi("httpRESTful")
703 createMockPlatformComponents()
704 err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", E2MURL, sdlEngine)
706 t.Error("Cannot retrieve startup data: " + err.Error())
709 os.Remove("config.json")
712 func TestInvalidarguments(t *testing.T) {
713 _ = PostSubReq("\n","nbifinterface")
714 _ = PostSubReq("xmurl","\n")