77import json
88import os
99from pathlib import Path
10+ import re
1011import shutil
1112import signal
1213import socket
1314import subprocess
1415import sys
1516import tempfile
1617import time
17- import tomllib
1818from typing import Any
1919from urllib .error import HTTPError , URLError
2020from urllib .request import Request , urlopen
@@ -105,20 +105,11 @@ def build_fixture(
105105 return executable .resolve ()
106106
107107
108- def package_version (server_directory : Path ) -> tuple [int , int , int ]:
109- with (server_directory / "Cargo.toml" ).open ("rb" ) as stream :
110- value = tomllib .load (stream )["package" ]["version" ]
111- components = value .split ("." )
112- if len (components ) != 3 or not all (component .isdigit () for component in components ):
113- raise RegressionFailure (f"fixture requires a stable numeric package version, got { value } " )
114- return tuple (int (component ) for component in components ) # type: ignore[return-value]
115-
116-
117- def validate_root_server (executable : Path , expected_version : str ) -> None :
108+ def executable_version (executable : Path , label : str ) -> tuple [int , int , int ]:
118109 if not executable .is_file ():
119- raise RegressionFailure (f"root server executable does not exist: { executable } " )
110+ raise RegressionFailure (f"{ label } executable does not exist: { executable } " )
120111 if os .name != "nt" and not os .access (executable , os .X_OK ):
121- raise RegressionFailure (f"root server is not executable: { executable } " )
112+ raise RegressionFailure (f"{ label } executable is not executable: { executable } " )
122113 try :
123114 completed = subprocess .run (
124115 [str (executable ), "--version" ],
@@ -128,12 +119,27 @@ def validate_root_server(executable: Path, expected_version: str) -> None:
128119 timeout = 10 ,
129120 )
130121 except subprocess .TimeoutExpired as error :
131- raise RegressionFailure ("root server --version timed out" ) from error
122+ raise RegressionFailure (f"{ label } --version timed out" ) from error
123+ except subprocess .CalledProcessError as error :
124+ raise RegressionFailure (
125+ f"{ label } --version exited with status { error .returncode } "
126+ ) from error
127+
132128 reported = completed .stdout .strip ()
133- expected = f"codex-web { expected_version } "
134- if reported != expected :
129+ match = re .fullmatch (r"codex-web ([0-9]+)\.([0-9]+)\.([0-9]+)" , reported )
130+ if match is None :
131+ raise RegressionFailure (
132+ f"{ label } requires a stable numeric codex-web version, got { reported !r} "
133+ )
134+ return tuple (int (component ) for component in match .groups ()) # type: ignore[return-value]
135+
136+
137+ def validate_root_server (executable : Path , expected_version : str ) -> None :
138+ reported_version = version_text (executable_version (executable , "root server" ))
139+ if reported_version != expected_version :
135140 raise RegressionFailure (
136- f"root server version mismatch: expected { expected !r} , got { reported !r} "
141+ "root server version mismatch: "
142+ f"expected { expected_version !r} , got { reported_version !r} "
137143 )
138144
139145
@@ -431,12 +437,13 @@ def run_regression(args: argparse.Namespace) -> dict[str, Any]:
431437 if not fixture .is_file ():
432438 raise RegressionFailure (f"fixture executable does not exist: { fixture } " )
433439
434- root_version = version_text (package_version (server_directory ))
440+ fixture_version = executable_version (fixture , "fixture" )
441+ root_version = version_text (fixture_version )
435442 packaged_root = args .root_server is not None
436443 root_server = args .root_server .resolve () if packaged_root else fixture
437444 if packaged_root :
438445 validate_root_server (root_server , root_version )
439- first_tuple , second_tuple , failed_tuple = next_versions (package_version ( server_directory ) )
446+ first_tuple , second_tuple , failed_tuple = next_versions (fixture_version )
440447 first_version = version_text (first_tuple )
441448 second_version = version_text (second_tuple )
442449 failed_version = version_text (failed_tuple )
0 commit comments