2018-08-16 06:22:20 +00:00
|
|
|
// Statup
|
|
|
|
// Copyright (C) 2018. Hunter Long and the project contributors
|
|
|
|
// Written by Hunter Long <info@socialeck.com> and the project contributors
|
|
|
|
//
|
|
|
|
// https://github.com/hunterlong/statup
|
|
|
|
//
|
|
|
|
// The licenses for most software and other practical works are designed
|
|
|
|
// to take away your freedom to share and change the works. By contrast,
|
|
|
|
// the GNU General Public License is intended to guarantee your freedom to
|
|
|
|
// share and change all versions of a program--to make sure it remains free
|
|
|
|
// software for all its users.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2018-07-27 04:45:42 +00:00
|
|
|
package core
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/hunterlong/statup/types"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"testing"
|
2018-08-19 00:37:00 +00:00
|
|
|
"time"
|
2018-07-27 04:45:42 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
newServiceId int64
|
|
|
|
)
|
|
|
|
|
2018-09-05 10:54:57 +00:00
|
|
|
func TestSelectHTTPService(t *testing.T) {
|
|
|
|
services, err := CoreApp.SelectAllServices()
|
|
|
|
assert.Nil(t, err)
|
2018-09-15 01:18:21 +00:00
|
|
|
assert.Equal(t, 15, len(services))
|
2018-09-05 10:54:57 +00:00
|
|
|
assert.Equal(t, "Google", services[0].Name)
|
|
|
|
assert.Equal(t, "http", services[0].Type)
|
|
|
|
}
|
|
|
|
|
2018-07-27 04:45:42 +00:00
|
|
|
func TestSelectAllServices(t *testing.T) {
|
2018-09-08 22:16:26 +00:00
|
|
|
services := CoreApp.Services
|
2018-08-21 03:11:40 +00:00
|
|
|
for _, s := range services {
|
2018-09-08 22:16:26 +00:00
|
|
|
service := s.(*Service)
|
|
|
|
service.Check(true)
|
2018-09-05 10:54:57 +00:00
|
|
|
assert.True(t, service.IsRunning())
|
2018-09-08 22:16:26 +00:00
|
|
|
t.Logf("ID: %v %v\n", service.Id, service.Name)
|
2018-08-21 03:11:40 +00:00
|
|
|
}
|
2018-09-15 01:18:21 +00:00
|
|
|
assert.Equal(t, 15, len(services))
|
2018-07-28 01:50:13 +00:00
|
|
|
}
|
|
|
|
|
2018-09-16 10:29:52 +00:00
|
|
|
func TestServiceDowntime(t *testing.T) {
|
|
|
|
service := SelectService(15)
|
|
|
|
downtime := service.Downtime()
|
2018-09-19 00:46:23 +00:00
|
|
|
assert.True(t, downtime.Minutes() > 0)
|
2018-09-16 10:29:52 +00:00
|
|
|
}
|
|
|
|
|
2018-07-28 01:50:13 +00:00
|
|
|
func TestSelectTCPService(t *testing.T) {
|
2018-09-08 22:16:26 +00:00
|
|
|
services := CoreApp.Services
|
2018-09-15 01:18:21 +00:00
|
|
|
assert.Equal(t, 15, len(services))
|
2018-07-28 01:50:13 +00:00
|
|
|
service := SelectService(5)
|
2018-09-05 10:54:57 +00:00
|
|
|
assert.NotNil(t, service)
|
2018-08-19 00:37:00 +00:00
|
|
|
assert.Equal(t, "Google DNS", service.Name)
|
|
|
|
assert.Equal(t, "tcp", service.Type)
|
2018-07-27 04:45:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestUpdateService(t *testing.T) {
|
|
|
|
service := SelectService(1)
|
2018-08-21 03:11:40 +00:00
|
|
|
service2 := SelectService(2)
|
2018-08-19 00:37:00 +00:00
|
|
|
assert.Equal(t, "Google", service.Name)
|
2018-08-21 03:11:40 +00:00
|
|
|
assert.Equal(t, "Statup Github", service2.Name)
|
|
|
|
assert.True(t, service.Online)
|
|
|
|
assert.True(t, service2.Online)
|
|
|
|
service.Name = "Updated Google"
|
|
|
|
service.Interval = 5
|
2018-08-22 05:41:15 +00:00
|
|
|
err := service.Update(true)
|
2018-08-20 07:20:05 +00:00
|
|
|
assert.Nil(t, err)
|
2018-08-21 03:11:40 +00:00
|
|
|
// check if updating pointer array shutdown any other service
|
|
|
|
service2 = SelectService(2)
|
|
|
|
assert.True(t, service2.Online)
|
2018-07-27 04:45:42 +00:00
|
|
|
}
|
|
|
|
|
2018-08-19 00:37:00 +00:00
|
|
|
func TestUpdateAllServices(t *testing.T) {
|
2018-08-20 07:20:05 +00:00
|
|
|
services, err := CoreApp.SelectAllServices()
|
2018-08-19 00:37:00 +00:00
|
|
|
assert.Nil(t, err)
|
2018-09-08 22:16:26 +00:00
|
|
|
for k, srv := range services {
|
2018-08-19 00:37:00 +00:00
|
|
|
srv.Name = "Changed " + srv.Name
|
|
|
|
srv.Interval = k + 3
|
2018-08-22 05:41:15 +00:00
|
|
|
err := srv.Update(true)
|
2018-08-20 07:20:05 +00:00
|
|
|
assert.Nil(t, err)
|
2018-08-19 00:37:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-27 04:45:42 +00:00
|
|
|
func TestServiceHTTPCheck(t *testing.T) {
|
|
|
|
service := SelectService(1)
|
2018-09-08 22:16:26 +00:00
|
|
|
service.Check(true)
|
|
|
|
assert.Equal(t, "Changed Updated Google", service.Name)
|
|
|
|
assert.True(t, service.Online)
|
2018-07-27 04:45:42 +00:00
|
|
|
}
|
|
|
|
|
2018-07-28 01:50:13 +00:00
|
|
|
func TestCheckHTTPService(t *testing.T) {
|
2018-08-19 00:37:00 +00:00
|
|
|
service := SelectService(1)
|
|
|
|
assert.Equal(t, "Changed Updated Google", service.Name)
|
2018-07-27 04:45:42 +00:00
|
|
|
assert.True(t, service.Online)
|
|
|
|
assert.Equal(t, 200, service.LastStatusCode)
|
|
|
|
assert.NotZero(t, service.Latency)
|
2018-10-03 03:48:40 +00:00
|
|
|
assert.NotZero(t, service.PingTime)
|
2018-07-27 04:45:42 +00:00
|
|
|
}
|
|
|
|
|
2018-07-28 01:50:13 +00:00
|
|
|
func TestServiceTCPCheck(t *testing.T) {
|
|
|
|
service := SelectService(5)
|
2018-09-08 22:16:26 +00:00
|
|
|
service.Check(true)
|
|
|
|
assert.Equal(t, "Changed Google DNS", service.Name)
|
|
|
|
assert.True(t, service.Online)
|
2018-07-28 01:50:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCheckTCPService(t *testing.T) {
|
2018-08-19 00:37:00 +00:00
|
|
|
service := SelectService(5)
|
|
|
|
assert.Equal(t, "Changed Google DNS", service.Name)
|
2018-07-28 01:50:13 +00:00
|
|
|
assert.True(t, service.Online)
|
|
|
|
assert.NotZero(t, service.Latency)
|
2018-10-03 03:48:40 +00:00
|
|
|
assert.NotZero(t, service.PingTime)
|
2018-07-28 01:50:13 +00:00
|
|
|
}
|
|
|
|
|
2018-08-16 01:07:02 +00:00
|
|
|
func TestServiceOnline24Hours(t *testing.T) {
|
2018-09-15 01:18:21 +00:00
|
|
|
since := time.Now().Add(-24 * time.Hour).Add(-10 * time.Minute)
|
2018-09-05 10:54:57 +00:00
|
|
|
service := SelectService(1)
|
2018-09-15 01:18:21 +00:00
|
|
|
assert.Equal(t, float32(100), service.OnlineSince(since))
|
2018-09-05 10:54:57 +00:00
|
|
|
service2 := SelectService(5)
|
|
|
|
assert.Equal(t, float32(100), service2.OnlineSince(since))
|
2018-09-15 01:18:21 +00:00
|
|
|
service3 := SelectService(14)
|
2018-09-15 02:53:54 +00:00
|
|
|
assert.True(t, service3.OnlineSince(since) > float32(49))
|
2018-08-16 01:07:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestServiceSmallText(t *testing.T) {
|
|
|
|
service := SelectService(5)
|
|
|
|
text := service.SmallText()
|
|
|
|
assert.Contains(t, text, "Online since")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestServiceAvgUptime(t *testing.T) {
|
2018-09-15 01:18:21 +00:00
|
|
|
since := time.Now().Add(-24 * time.Hour).Add(-10 * time.Minute)
|
2018-09-05 10:54:57 +00:00
|
|
|
service := SelectService(1)
|
2018-09-10 09:27:53 +00:00
|
|
|
assert.NotEqual(t, "0.00", service.AvgUptime(since))
|
2018-09-05 10:54:57 +00:00
|
|
|
service2 := SelectService(5)
|
|
|
|
assert.Equal(t, "100", service2.AvgUptime(since))
|
2018-09-15 01:18:21 +00:00
|
|
|
service3 := SelectService(13)
|
2018-09-15 03:02:27 +00:00
|
|
|
assert.NotEqual(t, "0", service3.AvgUptime(since))
|
2018-09-15 01:18:21 +00:00
|
|
|
service4 := SelectService(15)
|
2018-09-15 02:53:54 +00:00
|
|
|
assert.NotEqual(t, "0", service4.AvgUptime(since))
|
2018-08-16 01:07:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestServiceHits(t *testing.T) {
|
|
|
|
service := SelectService(5)
|
|
|
|
hits, err := service.Hits()
|
|
|
|
assert.Nil(t, err)
|
2018-09-15 01:18:21 +00:00
|
|
|
assert.Equal(t, int(1452), len(hits))
|
2018-08-16 01:07:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestServiceLimitedHits(t *testing.T) {
|
|
|
|
service := SelectService(5)
|
|
|
|
hits, err := service.LimitedHits()
|
|
|
|
assert.Nil(t, err)
|
2018-09-15 01:18:21 +00:00
|
|
|
assert.Equal(t, int(1024), len(hits))
|
2018-08-16 01:07:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestServiceTotalHits(t *testing.T) {
|
|
|
|
service := SelectService(5)
|
|
|
|
hits, err := service.TotalHits()
|
|
|
|
assert.Nil(t, err)
|
2018-10-03 10:47:32 +00:00
|
|
|
assert.NotZero(t, hits)
|
2018-08-16 01:07:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestServiceSum(t *testing.T) {
|
|
|
|
service := SelectService(5)
|
|
|
|
sum, err := service.Sum()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.NotZero(t, sum)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestCountOnline(t *testing.T) {
|
2018-09-08 22:16:26 +00:00
|
|
|
amount := CoreApp.CountOnline()
|
2018-09-15 01:18:21 +00:00
|
|
|
assert.True(t, amount >= 2)
|
2018-08-16 01:07:02 +00:00
|
|
|
}
|
|
|
|
|
2018-07-27 04:45:42 +00:00
|
|
|
func TestCreateService(t *testing.T) {
|
2018-08-20 07:20:05 +00:00
|
|
|
s := ReturnService(&types.Service{
|
2018-08-19 00:37:00 +00:00
|
|
|
Name: "That'll do 🐢",
|
|
|
|
Domain: "https://www.youtube.com/watch?v=rjQtzV9IZ0Q",
|
2018-07-27 04:45:42 +00:00
|
|
|
ExpectedStatus: 200,
|
2018-08-19 00:37:00 +00:00
|
|
|
Interval: 3,
|
2018-07-27 04:45:42 +00:00
|
|
|
Type: "http",
|
|
|
|
Method: "GET",
|
|
|
|
Timeout: 20,
|
2018-08-20 07:20:05 +00:00
|
|
|
})
|
2018-07-27 04:45:42 +00:00
|
|
|
var err error
|
2018-09-15 01:18:21 +00:00
|
|
|
newServiceId, err = s.Create(false)
|
2018-07-27 04:45:42 +00:00
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.NotZero(t, newServiceId)
|
2018-08-19 00:37:00 +00:00
|
|
|
newService := SelectService(newServiceId)
|
|
|
|
assert.Equal(t, "That'll do 🐢", newService.Name)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestViewNewService(t *testing.T) {
|
|
|
|
newService := SelectService(newServiceId)
|
|
|
|
assert.Equal(t, "That'll do 🐢", newService.Name)
|
2018-07-27 04:45:42 +00:00
|
|
|
}
|
|
|
|
|
2018-07-28 01:50:13 +00:00
|
|
|
func TestCreateFailingHTTPService(t *testing.T) {
|
2018-08-20 07:20:05 +00:00
|
|
|
s := ReturnService(&types.Service{
|
2018-07-28 01:50:13 +00:00
|
|
|
Name: "Bad URL",
|
|
|
|
Domain: "http://localhost/iamnothere",
|
|
|
|
ExpectedStatus: 200,
|
2018-08-19 00:37:00 +00:00
|
|
|
Interval: 2,
|
2018-07-28 01:50:13 +00:00
|
|
|
Type: "http",
|
|
|
|
Method: "GET",
|
|
|
|
Timeout: 5,
|
2018-08-20 07:20:05 +00:00
|
|
|
})
|
2018-07-28 01:50:13 +00:00
|
|
|
var err error
|
2018-09-15 01:18:21 +00:00
|
|
|
newServiceId, err = s.Create(false)
|
2018-07-28 01:50:13 +00:00
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.NotZero(t, newServiceId)
|
2018-08-19 00:37:00 +00:00
|
|
|
newService := SelectService(newServiceId)
|
2018-07-28 01:50:13 +00:00
|
|
|
assert.Equal(t, "Bad URL", newService.Name)
|
2018-09-05 10:54:57 +00:00
|
|
|
t.Log("new service ID: ", newServiceId)
|
2018-07-28 01:50:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestServiceFailedCheck(t *testing.T) {
|
2018-09-15 01:18:21 +00:00
|
|
|
service := SelectService(17)
|
2018-09-05 10:54:57 +00:00
|
|
|
assert.Equal(t, "Bad URL", service.Name)
|
2018-09-08 22:16:26 +00:00
|
|
|
service.Check(true)
|
|
|
|
assert.Equal(t, "Bad URL", service.Name)
|
|
|
|
assert.False(t, service.Online)
|
2018-07-28 01:50:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCreateFailingTCPService(t *testing.T) {
|
2018-08-20 07:20:05 +00:00
|
|
|
s := ReturnService(&types.Service{
|
2018-07-28 01:50:13 +00:00
|
|
|
Name: "Bad TCP",
|
|
|
|
Domain: "localhost",
|
|
|
|
Port: 5050,
|
|
|
|
Interval: 30,
|
|
|
|
Type: "tcp",
|
|
|
|
Timeout: 5,
|
2018-08-20 07:20:05 +00:00
|
|
|
})
|
2018-07-28 01:50:13 +00:00
|
|
|
var err error
|
2018-09-15 01:18:21 +00:00
|
|
|
newServiceId, err = s.Create(false)
|
2018-07-28 01:50:13 +00:00
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.NotZero(t, newServiceId)
|
2018-08-19 00:37:00 +00:00
|
|
|
newService := SelectService(newServiceId)
|
2018-07-28 01:50:13 +00:00
|
|
|
assert.Equal(t, "Bad TCP", newService.Name)
|
2018-09-05 10:54:57 +00:00
|
|
|
t.Log("new failing tcp service ID: ", newServiceId)
|
2018-07-28 01:50:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestServiceFailedTCPCheck(t *testing.T) {
|
2018-09-15 01:18:21 +00:00
|
|
|
service := SelectService(newServiceId)
|
2018-09-08 22:16:26 +00:00
|
|
|
service.Check(true)
|
|
|
|
assert.Equal(t, "Bad TCP", service.Name)
|
|
|
|
assert.False(t, service.Online)
|
2018-07-28 01:50:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCreateServiceFailure(t *testing.T) {
|
2018-08-20 07:20:05 +00:00
|
|
|
fail := &types.Failure{
|
|
|
|
Issue: "This is not an issue, but it would container HTTP response errors.",
|
|
|
|
Method: "http",
|
2018-07-28 01:50:13 +00:00
|
|
|
}
|
|
|
|
service := SelectService(8)
|
2018-08-20 07:20:05 +00:00
|
|
|
id, err := service.CreateFailure(fail)
|
2018-07-28 01:50:13 +00:00
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.NotZero(t, id)
|
|
|
|
}
|
|
|
|
|
2018-07-27 04:45:42 +00:00
|
|
|
func TestDeleteService(t *testing.T) {
|
2018-08-19 00:37:00 +00:00
|
|
|
service := SelectService(newServiceId)
|
2018-07-27 04:45:42 +00:00
|
|
|
|
2018-08-20 07:20:05 +00:00
|
|
|
count, err := CoreApp.SelectAllServices()
|
2018-07-27 04:45:42 +00:00
|
|
|
assert.Nil(t, err)
|
2018-09-15 01:18:21 +00:00
|
|
|
assert.Equal(t, 18, len(count))
|
2018-07-27 04:45:42 +00:00
|
|
|
|
2018-08-20 07:20:05 +00:00
|
|
|
err = service.Delete()
|
2018-07-27 04:45:42 +00:00
|
|
|
assert.Nil(t, err)
|
|
|
|
|
2018-09-08 22:16:26 +00:00
|
|
|
services := CoreApp.Services
|
2018-09-15 01:18:21 +00:00
|
|
|
assert.Equal(t, 17, len(services))
|
2018-07-27 04:45:42 +00:00
|
|
|
}
|
2018-08-19 00:37:00 +00:00
|
|
|
|
|
|
|
func TestServiceCloseRoutine(t *testing.T) {
|
2018-08-20 07:20:05 +00:00
|
|
|
s := ReturnService(new(types.Service))
|
2018-08-19 00:37:00 +00:00
|
|
|
s.Name = "example"
|
|
|
|
s.Domain = "https://google.com"
|
|
|
|
s.Type = "http"
|
|
|
|
s.Method = "GET"
|
|
|
|
s.ExpectedStatus = 200
|
|
|
|
s.Interval = 1
|
2018-08-20 07:20:05 +00:00
|
|
|
s.Start()
|
|
|
|
assert.True(t, s.IsRunning())
|
2018-08-21 01:22:42 +00:00
|
|
|
t.Log(s.Checkpoint)
|
2018-09-08 22:16:26 +00:00
|
|
|
t.Log(s.SleepDuration)
|
2018-08-20 07:20:05 +00:00
|
|
|
go s.CheckQueue(false)
|
2018-08-21 01:22:42 +00:00
|
|
|
t.Log(s.Checkpoint)
|
2018-09-08 22:16:26 +00:00
|
|
|
t.Log(s.SleepDuration)
|
2018-08-21 01:22:42 +00:00
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
t.Log(s.Checkpoint)
|
2018-09-08 22:16:26 +00:00
|
|
|
t.Log(s.SleepDuration)
|
2018-08-21 01:22:42 +00:00
|
|
|
assert.True(t, s.IsRunning())
|
|
|
|
s.Close()
|
|
|
|
assert.False(t, s.IsRunning())
|
|
|
|
s.Close()
|
|
|
|
assert.False(t, s.IsRunning())
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestServiceCheckQueue(t *testing.T) {
|
|
|
|
s := ReturnService(new(types.Service))
|
|
|
|
s.Name = "example"
|
|
|
|
s.Domain = "https://google.com"
|
|
|
|
s.Type = "http"
|
|
|
|
s.Method = "GET"
|
|
|
|
s.ExpectedStatus = 200
|
|
|
|
s.Interval = 1
|
|
|
|
s.Start()
|
|
|
|
assert.True(t, s.IsRunning())
|
|
|
|
go s.CheckQueue(false)
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
time.Sleep(5 * time.Second)
|
|
|
|
t.Log(s.Checkpoint)
|
|
|
|
time.Sleep(6 * time.Second)
|
|
|
|
}()
|
|
|
|
|
2018-08-19 00:37:00 +00:00
|
|
|
time.Sleep(5 * time.Second)
|
2018-08-20 07:20:05 +00:00
|
|
|
assert.True(t, s.IsRunning())
|
|
|
|
s.Close()
|
|
|
|
assert.False(t, s.IsRunning())
|
|
|
|
s.Close()
|
|
|
|
assert.False(t, s.IsRunning())
|
2018-08-19 00:37:00 +00:00
|
|
|
}
|
2018-08-22 05:41:15 +00:00
|
|
|
|
|
|
|
func TestDNScheckService(t *testing.T) {
|
|
|
|
s := ReturnService(new(types.Service))
|
|
|
|
s.Name = "example"
|
|
|
|
s.Domain = "http://localhost:9000"
|
|
|
|
s.Type = "http"
|
|
|
|
s.Method = "GET"
|
|
|
|
s.ExpectedStatus = 200
|
|
|
|
s.Interval = 1
|
|
|
|
amount, err := s.dnsCheck()
|
|
|
|
assert.Nil(t, err)
|
|
|
|
assert.NotZero(t, amount)
|
|
|
|
}
|