Home | History | Annotate | Download | only in time
      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