| 
									
										
										
										
											2010-11-08 13:25:01 -08:00
										 |  |  | // Copyright 2010 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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package os_test | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	. "os" | 
					
						
							| 
									
										
										
										
											2012-01-09 16:51:20 -08:00
										 |  |  | 	"reflect" | 
					
						
							| 
									
										
										
										
											2014-10-01 11:17:15 -07:00
										 |  |  | 	"strings" | 
					
						
							| 
									
										
										
										
											2010-11-08 13:25:01 -08:00
										 |  |  | 	"testing" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // testGetenv gives us a controlled set of variables for testing Expand. | 
					
						
							|  |  |  | func testGetenv(s string) string { | 
					
						
							|  |  |  | 	switch s { | 
					
						
							|  |  |  | 	case "*": | 
					
						
							|  |  |  | 		return "all the args" | 
					
						
							|  |  |  | 	case "#": | 
					
						
							|  |  |  | 		return "NARGS" | 
					
						
							|  |  |  | 	case "$": | 
					
						
							|  |  |  | 		return "PID" | 
					
						
							|  |  |  | 	case "1": | 
					
						
							|  |  |  | 		return "ARGUMENT1" | 
					
						
							|  |  |  | 	case "HOME": | 
					
						
							|  |  |  | 		return "/usr/gopher" | 
					
						
							|  |  |  | 	case "H": | 
					
						
							|  |  |  | 		return "(Value of H)" | 
					
						
							|  |  |  | 	case "home_1": | 
					
						
							|  |  |  | 		return "/usr/foo" | 
					
						
							|  |  |  | 	case "_": | 
					
						
							|  |  |  | 		return "underscore" | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return "" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var expandTests = []struct { | 
					
						
							|  |  |  | 	in, out string | 
					
						
							|  |  |  | }{ | 
					
						
							|  |  |  | 	{"", ""}, | 
					
						
							|  |  |  | 	{"$*", "all the args"}, | 
					
						
							|  |  |  | 	{"$$", "PID"}, | 
					
						
							|  |  |  | 	{"${*}", "all the args"}, | 
					
						
							|  |  |  | 	{"$1", "ARGUMENT1"}, | 
					
						
							|  |  |  | 	{"${1}", "ARGUMENT1"}, | 
					
						
							|  |  |  | 	{"now is the time", "now is the time"}, | 
					
						
							|  |  |  | 	{"$HOME", "/usr/gopher"}, | 
					
						
							|  |  |  | 	{"$home_1", "/usr/foo"}, | 
					
						
							|  |  |  | 	{"${HOME}", "/usr/gopher"}, | 
					
						
							|  |  |  | 	{"${H}OME", "(Value of H)OME"}, | 
					
						
							|  |  |  | 	{"A$$$#$1$H$home_1*B", "APIDNARGSARGUMENT1(Value of H)/usr/foo*B"}, | 
					
						
							| 
									
										
										
										
											2018-03-28 13:45:26 +05:30
										 |  |  | 	{"start$+middle$^end$", "start$+middle$^end$"}, | 
					
						
							|  |  |  | 	{"mixed$|bag$$$", "mixed$|bagPID$"}, | 
					
						
							| 
									
										
										
										
											2010-11-08 13:25:01 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestExpand(t *testing.T) { | 
					
						
							|  |  |  | 	for _, test := range expandTests { | 
					
						
							|  |  |  | 		result := Expand(test.in, testGetenv) | 
					
						
							|  |  |  | 		if result != test.out { | 
					
						
							|  |  |  | 			t.Errorf("Expand(%q)=%q; expected %q", test.in, result, test.out) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-04-12 11:23:33 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-20 10:34:38 -04:00
										 |  |  | var global interface{} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-12 11:23:33 -07:00
										 |  |  | func BenchmarkExpand(b *testing.B) { | 
					
						
							|  |  |  | 	b.Run("noop", func(b *testing.B) { | 
					
						
							| 
									
										
										
										
											2018-04-20 10:34:38 -04:00
										 |  |  | 		var s string | 
					
						
							| 
									
										
										
										
											2018-04-12 11:23:33 -07:00
										 |  |  | 		b.ReportAllocs() | 
					
						
							|  |  |  | 		for i := 0; i < b.N; i++ { | 
					
						
							|  |  |  | 			s = Expand("tick tick tick tick", func(string) string { return "" }) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-04-20 10:34:38 -04:00
										 |  |  | 		global = s | 
					
						
							| 
									
										
										
										
											2018-04-12 11:23:33 -07:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 	b.Run("multiple", func(b *testing.B) { | 
					
						
							| 
									
										
										
										
											2018-04-20 10:34:38 -04:00
										 |  |  | 		var s string | 
					
						
							| 
									
										
										
										
											2018-04-12 11:23:33 -07:00
										 |  |  | 		b.ReportAllocs() | 
					
						
							|  |  |  | 		for i := 0; i < b.N; i++ { | 
					
						
							|  |  |  | 			s = Expand("$a $a $a $a", func(string) string { return "boom" }) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-04-20 10:34:38 -04:00
										 |  |  | 		global = s | 
					
						
							| 
									
										
										
										
											2018-04-12 11:23:33 -07:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-01-09 16:51:20 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestConsistentEnviron(t *testing.T) { | 
					
						
							|  |  |  | 	e0 := Environ() | 
					
						
							|  |  |  | 	for i := 0; i < 10; i++ { | 
					
						
							|  |  |  | 		e1 := Environ() | 
					
						
							|  |  |  | 		if !reflect.DeepEqual(e0, e1) { | 
					
						
							|  |  |  | 			t.Fatalf("environment changed") | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-10-01 11:17:15 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestUnsetenv(t *testing.T) { | 
					
						
							|  |  |  | 	const testKey = "GO_TEST_UNSETENV" | 
					
						
							|  |  |  | 	set := func() bool { | 
					
						
							|  |  |  | 		prefix := testKey + "=" | 
					
						
							|  |  |  | 		for _, key := range Environ() { | 
					
						
							|  |  |  | 			if strings.HasPrefix(key, prefix) { | 
					
						
							|  |  |  | 				return true | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return false | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := Setenv(testKey, "1"); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Setenv: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if !set() { | 
					
						
							|  |  |  | 		t.Error("Setenv didn't set TestUnsetenv") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if err := Unsetenv(testKey); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Unsetenv: %v", err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if set() { | 
					
						
							|  |  |  | 		t.Fatal("Unsetenv didn't clear TestUnsetenv") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2015-05-05 11:17:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-13 13:29:19 -08:00
										 |  |  | func TestClearenv(t *testing.T) { | 
					
						
							|  |  |  | 	const testKey = "GO_TEST_CLEARENV" | 
					
						
							|  |  |  | 	const testValue = "1" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// reset env | 
					
						
							|  |  |  | 	defer func(origEnv []string) { | 
					
						
							|  |  |  | 		for _, pair := range origEnv { | 
					
						
							|  |  |  | 			// Environment variables on Windows can begin with = | 
					
						
							| 
									
										
										
										
											2018-06-01 17:29:59 -03:00
										 |  |  | 			// https://blogs.msdn.com/b/oldnewthing/archive/2010/05/06/10008132.aspx | 
					
						
							| 
									
										
										
										
											2017-10-05 15:49:32 +02:00
										 |  |  | 			i := strings.Index(pair[1:], "=") + 1 | 
					
						
							| 
									
										
										
										
											2016-11-13 13:29:19 -08:00
										 |  |  | 			if err := Setenv(pair[:i], pair[i+1:]); err != nil { | 
					
						
							|  |  |  | 				t.Errorf("Setenv(%q, %q) failed during reset: %v", pair[:i], pair[i+1:], err) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}(Environ()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if err := Setenv(testKey, testValue); err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("Setenv(%q, %q) failed: %v", testKey, testValue, err) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if _, ok := LookupEnv(testKey); !ok { | 
					
						
							|  |  |  | 		t.Errorf("Setenv(%q, %q) didn't set $%s", testKey, testValue, testKey) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	Clearenv() | 
					
						
							|  |  |  | 	if val, ok := LookupEnv(testKey); ok { | 
					
						
							|  |  |  | 		t.Errorf("Clearenv() didn't clear $%s, remained with value %q", testKey, val) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-05 11:17:08 -07:00
										 |  |  | func TestLookupEnv(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2015-05-06 08:26:51 -07:00
										 |  |  | 	const smallpox = "SMALLPOX"      // No one has smallpox. | 
					
						
							|  |  |  | 	value, ok := LookupEnv(smallpox) // Should not exist. | 
					
						
							| 
									
										
										
										
											2015-05-05 11:17:08 -07:00
										 |  |  | 	if ok || value != "" { | 
					
						
							| 
									
										
										
										
											2015-05-06 08:26:51 -07:00
										 |  |  | 		t.Fatalf("%s=%q", smallpox, value) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-05-06 09:53:48 -07:00
										 |  |  | 	defer Unsetenv(smallpox) | 
					
						
							| 
									
										
										
										
											2015-05-06 08:26:51 -07:00
										 |  |  | 	err := Setenv(smallpox, "virus") | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							|  |  |  | 		t.Fatalf("failed to release smallpox virus") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-12-01 14:02:53 +01:00
										 |  |  | 	_, ok = LookupEnv(smallpox) | 
					
						
							| 
									
										
										
										
											2015-05-06 08:26:51 -07:00
										 |  |  | 	if !ok { | 
					
						
							|  |  |  | 		t.Errorf("smallpox release failed; world remains safe but LookupEnv is broken") | 
					
						
							| 
									
										
										
										
											2015-05-05 11:17:08 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |