ノート

[BUG] 8371092: NullPointerException in AltServiceUsageTest.afterClass() test

テスト後にチャンネルを閉じる時に発生するぬるぽに対処しました。

概要#

 net 系の​ AltServiceUsageTest では,​テスト・クラスの​初期化時に​ DatagramChannel udpNotResponding を​フィールドと​して​保持しています1。​ この​ DatagramChannel は​テスト終了後​(つまり,​テスト・クラスの​破棄時)に​閉じられます2

 正常系ではオリジンおよび​代替サーバの​準備チャンネルの​作成テスト・テスト・テストチャンネルの​破棄 と​なり,​特段問題ありません。

 ところで,​85 行目3では​「オリジン・サーバと​代替サーバ」の​アドレスを​比較して,​これが​同一で​あればチャンネルを​準備しない(=初期化しない)と​いう​挙動を​取ります。​ この​場合に​テストが​行われると,​チャンネルが​依然と​して​初期化されないため,​チャンネルの​破棄時に​ NullPointerException が​発生する​恐れが​あります4

2026/11/02 JBS で​発見#

 本バグを​ JBS で​発見し,​ローカルで​検証を​行いました。​その​結果,​危惧された​バグが​再現された​ため,​修正に​取り掛かりました。

 以下は,​修正対象の​メソッドです5

@AfterClass
public void afterClass() throws Exception {
    safeStop(originServer);
    safeStop(altServer);
    udpNotResponding.close();
}

 この​部分に​問題が​ある​ため,​ここに​ null チェックを​差し挟む処理を​入れます。​ udpNotResponding.close(); は​他の​箇所でも​呼び出される​ため,​共通の​ヘルパ・メソッドを​作成して,​それを​呼び出す形としました。​ 統合可能と​して​マークしました。

private static void safeStop(final HttpTestServer server) {
    if (server == null) {
        return;
    }
    final InetSocketAddress serverAddr = server.getAddress();
    try {
        System.out.println("Stopping server " + serverAddr);
        server.stop();
    } catch (Exception e) {
        System.err.println("Ignoring exception: " + e.getMessage() + " that occurred " +
                "during stop of server: " + serverAddr);
    }
}

 これを​導入し,​呼び出し部​分も​置換する​ことで,​修正としました6

2025/11/03 レビュー#

 Daniel Fuchs7氏に​レビューを​いただき,​Approve されました。​ また,​あわせて​以下の​コメントを​いただきました。

Please make sure to run the test locally before integrating. Networking tests are not run by github actions.

2025/11/04 統合リクエスト#

 先の​レビューを​確認したのち,​ローカルで​テストを​行った​ところ,​パスした​ことを​確認しました。​ 統合可能と​して​マークしました。

2025/11/05 統合#

 Fuchs7 氏に​ /sponser を​していただき,2f455ed8 と​して​ JDK へ​統合されました。


Footnotes#

  1. 2