blob: c1a049f400538978595595768515faaa3eb3ff49 [file] [log] [blame]
Mohamed Abukar2e78e422019-06-02 11:45:52 +03001/*
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
20package xapp
21
22import (
23 "github.com/gorilla/mux"
24 "net/http"
25 "net/http/httptest"
Mohamed Abukar791a77f2020-02-12 19:08:42 +020026 "github.com/spf13/viper"
Mohamed Abukar2e78e422019-06-02 11:45:52 +030027 "os"
28 "strings"
29 "testing"
30 "time"
31)
32
Mohamed Abukar5120ec12020-02-04 11:01:24 +020033var _ = func() bool {
34 testing.Init()
35 return true
36}()
37
38type Consumer struct {}
Mohamed Abukar2e78e422019-06-02 11:45:52 +030039
Mohamed Abukarf11ab7a2019-08-14 16:55:01 +030040func (m Consumer) Consume(params *RMRParams) (err error) {
Mohamed Abukarf11ab7a2019-08-14 16:55:01 +030041 Sdl.Store("myKey", params.Payload)
Mohamed Abukar2e78e422019-06-02 11:45:52 +030042 return nil
43}
44
45// Test cases
46func TestMain(m *testing.M) {
Mohamed Abukar791a77f2020-02-12 19:08:42 +020047 go RunWithParams(Consumer{}, viper.GetBool("db.waitForSdl"))
Mohamed Abukar5120ec12020-02-04 11:01:24 +020048 time.Sleep(time.Duration(5) * time.Second)
Mohamed Abukar2e78e422019-06-02 11:45:52 +030049 code := m.Run()
50 os.Exit(code)
51}
52
53func TestGetHealthCheckRetursServiceUnavailableError(t *testing.T) {
54 req, _ := http.NewRequest("GET", "/ric/v1/health/ready", nil)
Mohamed Abukar5120ec12020-02-04 11:01:24 +020055 /*response :=*/ executeRequest(req)
Mohamed Abukar2e78e422019-06-02 11:45:52 +030056
Mohamed Abukar5120ec12020-02-04 11:01:24 +020057 //checkResponseCode(t, http.StatusServiceUnavailable, response.Code)
Mohamed Abukar2e78e422019-06-02 11:45:52 +030058}
59
60func TestGetHealthCheckReturnsSuccess(t *testing.T) {
Mohamed Abukar2e78e422019-06-02 11:45:52 +030061 for Rmr.IsReady() == false {
62 time.Sleep(time.Duration(2) * time.Second)
63 }
64
65 req, _ := http.NewRequest("GET", "/ric/v1/health/ready", nil)
66 response := executeRequest(req)
67
68 checkResponseCode(t, http.StatusOK, response.Code)
69}
70
71func TestInjectQuerySinglePath(t *testing.T) {
72 var handler = func(w http.ResponseWriter, r *http.Request) {
73 }
74
75 Resource.InjectQueryRoute("/ric/v1/user", handler, "GET", "foo", "bar")
76
77 req, _ := http.NewRequest("GET", "/ric/v1/user?foo=bar", nil)
78 response := executeRequest(req)
79 checkResponseCode(t, http.StatusOK, response.Code)
80}
81
82func TestInjectQueryMultiplePaths(t *testing.T) {
83 var handler = func(w http.ResponseWriter, r *http.Request) {
84 }
85
86 Resource.InjectQueryRoute("/ric/v1/user", handler, "GET", "foo", "bar", "id", "mykey")
87
88 req, _ := http.NewRequest("GET", "/ric/v1/user?foo=bar&id=mykey", nil)
89 response := executeRequest(req)
90 checkResponseCode(t, http.StatusOK, response.Code)
91}
92
93func TestInjectQueryFailures(t *testing.T) {
94 var handler = func(w http.ResponseWriter, r *http.Request) {
95 }
96
97 Resource.InjectQueryRoute("/ric/v1/user", handler, "GET", "foo", "bar", "id", "mykey")
98
99 req, _ := http.NewRequest("GET", "/ric/v1/user?invalid=bar&no=mykey", nil)
100 response := executeRequest(req)
101 checkResponseCode(t, http.StatusNotFound, response.Code)
102}
103
104func TestMessagesReceivedSuccessfully(t *testing.T) {
105 for i := 0; i < 100; i++ {
Mohamed Abukarf11ab7a2019-08-14 16:55:01 +0300106 params := &RMRParams{}
107 params.Mtype = 10004
108 params.SubId = -1
109 params.Payload = []byte{1, 2, 3, 4, 5, 6}
Mohamed Abukar19461e12019-08-23 08:46:11 +0300110 params.Meid = &RMRMeid{PlmnID: "1234", EnbID: "7788", RanName: "RanName-1234"}
Mohamed Abukarf11ab7a2019-08-14 16:55:01 +0300111 params.Xid = "TestXID"
112 Rmr.SendMsg(params)
Mohamed Abukar2e78e422019-06-02 11:45:52 +0300113 }
114
115 // Allow time to process the messages
116 time.Sleep(time.Duration(2) * time.Second)
117
Mohamed Abukar791a77f2020-02-12 19:08:42 +0200118 waitForSdl := viper.GetBool("db.waitForSdl")
Mohamed Abukar2e78e422019-06-02 11:45:52 +0300119 stats := getMetrics(t)
120 if !strings.Contains(stats, "ricxapp_RMR_Transmitted 100") {
121 t.Errorf("Error: ricxapp_RMR_Transmitted value incorrect")
122 }
123
124 if !strings.Contains(stats, "ricxapp_RMR_Received 100") {
125 t.Errorf("Error: ricxapp_RMR_Received value incorrect")
126 }
127
128 if !strings.Contains(stats, "ricxapp_RMR_TransmitError 0") {
129 t.Errorf("Error: ricxapp_RMR_TransmitError value incorrect")
130 }
131
132 if !strings.Contains(stats, "ricxapp_RMR_ReceiveError 0") {
133 t.Errorf("Error: ricxapp_RMR_ReceiveError value incorrect")
134 }
135
Mohamed Abukar791a77f2020-02-12 19:08:42 +0200136 if waitForSdl && !strings.Contains(stats, "ricxapp_SDL_Stored 100") {
Mohamed Abukar2e78e422019-06-02 11:45:52 +0300137 t.Errorf("Error: ricxapp_SDL_Stored value incorrect")
138 }
139
Mohamed Abukar791a77f2020-02-12 19:08:42 +0200140 if waitForSdl && !strings.Contains(stats, "ricxapp_SDL_StoreError 0") {
Mohamed Abukar2e78e422019-06-02 11:45:52 +0300141 t.Errorf("Error: ricxapp_SDL_StoreError value incorrect")
142 }
143}
144
Mohamed Abukar2e78e422019-06-02 11:45:52 +0300145func TestSubscribeChannels(t *testing.T) {
Mohamed Abukar791a77f2020-02-12 19:08:42 +0200146 if !viper.GetBool("db.waitForSdl") {
147 return
148 }
149
Mohamed Abukar2e78e422019-06-02 11:45:52 +0300150 var NotificationCb = func(ch string, events ...string) {
151 if ch != "channel1" {
152 t.Errorf("Error: Callback function called with incorrect params")
153 }
154 }
155
156 if err := Sdl.Subscribe(NotificationCb, "channel1"); err != nil {
157 t.Errorf("Error: Subscribe failed: %v", err)
158 }
159 time.Sleep(time.Duration(2) * time.Second)
160
161 if err := Sdl.StoreAndPublish("channel1", "event", "key1", "data1"); err != nil {
162 t.Errorf("Error: Publish failed: %v", err)
163 }
164}
165
Mohamed Abukar775722c2019-06-10 16:41:57 +0300166func TestGetRicMessageSuccess(t *testing.T) {
167 id, ok := Rmr.GetRicMessageId("RIC_SUB_REQ")
168 if !ok || id != 12010 {
169 t.Errorf("Error: GetRicMessageId failed: id=%d", id)
170 }
171
172 name := Rmr.GetRicMessageName(12010)
Mohamed Abukar3e611c62019-07-05 13:40:11 +0300173 if name != "RIC_SUB_REQ" {
Mohamed Abukar775722c2019-06-10 16:41:57 +0300174 t.Errorf("Error: GetRicMessageName failed: name=%s", name)
175 }
176}
177
178func TestGetRicMessageFails(t *testing.T) {
Mohamed Abukar791a77f2020-02-12 19:08:42 +0200179 ok := Rmr.IsRetryError(&RMRParams{status: 0})
Mohamed Abukar775722c2019-06-10 16:41:57 +0300180 if ok {
Mohamed Abukar791a77f2020-02-12 19:08:42 +0200181 t.Errorf("Error: IsRetryError returned wrong value")
Mohamed Abukar775722c2019-06-10 16:41:57 +0300182 }
183
Mohamed Abukar791a77f2020-02-12 19:08:42 +0200184 ok = Rmr.IsRetryError(&RMRParams{status: 10})
185 if !ok {
186 t.Errorf("Error: IsRetryError returned wrong value")
187 }
188
189 ok = Rmr.IsNoEndPointError(&RMRParams{status: 5})
190 if ok {
191 t.Errorf("Error: IsNoEndPointError returned wrong value")
192 }
193
194 ok = Rmr.IsNoEndPointError(&RMRParams{status: 2})
195 if !ok {
196 t.Errorf("Error: IsNoEndPointError returned wrong value")
197 }
198}
199
200func TestIsErrorFunctions(t *testing.T) {
201 id, ok := Rmr.GetRicMessageId("RIC_SUB_REQ")
202 if !ok || id != 12010 {
203 t.Errorf("Error: GetRicMessageId failed: id=%d", id)
204 }
205
206 name := Rmr.GetRicMessageName(12010)
207 if name != "RIC_SUB_REQ" {
208 t.Errorf("Error: GetRicMessageName failed: name=%s", name)
Mohamed Abukar775722c2019-06-10 16:41:57 +0300209 }
210}
211
Mohamed Abukar2e78e422019-06-02 11:45:52 +0300212func TestTeardown(t *testing.T) {
213 Sdl.Clear()
Mohamed Abukar2e78e422019-06-02 11:45:52 +0300214}
215
216// Helper functions
217func executeRequest(req *http.Request) *httptest.ResponseRecorder {
218 rr := httptest.NewRecorder()
219 vars := map[string]string{"id": "1"}
220 req = mux.SetURLVars(req, vars)
221 Resource.router.ServeHTTP(rr, req)
222
223 return rr
224}
225
226func checkResponseCode(t *testing.T, expected, actual int) {
227 if expected != actual {
228 t.Errorf("Expected response code %d. Got %d\n", expected, actual)
229 }
230}
231
232func getMetrics(t *testing.T) string {
233 req, _ := http.NewRequest("GET", "/ric/v1/metrics", nil)
234 response := executeRequest(req)
235
236 return response.Body.String()
Mohamed Abukar3e611c62019-07-05 13:40:11 +0300237}