| // Copyright 2020 The gVisor Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package faketime_test |
| |
| import ( |
| "testing" |
| "time" |
| |
| "gvisor.dev/gvisor/pkg/tcpip/faketime" |
| ) |
| |
| func TestManualClockAdvance(t *testing.T) { |
| const timeout = time.Millisecond |
| clock := faketime.NewManualClock() |
| start := clock.NowMonotonic() |
| clock.Advance(timeout) |
| if got, want := time.Duration(clock.NowMonotonic()-start)*time.Nanosecond, timeout; got != want { |
| t.Errorf("got = %d, want = %d", got, want) |
| } |
| } |
| |
| func TestManualClockAfterFunc(t *testing.T) { |
| const ( |
| timeout1 = time.Millisecond // timeout for counter1 |
| timeout2 = 2 * time.Millisecond // timeout for counter2 |
| ) |
| tests := []struct { |
| name string |
| advance time.Duration |
| wantCounter1 int |
| wantCounter2 int |
| }{ |
| { |
| name: "before timeout1", |
| advance: timeout1 - 1, |
| wantCounter1: 0, |
| wantCounter2: 0, |
| }, |
| { |
| name: "timeout1", |
| advance: timeout1, |
| wantCounter1: 1, |
| wantCounter2: 0, |
| }, |
| { |
| name: "timeout2", |
| advance: timeout2, |
| wantCounter1: 1, |
| wantCounter2: 1, |
| }, |
| { |
| name: "after timeout2", |
| advance: timeout2 + 1, |
| wantCounter1: 1, |
| wantCounter2: 1, |
| }, |
| } |
| |
| for _, test := range tests { |
| t.Run(test.name, func(t *testing.T) { |
| clock := faketime.NewManualClock() |
| counter1 := 0 |
| counter2 := 0 |
| clock.AfterFunc(timeout1, func() { |
| counter1++ |
| }) |
| clock.AfterFunc(timeout2, func() { |
| counter2++ |
| }) |
| start := clock.NowMonotonic() |
| clock.Advance(test.advance) |
| if got, want := counter1, test.wantCounter1; got != want { |
| t.Errorf("got counter1 = %d, want = %d", got, want) |
| } |
| if got, want := counter2, test.wantCounter2; got != want { |
| t.Errorf("got counter2 = %d, want = %d", got, want) |
| } |
| if got, want := time.Duration(clock.NowMonotonic()-start)*time.Nanosecond, test.advance; got != want { |
| t.Errorf("got elapsed = %d, want = %d", got, want) |
| } |
| }) |
| } |
| } |