github.com/comwrg/go/src@v0.0.0-20220319063731-c238d0440370/time/zoneinfo_unix_test.go (about) 1 // Copyright 2020 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 //go:build aix || (darwin && !ios) || dragonfly || freebsd || (linux && !android) || netbsd || openbsd || solaris 6 // +build aix darwin,!ios dragonfly freebsd linux,!android netbsd openbsd solaris 7 8 package time_test 9 10 import ( 11 "os" 12 "testing" 13 "time" 14 ) 15 16 func TestEnvTZUsage(t *testing.T) { 17 const env = "TZ" 18 tz, ok := os.LookupEnv(env) 19 if !ok { 20 defer os.Unsetenv(env) 21 } else { 22 defer os.Setenv(env, tz) 23 } 24 defer time.ForceUSPacificForTesting() 25 26 localZoneName := "Local" 27 // The file may not exist. 28 if _, err := os.Stat("/etc/localtime"); os.IsNotExist(err) { 29 localZoneName = "UTC" 30 } 31 32 cases := []struct { 33 nilFlag bool 34 tz string 35 local string 36 }{ 37 // no $TZ means use the system default /etc/localtime. 38 {true, "", localZoneName}, 39 // $TZ="" means use UTC. 40 {false, "", "UTC"}, 41 {false, ":", "UTC"}, 42 {false, "Asia/Shanghai", "Asia/Shanghai"}, 43 {false, ":Asia/Shanghai", "Asia/Shanghai"}, 44 {false, "/etc/localtime", localZoneName}, 45 {false, ":/etc/localtime", localZoneName}, 46 } 47 48 for _, c := range cases { 49 time.ResetLocalOnceForTest() 50 if c.nilFlag { 51 os.Unsetenv(env) 52 } else { 53 os.Setenv(env, c.tz) 54 } 55 if time.Local.String() != c.local { 56 t.Errorf("invalid Local location name for %q: got %q want %q", c.tz, time.Local, c.local) 57 } 58 } 59 60 time.ResetLocalOnceForTest() 61 // The file may not exist on Solaris 2 and IRIX 6. 62 path := "/usr/share/zoneinfo/Asia/Shanghai" 63 os.Setenv(env, path) 64 if _, err := os.Stat(path); os.IsNotExist(err) { 65 if time.Local.String() != "UTC" { 66 t.Errorf(`invalid path should fallback to UTC: got %q want "UTC"`, time.Local) 67 } 68 return 69 } 70 if time.Local.String() != path { 71 t.Errorf(`custom path should lead to path itself: got %q want %q`, time.Local, path) 72 } 73 74 timeInUTC := time.Date(2009, 1, 1, 12, 0, 0, 0, time.UTC) 75 sameTimeInShanghai := time.Date(2009, 1, 1, 20, 0, 0, 0, time.Local) 76 if !timeInUTC.Equal(sameTimeInShanghai) { 77 t.Errorf("invalid timezone: got %q want %q", timeInUTC, sameTimeInShanghai) 78 } 79 80 time.ResetLocalOnceForTest() 81 os.Setenv(env, ":"+path) 82 if time.Local.String() != path { 83 t.Errorf(`custom path should lead to path itself: got %q want %q`, time.Local, path) 84 } 85 86 time.ResetLocalOnceForTest() 87 os.Setenv(env, path[:len(path)-1]) 88 if time.Local.String() != "UTC" { 89 t.Errorf(`invalid path should fallback to UTC: got %q want "UTC"`, time.Local) 90 } 91 }