Skip to content

Commit 00cf342

Browse files
authored
Merge pull request #1444 from spevans/pr_sr_6968
2 parents f9afb90 + 078d009 commit 00cf342

File tree

2 files changed

+53
-7
lines changed

2 files changed

+53
-7
lines changed

Foundation/ProcessInfo.swift

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,22 @@ open class ProcessInfo: NSObject {
4141

4242
}
4343

44-
45-
internal static var _environment: [String : String] = {
46-
return Dictionary<String, String>._unconditionallyBridgeFromObjectiveC(__CFGetEnvironment()._nsObject)
47-
}()
48-
4944
open var environment: [String : String] {
50-
return ProcessInfo._environment
45+
let equalSign = Character("=")
46+
let strEncoding = String.defaultCStringEncoding
47+
let envp = _CFEnviron()
48+
var env: [String : String] = [:]
49+
var idx = 0
50+
51+
while let entry = envp.advanced(by: idx).pointee {
52+
if let entry = String(cString: entry, encoding: strEncoding), let i = entry.index(of: equalSign) {
53+
let key = String(entry.prefix(upTo: i))
54+
let value = String(entry.suffix(from: i).dropFirst())
55+
env[key] = value
56+
}
57+
idx += 1
58+
}
59+
return env
5160
}
5261

5362
open var arguments: [String] {

TestFoundation/TestProcessInfo.swift

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ class TestProcessInfo : XCTestCase {
2424
("test_operatingSystemVersion", test_operatingSystemVersion ),
2525
("test_processName", test_processName ),
2626
("test_globallyUniqueString", test_globallyUniqueString ),
27+
("test_environment", test_environment),
2728
]
2829
}
2930

@@ -66,5 +67,41 @@ class TestProcessInfo : XCTestCase {
6667
XCTAssertEqual(parts[3].utf16.count, 4)
6768
XCTAssertEqual(parts[4].utf16.count, 12)
6869
}
69-
70+
71+
func test_environment() {
72+
let preset = ProcessInfo.processInfo.environment["test"]
73+
setenv("test", "worked", 1)
74+
let postset = ProcessInfo.processInfo.environment["test"]
75+
XCTAssertNil(preset)
76+
XCTAssertEqual(postset, "worked")
77+
78+
// Bad values that wont be stored
79+
XCTAssertEqual(setenv("", "", 1), -1)
80+
XCTAssertEqual(setenv("bad1=", "", 1), -1)
81+
XCTAssertEqual(setenv("bad2=", "1", 1) ,-1)
82+
XCTAssertEqual(setenv("bad3=", "=2", 1), -1)
83+
84+
// Good values that will be, check splitting on '='
85+
XCTAssertEqual(setenv("var1", "",1 ), 0)
86+
XCTAssertEqual(setenv("var2", "=", 1), 0)
87+
XCTAssertEqual(setenv("var3", "=x", 1), 0)
88+
XCTAssertEqual(setenv("var4", "x=", 1), 0)
89+
XCTAssertEqual(setenv("var5", "=x=", 1), 0)
90+
91+
let env = ProcessInfo.processInfo.environment
92+
93+
XCTAssertNil(env[""])
94+
XCTAssertNil(env["bad1"])
95+
XCTAssertNil(env["bad1="])
96+
XCTAssertNil(env["bad2"])
97+
XCTAssertNil(env["bad2="])
98+
XCTAssertNil(env["bad3"])
99+
XCTAssertNil(env["bad3="])
100+
101+
XCTAssertEqual(env["var1"], "")
102+
XCTAssertEqual(env["var2"], "=")
103+
XCTAssertEqual(env["var3"], "=x")
104+
XCTAssertEqual(env["var4"], "x=")
105+
XCTAssertEqual(env["var5"], "=x=")
106+
}
70107
}

0 commit comments

Comments
 (0)