diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..08891d8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true \ No newline at end of file diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..24859f4 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,20 @@ +name: Main + +on: + push: + branches: [main] + +jobs: + unit-tests: + name: Unit tests + uses: apple/swift-nio/.github/workflows/unit_tests.yml@main + with: + linux_5_9_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_5_10_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_6_0_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_nightly_6_0_arguments_override: "--explicit-target-dependency-import-check error" + linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error" + + cxx-interop: + name: Cxx interop + uses: apple/swift-nio/.github/workflows/cxx_interop.yml@main diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 0000000..f192530 --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,28 @@ +name: PR + +on: + pull_request: + types: [opened, reopened, synchronize] + +jobs: + soundness: + name: Soundness + uses: swiftlang/github-workflows/.github/workflows/soundness.yml@main + with: + license_header_check_project_name: "SwiftAsyncDNSResolver" + yamllint_check_enabled: false + api_breakage_check_enabled: false + + unit-tests: + name: Unit tests + uses: apple/swift-nio/.github/workflows/unit_tests.yml@main + with: + linux_5_9_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_5_10_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_6_0_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_nightly_6_0_arguments_override: "--explicit-target-dependency-import-check error" + linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error" + + cxx-interop: + name: Cxx interop + uses: apple/swift-nio/.github/workflows/cxx_interop.yml@main diff --git a/.github/workflows/pull_request_label.yml b/.github/workflows/pull_request_label.yml new file mode 100644 index 0000000..86f199f --- /dev/null +++ b/.github/workflows/pull_request_label.yml @@ -0,0 +1,18 @@ +name: PR label + +on: + pull_request: + types: [labeled, unlabeled, opened, reopened, synchronize] + +jobs: + semver-label-check: + name: Semantic Version label check + runs-on: ubuntu-latest + timeout-minutes: 1 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Check for Semantic Version label + uses: apple/swift-nio/.github/actions/pull_request_semver_label_checker@main diff --git a/.github/workflows/scheduled.yml b/.github/workflows/scheduled.yml new file mode 100644 index 0000000..2e233df --- /dev/null +++ b/.github/workflows/scheduled.yml @@ -0,0 +1,20 @@ +name: Scheduled + +on: + schedule: + - cron: "0 8,20 * * *" + +jobs: + unit-tests: + name: Unit tests + uses: apple/swift-nio/.github/workflows/unit_tests.yml@main + with: + linux_5_9_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_5_10_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_6_0_arguments_override: "-Xswiftc -warnings-as-errors --explicit-target-dependency-import-check error" + linux_nightly_6_0_arguments_override: "--explicit-target-dependency-import-check error" + linux_nightly_main_arguments_override: "--explicit-target-dependency-import-check error" + + cxx-interop: + name: Cxx interop + uses: apple/swift-nio/.github/workflows/cxx_interop.yml@main diff --git a/.licenseignore b/.licenseignore new file mode 100644 index 0000000..bdf3573 --- /dev/null +++ b/.licenseignore @@ -0,0 +1,13 @@ +.gitignore +.licenseignore +.swiftformatignore +.spi.yml +.swift-format +.github/ +**.md +**.txt +**Package.swift +docker/* +.gitmodules +.editorconfig +Sources/CAsyncDNSResolver/c-ares diff --git a/.swift-format b/.swift-format new file mode 100644 index 0000000..7fa06fb --- /dev/null +++ b/.swift-format @@ -0,0 +1,62 @@ +{ + "version" : 1, + "indentation" : { + "spaces" : 4 + }, + "tabWidth" : 4, + "fileScopedDeclarationPrivacy" : { + "accessLevel" : "private" + }, + "spacesAroundRangeFormationOperators" : false, + "indentConditionalCompilationBlocks" : false, + "indentSwitchCaseLabels" : false, + "lineBreakAroundMultilineExpressionChainComponents" : false, + "lineBreakBeforeControlFlowKeywords" : false, + "lineBreakBeforeEachArgument" : true, + "lineBreakBeforeEachGenericRequirement" : true, + "lineLength" : 120, + "maximumBlankLines" : 1, + "respectsExistingLineBreaks" : true, + "prioritizeKeepingFunctionOutputTogether" : true, + "rules" : { + "AllPublicDeclarationsHaveDocumentation" : false, + "AlwaysUseLiteralForEmptyCollectionInit" : false, + "AlwaysUseLowerCamelCase" : false, + "AmbiguousTrailingClosureOverload" : true, + "BeginDocumentationCommentWithOneLineSummary" : false, + "DoNotUseSemicolons" : true, + "DontRepeatTypeInStaticProperties" : true, + "FileScopedDeclarationPrivacy" : true, + "FullyIndirectEnum" : true, + "GroupNumericLiterals" : true, + "IdentifiersMustBeASCII" : true, + "NeverForceUnwrap" : false, + "NeverUseForceTry" : false, + "NeverUseImplicitlyUnwrappedOptionals" : false, + "NoAccessLevelOnExtensionDeclaration" : true, + "NoAssignmentInExpressions" : true, + "NoBlockComments" : true, + "NoCasesWithOnlyFallthrough" : true, + "NoEmptyTrailingClosureParentheses" : true, + "NoLabelsInCasePatterns" : true, + "NoLeadingUnderscores" : false, + "NoParensAroundConditions" : true, + "NoVoidReturnOnFunctionSignature" : true, + "OmitExplicitReturns" : true, + "OneCasePerLine" : true, + "OneVariableDeclarationPerLine" : true, + "OnlyOneTrailingClosureArgument" : true, + "OrderedImports" : true, + "ReplaceForEachWithForLoop" : true, + "ReturnVoidInsteadOfEmptyTuple" : true, + "UseEarlyExits" : false, + "UseExplicitNilCheckInConditions" : false, + "UseLetInEveryBoundCaseVariable" : false, + "UseShorthandTypeNames" : true, + "UseSingleLinePropertyGetter" : false, + "UseSynthesizedInitializer" : false, + "UseTripleSlashForDocumentationComments" : true, + "UseWhereClausesInForLoops" : false, + "ValidateDocumentationComments" : false + } +} diff --git a/.swiftformat b/.swiftformat deleted file mode 100644 index 1a00a99..0000000 --- a/.swiftformat +++ /dev/null @@ -1,19 +0,0 @@ -# file options - ---swiftversion 5.5 ---exclude .build - -# format options - ---self insert ---patternlet inline ---stripunusedargs unnamed-only ---ifdef no-indent ---guardelse same-line ---nevertrailing filter ---extensionacl on-declarations - -# rules - ---disable wrapMultilineStatementBraces - diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f50331f..4641f7f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,29 +54,10 @@ A good patch is: 3. Documented, adding API documentation as needed to cover new functions and properties. 4. Accompanied by a great commit message, using our commit message template. -### Run `./scripts/soundness.sh` +### Run CI checks locally -The scripts directory contains a [soundness.sh script](https://github.com/apple/swift-async-dns-resolver/blob/main/scripts/soundness.sh) -that enforces additional checks, like license headers and formatting style. - -Please make sure to `./scripts/soundness.sh` before pushing a change upstream, otherwise it is likely the PR validation will fail -on minor changes such as a missing `self.` or similar formatting issues. - -For frequent contributors, we recommend adding the script as a [git pre-push hook](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks), -which you can do via executing the following command in the project root directory: - -```bash -cat << EOF > .git/hooks/pre-push - -if [[ -f "scripts/soundness.sh" ]]; then - scripts/soundness.sh -fi -EOF -``` - -Which makes the script execute, and only allow the `git push` to complete if the check has passed. - -In the case of formatting issues, you can then `git add` the formatting changes, and attempt the push again. +You can run the Github Actions workflows locally using +[act](https://github.com/nektos/act). For detailed steps on how to do this please see [https://github.com/swiftlang/github-workflows?tab=readme-ov-file#running-workflows-locally](https://github.com/swiftlang/github-workflows?tab=readme-ov-file#running-workflows-locally). ## How to contribute your work diff --git a/Package.swift b/Package.swift index a185218..eda082b 100644 --- a/Package.swift +++ b/Package.swift @@ -1,8 +1,9 @@ // swift-tools-version:5.6 -import class Foundation.FileManager import PackageDescription +import class Foundation.FileManager + var caresExclude = [ "./c-ares/src/lib/cares.rc", "./c-ares/src/lib/CMakeLists.txt", @@ -22,11 +23,9 @@ do { let package = Package( name: "swift-async-dns-resolver", products: [ - .library(name: "AsyncDNSResolver", targets: ["AsyncDNSResolver"]), - ], - dependencies: [ - .package(url: "https://github.com/apple/swift-docc-plugin", from: "1.0.0"), + .library(name: "AsyncDNSResolver", targets: ["AsyncDNSResolver"]) ], + dependencies: [], targets: [ .target( name: "CAsyncDNSResolver", @@ -43,7 +42,7 @@ let package = Package( .target( name: "AsyncDNSResolver", dependencies: [ - "CAsyncDNSResolver", + "CAsyncDNSResolver" ] ), diff --git a/Sources/AsyncDNSResolver/AsyncDNSResolver.swift b/Sources/AsyncDNSResolver/AsyncDNSResolver.swift index 1c3fed7..9e80ca3 100644 --- a/Sources/AsyncDNSResolver/AsyncDNSResolver.swift +++ b/Sources/AsyncDNSResolver/AsyncDNSResolver.swift @@ -339,7 +339,14 @@ public struct NAPTRRecord: Sendable, Hashable, CustomStringConvertible { "\(Self.self)(flags=\(self.flags ?? ""), service=\(self.service ?? ""), regExp=\(self.regExp ?? ""), replacement=\(self.replacement), order=\(self.order), preference=\(self.preference))" } - public init(flags: String?, service: String?, regExp: String?, replacement: String, order: UInt16, preference: UInt16) { + public init( + flags: String?, + service: String?, + regExp: String?, + replacement: String, + order: UInt16, + preference: UInt16 + ) { self.flags = flags self.service = service self.regExp = regExp diff --git a/Sources/AsyncDNSResolver/c-ares/AresOptions.swift b/Sources/AsyncDNSResolver/c-ares/AresOptions.swift index 3200667..2b4c52d 100644 --- a/Sources/AsyncDNSResolver/c-ares/AresOptions.swift +++ b/Sources/AsyncDNSResolver/c-ares/AresOptions.swift @@ -356,7 +356,9 @@ extension String { extension Sequence { fileprivate func deallocate() where Element == UnsafeMutablePointer? { - self.forEach { $0?.deallocate() } + for entry in self { + entry?.deallocate() + } } } @@ -365,7 +367,7 @@ struct AresOptionMasks: OptionSet { let rawValue: CInt static let FLAGS = AresOptionMasks(rawValue: ARES_OPT_FLAGS) - static let TIMEOUT = AresOptionMasks(rawValue: ARES_OPT_TIMEOUT) // Deprecated by TIMEOUTMS + static let TIMEOUT = AresOptionMasks(rawValue: ARES_OPT_TIMEOUT) // Deprecated by TIMEOUTMS static let TRIES = AresOptionMasks(rawValue: ARES_OPT_TRIES) static let NDOTS = AresOptionMasks(rawValue: ARES_OPT_NDOTS) static let UDP_PORT = AresOptionMasks(rawValue: ARES_OPT_UDP_PORT) diff --git a/Sources/AsyncDNSResolver/c-ares/DNSResolver_c-ares.swift b/Sources/AsyncDNSResolver/c-ares/DNSResolver_c-ares.swift index b0605bb..ba0864a 100644 --- a/Sources/AsyncDNSResolver/c-ares/DNSResolver_c-ares.swift +++ b/Sources/AsyncDNSResolver/c-ares/DNSResolver_c-ares.swift @@ -122,7 +122,9 @@ extension QueryType { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) class Ares { - typealias QueryCallback = @convention(c) (UnsafeMutableRawPointer?, CInt, CInt, UnsafeMutablePointer?, CInt) -> Void + typealias QueryCallback = @convention(c) ( + UnsafeMutableRawPointer?, CInt, CInt, UnsafeMutablePointer?, CInt + ) -> Void let options: AresOptions let channel: AresChannel @@ -193,11 +195,11 @@ class Ares { extension Ares { // TODO: implement this more nicely using NIO EventLoop? // See: - // https://github.com/dimbleby/c-ares-resolver/blob/master/src/unix/eventloop.rs - // https://github.com/dimbleby/rust-c-ares/blob/master/src/channel.rs - // https://github.com/dimbleby/rust-c-ares/blob/master/examples/event-loop.rs + // https://github.com/dimbleby/c-ares-resolver/blob/master/src/unix/eventloop.rs // ignore-unacceptable-language + // https://github.com/dimbleby/rust-c-ares/blob/master/src/channel.rs // ignore-unacceptable-language + // https://github.com/dimbleby/rust-c-ares/blob/master/examples/event-loop.rs // ignore-unacceptable-language class QueryProcessor { - static let defaultPollInterval: UInt64 = 10 * 1_000_000 // 10ms + static let defaultPollInterval: UInt64 = 10 * 1_000_000 // 10ms private let channel: AresChannel private let pollIntervalNanos: UInt64 @@ -449,7 +451,14 @@ extension Ares { let hostentPtrPtr = UnsafeMutablePointer?>.allocate(capacity: 1) defer { hostentPtrPtr.deallocate() } - let parseStatus = ares_parse_ptr_reply(buffer, length, dummyAddrPointer, INET_ADDRSTRLEN, AF_INET, hostentPtrPtr) + let parseStatus = ares_parse_ptr_reply( + buffer, + length, + dummyAddrPointer, + INET_ADDRSTRLEN, + AF_INET, + hostentPtrPtr + ) switch parseStatus { case ARES_SUCCESS: diff --git a/Sources/AsyncDNSResolver/dnssd/DNSResolver_dnssd.swift b/Sources/AsyncDNSResolver/dnssd/DNSResolver_dnssd.swift index 29c306e..7594b98 100644 --- a/Sources/AsyncDNSResolver/dnssd/DNSResolver_dnssd.swift +++ b/Sources/AsyncDNSResolver/dnssd/DNSResolver_dnssd.swift @@ -182,7 +182,10 @@ extension DNSSD { class QueryReplyHandler { private let _handleRecord: (DNSServiceErrorType, UnsafeRawPointer?, UInt16) -> Void - init(handler: Handler, _ continuation: AsyncThrowingStream.Continuation) { + init( + handler: Handler, + _ continuation: AsyncThrowingStream.Continuation + ) { self._handleRecord = { errorCode, _data, _length in let data: UnsafeRawPointer? let length: UInt16 @@ -232,7 +235,7 @@ protocol DNSSDQueryReplyHandler { @available(macOS 10.15, iOS 13, tvOS 13, watchOS 6, *) extension DNSSD { - // Reference: https://github.com/orlandos-nl/DNSClient/blob/master/Sources/DNSClient/Messages/Message.swift + // Reference: https://github.com/orlandos-nl/DNSClient/blob/master/Sources/DNSClient/Messages/Message.swift // // ignore-unacceptable-language struct AQueryReplyHandler: DNSSDQueryReplyHandler { static let instance = AQueryReplyHandler() @@ -338,12 +341,13 @@ extension DNSSD { var buffer = Array(bufferPtr)[...] guard let mname = self.readName(&buffer), - let rname = self.readName(&buffer), - let serial = buffer.readInteger(as: UInt32.self), - let refresh = buffer.readInteger(as: UInt32.self), - let retry = buffer.readInteger(as: UInt32.self), - let expire = buffer.readInteger(as: UInt32.self), - let ttl = buffer.readInteger(as: UInt32.self) else { + let rname = self.readName(&buffer), + let serial = buffer.readInteger(as: UInt32.self), + let refresh = buffer.readInteger(as: UInt32.self), + let retry = buffer.readInteger(as: UInt32.self), + let expire = buffer.readInteger(as: UInt32.self), + let ttl = buffer.readInteger(as: UInt32.self) + else { throw AsyncDNSResolver.Error(code: .badResponse) } @@ -398,7 +402,8 @@ extension DNSSD { var buffer = Array(bufferPtr)[...] guard let priority = buffer.readInteger(as: UInt16.self), - let host = self.readName(&buffer) else { + let host = self.readName(&buffer) + else { throw AsyncDNSResolver.Error(code: .badResponse) } @@ -441,9 +446,10 @@ extension DNSSD { var buffer = Array(bufferPtr)[...] guard let priority = buffer.readInteger(as: UInt16.self), - let weight = buffer.readInteger(as: UInt16.self), - let port = buffer.readInteger(as: UInt16.self), - let host = self.readName(&buffer) else { + let weight = buffer.readInteger(as: UInt16.self), + let port = buffer.readInteger(as: UInt16.self), + let host = self.readName(&buffer) + else { throw AsyncDNSResolver.Error(code: .badResponse) } @@ -465,8 +471,9 @@ extension DNSSDQueryReplyHandler { func readName(_ buffer: inout ArraySlice) -> String? { var parts: [String] = [] while let length = buffer.readInteger(as: UInt8.self), - length > 0, - let part = buffer.readString(length: Int(length)) { + length > 0, + let part = buffer.readString(length: Int(length)) + { parts.append(part) } diff --git a/Tests/AsyncDNSResolverTests/c-ares/AresChannelTests.swift b/Tests/AsyncDNSResolverTests/c-ares/AresChannelTests.swift index 2ed9dd5..cf8340b 100644 --- a/Tests/AsyncDNSResolverTests/c-ares/AresChannelTests.swift +++ b/Tests/AsyncDNSResolverTests/c-ares/AresChannelTests.swift @@ -12,9 +12,10 @@ // //===----------------------------------------------------------------------===// -@testable import AsyncDNSResolver import XCTest +@testable import AsyncDNSResolver + final class AresChannelTests: XCTestCase { func test_init() async throws { let options = AresOptions() diff --git a/Tests/AsyncDNSResolverTests/c-ares/AresErrorTests.swift b/Tests/AsyncDNSResolverTests/c-ares/AresErrorTests.swift index e1da982..32d8d7d 100644 --- a/Tests/AsyncDNSResolverTests/c-ares/AresErrorTests.swift +++ b/Tests/AsyncDNSResolverTests/c-ares/AresErrorTests.swift @@ -12,10 +12,11 @@ // //===----------------------------------------------------------------------===// -@testable import AsyncDNSResolver import CAsyncDNSResolver import XCTest +@testable import AsyncDNSResolver + final class AresErrorTests: XCTestCase { func test_initFromCode() { let inputs: [Int32: AsyncDNSResolver.Error.Code] = [ @@ -32,7 +33,11 @@ final class AresErrorTests: XCTestCase { for (code, expected) in inputs { let error = AsyncDNSResolver.Error(cAresCode: code, "some error") XCTAssertEqual(error.code, expected) - XCTAssertEqual(error.message, "some error", "Expected description to be \"some error\", got \(error.message)") + XCTAssertEqual( + error.message, + "some error", + "Expected description to be \"some error\", got \(error.message)" + ) } } } diff --git a/Tests/AsyncDNSResolverTests/c-ares/AresOptionsTests.swift b/Tests/AsyncDNSResolverTests/c-ares/AresOptionsTests.swift index 34c989c..c65b465 100644 --- a/Tests/AsyncDNSResolverTests/c-ares/AresOptionsTests.swift +++ b/Tests/AsyncDNSResolverTests/c-ares/AresOptionsTests.swift @@ -12,10 +12,11 @@ // //===----------------------------------------------------------------------===// -@testable import AsyncDNSResolver import CAsyncDNSResolver import XCTest +@testable import AsyncDNSResolver + final class AresOptionsTests: XCTestCase { private typealias Options = CAresDNSResolver.Options private typealias Flags = CAresDNSResolver.Options.Flags @@ -67,10 +68,18 @@ final class AresOptionsTests: XCTestCase { self.assertKeyPathValue(options: aresOptions, keyPath: \.tcp_port, expected: options.tcpPort) self.ensureOptionMaskSet(aresOptions, .TCP_PORT) - self.assertKeyPathValue(options: aresOptions, keyPath: \.socket_send_buffer_size, expected: options.socketSendBufferSize!) + self.assertKeyPathValue( + options: aresOptions, + keyPath: \.socket_send_buffer_size, + expected: options.socketSendBufferSize! + ) self.ensureOptionMaskSet(aresOptions, .SOCK_SNDBUF) - self.assertKeyPathValue(options: aresOptions, keyPath: \.socket_receive_buffer_size, expected: options.socketReceiveBufferSize!) + self.assertKeyPathValue( + options: aresOptions, + keyPath: \.socket_receive_buffer_size, + expected: options.socketReceiveBufferSize! + ) self.ensureOptionMaskSet(aresOptions, .SOCK_RCVBUF) self.assertKeyPathValue(options: aresOptions, keyPath: \.ednspsz, expected: options.ednsPacketSize!) @@ -90,10 +99,18 @@ final class AresOptionsTests: XCTestCase { self.ensureOptionMaskSet(aresOptions, .DOMAINS) XCTAssertNotNil(aresOptions.servers) - XCTAssertEqual(aresOptions.servers, options.servers, "Expected servers to be \(options.servers!), got \(aresOptions.servers!)") + XCTAssertEqual( + aresOptions.servers, + options.servers, + "Expected servers to be \(options.servers!), got \(aresOptions.servers!)" + ) XCTAssertNotNil(aresOptions.sortlist) - XCTAssertEqual(aresOptions.sortlist, options.sortlist, "Expected sortlist to be \(options.sortlist!), got \(aresOptions.sortlist!)") + XCTAssertEqual( + aresOptions.sortlist, + options.sortlist, + "Expected sortlist to be \(options.sortlist!), got \(aresOptions.sortlist!)" + ) } func test_rotate() { @@ -138,7 +155,8 @@ final class AresOptionsTests: XCTestCase { private func assertKeyPathValue( options: AresOptions, - keyPath: KeyPath, expected: T + keyPath: KeyPath, + expected: T ) where T: Equatable { let actual = options.underlying[keyPath: keyPath] XCTAssertEqual(actual, expected, "Expected \(keyPath) to be \(expected), got \(actual)") @@ -151,7 +169,7 @@ final class AresOptionsTests: XCTestCase { ) { let actualPointer = options.underlying[keyPath: keyPath] XCTAssertNotNil(actualPointer, "Expected \(keyPath) to be non nil") - let actual = String(cString: actualPointer!) // !-safe since we check for nil + let actual = String(cString: actualPointer!) // !-safe since we check for nil XCTAssertEqual(actual, expected, "Expected \(keyPath) to be \(expected), got \(actual)") } diff --git a/Tests/AsyncDNSResolverTests/c-ares/CAresDNSResolverTests.swift b/Tests/AsyncDNSResolverTests/c-ares/CAresDNSResolverTests.swift index 0f811fe..c48048f 100644 --- a/Tests/AsyncDNSResolverTests/c-ares/CAresDNSResolverTests.swift +++ b/Tests/AsyncDNSResolverTests/c-ares/CAresDNSResolverTests.swift @@ -12,9 +12,10 @@ // //===----------------------------------------------------------------------===// -@testable import AsyncDNSResolver import XCTest +@testable import AsyncDNSResolver + final class CAresDNSResolverTests: XCTestCase { var resolver: CAresDNSResolver! var verbose: Bool = false @@ -33,7 +34,7 @@ final class CAresDNSResolverTests: XCTestCase { override func tearDown() { super.tearDown() - self.resolver = nil // FIXME: for tsan + self.resolver = nil // FIXME: for tsan } func test_queryA() async throws { @@ -126,7 +127,7 @@ final class CAresDNSResolverTests: XCTestCase { _ query: @escaping (_ index: Int) async throws -> Void ) async throws { try await withThrowingTaskGroup(of: Void.self) { group in - for i in 1 ... times { + for i in 1...times { group.addTask { try await query(i) } @@ -198,13 +199,12 @@ final class CAresDNSResolverTests: XCTestCase { } } - /* expected: "no data" error - try await run { i in - let reply = try await self.resolver.queryNAPTR(name: "apple.com") - if self.verbose { - print("[NAPTR] run #\(i) result: \(reply)") - } - } - */ + // expected: "no data" error + // try await run { i in + // let reply = try await self.resolver.queryNAPTR(name: "apple.com") + // if self.verbose { + // print("[NAPTR] run #\(i) result: \(reply)") + // } + // } } } diff --git a/Tests/AsyncDNSResolverTests/dnssd/DNSDArraySliceTests.swift b/Tests/AsyncDNSResolverTests/dnssd/DNSDArraySliceTests.swift index 15a5a8a..4f71b5a 100644 --- a/Tests/AsyncDNSResolverTests/dnssd/DNSDArraySliceTests.swift +++ b/Tests/AsyncDNSResolverTests/dnssd/DNSDArraySliceTests.swift @@ -12,9 +12,10 @@ // //===----------------------------------------------------------------------===// -@testable import AsyncDNSResolver import XCTest +@testable import AsyncDNSResolver + #if canImport(Darwin) final class DNSDArraySliceTests: XCTestCase { func testReadUnsignedInteger() { diff --git a/Tests/AsyncDNSResolverTests/dnssd/DNSSDDNSResolverTests.swift b/Tests/AsyncDNSResolverTests/dnssd/DNSSDDNSResolverTests.swift index 4825f85..9f4092b 100644 --- a/Tests/AsyncDNSResolverTests/dnssd/DNSSDDNSResolverTests.swift +++ b/Tests/AsyncDNSResolverTests/dnssd/DNSSDDNSResolverTests.swift @@ -12,9 +12,10 @@ // //===----------------------------------------------------------------------===// -@testable import AsyncDNSResolver import XCTest +@testable import AsyncDNSResolver + #if canImport(Darwin) final class DNSSDDNSResolverTests: XCTestCase { var resolver: DNSSDDNSResolver! @@ -29,7 +30,7 @@ final class DNSSDDNSResolverTests: XCTestCase { override func tearDown() { super.tearDown() - self.resolver = nil // FIXME: for tsan + self.resolver = nil // FIXME: for tsan } func test_queryA() async throws { @@ -107,7 +108,10 @@ final class DNSSDDNSResolverTests: XCTestCase { func test_parseA() throws { let addrBytes: [UInt8] = [38, 32, 1, 73] try addrBytes.withUnsafeBufferPointer { - let record = try DNSSD.AQueryReplyHandler.instance.parseRecord(data: $0.baseAddress, length: UInt16($0.count)) + let record = try DNSSD.AQueryReplyHandler.instance.parseRecord( + data: $0.baseAddress, + length: UInt16($0.count) + ) XCTAssertEqual(record, ARecord(address: .init(address: "38.32.1.73"), ttl: nil)) } } @@ -117,7 +121,8 @@ final class DNSSDDNSResolverTests: XCTestCase { try addrBytes.withUnsafeBufferPointer { XCTAssertThrowsError( try DNSSD.AQueryReplyHandler.instance.parseRecord( - data: $0.baseAddress, length: UInt16($0.count) + data: $0.baseAddress, + length: UInt16($0.count) ) ) } @@ -128,7 +133,8 @@ final class DNSSDDNSResolverTests: XCTestCase { try addrBytes.withUnsafeBufferPointer { XCTAssertThrowsError( try DNSSD.AAAAQueryReplyHandler.instance.parseRecord( - data: $0.baseAddress, length: UInt16($0.count) + data: $0.baseAddress, + length: UInt16($0.count) ) ) } @@ -140,7 +146,7 @@ final class DNSSDDNSResolverTests: XCTestCase { _ query: @escaping (_ index: Int) async throws -> Void ) async throws { try await withThrowingTaskGroup(of: Void.self) { group in - for i in 1 ... times { + for i in 1...times { group.addTask { try await query(i) } diff --git a/Tests/AsyncDNSResolverTests/dnssd/DNSSDErrorTests.swift b/Tests/AsyncDNSResolverTests/dnssd/DNSSDErrorTests.swift index da80428..c87123d 100644 --- a/Tests/AsyncDNSResolverTests/dnssd/DNSSDErrorTests.swift +++ b/Tests/AsyncDNSResolverTests/dnssd/DNSSDErrorTests.swift @@ -30,7 +30,11 @@ final class DNSSDErrorTests: XCTestCase { for (code, expected) in inputs { let error = AsyncDNSResolver.Error(dnssdCode: Int32(code), "some error") XCTAssertEqual(error.code, expected) - XCTAssertEqual(error.message, "some error", "Expected description to be \"some error\", got \(error.message)") + XCTAssertEqual( + error.message, + "some error", + "Expected description to be \"some error\", got \(error.message)" + ) } } } diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index 274b772..0000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,28 +0,0 @@ -ARG swift_version=5.6 -ARG ubuntu_version=focal -ARG base_image=swift:$swift_version-$ubuntu_version -FROM $base_image -# needed to do again after FROM due to docker limitation -ARG swift_version -ARG ubuntu_version - -# set as UTF-8 -RUN apt-get update && apt-get install -y locales locales-all -ENV LC_ALL en_US.UTF-8 -ENV LANG en_US.UTF-8 -ENV LANGUAGE en_US.UTF-8 - -# dependencies -RUN apt-get update && apt-get install -y wget -RUN apt-get update && apt-get install -y lsof dnsutils netcat-openbsd net-tools curl jq # used by integration tests - -# tools -RUN mkdir -p $HOME/.tools -RUN echo 'export PATH="$HOME/.tools:$PATH"' >> $HOME/.profile - -# swiftformat (until part of the toolchain) - -ARG swiftformat_version=0.50.1 -RUN git clone --branch $swiftformat_version --depth 1 https://github.com/nicklockwood/SwiftFormat $HOME/.tools/swift-format -RUN cd $HOME/.tools/swift-format && swift build -c release -RUN ln -s $HOME/.tools/swift-format/.build/release/swiftformat $HOME/.tools/swiftformat diff --git a/docker/docker-compose.2004.56.yaml b/docker/docker-compose.2004.56.yaml deleted file mode 100644 index f600fe4..0000000 --- a/docker/docker-compose.2004.56.yaml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-async-dns-resolver:20.04-5.6 - build: - args: - ubuntu_version: "focal" - swift_version: "5.6" - - test: - image: swift-async-dns-resolver:20.04-5.6 - environment: [] - #- SANITIZER_ARG=--sanitize=thread - - shell: - image: swift-async-dns-resolver:20.04-5.6 diff --git a/docker/docker-compose.2204.510.yaml b/docker/docker-compose.2204.510.yaml deleted file mode 100644 index daf276e..0000000 --- a/docker/docker-compose.2204.510.yaml +++ /dev/null @@ -1,17 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-async-dns-resolver:22.04-5.10 - build: - args: - base_image: "swiftlang/swift:nightly-5.10-jammy" - - test: - image: swift-async-dns-resolver:22.04-5.10 - environment: [] - #- SANITIZER_ARG=--sanitize=thread - - shell: - image: swift-async-dns-resolver:22.04-5.10 diff --git a/docker/docker-compose.2204.57.yaml b/docker/docker-compose.2204.57.yaml deleted file mode 100644 index 462b45e..0000000 --- a/docker/docker-compose.2204.57.yaml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-async-dns-resolver:22.04-5.7 - build: - args: - ubuntu_version: "jammy" - swift_version: "5.7" - - test: - image: swift-async-dns-resolver:22.04-5.7 - environment: [] - #- SANITIZER_ARG=--sanitize=thread - - shell: - image: swift-async-dns-resolver:22.04-5.7 diff --git a/docker/docker-compose.2204.58.yaml b/docker/docker-compose.2204.58.yaml deleted file mode 100644 index 5cc45b4..0000000 --- a/docker/docker-compose.2204.58.yaml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-async-dns-resolver:22.04-5.8 - build: - args: - ubuntu_version: "jammy" - swift_version: "5.8" - - test: - image: swift-async-dns-resolver:22.04-5.8 - environment: [] - #- SANITIZER_ARG=--sanitize=thread - - shell: - image: swift-async-dns-resolver:22.04-5.8 diff --git a/docker/docker-compose.2204.59.yaml b/docker/docker-compose.2204.59.yaml deleted file mode 100644 index ecdcf3d..0000000 --- a/docker/docker-compose.2204.59.yaml +++ /dev/null @@ -1,18 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-async-dns-resolver:22.04-5.9 - build: - args: - ubuntu_version: "jammy" - swift_version: "5.9" - - test: - image: swift-async-dns-resolver:22.04-5.9 - environment: [] - #- SANITIZER_ARG=--sanitize=thread - - shell: - image: swift-async-dns-resolver:22.04-5.9 diff --git a/docker/docker-compose.2204.main.yaml b/docker/docker-compose.2204.main.yaml deleted file mode 100644 index 7784f34..0000000 --- a/docker/docker-compose.2204.main.yaml +++ /dev/null @@ -1,17 +0,0 @@ -version: "3" - -services: - - runtime-setup: - image: swift-async-dns-resolver:22.04-main - build: - args: - base_image: "swiftlang/swift:nightly-main-jammy" - - test: - image: swift-async-dns-resolver:22.04-main - environment: [] - #- SANITIZER_ARG=--sanitize=thread - - shell: - image: swift-async-dns-resolver:22.04-main diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml deleted file mode 100644 index 4ed9383..0000000 --- a/docker/docker-compose.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# this file is not designed to be run directly -# instead, use the docker-compose.. files -# eg docker-compose -f docker/docker-compose.yaml -f docker/docker-compose.1804.51.yaml run test -version: "3" - -services: - - runtime-setup: - image: swift-async-dns-resolver:default - build: - context: . - dockerfile: Dockerfile - - common: &common - image: swift-async-dns-resolver:default - depends_on: [runtime-setup] - volumes: - - ~/.ssh:/root/.ssh - - ..:/code:z - working_dir: /code - cap_drop: - - CAP_NET_RAW - - CAP_NET_BIND_SERVICE - - soundness: - <<: *common - command: /bin/bash -xcl "./scripts/soundness.sh" - - test: - <<: *common - environment: - - VERBOSE_TESTS=true - command: /bin/bash -xcl "swift test -Xswiftc -warnings-as-errors $${SANITIZER_ARG-}" - - # util - - shell: - <<: *common - entrypoint: /bin/bash diff --git a/scripts/generate_contributors_list.sh b/scripts/generate_contributors_list.sh deleted file mode 100755 index db7310f..0000000 --- a/scripts/generate_contributors_list.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -##===----------------------------------------------------------------------===## -## -## This source file is part of the SwiftAsyncDNSResolver open source project -## -## Copyright (c) 2020 Apple Inc. and the SwiftAsyncDNSResolver project authors -## Licensed under Apache License v2.0 -## -## See LICENSE.txt for license information -## See CONTRIBUTORS.txt for the list of SwiftAsyncDNSResolver project authors -## -## SPDX-License-Identifier: Apache-2.0 -## -##===----------------------------------------------------------------------===## - -##===----------------------------------------------------------------------===## -## -## 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 -## -##===----------------------------------------------------------------------===## - -set -eu -here="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -contributors=$( cd "$here"/.. && git shortlog -es | cut -f2 | sed 's/^/- /' ) - -cat > "$here/../CONTRIBUTORS.txt" <<- EOF - For the purpose of tracking copyright, this is the list of individuals and - organizations who have contributed source code to the Swift Asynchronous DNS Resolver. - - For employees of an organization/company where the copyright of work done - by employees of that company is held by the company itself, only the company - needs to be listed here. - - ## COPYRIGHT HOLDERS - - - Apple Inc. (all contributors with '@apple.com') - - ### Contributors - - $contributors - - **Updating this list** - - Please do not edit this file manually. It is generated using \`./scripts/generate_contributors_list.sh\`. If a name is misspelled or appearing multiple times: add an entry in \`./.mailmap\` -EOF diff --git a/scripts/preview_docc.sh b/scripts/preview_docc.sh deleted file mode 100755 index 89d487c..0000000 --- a/scripts/preview_docc.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -##===----------------------------------------------------------------------===## -## -## This source file is part of the SwiftAsyncDNSResolver open source project -## -## Copyright (c) 2023 Apple Inc. and the SwiftAsyncDNSResolver project authors -## Licensed under Apache License v2.0 -## -## See LICENSE.txt for license information -## See CONTRIBUTORS.txt for the list of SwiftAsyncDNSResolver project authors -## -## SPDX-License-Identifier: Apache-2.0 -## -##===----------------------------------------------------------------------===## - -##===----------------------------------------------------------------------===## -## -## This source file is part of the Swift Distributed Actors open source project -## -## Copyright (c) 2018-2019 Apple Inc. and the Swift Distributed Actors project authors -## Licensed under Apache License v2.0 -## -## See LICENSE.txt for license information -## See CONTRIBUTORS.md for the list of Swift Distributed Actors project authors -## -## SPDX-License-Identifier: Apache-2.0 -## -##===----------------------------------------------------------------------===## - -swift package --disable-sandbox preview-documentation --target $1 diff --git a/scripts/soundness.sh b/scripts/soundness.sh deleted file mode 100755 index efb44a4..0000000 --- a/scripts/soundness.sh +++ /dev/null @@ -1,133 +0,0 @@ -#!/bin/bash -##===----------------------------------------------------------------------===## -## -## This source file is part of the SwiftAsyncDNSResolver open source project -## -## Copyright (c) 2020-2024 Apple Inc. and the SwiftAsyncDNSResolver project authors -## Licensed under Apache License v2.0 -## -## See LICENSE.txt for license information -## See CONTRIBUTORS.txt for the list of SwiftAsyncDNSResolver project authors -## -## SPDX-License-Identifier: Apache-2.0 -## -##===----------------------------------------------------------------------===## - -set -eu -here="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -function replace_acceptable_years() { - # this needs to replace all acceptable forms with 'YEARS' - sed -e 's/202[0123]-202[1234]/YEARS/' -e 's/202[01234]/YEARS/' -} - -if ! hash swiftformat &> /dev/null -then - printf "\033[0;31mPlease install swiftformat (https://github.com/nicklockwood/SwiftFormat) and run again.\033[0m\n" - exit 1 -fi - -printf "=> Checking format... " -FIRST_OUT="$(git status --porcelain)" -swiftformat . > /dev/null 2>&1 -SECOND_OUT="$(git status --porcelain)" -if [[ "$FIRST_OUT" != "$SECOND_OUT" ]]; then - printf "\033[0;31mformatting issues!\033[0m\n" - git --no-pager diff - exit 1 -else - printf "\033[0;32mokay.\033[0m\n" -fi - -printf "=> Checking license headers...\n" -tmp=$(mktemp /tmp/.swift-async-dns-resolver-sanity_XXXXXX) - -for language in swift-or-c bash dtrace; do - printf " * checking $language... " - declare -a matching_files - declare -a exceptions - expections=( ) - matching_files=( -name '*' ) - case "$language" in - swift-or-c) - exceptions=( -path '*Sources/CAsyncDNSResolver/c-ares/*' -o -name Package.swift) - matching_files=( -name '*.swift' -o -name '*.c' -o -name '*.h' ) - cat > "$tmp" <<"EOF" -//===----------------------------------------------------------------------===// -// -// This source file is part of the SwiftAsyncDNSResolver open source project -// -// Copyright (c) YEARS Apple Inc. and the SwiftAsyncDNSResolver project authors -// Licensed under Apache License v2.0 -// -// See LICENSE.txt for license information -// See CONTRIBUTORS.txt for the list of SwiftAsyncDNSResolver project authors -// -// SPDX-License-Identifier: Apache-2.0 -// -//===----------------------------------------------------------------------===// -EOF - ;; - bash) - matching_files=( -name '*.sh' ) - cat > "$tmp" <<"EOF" -#!/bin/bash -##===----------------------------------------------------------------------===## -## -## This source file is part of the SwiftAsyncDNSResolver open source project -## -## Copyright (c) YEARS Apple Inc. and the SwiftAsyncDNSResolver project authors -## Licensed under Apache License v2.0 -## -## See LICENSE.txt for license information -## See CONTRIBUTORS.txt for the list of SwiftAsyncDNSResolver project authors -## -## SPDX-License-Identifier: Apache-2.0 -## -##===----------------------------------------------------------------------===## -EOF - ;; - dtrace) - matching_files=( -name '*.d' ) - cat > "$tmp" <<"EOF" -#!/usr/sbin/dtrace -q -s -/*===----------------------------------------------------------------------===* - * - * This source file is part of the SwiftAsyncDNSResolver open source project - * - * Copyright (c) YEARS Apple Inc. and the SwiftAsyncDNSResolver project authors - * Licensed under Apache License v2.0 - * - * See LICENSE.txt for license information - * See CONTRIBUTORS.txt for the list of SwiftAsyncDNSResolver project authors - * - * SPDX-License-Identifier: Apache-2.0 - * - *===----------------------------------------------------------------------===*/ -EOF - ;; - *) - echo >&2 "ERROR: unknown language '$language'" - ;; - esac - - expected_lines=$(cat "$tmp" | wc -l) - expected_sha=$(cat "$tmp" | shasum) - - ( - cd "$here/.." - find . \ - \( \! -path './.build/*' -a \ - \( "${matching_files[@]}" \) -a \ - \( \! \( "${exceptions[@]}" \) \) \) | while read line; do - if [[ "$(cat "$line" | replace_acceptable_years | head -n $expected_lines | shasum)" != "$expected_sha" ]]; then - printf "\033[0;31mmissing headers in file '$line'!\033[0m\n" - diff -u <(cat "$line" | replace_acceptable_years | head -n $expected_lines) "$tmp" - exit 1 - fi - done - printf "\033[0;32mokay.\033[0m\n" - ) -done - -rm "$tmp"