github.com/slayercat/go@v0.0.0-20170428012452-c51559813f61/src/time/tick_test.go (about)

     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  }