From d63a17741663e5263c00220d5239ff30d24ba9f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavol=20=C5=BD=C3=A1=C4=8Dik?= Date: Tue, 23 Jul 2024 18:06:16 +0200 Subject: [PATCH] Add simple sanity tests of the Python bindings And include them in the CI together with pylint and formatting checks. --- .github/workflows/python.yml | 48 +++++++++++++++++++ .readthedocs.yml | 2 +- .../libcpuid/_ffi_build_rtd.py} | 0 python/tests/sanity_test.py | 46 ++++++++++++++++++ 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/python.yml rename python/{ffi_build_rtd.py => src/libcpuid/_ffi_build_rtd.py} (100%) create mode 100644 python/tests/sanity_test.py diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml new file mode 100644 index 00000000..18eb5915 --- /dev/null +++ b/.github/workflows/python.yml @@ -0,0 +1,48 @@ +name: Test Python bindings + +on: + push: + branches: + - '*' + pull_request: + branches: + - '*' + +jobs: + test_python: + name: Test Python bindings + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Build and install libcpuid + run: | + sudo apt-get install autoconf libtool automake + libtoolize + autoreconf --install + ./configure + make + sudo make install + sudo ldconfig + + - name: Check code formatting (black) + run: | + pip install black + black --check python + + - name: Install the libcpuid Python package + run: pip install ./python + + - name: Perform static analysis (pylint) + run: | + pip install pylint + pylint python/src/libcpuid + + - name: Run tests + run: | + pip install pytest + pytest ./python diff --git a/.readthedocs.yml b/.readthedocs.yml index 61e9458d..08665843 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -19,7 +19,7 @@ build: - make - make install - pip install cffi - - python ./python/ffi_build_rtd.py ./libcpuid/libcpuid.h ./install + - python ./python/src/libcpuid/_ffi_build_rtd.py ./libcpuid/libcpuid.h ./install sphinx: configuration: python/docs/conf.py diff --git a/python/ffi_build_rtd.py b/python/src/libcpuid/_ffi_build_rtd.py similarity index 100% rename from python/ffi_build_rtd.py rename to python/src/libcpuid/_ffi_build_rtd.py diff --git a/python/tests/sanity_test.py b/python/tests/sanity_test.py new file mode 100644 index 00000000..bf17dc45 --- /dev/null +++ b/python/tests/sanity_test.py @@ -0,0 +1,46 @@ +"""Sanity tests for the libcpuid package.""" + +import os +import tempfile +import libcpuid +from libcpuid.info import CPUInfo, SystemInfo +from libcpuid.raw import CPURawData, CPURawDataArray + + +def test_cpu_name_in_vendor_list(): + """ + Checks that the current CPU codename appears + in the list of all CPUs of its vendor. + """ + info = CPUInfo.from_current_cpu() + cpulist = libcpuid.get_cpu_list(info.vendor) + assert info.cpu_codename in cpulist + + +def test_serialization(): + """ + Checks that CPU data serialization and + deserialization does not raise any errors. + """ + with tempfile.TemporaryDirectory() as tmpdirname: + info_file = os.path.join(tmpdirname, "info.txt") + raw = CPURawData.from_current_cpu() + raw.serialize(info_file) + info = CPUInfo.from_raw(raw) + info_from_file = CPUInfo.from_raw(CPURawData.from_file(info_file)) + assert info.features == info_from_file.features + + +def test_array_serialization(): + """ + Checks that CPU array data serialization and + deserialization does not raise any errors. + """ + with tempfile.TemporaryDirectory() as tmpdirname: + info_file = os.path.join(tmpdirname, "info.txt") + raw_array = CPURawDataArray.from_all_cpus() + raw_array.serialize(info_file) + info = SystemInfo.from_raw_array(raw_array) + info_from_file = SystemInfo.from_raw_array(CPURawDataArray.from_file(info_file)) + assert len(info) == len(info_from_file) + assert info[0].features == info_from_file[0].features