/* ================================================================================== 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 main import ( "bytes" "encoding/json" "fmt" sdl "gerrit.oran-osc.org/r/ric-plt/sdlgo" "github.com/spf13/viper" "log" "net" "net/http" "net/http/httptest" "testing" ) var resp SubscriptionResp // Test cases func TestNoSubscriptionsFound(t *testing.T) { req, _ := http.NewRequest("GET", "/ric/v1/subscriptions", nil) response := executeRequest(req) checkResponseCode(t, http.StatusOK, response.Code) if body := response.Body.String(); body != "[]" { t.Errorf("handler returned unexpected body: got %v want []", body) } } func TestAddNewSubscription(t *testing.T) { payload := []byte(`{"maxRetries": 3, "retryTimer": 5, "eventType":"Created", "targetUrl": "http://localhost:8087/xapps_handler"}`) req, _ := http.NewRequest("POST", "/ric/v1/subscriptions", bytes.NewBuffer(payload)) response := executeRequest(req) checkResponseCode(t, http.StatusCreated, response.Code) json.NewDecoder(response.Body).Decode(&resp) if resp.Version != 0 { t.Errorf("Creating new subscription failed: %v", resp) } } func TestGettAllSubscriptions(t *testing.T) { req, _ := http.NewRequest("GET", "/ric/v1/subscriptions", nil) response := executeRequest(req) checkResponseCode(t, http.StatusOK, response.Code) var subscriptions []SubscriptionReq json.NewDecoder(response.Body).Decode(&subscriptions) verifySubscription(t, subscriptions[0], "http://localhost:8087/xapps_handler", 3, 5, "Created") } func TestGetSingleSubscription(t *testing.T) { req, _ := http.NewRequest("GET", "/ric/v1/subscriptions/"+resp.Id, nil) response := executeRequest(req) checkResponseCode(t, http.StatusOK, response.Code) var subscription SubscriptionReq json.NewDecoder(response.Body).Decode(&subscription) verifySubscription(t, subscription, "http://localhost:8087/xapps_handler", 3, 5, "Created") } func TestUpdateSingleSubscription(t *testing.T) { payload := []byte(`{"maxRetries": 11, "retryTimer": 22, "eventType":"Deleted", "targetUrl": "http://localhost:8088/xapps_handler"}`) req, _ := http.NewRequest("PUT", "/ric/v1/subscriptions/"+resp.Id, bytes.NewBuffer(payload)) response := executeRequest(req) checkResponseCode(t, http.StatusOK, response.Code) var res SubscriptionResp json.NewDecoder(response.Body).Decode(&res) if res.Version != 0 { t.Errorf("handler returned unexpected data: %v", resp) } // Check that the subscription is updated properly req, _ = http.NewRequest("GET", "/ric/v1/subscriptions/"+resp.Id, nil) response = executeRequest(req) checkResponseCode(t, http.StatusOK, response.Code) var subscription SubscriptionReq json.NewDecoder(response.Body).Decode(&subscription) verifySubscription(t, subscription, "http://localhost:8088/xapps_handler", 11, 22, "Deleted") } func TestDeleteSingleSubscription(t *testing.T) { req, _ := http.NewRequest("DELETE", "/ric/v1/subscriptions/"+resp.Id, nil) response := executeRequest(req) checkResponseCode(t, http.StatusNoContent, response.Code) // Check that the subscription is removed properly req, _ = http.NewRequest("GET", "/ric/v1/subscriptions/"+resp.Id, nil) response = executeRequest(req) checkResponseCode(t, http.StatusNotFound, response.Code) } func TestDeleteSingleSubscriptionFails(t *testing.T) { req, _ := http.NewRequest("DELETE", "/ric/v1/subscriptions/invalidSubscriptionId", nil) response := executeRequest(req) checkResponseCode(t, http.StatusNotFound, response.Code) } func TestAddSingleSubscriptionFailsBodyEmpty(t *testing.T) { req, _ := http.NewRequest("POST", "/ric/v1/subscriptions/"+resp.Id, nil) response := executeRequest(req) checkResponseCode(t, http.StatusMethodNotAllowed, response.Code) } func TestUpdateeSingleSubscriptionFailsBodyEmpty(t *testing.T) { req, _ := http.NewRequest("PUT", "/ric/v1/subscriptions/"+resp.Id, nil) response := executeRequest(req) checkResponseCode(t, http.StatusMethodNotAllowed, response.Code) } func TestUpdateeSingleSubscriptionFailsInvalidId(t *testing.T) { payload := []byte(`{"maxRetries": 11, "retryTimer": 22, "eventType":"Deleted", "targetUrl": "http://localhost:8088/xapps_handler"}`) req, _ := http.NewRequest("PUT", "/ric/v1/subscriptions/invalidSubscriptionId"+resp.Id, bytes.NewBuffer(payload)) response := executeRequest(req) checkResponseCode(t, http.StatusNotFound, response.Code) } func TestPublishXappAction(t *testing.T) { payload := []byte(`{"maxRetries": 3, "retryTimer": 5, "eventType":"Created", "targetUrl": "http://127.0.0.1:8888"}`) req, _ := http.NewRequest("POST", "/ric/v1/subscriptions", bytes.NewBuffer(payload)) response := executeRequest(req) checkResponseCode(t, http.StatusCreated, response.Code) // Create a RestApi server (simulating RM) ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello, XM!") })) l, err := net.Listen("tcp", "127.0.0.1:8888") if err != nil { log.Fatal(err) } ts.Listener.Close() ts.Listener = l ts.Start() defer ts.Close() x.sd.Publish(xapp, EventType("created")) } func TestTeardown(t *testing.T) { db := sdl.NewSdlInstance(viper.GetString("db.sessionNamespace"), sdl.NewDatabase()) db.RemoveAll() } func verifySubscription(t *testing.T, subscription SubscriptionReq, url string, retries int, timer int, event string) { if subscription.TargetUrl != url { t.Errorf("Unexpected url: got=%s expected=%s", subscription.TargetUrl, url) } if subscription.MaxRetries != retries { t.Errorf("Unexpected retries: got=%d expected=%d", subscription.MaxRetries, retries) } if subscription.RetryTimer != timer { t.Errorf("Unexpected timer: got=%d expected=%d", subscription.RetryTimer, timer) } if subscription.EventType != event { t.Errorf("Unexpected event type: got=%s expected=%s", subscription.EventType, event) } }