blob: d52f4b2d359070d8aa8a6495e8b6a16a39cd30e8 [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 (
"github.com/stretchr/testify/suite"
"io/ioutil"
"net"
"net/http"
"os"
"strings"
"testing"
)
type HttpServerTestSuite struct {
suite.Suite
listener net.Listener
ch_notif chan []byte
ch_supervision chan chan string
}
// suite setup creates the HTTP server
func (suite *HttpServerTestSuite) SetupSuite() {
os.Unsetenv("http_proxy")
os.Unsetenv("HTTP_PROXY")
var err error
suite.listener, err = net.Listen("tcp", ":0")
suite.Nil(err)
suite.ch_notif = make(chan []byte)
suite.ch_supervision = make(chan chan string)
startHttpServer(suite.listener, "/vesmgr_notif/", suite.ch_notif, suite.ch_supervision)
}
func (suite *HttpServerTestSuite) TestHtppServerSupervisionInvalidOperation() {
resp, reply := suite.doPost("http://"+suite.listener.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(ch_supervision chan chan string, reply string) {
ch_supervision_ack := <-ch_supervision
ch_supervision_ack <- reply
}
func (suite *HttpServerTestSuite) TestHttpServerSupervision() {
// start the "main loop" to reply to the supervision to the HTTPServer
go replySupervision(suite.ch_supervision, "I'm just fine")
resp, reply := suite.doGet("http://" + suite.listener.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.listener.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(ch_notif chan []byte, ch chan []byte) {
notification := <-ch_notif
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.ch_notif, ch)
resp, reply := suite.doPost("http://"+suite.listener.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.listener.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))
}