Skip to content

Commit 7c08891

Browse files
committed
<https://bugs.swift.org/browse/SR-9930> Swift CI: TestProcess.test_passthrough_environment : failed - Test failed: InvalidEnvironmentVariable("swift_xcode")
Some environment variables can contain \n. Instead of trying to parse env’s output, have the helper tool return the environment as a property list and deserialize that.
1 parent df3196b commit 7c08891

File tree

3 files changed

+34
-36
lines changed

3 files changed

+34
-36
lines changed

Diff for: Foundation.xcodeproj/project.pbxproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -3120,7 +3120,7 @@
31203120
PRODUCT_NAME = "$(TARGET_NAME)";
31213121
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
31223122
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
3123-
SWIFT_VERSION = 4.2;
3123+
SWIFT_VERSION = 5.0;
31243124
};
31253125
name = Debug;
31263126
};
@@ -3140,7 +3140,7 @@
31403140
MACOSX_DEPLOYMENT_TARGET = 10.12;
31413141
PRODUCT_BUNDLE_IDENTIFIER = org.swift.xdgTestHelper;
31423142
PRODUCT_NAME = "$(TARGET_NAME)";
3143-
SWIFT_VERSION = 4.2;
3143+
SWIFT_VERSION = 5.0;
31443144
};
31453145
name = Release;
31463146
};

Diff for: TestFoundation/TestProcess.swift

+29-34
Original file line numberDiff line numberDiff line change
@@ -248,37 +248,38 @@ class TestProcess : XCTestCase {
248248
}
249249
}
250250

251-
func test_passthrough_environment() {
252-
do {
253-
let (output, _) = try runTask(["/usr/bin/env"], environment: nil)
254-
let env = try parseEnv(output)
255-
XCTAssertGreaterThan(env.count, 0)
256-
} catch {
257-
// FIXME: SR-9930 parseEnv fails if an environment variable contains
258-
// a newline.
259-
// XCTFail("Test failed: \(error)")
251+
func helperToolEnvironment(from environment: [String: String]) -> [String: String] {
252+
var result = environment
253+
let importantEnvVars = ProcessInfo.processInfo.environment.filter {
254+
$0.key.hasPrefix("LD_") || $0.key.hasPrefix("DYLD_")
260255
}
256+
for entry in importantEnvVars {
257+
result[entry.key] = entry.value
258+
}
259+
return result
260+
}
261+
262+
func test_passthrough_environment() throws {
263+
let helper = xdgTestHelperURL()
264+
let (output, _) = try runTask([helper.path, "--env"], environment: nil)
265+
let env = try parseEnv(output)
266+
XCTAssertGreaterThan(env.count, 0)
261267
}
262268

263-
func test_no_environment() {
264-
do {
265-
let (output, _) = try runTask(["/usr/bin/env"], environment: [:])
266-
let env = try parseEnv(output)
267-
XCTAssertEqual(env.count, 0)
268-
} catch {
269-
XCTFail("Test failed: \(error)")
270-
}
269+
func test_no_environment() throws {
270+
let helper = xdgTestHelperURL()
271+
let input = helperToolEnvironment(from: [:])
272+
let (output, _) = try runTask([helper.path, "--env"], environment: input)
273+
let env = try parseEnv(output)
274+
XCTAssertEqual(env, input)
271275
}
272276

273-
func test_custom_environment() {
274-
do {
275-
let input = ["HELLO": "WORLD", "HOME": "CUPERTINO"]
276-
let (output, _) = try runTask(["/usr/bin/env"], environment: input)
277-
let env = try parseEnv(output)
278-
XCTAssertEqual(env, input)
279-
} catch {
280-
XCTFail("Test failed: \(error)")
281-
}
277+
func test_custom_environment() throws {
278+
let helper = xdgTestHelperURL()
279+
let input = helperToolEnvironment(from: ["HELLO": "WORLD", "HOME": "CUPERTINO"])
280+
let (output, _) = try runTask([helper.path, "--env"], environment: input)
281+
let env = try parseEnv(output)
282+
XCTAssertEqual(env, input)
282283
}
283284

284285
private func realpathOf(path: String) -> String? {
@@ -654,14 +655,8 @@ internal func runTask(_ arguments: [String], environment: [String: String]? = ni
654655
}
655656

656657
private func parseEnv(_ env: String) throws -> [String: String] {
657-
var result = [String: String]()
658-
for line in env.components(separatedBy: "\n") where line != "" {
659-
guard let range = line.range(of: "=") else {
660-
throw Error.InvalidEnvironmentVariable(line)
661-
}
662-
result[String(line[..<range.lowerBound])] = String(line[range.upperBound...])
663-
}
664-
return result
658+
let dictionary = try PropertyListSerialization.propertyList(from: try env.data(using: .utf8).unwrapped(), format: nil) as? [String: String]
659+
return try dictionary.unwrapped()
665660
}
666661
#endif
667662

Diff for: TestFoundation/xdgTestHelper/main.swift

+3
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,9 @@ guard let arg = arguments.next() else {
168168
}
169169

170170
switch arg {
171+
case "--env":
172+
try! FileHandle.standardOutput.write(contentsOf: PropertyListSerialization.data(fromPropertyList: ProcessInfo.processInfo.environment, format: .xml, options: 0))
173+
171174
case "--xdgcheck":
172175
XDGCheck.run()
173176

0 commit comments

Comments
 (0)