blob: c2946aaa3629dac266f0da9e67adebf646df16fb [file] [log] [blame]
/*
* Copyright (c) 2019 AT&T Intellectual Property.
* Copyright (c) 2018-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 (
"io/ioutil"
"net/http"
"os"
"strings"
"testing"
"github.com/stretchr/testify/suite"
)
type HTTPServerTestSuite struct {
suite.Suite
chNotif chan []byte
chSupervision chan chan string
server HTTPServer
}
// suite setup creates the HTTP server
func (suite *HTTPServerTestSuite) SetupSuite() {
os.Unsetenv("http_proxy")
os.Unsetenv("HTTP_PROXY")
suite.chNotif = make(chan []byte)
suite.chSupervision = make(chan chan string)
suite.server = HTTPServer{}
suite.server.init(":0")
suite.server.start("/vesmgr_notif/", suite.chNotif, suite.chSupervision)
}
func (suite *HTTPServerTestSuite) TestHtppServerSupervisionInvalidOperation() {
resp, reply := suite.doPost("http://"+suite.server.addr().String()+SupervisionURL, "supervision")
suite.Equal("405 method not allowed\n", reply)
suite.Equal(405, resp.StatusCode)
suite.Equal("405 Method Not Allowed", resp.Status)
}
func (suite *HTTPServerTestSuite) doGet(url string) (*http.Response, string) {
resp, err := http.Get(url)
suite.Nil(err)
defer resp.Body.Close()
contents, err := ioutil.ReadAll(resp.Body)
suite.Nil(err)
return resp, string(contents)
}
func (suite *HTTPServerTestSuite) doPost(serverURL string, msg string) (*http.Response, string) {
resp, err := http.Post(serverURL, "data", strings.NewReader(msg))
suite.Nil(err)
defer resp.Body.Close()
contents, err := ioutil.ReadAll(resp.Body)
suite.Nil(err)
return resp, string(contents)
}
func replySupervision(chSupervision chan chan string, reply string) {
chSupervisionAck := <-chSupervision
chSupervisionAck <- reply
}
func (suite *HTTPServerTestSuite) TestHttpServerSupervision() {
// start the "main loop" to reply to the supervision to the HTTPServer
go replySupervision(suite.chSupervision, "I'm just fine")
resp, reply := suite.doGet("http://" + suite.server.addr().String() + SupervisionURL)
suite.Equal("I'm just fine", reply)
suite.Equal(200, resp.StatusCode)
suite.Equal("200 OK", resp.Status)
}
func (suite *HTTPServerTestSuite) TestHttpServerInvalidUrl() {
resp, reply := suite.doPost("http://"+suite.server.addr().String()+"/invalid_url", "foo")
suite.Equal("404 page not found\n", reply)
suite.Equal(404, resp.StatusCode)
suite.Equal("404 Not Found", resp.Status)
}
func readXAppNotification(chNotif chan []byte, ch chan []byte) {
notification := <-chNotif
ch <- notification
}
func (suite *HTTPServerTestSuite) TestHttpServerXappNotif() {
// start the "main loop" to receive the xAppNotification message from the HTTPServer
ch := make(chan []byte)
go readXAppNotification(suite.chNotif, ch)
resp, reply := suite.doPost("http://"+suite.server.addr().String()+"/vesmgr_notif/", "test data")
suite.Equal("", reply)
suite.Equal(200, resp.StatusCode)
suite.Equal("200 OK", resp.Status)
notification := <-ch
suite.Equal([]byte("test data"), notification)
}
func (suite *HTTPServerTestSuite) TestHttpServerXappNotifInvalidOperation() {
resp, reply := suite.doGet("http://" + suite.server.addr().String() + "/vesmgr_notif/")
suite.Equal("405 method not allowed\n", reply)
suite.Equal(405, resp.StatusCode)
suite.Equal("405 Method Not Allowed", resp.Status)
}
func TestHttpServerSuite(t *testing.T) {
suite.Run(t, new(HTTPServerTestSuite))
}