blob: e70b84e97c15f6e2aaacab7319cfb77a35930f2c [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package time_test
import (
"os"
"syscall"
"testing"
"sort"
. "time"
)
func TestSleep(t *testing.T) {
const delay = int64(100e6)
go func() {
Sleep(delay / 2)
syscall.Kill(os.Getpid(), syscall.SIGCHLD)
}()
start := Nanoseconds()
Sleep(delay)
duration := Nanoseconds() - start
if duration < delay {
t.Fatalf("Sleep(%d) slept for only %d ns", delay, duration)
}
}
func TestAfter(t *testing.T) {
const delay = int64(100e6)
start := Nanoseconds()
end := <-After(delay)
if duration := Nanoseconds() - start; duration < delay {
t.Fatalf("After(%d) slept for only %d ns", delay, duration)
}
if min := start + delay; end < min {
t.Fatalf("After(%d) expect >= %d, got %d", delay, min, end)
}
}
func TestAfterTick(t *testing.T) {
const (
Delta = 100 * 1e6
Count = 10
)
t0 := Nanoseconds()
for i := 0; i < Count; i++ {
<-After(Delta)
}
t1 := Nanoseconds()
ns := t1 - t0
target := int64(Delta * Count)
slop := target * 2 / 10
if ns < target-slop || ns > target+slop {
t.Fatalf("%d ticks of %g ns took %g ns, expected %g", Count, float64(Delta), float64(ns), float64(target))
}
}
var slots = []int{5, 3, 6, 6, 6, 1, 1, 2, 7, 9, 4, 8, 0}
type afterResult struct {
slot int
t int64
}
func await(slot int, result chan<- afterResult, ac <-chan int64) {
result <- afterResult{slot, <-ac}
}
func TestAfterQueuing(t *testing.T) {
const (
Delta = 100 * 1e6
)
// make the result channel buffered because we don't want
// to depend on channel queueing semantics that might
// possibly change in the future.
result := make(chan afterResult, len(slots))
t0 := Nanoseconds()
for _, slot := range slots {
go await(slot, result, After(int64(slot)*Delta))
}
sort.SortInts(slots)
for _, slot := range slots {
r := <-result
if r.slot != slot {
t.Fatalf("after queue got slot %d, expected %d", r.slot, slot)
}
ns := r.t - t0
target := int64(slot * Delta)
slop := int64(Delta) / 4
if ns < target-slop || ns > target+slop {
t.Fatalf("after queue slot %d arrived at %g, expected [%g,%g]", slot, float64(ns), float64(target-slop), float64(target+slop))
}
}
}