github.com/goproxy0/go@v0.0.0-20171111080102-49cc0c489d2c/src/time/internal_test.go (about) 1 // Copyright 2011 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 6 7 func init() { 8 // force US/Pacific for time zone tests 9 ForceUSPacificForTesting() 10 } 11 12 func initTestingZone() { 13 z, err := loadLocation("America/Los_Angeles", zoneSources[len(zoneSources)-1:]) 14 if err != nil { 15 panic("cannot load America/Los_Angeles for testing: " + err.Error()) 16 } 17 z.name = "Local" 18 localLoc = *z 19 } 20 21 var origZoneSources = zoneSources 22 23 func forceZipFileForTesting(zipOnly bool) { 24 zoneSources = make([]string, len(origZoneSources)) 25 copy(zoneSources, origZoneSources) 26 if zipOnly { 27 zoneSources = zoneSources[len(zoneSources)-1:] 28 } 29 } 30 31 var Interrupt = interrupt 32 var DaysIn = daysIn 33 34 func empty(arg interface{}, seq uintptr) {} 35 36 // Test that a runtimeTimer with a duration so large it overflows 37 // does not cause other timers to hang. 38 // 39 // This test has to be in internal_test.go since it fiddles with 40 // unexported data structures. 41 func CheckRuntimeTimerOverflow() { 42 // We manually create a runtimeTimer to bypass the overflow 43 // detection logic in NewTimer: we're testing the underlying 44 // runtime.addtimer function. 45 r := &runtimeTimer{ 46 when: runtimeNano() + (1<<63 - 1), 47 f: empty, 48 arg: nil, 49 } 50 startTimer(r) 51 52 // Start a goroutine that should send on t.C right away. 53 t := NewTimer(1) 54 55 defer func() { 56 // Subsequent tests won't work correctly if we don't stop the 57 // overflow timer and kick the timer proc back into service. 58 // 59 // The timer proc is now sleeping and can only be awoken by 60 // adding a timer to the *beginning* of the heap. We can't 61 // wake it up by calling NewTimer since other tests may have 62 // left timers running that should have expired before ours. 63 // Instead we zero the overflow timer duration and start it 64 // once more. 65 stopTimer(r) 66 t.Stop() 67 r.when = 0 68 startTimer(r) 69 }() 70 71 // If the test fails, we will hang here until the timeout in the testing package 72 // fires, which is 10 minutes. It would be nice to catch the problem sooner, 73 // but there is no reliable way to guarantee that timerproc schedules without 74 // doing something involving timerproc itself. Previous failed attempts have 75 // tried calling runtime.Gosched and runtime.GC, but neither is reliable. 76 // So we fall back to hope: We hope we don't hang here. 77 <-t.C 78 }