blob: 1521da3c4bec0c2eed90f59c0e62ceab04276834 [file] [log] [blame]
Katri Turunen412df962019-09-16 08:48:18 +03001/*
2 * Copyright (c) 2019 AT&T Intellectual Property.
3 * Copyright (c) 2018-2019 Nokia.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Roni Riska6ffba082019-11-27 10:59:54 +020016 *
17 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 * platform project (RICP).
19 *
Katri Turunen412df962019-09-16 08:48:18 +030020 */
21
22package main
23
24import (
25 "bytes"
26 "encoding/json"
27 "fmt"
Katri Turunen412df962019-09-16 08:48:18 +030028 "io/ioutil"
29 "net/http"
30 "net/http/httptest"
31 "testing"
Roni Riskafc77ebb2019-09-26 08:20:44 +030032
33 "github.com/stretchr/testify/suite"
Katri Turunen412df962019-09-16 08:48:18 +030034)
35
Roni Riskafc77ebb2019-09-26 08:20:44 +030036type AppmgrHTTPServerTestSuite struct {
Katri Turunen412df962019-09-16 08:48:18 +030037 suite.Suite
Roni Riskafc77ebb2019-09-26 08:20:44 +030038 subscriptions chan subscriptionNotification
39 xappNotifURL string
Katri Turunen412df962019-09-16 08:48:18 +030040}
41
42// suite setup
Roni Riskafc77ebb2019-09-26 08:20:44 +030043func (suite *AppmgrHTTPServerTestSuite) SetupSuite() {
44 // the url here is not actually used anywhere
45 suite.xappNotifURL = "http://127.0.0.1:8080" + vesmgrXappNotifPath
46 suite.subscriptions = make(chan subscriptionNotification)
Katri Turunen412df962019-09-16 08:48:18 +030047}
48
49// test setup
Roni Riskafc77ebb2019-09-26 08:20:44 +030050func (suite *AppmgrHTTPServerTestSuite) SetupTest() {
51 suite.subscriptions = make(chan subscriptionNotification)
Katri Turunen412df962019-09-16 08:48:18 +030052}
53
Roni Riskafc77ebb2019-09-26 08:20:44 +030054func (suite *AppmgrHTTPServerTestSuite) TestSubscribexAppNotifications() {
Katri Turunen412df962019-09-16 08:48:18 +030055 testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
56 body, _ := ioutil.ReadAll(req.Body)
57 var result map[string]interface{}
58 err := json.Unmarshal([]byte(body), &result)
59 suite.Nil(err)
Roni Riskace6ecc62020-01-28 11:58:06 +020060 data := result["Data"].(map[string]interface{})
61 suite.Equal(5, int(data["maxRetries"].(float64)))
62 suite.Equal(5, int(data["retryTimer"].(float64)))
63 suite.Equal("all", data["eventType"].(string))
Katri Turunen412df962019-09-16 08:48:18 +030064 suite.Equal("POST", req.Method)
65 res.Header().Add("Content-Type", "application/json")
66 res.WriteHeader(http.StatusCreated)
67 res.Write([]byte(`{"id":"deadbeef1234567890", "version":0, "eventType":"all"}`))
68 }))
69 defer testServer.Close()
70
Roni Riskafc77ebb2019-09-26 08:20:44 +030071 go subscribexAppNotifications(suite.xappNotifURL, suite.subscriptions, 1, testServer.URL)
Katri Turunen412df962019-09-16 08:48:18 +030072 isSubscribed := <-suite.subscriptions
73 suite.Nil(isSubscribed.err)
Roni Riskafc77ebb2019-09-26 08:20:44 +030074 suite.Equal("deadbeef1234567890", isSubscribed.subsID)
Katri Turunen412df962019-09-16 08:48:18 +030075}
76
Roni Riskafc77ebb2019-09-26 08:20:44 +030077func (suite *AppmgrHTTPServerTestSuite) TestSubscribexAppNotificationsWrongStatus() {
Katri Turunen412df962019-09-16 08:48:18 +030078 testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
79 res.Header().Add("Content-Type", "application/json")
80 res.WriteHeader(http.StatusUnauthorized)
81 res.Write([]byte(`{"id":"deadbeef1234567890", "version":0, "eventType":"all"}`))
82 }))
83 defer testServer.Close()
84
Roni Riskafc77ebb2019-09-26 08:20:44 +030085 requestBody := []byte(fmt.Sprintf(`{"maxRetries": 5, "retryTimer": 5, "eventType":"all", "targetUrl": "%v"}`, suite.xappNotifURL))
Katri Turunen412df962019-09-16 08:48:18 +030086 req, _ := http.NewRequest("POST", testServer.URL, bytes.NewBuffer(requestBody))
87 req.Header.Set("Content-Type", "application/json")
88 client := &http.Client{}
89
Roni Riskafc77ebb2019-09-26 08:20:44 +030090 subsID, err := subscribexAppNotificationsClientDo(req, client)
Katri Turunen412df962019-09-16 08:48:18 +030091 suite.Equal(errWrongStatusCode, err)
92 // after failed POST vesmgr.appmgrSubsId holds an initial values
Roni Riskafc77ebb2019-09-26 08:20:44 +030093 suite.Equal("", subsID)
Katri Turunen412df962019-09-16 08:48:18 +030094}
95
Roni Riskafc77ebb2019-09-26 08:20:44 +030096func (suite *AppmgrHTTPServerTestSuite) TestSubscribexAppNotificationsWrongUrl() {
Katri Turunen412df962019-09-16 08:48:18 +030097 // use fake appmgrUrl that is not served in unit test
Roni Riskafc77ebb2019-09-26 08:20:44 +030098 appmgrURL := "/I_do_not_exist/"
99 requestBody := []byte(fmt.Sprintf(`{"maxRetries": 5, "retryTimer": 5, "eventType":"all", "targetUrl": "%v"}`, suite.xappNotifURL))
100 req, _ := http.NewRequest("POST", appmgrURL, bytes.NewBuffer(requestBody))
Katri Turunen412df962019-09-16 08:48:18 +0300101 req.Header.Set("Content-Type", "application/json")
102 client := &http.Client{}
103
Roni Riskafc77ebb2019-09-26 08:20:44 +0300104 subsID, err := subscribexAppNotificationsClientDo(req, client)
Katri Turunen412df962019-09-16 08:48:18 +0300105 suite.Equal(errPostingFailed, err)
106 // after failed POST vesmgr.appmgrSubsId holds an initial values
Roni Riskafc77ebb2019-09-26 08:20:44 +0300107 suite.Equal("", subsID)
Katri Turunen412df962019-09-16 08:48:18 +0300108}
109
Roni Riskafc77ebb2019-09-26 08:20:44 +0300110func (suite *AppmgrHTTPServerTestSuite) TestSubscribexAppNotificationsReadBodyFails() {
Katri Turunen412df962019-09-16 08:48:18 +0300111 testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
112 res.Header().Set("Content-Length", "1")
113 res.Header().Add("Content-Type", "application/json")
114 res.WriteHeader(http.StatusCreated)
115 }))
116 defer testServer.Close()
117
Roni Riskafc77ebb2019-09-26 08:20:44 +0300118 go subscribexAppNotifications(suite.xappNotifURL, suite.subscriptions, 1, testServer.URL)
Katri Turunen412df962019-09-16 08:48:18 +0300119 isSubscribed := <-suite.subscriptions
120 suite.Equal("unexpected EOF", isSubscribed.err.Error())
Roni Riskafc77ebb2019-09-26 08:20:44 +0300121 suite.Equal("", isSubscribed.subsID)
Katri Turunen412df962019-09-16 08:48:18 +0300122}
123
Roni Riskafc77ebb2019-09-26 08:20:44 +0300124func (suite *AppmgrHTTPServerTestSuite) TestSubscribexAppNotificationsUnMarshalFails() {
Katri Turunen412df962019-09-16 08:48:18 +0300125 testServer := httptest.NewServer(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
126 res.Header().Add("Content-Type", "application/json")
127 res.WriteHeader(http.StatusCreated)
128 res.Write([]byte(`{""dump for UT": make(chan int),"}`))
129 }))
130 defer testServer.Close()
131
Roni Riskafc77ebb2019-09-26 08:20:44 +0300132 go subscribexAppNotifications(suite.xappNotifURL, suite.subscriptions, 1, testServer.URL)
Katri Turunen412df962019-09-16 08:48:18 +0300133 isSubscribed := <-suite.subscriptions
134 suite.Equal("invalid character 'd' after object key", isSubscribed.err.Error())
Roni Riskafc77ebb2019-09-26 08:20:44 +0300135 suite.Equal("", isSubscribed.subsID)
Katri Turunen412df962019-09-16 08:48:18 +0300136}
137
138func TestAppmgrHttpServerTestSuite(t *testing.T) {
Roni Riskafc77ebb2019-09-26 08:20:44 +0300139 suite.Run(t, new(AppmgrHTTPServerTestSuite))
Katri Turunen412df962019-09-16 08:48:18 +0300140}