blob: 21c69c0230e5fe261712fad2a4d8e7790c62176d [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.
*
* This source code is part of the near-RT RIC (RAN Intelligent Controller)
* platform project (RICP).
*
*/
package main
import (
"errors"
"os"
"os/exec"
"path/filepath"
"strconv"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/suite"
)
func TestGetMyIP(t *testing.T) {
myIPAddress, err := getMyIP()
assert.NotEqual(t, string(""), myIPAddress)
assert.Nil(t, err)
}
func TestConfCreate(t *testing.T) {
tmpfile := filepath.Join(os.TempDir(), "vestest."+strconv.Itoa(os.Getpid()))
defer os.Remove(tmpfile) // clean up
createConf(tmpfile, []byte("{}"))
_, err := os.Stat(tmpfile)
assert.Nil(t, err)
}
type VesmgrTestSuite struct {
suite.Suite
vesmgr VesMgr
}
func (suite *VesmgrTestSuite) SetupSuite() {
suite.vesmgr = VesMgr{}
suite.vesmgr.Init("0")
logger.MdcAdd("Testvesmgr", "0.0.1")
os.Setenv("VESMGR_HB_INTERVAL", "30s")
os.Setenv("VESMGR_MEAS_INTERVAL", "30s")
os.Setenv("VESMGR_PRICOLLECTOR_ADDR", "127.1.1.1")
os.Setenv("VESMGR_PRICOLLECTOR_PORT", "8443")
os.Setenv("VESMGR_PROMETHEUS_ADDR", "http://localhost:9090")
}
func (suite *VesmgrTestSuite) TestMainLoopSupervision() {
go suite.vesmgr.servRequest()
ch := make(chan string)
suite.vesmgr.chSupervision <- ch
reply := <-ch
suite.Equal("OK", reply)
}
func (suite *VesmgrTestSuite) TestMainLoopVesagentError() {
if os.Getenv("TEST_VESPA_EXIT") == "1" {
// we're run in a new process, now make vesmgr main loop exit
go suite.vesmgr.servRequest()
suite.vesmgr.chVesagent <- errors.New("vesagent killed")
// we should never actually end up to this sleep, since the runVesmgr should exit
time.Sleep(3 * time.Second)
return
}
// Run the vesmgr exit test as a separate process
cmd := exec.Command(os.Args[0], "-test.run", "TestVesMgrSuite", "-testify.m", "TestMainLoopVesagentError")
cmd.Env = append(os.Environ(), "TEST_VESPA_EXIT=1")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
// check that vesmgr existed with status 1
e, ok := err.(*exec.ExitError)
suite.True(ok)
suite.Equal("exit status 1", e.Error())
}
func (suite *VesmgrTestSuite) TestWaitSubscriptionLoopRespondsSupervisionAndBreaksWhenReceivedSubsNotif() {
go func() {
time.Sleep(time.Second)
ch := make(chan string)
suite.vesmgr.chSupervision <- ch
suite.Equal("OK", <-ch)
suite.vesmgr.chSupervision <- ch
suite.Equal("OK", <-ch)
suite.vesmgr.chXAppSubscriptions <- subscriptionNotification{true, nil, ""}
}()
suite.vesmgr.waitSubscriptionLoop()
}
func (suite *VesmgrTestSuite) TestEmptyNotificationChannelReadsAllMsgsFromCh() {
go func() {
for i := 0; i < 11; i++ {
suite.vesmgr.chXAppNotifications <- []byte("hello")
}
}()
time.Sleep(500 * time.Millisecond)
<-suite.vesmgr.chXAppNotifications
suite.vesmgr.emptyNotificationsChannel()
select {
case <-suite.vesmgr.chXAppNotifications:
suite.Fail("Got unexpected notification")
default:
// ok
}
}
func (suite *VesmgrTestSuite) TestVespaKilling() {
suite.vesmgr.vesagent = makeRunner("sleep", "20")
suite.vesmgr.startVesagent()
suite.NotNil(suite.vesmgr.killVespa())
}
func (suite *VesmgrTestSuite) TestVespaKillingAlreadyKilled() {
suite.vesmgr.vesagent = makeRunner("sleep", "20")
suite.vesmgr.startVesagent()
suite.NotNil(suite.vesmgr.killVespa())
// Just check that second kill does not block execution
suite.NotNil(suite.vesmgr.killVespa())
}
func TestVesMgrSuite(t *testing.T) {
suite.Run(t, new(VesmgrTestSuite))
}