]> Cypherpunks repositories - gostls13.git/commitdiff
os: test that LookupEnv reports all keys found in Environ
authorBryan C. Mills <bcmills@google.com>
Tue, 30 Nov 2021 21:33:51 +0000 (16:33 -0500)
committerBryan Mills <bcmills@google.com>
Fri, 3 Dec 2021 14:28:11 +0000 (14:28 +0000)
For #49886

Change-Id: Ie3a7f12a0d30ec719caf375e7be30cc4a5796c3f
Reviewed-on: https://go-review.googlesource.com/c/go/+/367850
Trust: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/os/env_test.go

index 4b860157b4c24257cf5e4989b0941ced17a7b088..11b3b89725d7ec2ad098258b10ced8022a18e892 100644 (file)
@@ -166,3 +166,39 @@ func TestLookupEnv(t *testing.T) {
                t.Errorf("smallpox release failed; world remains safe but LookupEnv is broken")
        }
 }
+
+// On Windows, Environ was observed to report keys with a single leading "=".
+// Check that they are properly reported by LookupEnv and can be set by SetEnv.
+// See https://golang.org/issue/49886.
+func TestEnvironConsistency(t *testing.T) {
+       for _, kv := range Environ() {
+               i := strings.Index(kv, "=")
+               if i == 0 {
+                       // We observe in practice keys with a single leading "=" on Windows.
+                       // TODO(#49886): Should we consume only the first leading "=" as part
+                       // of the key, or parse through arbitrarily many of them until a non-=,
+                       // or try each possible key/value boundary until LookupEnv succeeds?
+                       i = strings.Index(kv[1:], "=") + 1
+               }
+               if i < 0 {
+                       t.Errorf("Environ entry missing '=': %q", kv)
+               }
+
+               k := kv[:i]
+               v := kv[i+1:]
+               v2, ok := LookupEnv(k)
+               if ok && v == v2 {
+                       t.Logf("LookupEnv(%q) = %q, %t", k, v2, ok)
+               } else {
+                       t.Errorf("Environ contains %q, but LookupEnv(%q) = %q, %t", kv, k, v2, ok)
+               }
+
+               // Since k=v is already present in the environment,
+               // setting it should be a no-op.
+               if err := Setenv(k, v); err == nil {
+                       t.Logf("Setenv(%q, %q)", k, v)
+               } else {
+                       t.Errorf("Environ contains %q, but SetEnv(%q, %q) = %q", kv, k, v, err)
+               }
+       }
+}