Initial version
Change-Id: Ia95ac0cc8321d78489de7b728449f94e5553f27a
Signed-off-by: Mohamed Abukar <abukar.mohamed@nokia.com>
diff --git a/pkg/xapp/xapp_test.go b/pkg/xapp/xapp_test.go
new file mode 100755
index 0000000..51ac171
--- /dev/null
+++ b/pkg/xapp/xapp_test.go
@@ -0,0 +1,188 @@
+/*
+==================================================================================
+ Copyright (c) 2019 AT&T Intellectual Property.
+ Copyright (c) 2019 Nokia
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================================
+*/
+
+package xapp
+
+import (
+ "github.com/gorilla/mux"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "strings"
+ "testing"
+ "time"
+)
+
+type Consumer struct {
+}
+
+func (m Consumer) Consume(mtype, sid, len int, payload []byte) (err error) {
+ Sdl.Store("myKey", payload)
+ return nil
+}
+
+// Test cases
+func TestMain(m *testing.M) {
+ // Just run on the background (for coverage)
+ go Run(Consumer{})
+
+ code := m.Run()
+ os.Exit(code)
+}
+
+func TestGetHealthCheckRetursServiceUnavailableError(t *testing.T) {
+ req, _ := http.NewRequest("GET", "/ric/v1/health/ready", nil)
+ response := executeRequest(req)
+
+ checkResponseCode(t, http.StatusServiceUnavailable, response.Code)
+}
+
+func TestGetHealthCheckReturnsSuccess(t *testing.T) {
+ // Wait until RMR is up-and-running
+ for Rmr.IsReady() == false {
+ time.Sleep(time.Duration(2) * time.Second)
+ }
+
+ req, _ := http.NewRequest("GET", "/ric/v1/health/ready", nil)
+ response := executeRequest(req)
+
+ checkResponseCode(t, http.StatusOK, response.Code)
+}
+
+func TestInjectQuerySinglePath(t *testing.T) {
+ var handler = func(w http.ResponseWriter, r *http.Request) {
+ }
+
+ Resource.InjectQueryRoute("/ric/v1/user", handler, "GET", "foo", "bar")
+
+ req, _ := http.NewRequest("GET", "/ric/v1/user?foo=bar", nil)
+ response := executeRequest(req)
+ checkResponseCode(t, http.StatusOK, response.Code)
+}
+
+func TestInjectQueryMultiplePaths(t *testing.T) {
+ var handler = func(w http.ResponseWriter, r *http.Request) {
+ }
+
+ Resource.InjectQueryRoute("/ric/v1/user", handler, "GET", "foo", "bar", "id", "mykey")
+
+ req, _ := http.NewRequest("GET", "/ric/v1/user?foo=bar&id=mykey", nil)
+ response := executeRequest(req)
+ checkResponseCode(t, http.StatusOK, response.Code)
+}
+
+func TestInjectQueryFailures(t *testing.T) {
+ var handler = func(w http.ResponseWriter, r *http.Request) {
+ }
+
+ Resource.InjectQueryRoute("/ric/v1/user", handler, "GET", "foo", "bar", "id", "mykey")
+
+ req, _ := http.NewRequest("GET", "/ric/v1/user?invalid=bar&no=mykey", nil)
+ response := executeRequest(req)
+ checkResponseCode(t, http.StatusNotFound, response.Code)
+}
+
+func TestMessagesReceivedSuccessfully(t *testing.T) {
+ for i := 0; i < 100; i++ {
+ Rmr.Send(10004, 1111, 100, []byte{1, 2, 3, 4, 5, 6})
+ }
+
+ // Allow time to process the messages
+ time.Sleep(time.Duration(2) * time.Second)
+
+ stats := getMetrics(t)
+ if !strings.Contains(stats, "ricxapp_RMR_Transmitted 100") {
+ t.Errorf("Error: ricxapp_RMR_Transmitted value incorrect")
+ }
+
+ if !strings.Contains(stats, "ricxapp_RMR_Received 100") {
+ t.Errorf("Error: ricxapp_RMR_Received value incorrect")
+ }
+
+ if !strings.Contains(stats, "ricxapp_RMR_TransmitError 0") {
+ t.Errorf("Error: ricxapp_RMR_TransmitError value incorrect")
+ }
+
+ if !strings.Contains(stats, "ricxapp_RMR_ReceiveError 0") {
+ t.Errorf("Error: ricxapp_RMR_ReceiveError value incorrect")
+ }
+
+ if !strings.Contains(stats, "ricxapp_SDL_Stored 100") {
+ t.Errorf("Error: ricxapp_SDL_Stored value incorrect")
+ }
+
+ if !strings.Contains(stats, "ricxapp_SDL_StoreError 0") {
+ t.Errorf("Error: ricxapp_SDL_StoreError value incorrect")
+ }
+}
+
+func TestGetgNBList(t *testing.T) {
+ Rnib.Store("Kiikale", "Hello")
+ Rnib.Store("mykey", "myval")
+
+ v, _ := Rnib.GetgNBList()
+ if v["Kiikale"] != "Hello" || v["mykey"] != "myval" {
+ t.Errorf("Error: GetgNBList failed!")
+ }
+}
+
+func TestSubscribeChannels(t *testing.T) {
+ var NotificationCb = func(ch string, events ...string) {
+ if ch != "channel1" {
+ t.Errorf("Error: Callback function called with incorrect params")
+ }
+ }
+
+ if err := Sdl.Subscribe(NotificationCb, "channel1"); err != nil {
+ t.Errorf("Error: Subscribe failed: %v", err)
+ }
+ time.Sleep(time.Duration(2) * time.Second)
+
+ if err := Sdl.StoreAndPublish("channel1", "event", "key1", "data1"); err != nil {
+ t.Errorf("Error: Publish failed: %v", err)
+ }
+}
+
+func TestTeardown(t *testing.T) {
+ Sdl.Clear()
+ Rnib.Clear()
+}
+
+// Helper functions
+func executeRequest(req *http.Request) *httptest.ResponseRecorder {
+ rr := httptest.NewRecorder()
+ vars := map[string]string{"id": "1"}
+ req = mux.SetURLVars(req, vars)
+ Resource.router.ServeHTTP(rr, req)
+
+ return rr
+}
+
+func checkResponseCode(t *testing.T, expected, actual int) {
+ if expected != actual {
+ t.Errorf("Expected response code %d. Got %d\n", expected, actual)
+ }
+}
+
+func getMetrics(t *testing.T) string {
+ req, _ := http.NewRequest("GET", "/ric/v1/metrics", nil)
+ response := executeRequest(req)
+
+ return response.Body.String()
+}
\ No newline at end of file