Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add HTTP2FrameConvertible and HTTP2FramePayloadConvertible #216

Merged
merged 1 commit into from Jul 28, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 17 additions & 0 deletions Sources/NIOHTTP2/HTTP2Frame.swift
Expand Up @@ -251,3 +251,20 @@ public struct HTTP2Frame {
self.streamID = streamID
}
}

extension HTTP2Frame: HTTP2FrameConvertible, HTTP2FramePayloadConvertible {
func makeHTTP2Frame(streamID: HTTP2StreamID) -> HTTP2Frame {
assert(self.streamID == streamID, "streamID does not match")
return self
}
}

extension HTTP2Frame.FramePayload: HTTP2FrameConvertible, HTTP2FramePayloadConvertible {
var payload: HTTP2Frame.FramePayload {
return self
}

func makeHTTP2Frame(streamID: HTTP2StreamID) -> HTTP2Frame {
return HTTP2Frame(streamID: streamID, payload: self)
}
}
25 changes: 25 additions & 0 deletions Sources/NIOHTTP2/HTTP2FrameConvertible.swift
@@ -0,0 +1,25 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2020 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

protocol HTTP2FrameConvertible {
/// Makes an `HTTPFrame` with the given `streamID`.
///
/// - Parameter streamID: The `streamID` to use when constructing the frame.
func makeHTTP2Frame(streamID: HTTP2StreamID) -> HTTP2Frame
}

protocol HTTP2FramePayloadConvertible {
/// Makes a `HTTP2Frame.FramePayload`.
var payload: HTTP2Frame.FramePayload { get }
}
1 change: 1 addition & 0 deletions Tests/LinuxMain.swift
Expand Up @@ -35,6 +35,7 @@ import XCTest
testCase(HPACKCodingTests.allTests),
testCase(HPACKIntegrationTests.allTests),
testCase(HPACKRegressionTests.allTests),
testCase(HTTP2FrameConvertibleTests.allTests),
testCase(HTTP2FrameParserTests.allTests),
testCase(HTTP2StreamMultiplexerTests.allTests),
testCase(HTTP2ToHTTP1CodecTests.allTests),
Expand Down
34 changes: 34 additions & 0 deletions Tests/NIOHTTP2Tests/HTTP2FrameConvertibleTests+XCTest.swift
@@ -0,0 +1,34 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2017-2018 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
//
// HTTP2FrameConvertibleTests+XCTest.swift
//
import XCTest

///
/// NOTE: This file was generated by generate_linux_tests.rb
///
/// Do NOT edit this file directly as it will be regenerated automatically when needed.
///

extension HTTP2FrameConvertibleTests {

static var allTests : [(String, (HTTP2FrameConvertibleTests) -> () throws -> Void)] {
return [
("testHTTP2FrameConvertible", testHTTP2FrameConvertible),
("testHTTP2FramePayloadConvertible", testHTTP2FramePayloadConvertible),
]
}
}

60 changes: 60 additions & 0 deletions Tests/NIOHTTP2Tests/HTTP2FrameConvertibleTests.swift
@@ -0,0 +1,60 @@
//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2020 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
@testable import NIOHTTP2
import XCTest

final class HTTP2FrameConvertibleTests: XCTestCase {
func testHTTP2FrameConvertible() {
func checkConversion<Convertible: HTTP2FrameConvertible>(from convertible: Convertible, line: UInt = #line) {
let frame = convertible.makeHTTP2Frame(streamID: 42)

XCTAssertEqual(frame.streamID, 42)
switch frame.payload {
case .settings(.ack):
() // Expected
default:
XCTFail("Unexpected frame payload '\(frame.payload)'", line: line)
}
}

// Boring case: frame from a frame.
let frame = HTTP2Frame(streamID: 42, payload: .settings(.ack))
checkConversion(from: frame)

// Marginally less boring: frame from a payload.
let payload = HTTP2Frame.FramePayload.settings(.ack)
checkConversion(from: payload)
}

func testHTTP2FramePayloadConvertible() {
func checkConversion<Convertible: HTTP2FramePayloadConvertible>(from convertible: Convertible, line: UInt = #line) {
let payload = convertible.payload

switch payload {
case .settings(.ack):
() // Expected
default:
XCTFail("Unexpected frame payload '\(payload)'", line: line)
}
}

// Boring case: payload from a payload.
let payload = HTTP2Frame.FramePayload.settings(.ack)
checkConversion(from: payload)

// Marginally less boring: payload from a frame.
let frame = HTTP2Frame(streamID: 42, payload: .settings(.ack))
checkConversion(from: frame)
}
}