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