Coverage for cuda / pathfinder / _dynamic_libs / subprocess_protocol.py: 93.33%

45 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-29 01:27 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# SPDX-License-Identifier: Apache-2.0 

3 

4from __future__ import annotations 

5 

6import json 

7import sys 

8from dataclasses import dataclass 

9from pathlib import Path 

10from typing import Literal 

11 

12MODE_CANARY: Literal["canary"] = "canary" 

13MODE_LOAD: Literal["load"] = "load" 

14VALID_MODES: tuple[Literal["canary"], Literal["load"]] = (MODE_CANARY, MODE_LOAD) 

15 

16STATUS_OK: Literal["ok"] = "ok" 

17STATUS_NOT_FOUND: Literal["not-found"] = "not-found" 

18 

19DYNAMIC_LIB_SUBPROCESS_MODULE = "cuda.pathfinder._dynamic_libs.dynamic_lib_subprocess" 

20DYNAMIC_LIB_SUBPROCESS_CWD = Path(__file__).resolve().parents[3] 

21 

22 

23@dataclass(frozen=True) 

24class DynamicLibSubprocessPayload: 

25 status: Literal["ok", "not-found"] 

26 abs_path: str | None 

27 

28 

29def format_dynamic_lib_subprocess_payload( 

30 status: Literal["ok", "not-found"], 

31 abs_path: str | None, 

32 *, 

33 error: dict[str, str] | None = None, 

34) -> str: 

35 payload: dict[str, object] = {"status": status, "abs_path": abs_path} 1!#$678

36 if error is not None: 1!#$678

37 payload["error"] = error 1678

38 return json.dumps(payload) 1!#$678

39 

40 

41def build_dynamic_lib_subprocess_command(mode: str, libname: str) -> list[str]: 

42 return [sys.executable, "-m", DYNAMIC_LIB_SUBPROCESS_MODULE, mode, libname] 1%95'QRdSeTfUbgVhWijkXYlmnopZcqrstuvwxyzABCDEFGHIJK0LM1N2O3P4()

43 

44 

45def parse_dynamic_lib_subprocess_payload( 

46 stdout: str, 

47 *, 

48 libname: str, 

49 error_label: str, 

50) -> DynamicLibSubprocessPayload: 

51 # Use the final non-empty line in case earlier output lines are emitted. 

52 lines = [line for line in stdout.splitlines() if line.strip()] 195QRdSeTfUbgVhWijkXYlmnopZcqrstuvwxyzABCDEFGHIJK0LM1N2O3P4

53 if not lines: 195QRdSeTfUbgVhWijkXYlmnopZcqrstuvwxyzABCDEFGHIJK0LM1N2O3P4

54 raise RuntimeError(f"{error_label} produced no stdout payload for {libname!r}") 19

55 try: 15QRdSeTfUbgVhWijkXYlmnopZcqrstuvwxyzABCDEFGHIJK0LM1N2O3P4

56 payload = json.loads(lines[-1]) 15QRdSeTfUbgVhWijkXYlmnopZcqrstuvwxyzABCDEFGHIJK0LM1N2O3P4

57 except json.JSONDecodeError: 15

58 raise RuntimeError(f"{error_label} emitted invalid JSON payload for {libname!r}: {lines[-1]!r}") from None 15

59 if not isinstance(payload, dict): 1QRdSeTfUbgVhWijkXYlmnopZcqrstuvwxyzABCDEFGHIJK0LM1N2O3P4

60 raise RuntimeError(f"{error_label} emitted unexpected payload for {libname!r}: {payload!r}") 

61 status = payload.get("status") 1QRdSeTfUbgVhWijkXYlmnopZcqrstuvwxyzABCDEFGHIJK0LM1N2O3P4

62 abs_path = payload.get("abs_path") 1QRdSeTfUbgVhWijkXYlmnopZcqrstuvwxyzABCDEFGHIJK0LM1N2O3P4

63 if status == STATUS_OK: 1QRdSeTfUbgVhWijkXYlmnopZcqrstuvwxyzABCDEFGHIJK0LM1N2O3P4

64 if not isinstance(abs_path, str): 1RSTUbVWXYZc01234

65 raise RuntimeError(f"{error_label} emitted unexpected payload for {libname!r}: {payload!r}") 

66 return DynamicLibSubprocessPayload(status=STATUS_OK, abs_path=abs_path) 1RSTUbVWXYZc01234

67 if status == STATUS_NOT_FOUND: 1QdefbghijklmnopcqrstuvwxyzABCDEFGHIJKLMNOP

68 if abs_path is not None: 1defbghijklmnopcqrstuvwxyzABCDEFGHIJKLMNOP

69 raise RuntimeError(f"{error_label} emitted unexpected payload for {libname!r}: {payload!r}") 

70 return DynamicLibSubprocessPayload(status=STATUS_NOT_FOUND, abs_path=None) 1defbghijklmnopcqrstuvwxyzABCDEFGHIJKLMNOP

71 raise RuntimeError(f"{error_label} emitted unexpected payload for {libname!r}: {payload!r}") 1Q