blob: 16f194563811eed0495503e23bbe124c69ef9f1b [file] [log] [blame]
Rob Pike26cda272010-11-08 13:25:01 -08001// Copyright 2010 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 os_test
6
7import (
8 . "os"
Brad Fitzpatrick024952f2012-01-09 16:51:20 -08009 "reflect"
Brad Fitzpatrick85cdc492014-10-01 11:17:15 -070010 "strings"
Rob Pike26cda272010-11-08 13:25:01 -080011 "testing"
12)
13
14// testGetenv gives us a controlled set of variables for testing Expand.
15func testGetenv(s string) string {
16 switch s {
17 case "*":
18 return "all the args"
19 case "#":
20 return "NARGS"
21 case "$":
22 return "PID"
23 case "1":
24 return "ARGUMENT1"
25 case "HOME":
26 return "/usr/gopher"
27 case "H":
28 return "(Value of H)"
29 case "home_1":
30 return "/usr/foo"
31 case "_":
32 return "underscore"
33 }
34 return ""
35}
36
37var expandTests = []struct {
38 in, out string
39}{
40 {"", ""},
41 {"$*", "all the args"},
42 {"$$", "PID"},
43 {"${*}", "all the args"},
44 {"$1", "ARGUMENT1"},
45 {"${1}", "ARGUMENT1"},
46 {"now is the time", "now is the time"},
47 {"$HOME", "/usr/gopher"},
48 {"$home_1", "/usr/foo"},
49 {"${HOME}", "/usr/gopher"},
50 {"${H}OME", "(Value of H)OME"},
51 {"A$$$#$1$H$home_1*B", "APIDNARGSARGUMENT1(Value of H)/usr/foo*B"},
52}
53
54func TestExpand(t *testing.T) {
55 for _, test := range expandTests {
56 result := Expand(test.in, testGetenv)
57 if result != test.out {
58 t.Errorf("Expand(%q)=%q; expected %q", test.in, result, test.out)
59 }
60 }
61}
Brad Fitzpatrick024952f2012-01-09 16:51:20 -080062
63func TestConsistentEnviron(t *testing.T) {
64 e0 := Environ()
65 for i := 0; i < 10; i++ {
66 e1 := Environ()
67 if !reflect.DeepEqual(e0, e1) {
68 t.Fatalf("environment changed")
69 }
70 }
71}
Brad Fitzpatrick85cdc492014-10-01 11:17:15 -070072
73func TestUnsetenv(t *testing.T) {
74 const testKey = "GO_TEST_UNSETENV"
75 set := func() bool {
76 prefix := testKey + "="
77 for _, key := range Environ() {
78 if strings.HasPrefix(key, prefix) {
79 return true
80 }
81 }
82 return false
83 }
84 if err := Setenv(testKey, "1"); err != nil {
85 t.Fatalf("Setenv: %v", err)
86 }
87 if !set() {
88 t.Error("Setenv didn't set TestUnsetenv")
89 }
90 if err := Unsetenv(testKey); err != nil {
91 t.Fatalf("Unsetenv: %v", err)
92 }
93 if set() {
94 t.Fatal("Unsetenv didn't clear TestUnsetenv")
95 }
96}
Rob Pikee8c0d0f2015-05-05 11:17:08 -070097
Jesse Szwedko5f74ce32016-11-13 13:29:19 -080098func TestClearenv(t *testing.T) {
99 const testKey = "GO_TEST_CLEARENV"
100 const testValue = "1"
101
102 // reset env
103 defer func(origEnv []string) {
104 for _, pair := range origEnv {
105 // Environment variables on Windows can begin with =
106 // http://blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx
Marvin Stenger90d71fe2017-10-05 15:49:32 +0200107 i := strings.Index(pair[1:], "=") + 1
Jesse Szwedko5f74ce32016-11-13 13:29:19 -0800108 if err := Setenv(pair[:i], pair[i+1:]); err != nil {
109 t.Errorf("Setenv(%q, %q) failed during reset: %v", pair[:i], pair[i+1:], err)
110 }
111 }
112 }(Environ())
113
114 if err := Setenv(testKey, testValue); err != nil {
115 t.Fatalf("Setenv(%q, %q) failed: %v", testKey, testValue, err)
116 }
117 if _, ok := LookupEnv(testKey); !ok {
118 t.Errorf("Setenv(%q, %q) didn't set $%s", testKey, testValue, testKey)
119 }
120 Clearenv()
121 if val, ok := LookupEnv(testKey); ok {
122 t.Errorf("Clearenv() didn't clear $%s, remained with value %q", testKey, val)
123 }
124}
125
Rob Pikee8c0d0f2015-05-05 11:17:08 -0700126func TestLookupEnv(t *testing.T) {
Rob Pike072a2632015-05-06 08:26:51 -0700127 const smallpox = "SMALLPOX" // No one has smallpox.
128 value, ok := LookupEnv(smallpox) // Should not exist.
Rob Pikee8c0d0f2015-05-05 11:17:08 -0700129 if ok || value != "" {
Rob Pike072a2632015-05-06 08:26:51 -0700130 t.Fatalf("%s=%q", smallpox, value)
131 }
Brad Fitzpatrickec87dbf2015-05-06 09:53:48 -0700132 defer Unsetenv(smallpox)
Rob Pike072a2632015-05-06 08:26:51 -0700133 err := Setenv(smallpox, "virus")
134 if err != nil {
135 t.Fatalf("failed to release smallpox virus")
136 }
Tobias Klauser08176b22017-12-01 14:02:53 +0100137 _, ok = LookupEnv(smallpox)
Rob Pike072a2632015-05-06 08:26:51 -0700138 if !ok {
139 t.Errorf("smallpox release failed; world remains safe but LookupEnv is broken")
Rob Pikee8c0d0f2015-05-05 11:17:08 -0700140 }
141}