github.com/jimmyx0x/go-ethereum@v1.10.28/common/mclock/simclock_test.go (about)

     1  // Copyright 2019 The go-ethereum Authors
     2  // This file is part of the go-ethereum library.
     3  //
     4  // The go-ethereum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The go-ethereum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package mclock
    18  
    19  import (
    20  	"testing"
    21  	"time"
    22  )
    23  
    24  var _ Clock = System{}
    25  var _ Clock = new(Simulated)
    26  
    27  func TestSimulatedAfter(t *testing.T) {
    28  	var (
    29  		timeout = 30 * time.Minute
    30  		offset  = 99 * time.Hour
    31  		adv     = 11 * time.Minute
    32  		c       Simulated
    33  	)
    34  	c.Run(offset)
    35  
    36  	end := c.Now().Add(timeout)
    37  	ch := c.After(timeout)
    38  	for c.Now() < end.Add(-adv) {
    39  		c.Run(adv)
    40  		select {
    41  		case <-ch:
    42  			t.Fatal("Timer fired early")
    43  		default:
    44  		}
    45  	}
    46  
    47  	c.Run(adv)
    48  	select {
    49  	case stamp := <-ch:
    50  		want := AbsTime(0).Add(offset).Add(timeout)
    51  		if stamp != want {
    52  			t.Errorf("Wrong time sent on timer channel: got %v, want %v", stamp, want)
    53  		}
    54  	default:
    55  		t.Fatal("Timer didn't fire")
    56  	}
    57  }
    58  
    59  func TestSimulatedAfterFunc(t *testing.T) {
    60  	var c Simulated
    61  
    62  	called1 := false
    63  	timer1 := c.AfterFunc(100*time.Millisecond, func() { called1 = true })
    64  	if c.ActiveTimers() != 1 {
    65  		t.Fatalf("%d active timers, want one", c.ActiveTimers())
    66  	}
    67  	if fired := timer1.Stop(); !fired {
    68  		t.Fatal("Stop returned false even though timer didn't fire")
    69  	}
    70  	if c.ActiveTimers() != 0 {
    71  		t.Fatalf("%d active timers, want zero", c.ActiveTimers())
    72  	}
    73  	if called1 {
    74  		t.Fatal("timer 1 called")
    75  	}
    76  	if fired := timer1.Stop(); fired {
    77  		t.Fatal("Stop returned true after timer was already stopped")
    78  	}
    79  
    80  	called2 := false
    81  	timer2 := c.AfterFunc(100*time.Millisecond, func() { called2 = true })
    82  	c.Run(50 * time.Millisecond)
    83  	if called2 {
    84  		t.Fatal("timer 2 called")
    85  	}
    86  	c.Run(51 * time.Millisecond)
    87  	if !called2 {
    88  		t.Fatal("timer 2 not called")
    89  	}
    90  	if fired := timer2.Stop(); fired {
    91  		t.Fatal("Stop returned true after timer has fired")
    92  	}
    93  }
    94  
    95  func TestSimulatedSleep(t *testing.T) {
    96  	var (
    97  		c       Simulated
    98  		timeout = 1 * time.Hour
    99  		done    = make(chan AbsTime, 1)
   100  	)
   101  	go func() {
   102  		c.Sleep(timeout)
   103  		done <- c.Now()
   104  	}()
   105  
   106  	c.WaitForTimers(1)
   107  	c.Run(2 * timeout)
   108  	select {
   109  	case stamp := <-done:
   110  		want := AbsTime(2 * timeout)
   111  		if stamp != want {
   112  			t.Errorf("Wrong time after sleep: got %v, want %v", stamp, want)
   113  		}
   114  	case <-time.After(5 * time.Second):
   115  		t.Fatal("Sleep didn't return in time")
   116  	}
   117  }
   118  
   119  func TestSimulatedTimerReset(t *testing.T) {
   120  	var (
   121  		c       Simulated
   122  		timeout = 1 * time.Hour
   123  	)
   124  	timer := c.NewTimer(timeout)
   125  	c.Run(2 * timeout)
   126  	select {
   127  	case ftime := <-timer.C():
   128  		if ftime != AbsTime(timeout) {
   129  			t.Fatalf("wrong time %v sent on timer channel, want %v", ftime, AbsTime(timeout))
   130  		}
   131  	default:
   132  		t.Fatal("timer didn't fire")
   133  	}
   134  
   135  	timer.Reset(timeout)
   136  	c.Run(2 * timeout)
   137  	select {
   138  	case ftime := <-timer.C():
   139  		if ftime != AbsTime(3*timeout) {
   140  			t.Fatalf("wrong time %v sent on timer channel, want %v", ftime, AbsTime(3*timeout))
   141  		}
   142  	default:
   143  		t.Fatal("timer didn't fire again")
   144  	}
   145  }
   146  
   147  func TestSimulatedTimerStop(t *testing.T) {
   148  	var (
   149  		c       Simulated
   150  		timeout = 1 * time.Hour
   151  	)
   152  	timer := c.NewTimer(timeout)
   153  	c.Run(2 * timeout)
   154  	if timer.Stop() {
   155  		t.Errorf("Stop returned true for fired timer")
   156  	}
   157  	select {
   158  	case <-timer.C():
   159  	default:
   160  		t.Fatal("timer didn't fire")
   161  	}
   162  }