1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package time_test 6 7 import ( 8 "testing" 9 . "time" 10 ) 11 12 func TestTicker(t *testing.T) { 13 const Count = 10 14 Delta := 100 * Millisecond 15 ticker := NewTicker(Delta) 16 t0 := Now() 17 for i := 0; i < Count; i++ { 18 <-ticker.C 19 } 20 ticker.Stop() 21 t1 := Now() 22 dt := t1.Sub(t0) 23 target := Delta * Count 24 slop := target * 2 / 10 25 if dt < target-slop || (!testing.Short() && dt > target+slop) { 26 t.Fatalf("%d %s ticks took %s, expected [%s,%s]", Count, Delta, dt, target-slop, target+slop) 27 } 28 // Now test that the ticker stopped 29 Sleep(2 * Delta) 30 select { 31 case <-ticker.C: 32 t.Fatal("Ticker did not shut down") 33 default: 34 // ok 35 } 36 } 37 38 // Test that a bug tearing down a ticker has been fixed. This routine should not deadlock. 39 func TestTeardown(t *testing.T) { 40 Delta := 100 * Millisecond 41 if testing.Short() { 42 Delta = 20 * Millisecond 43 } 44 for i := 0; i < 3; i++ { 45 ticker := NewTicker(Delta) 46 <-ticker.C 47 ticker.Stop() 48 } 49 } 50 51 // Test the Tick convenience wrapper. 52 func TestTick(t *testing.T) { 53 // Test that giving a negative duration returns nil. 54 if got := Tick(-1); got != nil { 55 t.Errorf("Tick(-1) = %v; want nil", got) 56 } 57 } 58 59 // Test that NewTicker panics when given a duration less than zero. 60 func TestNewTickerLtZeroDuration(t *testing.T) { 61 defer func() { 62 if err := recover(); err == nil { 63 t.Errorf("NewTicker(-1) should have panicked") 64 } 65 }() 66 NewTicker(-1) 67 } 68 69 func BenchmarkTicker(b *testing.B) { 70 ticker := NewTicker(1) 71 b.ResetTimer() 72 b.StartTimer() 73 for i := 0; i < b.N; i++ { 74 <-ticker.C 75 } 76 b.StopTimer() 77 ticker.Stop() 78 } 79