You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
1.9 KiB
90 lines
1.9 KiB
package idleshut
|
|
|
|
import (
|
|
"sync/atomic"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestFlow(t *testing.T) {
|
|
p := New(Config{})
|
|
if p.Running() {
|
|
t.Fatal("running when first started")
|
|
}
|
|
|
|
_ = p.Start()
|
|
if !p.Running() {
|
|
t.Fatal("should be running when started")
|
|
}
|
|
|
|
_ = p.Stop()
|
|
if p.Running() {
|
|
t.Fatal("running after stopped")
|
|
}
|
|
}
|
|
|
|
func TestTicking(t *testing.T) {
|
|
var idleTicksNonPtr uint32
|
|
var idleTicks = &idleTicksNonPtr
|
|
|
|
p := New(Config{
|
|
TickDuration: 10 * time.Millisecond,
|
|
MaxIdleTicks: 10,
|
|
IdleTick: func() error {
|
|
atomic.AddUint32(idleTicks, 1)
|
|
return nil
|
|
},
|
|
TickError: func(err error) {
|
|
t.Fatal("got an idle process error:", err)
|
|
},
|
|
})
|
|
|
|
// initial start
|
|
_ = p.Start()
|
|
if !p.Running() {
|
|
t.Fatal("should be running when started")
|
|
}
|
|
|
|
// use up all the ticks right away
|
|
time.Sleep(1 * time.Second)
|
|
|
|
if atomic.LoadUint32(idleTicks) != 10 {
|
|
t.Fatal("should have seen 10 idle ticks, which fits into MaxIdleTicks, saw", idleTicks)
|
|
}
|
|
if p.Running() {
|
|
t.Fatal("should be expired from idle ticks")
|
|
}
|
|
|
|
// reset the ticks, but dont restart the process
|
|
atomic.StoreUint32(idleTicks, 0)
|
|
time.Sleep(130 * time.Millisecond)
|
|
if atomic.LoadUint32(idleTicks) != 0 {
|
|
t.Fatal("should have seen 0 idle ticks with no process running, saw", idleTicks)
|
|
}
|
|
|
|
_ = p.Start()
|
|
if !p.Running() {
|
|
t.Fatal("should be running when started again")
|
|
}
|
|
|
|
time.Sleep(31 * time.Millisecond)
|
|
|
|
if saw := atomic.LoadUint32(idleTicks); saw != 3 {
|
|
t.Fatal("should have seen 3 idle ticks, saw", saw)
|
|
}
|
|
|
|
p.Touch()
|
|
time.Sleep(110 * time.Millisecond)
|
|
|
|
if saw := atomic.LoadUint32(idleTicks); saw != 13 {
|
|
t.Fatal("should have seen 13 idle ticks since we touched the process partway through, saw", saw)
|
|
}
|
|
|
|
// reset the ticks and restart the process
|
|
atomic.StoreUint32(idleTicks, 0)
|
|
_ = p.Start()
|
|
|
|
if g := p.generation(); g != 3 {
|
|
t.Fatal("we've started 3 times, but saw we counted to generation", g)
|
|
}
|
|
}
|
|
|