| // Copyright 2020 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. |
| |
| //go:build aix || (darwin && !ios) || dragonfly || freebsd || (linux && !android) || netbsd || openbsd || solaris |
| // +build aix darwin,!ios dragonfly freebsd linux,!android netbsd openbsd solaris |
| |
| package time_test |
| |
| import ( |
| "os" |
| "testing" |
| "time" |
| ) |
| |
| func TestEnvTZUsage(t *testing.T) { |
| const env = "TZ" |
| tz, ok := os.LookupEnv(env) |
| if !ok { |
| defer os.Unsetenv(env) |
| } else { |
| defer os.Setenv(env, tz) |
| } |
| defer time.ForceUSPacificForTesting() |
| |
| localZoneName := "Local" |
| // The file may not exist. |
| if _, err := os.Stat("/etc/localtime"); os.IsNotExist(err) { |
| localZoneName = "UTC" |
| } |
| |
| cases := []struct { |
| nilFlag bool |
| tz string |
| local string |
| }{ |
| // no $TZ means use the system default /etc/localtime. |
| {true, "", localZoneName}, |
| // $TZ="" means use UTC. |
| {false, "", "UTC"}, |
| {false, ":", "UTC"}, |
| {false, "Asia/Shanghai", "Asia/Shanghai"}, |
| {false, ":Asia/Shanghai", "Asia/Shanghai"}, |
| {false, "/etc/localtime", localZoneName}, |
| {false, ":/etc/localtime", localZoneName}, |
| } |
| |
| for _, c := range cases { |
| time.ResetLocalOnceForTest() |
| if c.nilFlag { |
| os.Unsetenv(env) |
| } else { |
| os.Setenv(env, c.tz) |
| } |
| if time.Local.String() != c.local { |
| t.Errorf("invalid Local location name for %q: got %q want %q", c.tz, time.Local, c.local) |
| } |
| } |
| |
| time.ResetLocalOnceForTest() |
| // The file may not exist on Solaris 2 and IRIX 6. |
| path := "/usr/share/zoneinfo/Asia/Shanghai" |
| os.Setenv(env, path) |
| if _, err := os.Stat(path); os.IsNotExist(err) { |
| if time.Local.String() != "UTC" { |
| t.Errorf(`invalid path should fallback to UTC: got %q want "UTC"`, time.Local) |
| } |
| return |
| } |
| if time.Local.String() != path { |
| t.Errorf(`custom path should lead to path itself: got %q want %q`, time.Local, path) |
| } |
| |
| timeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC) |
| sameTimeInShanghai := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local) |
| if !timeInUTC.Equal(sameTimeInShanghai) { |
| t.Errorf("invalid timezone: got %q want %q", timeInUTC, sameTimeInShanghai) |
| } |
| |
| time.ResetLocalOnceForTest() |
| os.Setenv(env, ":"+path) |
| if time.Local.String() != path { |
| t.Errorf(`custom path should lead to path itself: got %q want %q`, time.Local, path) |
| } |
| |
| time.ResetLocalOnceForTest() |
| os.Setenv(env, path[:len(path)-1]) |
| if time.Local.String() != "UTC" { |
| t.Errorf(`invalid path should fallback to UTC: got %q want "UTC"`, time.Local) |
| } |
| } |