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
5package time
6
7func init() {
8	// Force US/Pacific for time zone tests.
9	ForceUSPacificForTesting()
10}
11
12func initTestingZone() {
13	// For hermeticity, use only tzinfo source from the test's GOROOT,
14	// not the system sources and not whatever GOROOT may happen to be
15	// set in the process's environment (if any).
16	// This test runs in GOROOT/src/time, so GOROOT is "../..",
17	// but it is theoretically possible
18	sources := []string{"../../lib/time/zoneinfo.zip"}
19	z, err := loadLocation("America/Los_Angeles", sources)
20	if err != nil {
21		panic("cannot load America/Los_Angeles for testing: " + err.Error() + "; you may want to use -tags=timetzdata")
22	}
23	z.name = "Local"
24	localLoc = *z
25}
26
27var origPlatformZoneSources []string = platformZoneSources
28
29func disablePlatformSources() (undo func()) {
30	platformZoneSources = nil
31	return func() {
32		platformZoneSources = origPlatformZoneSources
33	}
34}
35
36var Interrupt = interrupt
37var DaysIn = daysIn
38
39func empty(arg any, seq uintptr, delta int64) {}
40
41// Test that a runtimeTimer with a period that would overflow when on
42// expiration does not throw or cause other timers to hang.
43//
44// This test has to be in internal_test.go since it fiddles with
45// unexported data structures.
46func CheckRuntimeTimerPeriodOverflow() {
47	// We manually create a runtimeTimer with huge period, but that expires
48	// immediately. The public Timer interface would require waiting for
49	// the entire period before the first update.
50	t := newTimer(runtimeNano(), 1<<63-1, empty, nil, nil)
51	defer t.Stop()
52
53	// If this test fails, we will either throw (when siftdownTimer detects
54	// bad when on update), or other timers will hang (if the timer in a
55	// heap is in a bad state). There is no reliable way to test this, but
56	// we wait on a short timer here as a smoke test (alternatively, timers
57	// in later tests may hang).
58	<-After(25 * Millisecond)
59}
60
61var (
62	MinMonoTime = Time{wall: 1 << 63, ext: -1 << 63, loc: UTC}
63	MaxMonoTime = Time{wall: 1 << 63, ext: 1<<63 - 1, loc: UTC}
64
65	NotMonoNegativeTime = Time{wall: 0, ext: -1<<63 + 50}
66)
67