-
-
Notifications
You must be signed in to change notification settings - Fork 45
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
Combine the WebDriver setup process into WebDriverService and make it easier to reuse #474
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
self comment
@@ -0,0 +1,25 @@ | |||
public func withRetry<R>( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
コピペで移動してきた
|
||
public struct CommandWebDriverService: WebDriverService { | ||
private static func findAvailablePort() async throws -> SocketAddress { | ||
let bootstrap = ServerBootstrap(group: .singletonMultiThreadedEventLoopGroup) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここの EventLoopGroup だけ NIOPosixの提供するシングルトンに変えた
他はコピペ
private static func launchDriver( | ||
terminal: InteractiveWriter, | ||
executablePath: String | ||
) async throws -> (URL, CartonHelpers.Process) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Processを返すように変更する
public var process: CartonHelpers.Process | ||
|
||
public func dispose() { | ||
process.signal(SIGKILL) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
このサービスはコマンドで起動するのでdisposeでKILLするためにProcessを持つ
guard process.terminationStatus == 0 else { | ||
let body: String? = responseBody.map { String(decoding: $0, as: UTF8.self) } | ||
|
||
throw WebDriverError.curlError( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ここエラーの内容をリッチにした。
|
||
public var endpoint: URL | ||
|
||
public func dispose() {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
これはリモートのURLを持つだけなので空
func checkRemoteURL() throws -> URL { | ||
guard let value = ProcessInfo.processInfo.environment["WEBDRIVER_REMOTE_URL"] else { | ||
throw XCTSkip("Skip WebDriver tests due to no WEBDRIVER_REMOTE_URL env var") | ||
func testGotoURLSession() async throws { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
このテストケースの目的は、
クライアント実装が動作するか確かめることなので、
URLSessionとCurlの両方を確かめたい。
それぞれテストケースとして分離して、明示的に渡すことでテストする。
ここではクライアントのテストがしたいので、
どの方式で Web Driver を起動しているかは関心がないため、
WEBDRIVER_REMOTE_URL
を参照する挙動は変更して、
carton test
コマンドと同じロジックで利用可能な Web Driver を検索させるようにする。
それはそれとして、
様々な WebDriver 実装ごとのテストを追加した方が良い。
このパッチではやらない。
CIのLinuxのエラー
curlの方も3度目の正直でギリギリ通過してるので、 |
ふ〜む? |
生まれてからずっと壊れていたらしくて、corelibs-foundation内部のバグの可能性が高いので、この問題は見送る。 |
|
||
#else | ||
|
||
// Due to a broken URLSession in swift-corelibs-foundation, this class cannot be used on Linux. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Linuxでは動かないという情報を残しておく
@kateinoigakukun まとまったので確認をお願いします |
return curl | ||
} | ||
|
||
#if os(Linux) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
URLSession is broken on not only Linux but also all platforms that use corelibs-foundation. So I think #if canImport(FoundationNetworking)
would be the correct condition.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
なるほど。後で直します。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
背景
#473 のために、WebDriver を利用したい。
WebDriver の実装は
WebDriverClient.swift
にクライアント実装、CartonFrontendTestCommand.swift
にドライバの選択処理などが書かれている。提案
WebDriver関連の実装をモジュールにまとめて、
テストなどから再利用しやすいようにする。
WebDriverHTTPClient
の公開WebDriverClient
において、curl が使える状況では 引数で受け取った
URLSession
を捨てるようになっていた。また、 curl と URLSession の抽象化のために
WebDriverHTTPClient
を定義していた。URLSession
はこれに直接準拠していた。WebDriverClient
がHTTP通信に使う依存物は、ユーザー側から注入をコントロールできるようにした方が良い。
そのほうが、個別の実装をテストしたり、
自動選択したりする挙動を使う意図が明確なコードを書くことができる。
しかし、
WebDriverHTTPClient
のメソッドは、URLSession
の既存のメソッドと紛らわしいし、仕様がこの用途に特化しているため、他の場所から使われたくないため、
URLSession
への準拠させたくはない。そこで、
URLSessionWebDriverHTTPClient
というアダプタを用意する。また、
Curl
型もCurlWebDriverHTTPClient
にリネームする。さらに、従来の選択挙動は
WebDriverHTTPClients.find
として利用可能にする。Linux の対応
URLSessionWebDriverHTTPClient
は Linux では全く動かないことがわかった。既存の実装も動いてなかったらしい。
そこで、これが動かないことをコメントしつつ、
#if os
でLinuxでは完全に存在を消す。以下で起票された。
swiftlang/swift-corelibs-foundation#4965
WebDriverService
の実装CartonFrontendTestCommand
において3種類のWebDriver利用パターンがあり、そのうち2種類は終了時に専用のクリーンアップ処理が必要になっている。
そこで、この概念を
WebDriverService
として抽象化して、3種類の実装を2つの具体型の
RemoteWebDriverService
とCommandWebDriverService
として定義し直す。WebDriverService
はすでに起動した web driver を表現していて、dispose
メソッドでシャットダウンを行う。また、(extensionで定義された)
client
メソッドにWebDriverHTTPClient
を渡すことで、セッションの初期化が終了し通信できる状態になったクライアントを返す。
また、従来のドライバ選択ロジックは
WebDriverServices.find
として利用可能にする。withRetry
の公開WebDriverの既存ロジックにリトライ施行があったが、
CommandTestHelper
のwithRetry
で同じ挙動を再現できるので、これを
CartonHelpers
に移動して共通化する。これはリトライ時のメッセージも出すので、
よりユーザが状況を把握しやすい。
以下は実例のテストの出力で、safaridriver + curlの場合に、
curlの呼び出しが早すぎて一回失敗していることがわかる
WebDriver
モジュールへの名前変更WebDriverService
なども含まれたので、WebDriverClient
モジュールをWebDriver
モジュールに名前変更する