Release of Routing Manager v0.3.0
[ric-plt/rtmgr.git] / pkg / nbi / httprestful_test.go
1 /*
2 ==================================================================================
3   Copyright (c) 2019 AT&T Intellectual Property.
4   Copyright (c) 2019 Nokia
5
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
9
10        http://www.apache.org/licenses/LICENSE-2.0
11
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 ==================================================================================
18 */
19 /*
20   Mnemonic:     httprestful_test.go
21   Abstract:     HTTPRestful unit tests
22   Date:         15 May 2019
23 */
24
25 package nbi
26
27 import (
28         "routing-manager/pkg/stub"
29         "routing-manager/pkg/models"
30         "routing-manager/pkg/sdl"
31         "github.com/go-openapi/swag"
32         "testing"
33         "time"
34         "net"
35         "net/http"
36         "net/http/httptest"
37         "fmt"
38         "os"
39         "io/ioutil"
40         "encoding/json"
41 )
42
43 var BASIC_XAPPLIST = []byte(`[
44  {
45  "name":"xapp-01","status":"unknown","version":"1.2.3",
46     "instances":[
47         {"name":"xapp-01-instance-01","status":"pending","ip":"172.16.1.103","port":4555,
48             "txMessages":["ControlIndication"],
49             "rxMessages":["LoadIndication","Reset"]
50         },
51         {"name":"xapp-01-instance-02","status":"pending","ip":"10.244.1.12","port":4561,
52             "txMessages":["ControlIndication","SNStatusTransfer"],
53             "rxMessages":["LoadIndication","HandoverPreparation"]
54         }
55     ]
56 }
57 ]`)
58
59 var SUBSCRIPTION_RESP = []byte(`{"ID":"deadbeef1234567890", "Version":0, "EventType":"all"}`)
60
61
62 var INVALID_SUB_RESP = []byte(`{"Version":0, "EventType":all}`)
63
64
65 func createMockAppmgrWithData(url string, g []byte, p []byte) *httptest.Server {
66         l, err := net.Listen("tcp", url)
67         if err != nil {
68                 fmt.Println("Failed to create listener: " + err.Error())
69         }
70         ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
71                 if r.Method == "GET" && r.URL.String() == "/ric/v1/xapps" {
72                         w.Header().Add("Content-Type", "application/json")
73                         w.WriteHeader(http.StatusOK)
74                         w.Write(g)
75                 }
76                 if r.Method == "POST" && r.URL.String() == "/ric/v1/subscriptions" {
77                         w.Header().Add("Content-Type", "application/json")
78                         w.WriteHeader(http.StatusCreated)
79                         w.Write(p)
80                 }
81
82         }))
83         ts.Listener.Close()
84         ts.Listener = l
85         return ts
86 }
87
88 func createMockPlatformComponents() {
89         var filename = string("config.json")
90         file, _ := json.MarshalIndent(stub.ValidPlatformComponents, "", "")
91         filestr := string(file)
92         filestr = "{\"PlatformComponents\":"+filestr+"}"
93         file = []byte(filestr)
94         _ = ioutil.WriteFile(filename, file, 644)
95 }
96
97 func TestRecvXappCallbackData(t *testing.T) {
98         data := models.XappCallbackData {
99                 Data: *swag.String("[]"),
100                 DataVersion: *swag.Int64(1),
101                 Event: *swag.String("any"),
102                 ID: *swag.Int64(123456),
103         }
104
105         ch := make(chan *models.XappCallbackData)
106         defer close(ch)
107         httpRestful := NewHttpRestful()
108         go func() {ch<- &data}()
109         time.Sleep(1 * time.Second)
110         t.Log(string(len(ch)))
111         xappList, err := httpRestful.RecvXappCallbackData(ch)
112         if err != nil {
113                 t.Error("Receive failed: "+err.Error())
114         } else {
115                 if xappList == nil {
116                         t.Error("Expected an XApp notification list")
117                 } else {
118                         t.Log("whatever")
119                 }
120         }
121 }
122
123 func TestProvideXappHandleHandlerImpl(t *testing.T) {
124         datach := make(chan *models.XappCallbackData, 10)
125         defer close(datach)
126         data := models.XappCallbackData{
127                 Data: *swag.String("[]"),
128                 DataVersion: *swag.Int64(1),
129                 Event: *swag.String("someevent"),
130                 ID: *swag.Int64(123456)}
131         var httpRestful, _ = GetNbi("httpRESTful")
132         err := httpRestful.(*HttpRestful).ProvideXappHandleHandlerImpl(datach, &data)
133         if err != nil {
134                 t.Error("Error occured: "+err.Error())
135         } else {
136                 recv := <-datach
137                 if recv == nil {
138                         t.Error("Something gone wrong: "+err.Error())
139                 } else {
140                         if recv != &data {
141                                 t.Error("Malformed data on channel")
142                         }
143                 }
144         }
145 }
146
147 func TestValidateXappCallbackData(t *testing.T) {
148         data := models.XappCallbackData{
149                 Data: *swag.String("[]"),
150                 DataVersion: *swag.Int64(1),
151                 Event: *swag.String("someevent"),
152                 ID: *swag.Int64(123456)}
153
154         err := validateXappCallbackData(&data)
155         if err != nil {
156                 t.Error("Invalid XApp callback data: "+err.Error())
157         }
158 }
159
160 func TestValidateXappCallbackDataWithInvalidData(t *testing.T) {
161         data := models.XappCallbackData{
162                 Data: *swag.String("{}"),
163                 DataVersion: *swag.Int64(1),
164                 Event: *swag.String("someevent"),
165                 ID: *swag.Int64(123456)}
166
167         err := validateXappCallbackData(&data)
168         if err == nil {
169                 t.Error("Invalid XApp callback data: "+err.Error())
170         }
171 }
172
173
174 func TestHttpGetXappsInvalidData(t *testing.T) {
175         _, err := httpGetXapps(XMURL)
176         if err == nil {
177                 t.Error("No XApp data received: "+err.Error())
178         }
179 }
180
181 func TestHttpGetXappsWithValidData(t *testing.T) {
182         var expected int = 1
183         ts := createMockAppmgrWithData("127.0.0.1:3000", BASIC_XAPPLIST, nil)
184
185         ts.Start()
186         defer ts.Close()
187         xapplist, err := httpGetXapps(XMURL)
188         if err != nil {
189                 t.Error("Error occured: " + err.Error())
190         } else {
191                 if len(*xapplist) != expected {
192                         t.Error("Invalid XApp data: got " + string(len(*xapplist)) + ", expected " + string(expected))
193                 }
194         }
195 }
196
197 func TestRetrieveStartupDataTimeout(t *testing.T) {
198         sdlEngine, _ := sdl.GetSdl("file")
199         createMockPlatformComponents()
200         err := retrieveStartupData(XMURL, "httpgetter","rt.json", "config.json", sdlEngine)
201         if err == nil {
202                 t.Error("Cannot retrieve startup data: "+err.Error())
203         }
204         os.Remove("rt.json")
205         os.Remove("config.json")
206 }
207
208 func TestRetrieveStartupData(t *testing.T) {
209         ts := createMockAppmgrWithData("127.0.0.1:3000", BASIC_XAPPLIST, SUBSCRIPTION_RESP)
210         ts.Start()
211         defer ts.Close()
212         sdlEngine, _ := sdl.GetSdl("file")
213         var httpRestful, _ = GetNbi("httpRESTful")
214         createMockPlatformComponents()
215         err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json","config.json", sdlEngine)
216         //err := retrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
217         if err != nil {
218                 t.Error("Cannot retrieve startup data: "+err.Error())
219         }
220         os.Remove("rt.json")
221         os.Remove("config.json")
222 }
223
224 func TestRetrieveStartupDataWithInvalidSubResp(t *testing.T) {
225         ts := createMockAppmgrWithData("127.0.0.1:3000", BASIC_XAPPLIST, INVALID_SUB_RESP)
226         ts.Start()
227         defer ts.Close()
228         sdlEngine, _ := sdl.GetSdl("file")
229         var httpRestful, _ = GetNbi("httpRESTful")
230         createMockPlatformComponents()
231         err := httpRestful.(*HttpRestful).RetrieveStartupData(XMURL, "httpgetter", "rt.json", "config.json", sdlEngine)
232         if err == nil {
233                 t.Error("Cannot retrieve startup data: "+err.Error())
234         }
235         os.Remove("rt.json")
236         os.Remove("config.json")
237 }