Skip to content

Commit

Permalink
Remove hardcoded ports in tests (#3071)
Browse files Browse the repository at this point in the history
* Start removing hardcoded ports from tests
* Handle tests that have port set to 0
* Remove tests that default to port 8080
  • Loading branch information
0xTim committed Sep 22, 2023
1 parent b70d504 commit 8f230c6
Show file tree
Hide file tree
Showing 10 changed files with 137 additions and 70 deletions.
15 changes: 14 additions & 1 deletion Sources/XCTVapor/XCTApplication.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ extension Application: XCTApplicationTester {
extension Application {
public enum Method {
case inMemory
// TODO: Default to Port 0 in the next major release
public static var running: Method {
return .running(hostname:"localhost", port: 8080)
}
Expand Down Expand Up @@ -51,7 +52,19 @@ extension Application {
defer { try! client.syncShutdown() }
var path = request.url.path
path = path.hasPrefix("/") ? path : "/\(path)"
var url = "http://\(self.hostname):\(self.port)\(path)"

let actualPort: Int

if self.port == 0 {
guard let portAllocated = app.http.server.shared.localAddress?.port else {
throw Abort(.internalServerError, reason: "Failed to get port from local address")
}
actualPort = portAllocated
} else {
actualPort = self.port
}

var url = "http://\(self.hostname):\(actualPort)\(path)"
if let query = request.url.query {
url += "?\(query)"
}
Expand Down
20 changes: 15 additions & 5 deletions Tests/AsyncTests/AsyncClientTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,15 @@ final class AsyncClientTests: XCTestCase {
$0.redirect(to: "foo")
}

try app.server.start(address: .hostname("localhost", port: 8080))
try app.server.start(address: .hostname("localhost", port: 0))
defer { app.server.shutdown() }

guard let port = app.http.server.shared.localAddress?.port else {
XCTFail("Failed to get port for app")
return
}

let res = try await app.client.get("http://localhost:8080/redirect")
let res = try await app.client.get("http://localhost:\(port)/redirect")

XCTAssertEqual(res.status, .seeOther)
}
Expand All @@ -86,13 +91,18 @@ final class AsyncClientTests: XCTestCase {
$0.redirect(to: "foo")
}

try app.server.start(address: .hostname("localhost", port: 8080))
try app.server.start(address: .hostname("localhost", port: 0))
defer { app.server.shutdown() }

guard let port = app.http.server.shared.localAddress?.port else {
XCTFail("Failed to get port for app")
return
}

_ = try await app.client.get("http://localhost:8080/redirect")
_ = try await app.client.get("http://localhost:\(port)/redirect")

app.http.client.configuration.redirectConfiguration = .follow(max: 1, allowCycles: false)
let res = try await app.client.get("http://localhost:8080/redirect")
let res = try await app.client.get("http://localhost:\(port)/redirect")
XCTAssertEqual(res.status, .seeOther)
}

Expand Down
2 changes: 1 addition & 1 deletion Tests/AsyncTests/AsyncRouteTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ final class AsyncRouteTests: XCTestCase {
[testMarkerHeaderKey: testMarkerHeaderValue]
}, onUpgrade: { _, _ in })

try app.testable(method: .running).test(.GET, "customshouldupgrade", beforeRequest: { req in
try app.testable(method: .running(port: 0)).test(.GET, "customshouldupgrade", beforeRequest: { req in
req.headers.replaceOrAdd(name: HTTPHeaders.Name.secWebSocketVersion, value: "13")
req.headers.replaceOrAdd(name: HTTPHeaders.Name.secWebSocketKey, value: "zyFJtLIpI2ASsmMHJ4Cf0A==")
req.headers.replaceOrAdd(name: .connection, value: "Upgrade")
Expand Down
11 changes: 9 additions & 2 deletions Tests/AsyncTests/AsyncWebSocketTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ final class AsyncWebSocketTests: XCTestCase {
let app = Application(.testing)
defer { app.shutdown() }

app.http.server.configuration.port = 8085
app.http.server.configuration.port = 0

app.webSocket("bar") { req, ws in
ws.close(promise: nil)
Expand All @@ -59,10 +59,17 @@ final class AsyncWebSocketTests: XCTestCase {
app.environment.arguments = ["serve"]

try app.start()

XCTAssertNotNil(app.http.server.shared.localAddress)
guard let localAddress = app.http.server.shared.localAddress,
let port = localAddress.port else {
XCTFail("couldn't get ip/port from \(app.http.server.shared.localAddress.debugDescription)")
return
}

do {
try await WebSocket.connect(
to: "ws://localhost:8085/foo",
to: "ws://localhost:\(port)/foo",
on: app.eventLoopGroup.next()
) { _ in }
XCTFail("should have failed")
Expand Down
20 changes: 15 additions & 5 deletions Tests/VaporTests/ClientTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,15 @@ final class ClientTests: XCTestCase {
$0.redirect(to: "foo")
}

try app.server.start(address: .hostname("localhost", port: 8080))
try app.server.start(address: .hostname("localhost", port: 0))
defer { app.server.shutdown() }

guard let port = app.http.server.shared.localAddress?.port else {
XCTFail("Failed to get port for app")
return
}

let res = try app.client.get("http://localhost:8080/redirect").wait()
let res = try app.client.get("http://localhost:\(port)/redirect").wait()

XCTAssertEqual(res.status, .seeOther)
}
Expand All @@ -90,13 +95,18 @@ final class ClientTests: XCTestCase {
$0.redirect(to: "foo")
}

try app.server.start(address: .hostname("localhost", port: 8080))
try app.server.start(address: .hostname("localhost", port: 0))
defer { app.server.shutdown() }

guard let port = app.http.server.shared.localAddress?.port else {
XCTFail("Failed to get port for app")
return
}

_ = try app.client.get("http://localhost:8080/redirect").wait()
_ = try app.client.get("http://localhost:\(port)/redirect").wait()

app.http.client.configuration.redirectConfiguration = .follow(max: 1, allowCycles: false)
let res = try app.client.get("http://localhost:8080/redirect").wait()
let res = try app.client.get("http://localhost:\(port)/redirect").wait()
XCTAssertEqual(res.status, .seeOther)
}

Expand Down
42 changes: 21 additions & 21 deletions Tests/VaporTests/FileTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ final class FileTests: XCTestCase {
}
}

try app.testable(method: .running).test(.GET, "/file-stream") { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream") { res in
let test = "the quick brown fox"
XCTAssertNotNil(res.headers.first(name: .eTag))
XCTAssertContains(res.body.string, test)
Expand All @@ -36,7 +36,7 @@ final class FileTests: XCTestCase {

var headers = HTTPHeaders()
headers.replaceOrAdd(name: .connection, value: "close")
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
let test = "the quick brown fox"
XCTAssertNotNil(res.headers.first(name: .eTag))
XCTAssertContains(res.body.string, test)
Expand All @@ -62,7 +62,7 @@ final class FileTests: XCTestCase {
}
}

try app.testable(method: .running).test(.GET, "/file-stream") { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream") { res in
XCTAssertTrue(res.body.string.isEmpty)
}
}
Expand All @@ -83,7 +83,7 @@ final class FileTests: XCTestCase {

var headerRequest = HTTPHeaders()
headerRequest.range = .init(unit: .bytes, ranges: [.tail(value: 20)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headerRequest) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headerRequest) { res in

let contentRange = res.headers.first(name: "content-range")
let contentLength = res.headers.first(name: "content-length")
Expand Down Expand Up @@ -114,7 +114,7 @@ final class FileTests: XCTestCase {

var headerRequest = HTTPHeaders()
headerRequest.range = .init(unit: .bytes, ranges: [.start(value: 20)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headerRequest) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headerRequest) { res in

let contentRange = res.headers.first(name: "content-range")
let contentLength = res.headers.first(name: "content-length")
Expand Down Expand Up @@ -145,7 +145,7 @@ final class FileTests: XCTestCase {

var headerRequest = HTTPHeaders()
headerRequest.range = .init(unit: .bytes, ranges: [.within(start: 20, end: 25)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headerRequest) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headerRequest) { res in

let contentRange = res.headers.first(name: "content-range")
let contentLength = res.headers.first(name: "content-length")
Expand Down Expand Up @@ -176,7 +176,7 @@ final class FileTests: XCTestCase {

var headers = HTTPHeaders()
headers.range = .init(unit: .bytes, ranges: [.within(start: 0, end: 0)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
XCTAssertEqual(res.status, .partialContent)

XCTAssertEqual(res.headers.first(name: .contentLength), "1")
Expand All @@ -203,12 +203,12 @@ final class FileTests: XCTestCase {

var headerRequest = HTTPHeaders()
headerRequest.range = .init(unit: .bytes, ranges: [.within(start: -20, end: 25)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headerRequest) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headerRequest) { res in
XCTAssertEqual(res.status, .badRequest)
}

headerRequest.range = .init(unit: .bytes, ranges: [.within(start: 10, end: 100000000)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headerRequest) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headerRequest) { res in
XCTAssertEqual(res.status, .badRequest)
}
}
Expand All @@ -229,12 +229,12 @@ final class FileTests: XCTestCase {

var headerRequest = HTTPHeaders()
headerRequest.range = .init(unit: .bytes, ranges: [.start(value: -20)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headerRequest) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headerRequest) { res in
XCTAssertEqual(res.status, .badRequest)
}

headerRequest.range = .init(unit: .bytes, ranges: [.start(value: 100000000)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headerRequest) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headerRequest) { res in
XCTAssertEqual(res.status, .badRequest)
}
}
Expand All @@ -255,12 +255,12 @@ final class FileTests: XCTestCase {

var headerRequest = HTTPHeaders()
headerRequest.range = .init(unit: .bytes, ranges: [.tail(value: -20)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headerRequest) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headerRequest) { res in
XCTAssertEqual(res.status, .badRequest)
}

headerRequest.range = .init(unit: .bytes, ranges: [.tail(value: 100000000)])
try app.testable(method: .running).test(.GET, "/file-stream", headers: headerRequest) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headerRequest) { res in
XCTAssertEqual(res.status, .badRequest)
}
}
Expand Down Expand Up @@ -404,42 +404,42 @@ final class FileTests: XCTestCase {

var headers = HTTPHeaders()
headers.replaceOrAdd(name: .range, value: "bytes=0-9223372036854775807")
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
XCTAssertEqual(res.status, .badRequest)
}

headers.replaceOrAdd(name: .range, value: "bytes=-1-10")
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
XCTAssertEqual(res.status, .badRequest)
}

headers.replaceOrAdd(name: .range, value: "bytes=100-10")
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
XCTAssertEqual(res.status, .badRequest)
}

headers.replaceOrAdd(name: .range, value: "bytes=10--100")
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
XCTAssertEqual(res.status, .badRequest)
}

headers.replaceOrAdd(name: .range, value: "bytes=9223372036854775808-")
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
XCTAssertEqual(res.status, .badRequest)
}

headers.replaceOrAdd(name: .range, value: "bytes=922337203-")
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
XCTAssertEqual(res.status, .badRequest)
}

headers.replaceOrAdd(name: .range, value: "bytes=-922337203")
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
XCTAssertEqual(res.status, .badRequest)
}

headers.replaceOrAdd(name: .range, value: "bytes=-9223372036854775808")
try app.testable(method: .running).test(.GET, "/file-stream", headers: headers) { res in
try app.testable(method: .running(port: 0)).test(.GET, "/file-stream", headers: headers) { res in
XCTAssertEqual(res.status, .badRequest)
}
}
Expand Down

0 comments on commit 8f230c6

Please sign in to comment.