| // Copyright 2011 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package time |
| |
| import "runtime" |
| |
| func init() { |
| // force US/Pacific for time zone tests |
| ForceUSPacificForTesting() |
| } |
| |
| func initTestingZone() { |
| z, err := loadLocation("America/Los_Angeles", zoneSources[len(zoneSources)-1:]) |
| if runtime.Compiler == "gccgo" && err != nil { |
| z, err = loadLocation("America/Los_Angeles", zoneSources) |
| } |
| if err != nil { |
| panic("cannot load America/Los_Angeles for testing: " + err.Error()) |
| } |
| z.name = "Local" |
| localLoc = *z |
| } |
| |
| var OrigZoneSources = zoneSources |
| |
| func forceZipFileForTesting(zipOnly bool) { |
| zoneSources = make([]string, len(OrigZoneSources)) |
| copy(zoneSources, OrigZoneSources) |
| if zipOnly { |
| zoneSources = zoneSources[len(zoneSources)-1:] |
| } |
| } |
| |
| var Interrupt = interrupt |
| var DaysIn = daysIn |
| |
| func empty(arg interface{}, seq uintptr) {} |
| |
| // Test that a runtimeTimer with a duration so large it overflows |
| // does not cause other timers to hang. |
| // |
| // This test has to be in internal_test.go since it fiddles with |
| // unexported data structures. |
| func CheckRuntimeTimerOverflow() { |
| // We manually create a runtimeTimer to bypass the overflow |
| // detection logic in NewTimer: we're testing the underlying |
| // runtime.addtimer function. |
| r := &runtimeTimer{ |
| when: runtimeNano() + (1<<63 - 1), |
| f: empty, |
| arg: nil, |
| } |
| startTimer(r) |
| |
| // Start a goroutine that should send on t.C right away. |
| t := NewTimer(1) |
| |
| defer func() { |
| // Subsequent tests won't work correctly if we don't stop the |
| // overflow timer and kick the timer proc back into service. |
| // |
| // The timer proc is now sleeping and can only be awoken by |
| // adding a timer to the *beginning* of the heap. We can't |
| // wake it up by calling NewTimer since other tests may have |
| // left timers running that should have expired before ours. |
| // Instead we zero the overflow timer duration and start it |
| // once more. |
| stopTimer(r) |
| t.Stop() |
| r.when = 0 |
| startTimer(r) |
| }() |
| |
| // If the test fails, we will hang here until the timeout in the testing package |
| // fires, which is 10 minutes. It would be nice to catch the problem sooner, |
| // but there is no reliable way to guarantee that timerproc schedules without |
| // doing something involving timerproc itself. Previous failed attempts have |
| // tried calling runtime.Gosched and runtime.GC, but neither is reliable. |
| // So we fall back to hope: We hope we don't hang here. |
| <-t.C |
| } |