crontabex/crontab_test.go

130 lines
3.0 KiB
Go

package crontab
import (
"fmt"
"log"
"runtime"
"testing"
"time"
)
// type LRValue struct {
// left, right int
// }
func TestParseCrontab(t *testing.T) {
// crontab := "0-5/2,7-30/3,30,35,40-^1 * * * *" //(秒) 分 时 号(每月的多少号, 要注意月可可能性) 星期几(每个星期的) /每 ,列表 -范围
crontab := "* * * * *"
PrintMemUsage()
ty := newTrieYear()
cron := NewCrontab(crontab)
ty.FromCrontab(cron)
if len(ty.GetPlanTime(cron, time.Now(), 10)) != 10 {
t.Error("GetPlanTime error len != 10")
}
cron.createYearPlan()
if cron.TimeUp() {
t.Error("timeup error", cron.WillPlans[0:2])
}
PrintMemUsage()
}
func TestParseInterval(t *testing.T) {
//crontab := "0-5/2,7-30/3,30,35,40-^1 * * * *" //(秒) 分 时 号(每月的多少号, 要注意月可可能性) 星期几(每个星期的) /每 ,列表 -范围
//crontab := "f1-2|1-3|5-8x5,f1|10m,10-15,f22?15-12"
crontab := "2s"
cron := NewCrontab(crontab)
now := time.Now()
for i := 0; i <= 3; i++ {
log.Println(cron.NextTime())
if cron.TimeUp() {
sec := time.Since(now).Seconds()
if i != 0 {
if 2.0 <= sec && sec <= 2.1 {
t.Log(sec)
} else {
t.Error("interval time is ", sec)
}
}
now = time.Now()
}
time.Sleep(time.Second)
}
}
func TestParseIntervalPlus(t *testing.T) {
// crontab := "0-5/2,7-30/3,30,35,40-^1 * * * *" //(秒) 分 时 号(每月的多少号, 要注意月可可能性) 星期几(每个星期的) /每 ,列表 -范围
// crondata := NewCrontab("*22 * * * *")
//crontab := "0-5/2,7-30/3,30,35,40-^1 * * * *" //(秒) 分 时 号(每月的多少号, 要注意月可可能性) 星期几(每个星期的) /每 ,列表 -范围
//crontab := "f1-2|1-3|5-8x5,f1|10m,10-15,f1" ^代表往后算 ^5 2月份就代表 28-4=24 f代表失败后1-2秒设置 由SetStatus控制 t 相反默认不写前缀为t
crontab := "f2|f2?3|f3?4|1"
cron := NewCrontab(crontab)
now := time.Now()
t.Error("")
for i := 0; i <= 5*15; i++ {
cron.NextTime()
if cron.TimeUp() {
sec := time.Since(now).Seconds()
cron.SetStatus(false)
t.Error(i, sec)
if i == 0 {
if 1.0 <= sec && sec <= 1.1 {
t.Log(sec)
} else {
t.Error(i, "interval time is ", sec)
}
}
if i == 1 {
if 2.0 <= sec && sec <= 2.1 {
t.Log(sec)
} else {
t.Error(i, "interval time is ", sec)
}
}
if i == 2 {
if 3.0 <= sec && sec <= 3.1 {
t.Log(sec)
} else {
t.Error(i, "interval time is ", sec)
}
}
if i == 3 {
if 4.0 <= sec && sec <= 4.1 {
t.Log(sec)
} else {
t.Error(i, "interval time is ", sec)
}
}
now = time.Now()
}
time.Sleep(time.Millisecond * 200)
}
}
func PrintMemUsage() {
var m runtime.MemStats
runtime.ReadMemStats(&m)
// For info on each, see: https://golang.org/pkg/runtime/#MemStats
fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
fmt.Printf("\tNumGC = %v\n", m.NumGC)
}
func bToMb(b uint64) uint64 {
return b / 1024 / 1024
}