From e4a1abc29d529534c1907a11ebe25ba48cd09198 Mon Sep 17 00:00:00 2001 From: Alan Peixinho Date: Thu, 1 Oct 2026 14:06:18 -0300 Subject: [PATCH 1/2] feat(http): include OS family in User-Agent Coarse OS in the kci-dev UA supports dashboard client analytics (kernelci/dashboard#2144). Signed-off-by: Alan Peixinho --- kcidev/libs/common.py | 13 ++++++++++++- tests/test_kcidev.py | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/kcidev/libs/common.py b/kcidev/libs/common.py index 6d15902..2272cb7 100644 --- a/kcidev/libs/common.py +++ b/kcidev/libs/common.py @@ -4,6 +4,7 @@ import json import logging import os +import platform import sys from importlib.metadata import PackageNotFoundError, version @@ -20,8 +21,18 @@ except PackageNotFoundError: kcidev_version = "unknown" + +def client_os_family() -> str: + system = platform.system() + if system == "Darwin": + return "macOS" + return system or "unknown" + + kcidev_session = requests.Session() -kcidev_session.headers["User-Agent"] = f"kci-dev/{kcidev_version}" +kcidev_session.headers["User-Agent"] = ( + f"kci-dev/{kcidev_version} ({client_os_family()})" +) # Default connect and read timeouts for HTTP operations. HTTP_TIMEOUT = (10, 60) diff --git a/tests/test_kcidev.py b/tests/test_kcidev.py index 72b3ee2..d021fbe 100644 --- a/tests/test_kcidev.py +++ b/tests/test_kcidev.py @@ -6,7 +6,7 @@ import git import pytest -from kcidev.libs.common import kcidev_session, kcidev_version +from kcidev.libs.common import client_os_family, kcidev_session, kcidev_version from kcidev.subcommands.config import add_config @@ -871,7 +871,7 @@ def test_kcidev_results_build_with_real_id(): def test_kcidev_session_user_agent(): ua = kcidev_session.headers["User-Agent"] - assert ua == f"kci-dev/{kcidev_version}" + assert ua == f"kci-dev/{kcidev_version} ({client_os_family()})" def test_kcidev_version_from_metadata(): From 64b2c119fff9b54556139725a0a9aeca778428c3 Mon Sep 17 00:00:00 2001 From: Alan Peixinho Date: Fri, 2 Oct 2026 14:04:20 -0300 Subject: [PATCH 2/2] test(http): assert OS family mappings directly * Assert Linux, Darwin, Windows, and an empty value directly. * Report unknown for any OS outside Linux, macOS, and Windows. Signed-off-by: Alan Peixinho --- kcidev/libs/common.py | 4 +++- tests/test_kcidev.py | 20 +++++++++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/kcidev/libs/common.py b/kcidev/libs/common.py index 2272cb7..668f483 100644 --- a/kcidev/libs/common.py +++ b/kcidev/libs/common.py @@ -26,7 +26,9 @@ def client_os_family() -> str: system = platform.system() if system == "Darwin": return "macOS" - return system or "unknown" + if system == "Linux" or system == "Windows": + return system + return "unknown" kcidev_session = requests.Session() diff --git a/tests/test_kcidev.py b/tests/test_kcidev.py index d021fbe..7b3b978 100644 --- a/tests/test_kcidev.py +++ b/tests/test_kcidev.py @@ -869,9 +869,27 @@ def test_kcidev_results_build_with_real_id(): pass +@pytest.mark.parametrize( + ("system", "expected"), + [ + ("Linux", "Linux"), + ("Darwin", "macOS"), + ("Windows", "Windows"), + ("", "unknown"), + ("FreeBSD", "unknown"), + ], +) +def test_client_os_family(monkeypatch, system, expected): + monkeypatch.setattr("kcidev.libs.common.platform.system", lambda: system) + assert client_os_family() == expected + + def test_kcidev_session_user_agent(): ua = kcidev_session.headers["User-Agent"] - assert ua == f"kci-dev/{kcidev_version} ({client_os_family()})" + assert re.fullmatch( + rf"kci-dev/{re.escape(kcidev_version)} \((Linux|macOS|Windows|unknown)\)", + ua, + ) def test_kcidev_version_from_metadata():