Skip to content

Commit

Permalink
Use script to run cargo test, simplify subprocess call.
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinhartman committed Jan 29, 2025
1 parent 1715e32 commit 663eaa8
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 17 deletions.
13 changes: 3 additions & 10 deletions .azure/test-linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,20 +96,13 @@ jobs:
sudo apt-get install -y graphviz
displayName: 'Install optional non-Python dependencies'
# Note that we explicitly use the virtual env with Qiskit installed to run the Rust
# tests since some of them still depend on Qiskit's Python API via PyO3.
- ${{ if eq(parameters.testRust, true) }}:
# We need to avoid linking our crates into full Python extension libraries during Rust-only
# testing because Rust/PyO3 can't handle finding a static CPython interpreter.
# Note that we use the virtual env with Qiskit installed to run the Rust
# tests since some of them still depend on Qiskit's Python API via PyO3.
- bash: |
source test-job/bin/activate
python tools/report_numpy_state.py
PYTHONUSERBASE="$VIRTUAL_ENV" cargo test --no-default-features
env:
# On Linux we link against `libpython` dynamically, but it isn't written into the rpath
# of the test executable (I'm not 100% sure why ---Jake). It's easiest just to forcibly
# include the correct place in the `dlopen` search path.
LD_LIBRARY_PATH: '$(usePython.pythonLocation)/lib:$LD_LIBRARY_PATH'
python tools/run_cargo_test.py
displayName: "Run Rust tests"
- bash: |
Expand Down
40 changes: 40 additions & 0 deletions tools/run_cargo_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#!/usr/bin/env python3

# This code is part of Qiskit.
#
# (C) Copyright IBM 2025.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

"""
Utility script to invoke cargo test within the current Python environment.
Notably, this sets up the environment variables necessary for Qiskit to be
found by PyO3 / our Rust test executable.
"""

import os
import subprocess
import sys
import sysconfig

# This allows the Python interpreter baked into our test executable to find the
# Qiskit installed in the active environment.
os.environ["PYTHONUSERBASE"] = sys.prefix

# On Linux, the test executable's RPATH doesn't contain libpython, so we add it
# to the dlopen search path here.
os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(
filter(None, [sysconfig.get_config_var("LIBDIR"), os.getenv("LD_LIBRARY_PATH")])
)

# The '--no-default-features' flag is used here to disable PyO3's
# 'extension-module' when running the tests (which would otherwise cause link
# errors).
subprocess.run(["cargo", "test", "--no-default-features"], check=True)
8 changes: 1 addition & 7 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,8 @@ commands =
[testenv:rust]
basepython = python3
package_env = .pkg-rust
setenv =
PYTHONUSERBASE={envdir}
allowlist_externals = cargo
commands =
python -c '\
import os, subprocess, sysconfig;\
os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(filter(None, [sysconfig.get_config_var("LIBDIR"), os.getenv("LD_LIBRARY_PATH")]));\
subprocess.run(["cargo", "test", "--no-default-features"]).check_returncode()'
commands = python tools/run_cargo_test.py

# This is a special package_env used by the 'rust' env above
# to force Qiskit's Rust code to build in debug mode. We do this
Expand Down

0 comments on commit 663eaa8

Please sign in to comment.