Skip to content
Snippets Groups Projects
Unverified Commit f76a60d4 authored by Tomasz Maczukin's avatar Tomasz Maczukin
Browse files

Add tests for HTTP Statistics Server

parent fb9b615c
No related branches found
No related tags found
No related merge requests found
......@@ -94,4 +94,4 @@ func (b *buildsHelper) removeBuild(deleteBuild *common.Build) bool {
func (b *buildsHelper) buildsCount() int {
return len(b.builds)
}
\ No newline at end of file
}
......@@ -57,6 +57,9 @@ type RunCommand struct {
// runFinished is used to notify that Run() did finish
runFinished chan bool
// statsServingStarted is used to notify that HTTP Statistics Server started serving statistics
statsServingStarted chan bool
}
func (mr *RunCommand) log() *log.Entry {
......@@ -240,6 +243,7 @@ func (mr *RunCommand) Start(s service.Service) error {
mr.runSignal = make(chan os.Signal, 1)
mr.reloadSignal = make(chan os.Signal, 1)
mr.runFinished = make(chan bool, 1)
mr.statsServingStarted = make(chan bool, 1)
mr.stopSignals = make(chan os.Signal)
mr.startedAt = time.Now()
mr.log().Println("Starting multi-runner from", mr.ConfigFile, "...")
......@@ -323,7 +327,7 @@ func (mr *RunCommand) Run() {
signal.Notify(mr.stopSignals, syscall.SIGQUIT, syscall.SIGTERM, os.Interrupt, os.Kill)
signal.Notify(mr.reloadSignal, syscall.SIGHUP)
statsServer := stats_server.NewStatsServer(mr.statsServerAddress(), mr, mr.runFinished)
statsServer := stats_server.NewStatsServer(mr.statsServerAddress(), mr, mr.runFinished, mr.statsServingStarted)
go statsServer.Start()
startWorker := make(chan int)
......
......@@ -67,9 +67,10 @@ func (h *StatsHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
}
type StatsServer struct {
address string
command RunCommand
runFinished chan bool
address string
command RunCommand
runFinished chan bool
servingStarted chan bool
}
type StatsServerNotEnabledError struct {
......@@ -113,6 +114,8 @@ func (server *StatsServer) Start() {
log.WithField("socket", listener.Addr()).Infoln("Starting StatsServer...")
go srv.Serve(listener)
server.servingStarted <- true
<-server.runFinished
log.Infoln("Stopping StatsServer...")
server.runFinished <- true
......@@ -144,10 +147,11 @@ func (server *StatsServer) parseAddress() (net, address string, err error) {
return
}
func NewStatsServer(address string, runCommand RunCommand, runFinished chan bool) *StatsServer {
func NewStatsServer(address string, runCommand RunCommand, runFinished chan bool, servingStarted chan bool) *StatsServer {
return &StatsServer{
address: address,
command: runCommand,
runFinished: runFinished,
address: address,
command: runCommand,
runFinished: runFinished,
servingStarted: servingStarted,
}
}
package stats_server
import (
"encoding/json"
"io/ioutil"
"net/http"
"testing"
"time"
log "github.com/Sirupsen/logrus"
"gitlab.com/gitlab-org/gitlab-ci-multi-runner/common"
)
func TestStatsDataJSONEncoding(t *testing.T) {
startedAt, _ := time.Parse(time.RFC3339, "2016-07-02T00:01:44+02:00")
configReloadedAt, _ := time.Parse(time.RFC3339, "2016-07-02T00:01:44+02:00")
buildAt, _ := time.Parse(time.RFC3339, "2016-07-02T00:01:28+02:00")
data := StatsData{
StartedAt: startedAt,
ConfigReloadedAt: configReloadedAt,
BuildsCount: 5,
RunnersBuildsCounts: map[string]int{
"abc1234": 3,
"def5678": 2,
},
Uptime: 0.1234,
VersionInfo: common.AppVersionInfo{
Name: "gitlab-ci-multi-runner",
Version: "1.3.0~beta.26.gbdcb5e6",
Revision: "bdcb5e6",
Branch: "feature/stats-server",
GOVersion: "go1.6.2",
BuiltAt: buildAt,
OS: "linux",
Architecture: "amd64",
},
}
encodedData, _ := json.Marshal(data)
expectedData := []byte("{\"started_at\":\"2016-07-02T00:01:44+02:00\",\"config_reloaded_at\":\"2016-07-02T00:01:44+02:00\",\"builds_count\":5,\"runners_builds_counts\":{\"abc1234\":3,\"def5678\":2},\"uptime\":0.1234,\"version_info\":{\"name\":\"gitlab-ci-multi-runner\",\"version\":\"1.3.0~beta.26.gbdcb5e6\",\"revision\":\"bdcb5e6\",\"branch\":\"feature/stats-server\",\"go_version\":\"go1.6.2\",\"built_at\":\"2016-07-02T00:01:28+02:00\",\"os\":\"linux\",\"architecture\":\"amd64\"}}")
equal := true
for i := range encodedData {
if encodedData[i] != expectedData[i] {
equal = false
break
}
}
if !equal {
t.Error("JSON encoding invalid.\nexpected:\n\t", string(expectedData), "\ngot:\n\t", string(encodedData))
}
}
var STARTED_AT = "2016-07-02T00:01:44+02:00"
var CONFIG_RELOADED_AT = "2016-07-02T00:01:44+02:00"
type TestRunCommand struct{}
func (t *TestRunCommand) StatsData() StatsData {
startedAt, _ := time.Parse(time.RFC3339, STARTED_AT)
configReloadedAt, _ := time.Parse(time.RFC3339, CONFIG_RELOADED_AT)
return StatsData{
StartedAt: startedAt,
ConfigReloadedAt: configReloadedAt,
BuildsCount: 5,
RunnersBuildsCounts: map[string]int{
"abc1234": 3,
"def5678": 2,
},
}
}
func TestStatsHandlerPrepare(t *testing.T) {
handler := StatsHandler{
command: &TestRunCommand{},
}
statsData := handler.data()
if statsData.Uptime <= 0 {
t.Error("Uptime should not greather than 0")
}
if statsData.VersionInfo != common.AppVersion {
t.Error("Version info is invalid\nexpected:\n\t", common.AppVersion, "\ngot:\n\t", statsData.VersionInfo)
}
}
func StartServer() (finished, servingStarted chan bool) {
finished = make(chan bool, 1)
servingStarted = make(chan bool, 1)
server := NewStatsServer("tcp://127.0.0.1:64000", &TestRunCommand{}, finished, servingStarted)
go server.Start()
return
}
func TestHTTPServer(t *testing.T) {
finished, servingStarted := StartServer()
<-servingStarted
log.Errorln("test")
res, err := http.Get("http://127.0.0.1:64000")
if err != nil {
t.Error(err)
}
body, err := ioutil.ReadAll(res.Body)
res.Body.Close()
if err != nil {
t.Error(err)
}
data := &StatsData{}
err = json.Unmarshal(body, data)
if err != nil {
t.Error(err)
}
finished <- true
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment