Skip to content

Commit

Permalink
Merge pull request #51 from outfoxx/task/validate_pings
Browse files Browse the repository at this point in the history
Validate comment only “pings” are counted as events but not dispatched
  • Loading branch information
kdubb committed Oct 23, 2023
2 parents 6663ca5 + 94753b6 commit eed0567
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 6 deletions.
2 changes: 1 addition & 1 deletion Sources/Sunday/EventSource.swift
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ public class EventSource {
private var queue: DispatchQueue

private var lastEventId: String?
private var lastEventReceivedTime: DispatchTime = .distantFuture
internal private(set) var lastEventReceivedTime: DispatchTime = .distantFuture

private var connectionOrigin: URL?
private var connectionAttemptTime: DispatchTime?
Expand Down
19 changes: 19 additions & 0 deletions Tests/SundayTests/EventParserTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -241,4 +241,23 @@ class EventParserTests: XCTestCase {
XCTAssertEqual(event.data, "")
}

func testDispatchesOnlyCommentLines() {
let eventBuffer = ": ping\n\n".data(using: .utf8)!

let parser = EventParser()

var events: [EventInfo] = []
parser.process(data: eventBuffer) { events.append($0) }

XCTAssertEqual(events.count, 1)
guard let event = events.first else {
return
}

XCTAssertEqual(event.retry, nil)
XCTAssertEqual(event.id, nil)
XCTAssertEqual(event.event, nil)
XCTAssertEqual(event.data, nil)
}

}
58 changes: 53 additions & 5 deletions Tests/SundayTests/EventSourceTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -606,14 +606,62 @@ class EventSourceTests: XCTestCase {
waitForExpectations()
}

func testPrintRetryDelay() {
func testCheckRetryDelays() {

for attempt in 0 ..< 100 {
print(EventSource.calculateRetryDelay(retryAttempt: attempt,
retryTime: EventSource.retryTimeDefault,
lastConnectTime: .milliseconds(100)))
var delays: [DispatchTimeInterval] = []

for attempt in 0 ..< 30 {
delays.append(EventSource.calculateRetryDelay(retryAttempt: attempt,
retryTime: EventSource.retryTimeDefault,
lastConnectTime: .milliseconds(0)))
}

XCTAssertEqual(delays[0], .milliseconds(0))
XCTAssertEqual(delays[1], .milliseconds(100))
XCTAssertGreaterThan(delays[29].totalSeconds, 60)
}

func testPingsResetLastEventReceivedTime() throws {

let server = try! RoutingHTTPServer(port: .any, localOnly: true) {
Path("/simple") {
GET { _, res in
res.start(status: .ok, headers: [
HTTP.StdHeaders.contentType: [MediaType.eventStream.value],
HTTP.StdHeaders.transferEncoding: ["chunked"],
])
res.server.queue.asyncAfter(deadline: .now().advanced(by: .seconds(1))) {
res.send(chunk: ": ping\n\n".data(using: .utf8) ?? Data())
res.finish(trailers: [:])
}
}
}
}
guard let serverURL = server.startLocal(timeout: 5.0) else {
XCTFail("could not start local server")
return
}
defer { server.stop() }

let session = NetworkSession(configuration: .default)
defer { session.close(cancelOutstandingTasks: true) }

let url = try XCTUnwrap(URL(string: "/simple", relativeTo: serverURL))
let eventSource =
EventSource {
let request = URLRequest(url: url).adding(httpHeaders: $0)
return try session.dataEventStream(for: request)
}

eventSource.connect()

Thread.sleep(forTimeInterval: 0.5)

XCTAssertEqual(eventSource.lastEventReceivedTime, .distantFuture)

Thread.sleep(forTimeInterval: 1.5)

XCTAssertLessThan(DispatchTime.now().distance(to: eventSource.lastEventReceivedTime).totalSeconds, 0.5)
}

}

0 comments on commit eed0567

Please sign in to comment.