Skip to main content

Fault injection and testing core

Project description

faultcore logo

Python 3.10+ License: MIT PyPI Downloads CI ReadTheDocs

Helps you test how your application behaves under realistic network failures without rewriting application code or introducing an in-app proxy layer.

Core value:

  • non-intrusive Linux socket interception through LD_PRELOAD;
  • Python-first ergonomics (decorators, policy APIs, CLI workflows);
  • deterministic and reproducible fault decisions for CI validation;
  • broad fault model coverage across connection, transport, DNS, and payload behavior.

Detailed documentation lives in docs/ and is published at:

Package distribution (PyPI):

High-level architecture

Faultcore interceptor flow

Execution model:

  1. Python decorators/policies write effective configuration to shared memory.
  2. Linux interceptor hooks socket syscalls (send, recv, connect, sendto, recvfrom, getaddrinfo).
  3. faultcore_network evaluates a deterministic runtime-stage graph (R0..R8) with operation-specific applicability.
  4. Runtime applies directives (delay, drop, timeout, error, mutate, reorder, duplicate) and then calls original libc functions when needed.

Quick Start

Install from PyPI:

pip install faultcore

Requirements:

  • Python 3.10+
  • Rust toolchain
  • Linux for network interception

Install development dependencies and build native artifacts:

uv sync --group dev
./build.sh

build.sh expects .venv/bin/python to exist, validates version alignment across pyproject.toml, faultcore_interceptor/Cargo.toml, and faultcore_network/Cargo.toml, then stages Linux interceptor artifacts into src/faultcore/_native/<platform-tag>/ before building wheels.

Fast validation path:

sh lint.sh
sh build.sh
sh tests.sh

Long stress path (optional):

sh tests_long.sh

CLI-first execution:

uv run faultcore doctor
uv run faultcore run -- python -c "import socket; print('ok')"
uv run faultcore run --run-json artifacts/run.json -- pytest -q
uv run faultcore report --input artifacts/run.json --output artifacts/report.html
uv run faultcore report --input artifacts/run.json --output artifacts/report.latest.html --max-events 200 --reverse-events

Notes:

  • faultcore run defaults to strict mode on Linux and exits with code 2 when interceptor probing fails.
  • Use --no-strict only for debugging environments where preload activation is intentionally unavailable.
  • With --run-json, CLI enables record/replay capture mode automatically when mode is unset/off and writes <run-json>.rr.jsonl.gz when FAULTCORE_RECORD_REPLAY_PATH is unset.
  • faultcore report supports optional event rendering controls: --max-events and --reverse-events.

Manual LD_PRELOAD execution is still available for advanced debugging.

Platform behavior:

  • Linux: faultcore run configures LD_PRELOAD automatically and probes interceptor activation in strict mode.
  • Non-Linux: decorators and policy APIs are still callable, but interceptor-level network effects are not active.

Minimal usage:

import faultcore

@faultcore.timeout(connect="200ms")
def slow_operation():
    return "ok"

@faultcore.rate("10mbps")
def network_operation():
    return "ok"

What you can test

It supports failure scenarios that commonly cause production-only bugs:

  • latency and jitter;
  • packet loss and burst loss;
  • bandwidth throttling;
  • connection and receive timeouts;
  • connection error injection;
  • DNS delay, timeout, and NXDOMAIN;
  • correlated loss (Gilbert-Elliott style state behavior);
  • directional profiles (uplink vs downlink);
  • packet duplicate and packet reorder;
  • session budget limits (bytes, ops, duration);
  • payload mutation in stream operations;
  • target-aware rules (hostname/SNI/protocol/address/port based scope);
  • record/replay for reproducible failure timelines.

These can be combined in one run to validate retries, idempotency, fallbacks, parser robustness, and resilience logic under stress.

Typical CI use cases

  • Validate retry/backoff behavior under timeout + packet loss.
  • Validate DNS fallback and graceful degradation under resolver faults.
  • Validate stream parser robustness under payload mutation and reorder.
  • Reproduce flaky integration failures with record/replay evidence.
  • Generate run JSON + HTML report artifacts for post-run analysis.

Documentation Index

Primary docs entrypoint:

Core documentation paths:

Document Scope
docs/getting_started.md Installation, first run, first decorator
docs/cli_usage.md CLI commands (doctor, run, report) and recommended workflows
docs/api_reference.md Feature-by-feature reference (timeout, rate, latency, jitter, loss, DNS, policy APIs)
docs/examples.md Scenario map and recommended testing patterns
docs/troubleshooting.md Symptom-based troubleshooting and quality gate

Deep-dive references:

Document Scope
docs/architecture.md System architecture with runtime-stage graph and module layout
docs/policies_and_context.md Policy lifecycle and application patterns
docs/interceptor_and_shm.md CLI runtime and SHM/interceptor details
docs/testing_and_examples.md Build/test command details and legacy examples
docs/shm_protocol.md SHM binary layout and consistency protocol
docs/operations_tuning.md Baseline/tuning/stress operational guidance

Build Documentation (Sphinx + MyST)

Generate HTML docs locally:

uv run sphinx-build -M html docs docs/_build

Open generated site entrypoint:

  • docs/_build/html/index.html

Publish to PyPI

The project includes a release workflow at .github/workflows/publish-pypi.yml that builds:

  • Linux x86_64 wheels
  • Linux i686 wheels
  • Linux aarch64 wheels
  • one source distribution (sdist)

Release options:

  1. Push a tag like v2026.3.8 to publish directly to PyPI.
  2. Run the workflow manually (workflow_dispatch) and choose:
    • pypi for production publish
    • testpypi for dry-run validation

The wheel build uses cibuildwheel and stages architecture-specific native artifacts with scripts/build_native_artifacts.sh before each wheel build.

Project Status

  • Python package metadata: pyproject.toml
  • Public API source of truth: src/faultcore/__init__.py
  • Decorator behavior source of truth: src/faultcore/decorator.py
  • Unit tests: tests/unit/
  • Integration CLI scripts: tests/integration/

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

faultcore-2026.4.9.tar.gz (50.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

faultcore-2026.4.9-py3-none-manylinux2014_x86_64.whl (478.7 kB view details)

Uploaded Python 3

faultcore-2026.4.9-py3-none-manylinux2014_i686.whl (516.8 kB view details)

Uploaded Python 3

faultcore-2026.4.9-py3-none-manylinux2014_aarch64.whl (467.4 kB view details)

Uploaded Python 3

File details

Details for the file faultcore-2026.4.9.tar.gz.

File metadata

  • Download URL: faultcore-2026.4.9.tar.gz
  • Upload date:
  • Size: 50.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for faultcore-2026.4.9.tar.gz
Algorithm Hash digest
SHA256 b6d4dbf6c2be294e22d06bd5c99f06413dec49484a92604eff469b06dd2a12fd
MD5 cb83dd235002c613847e83bd630fb538
BLAKE2b-256 0064bd93dc3c045602079a8af32fb2729200e9d5900551dac843587cafbb94cb

See more details on using hashes here.

Provenance

The following attestation bundles were made for faultcore-2026.4.9.tar.gz:

Publisher: publish-pypi.yml on albertobadia/faultcore

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file faultcore-2026.4.9-py3-none-manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for faultcore-2026.4.9-py3-none-manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cbf485d09ba98cf38d922d4e7657ad9d21a3a4b885bd0475d74d4b5071f56c95
MD5 52e06da2d392b49f620cee2951b0cd05
BLAKE2b-256 1f489cde06faeda790398deee12444625b1fe57f879c7d6e88178f150cd3859c

See more details on using hashes here.

Provenance

The following attestation bundles were made for faultcore-2026.4.9-py3-none-manylinux2014_x86_64.whl:

Publisher: publish-pypi.yml on albertobadia/faultcore

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file faultcore-2026.4.9-py3-none-manylinux2014_i686.whl.

File metadata

File hashes

Hashes for faultcore-2026.4.9-py3-none-manylinux2014_i686.whl
Algorithm Hash digest
SHA256 6459db894b022173d242dc295be871b5df9cb4276075cfcfa360b15ac4374f60
MD5 636ff56f56eaed0a44fe9971f584625d
BLAKE2b-256 567c61b55905e80e0ccad73a17eac9071df525584119e289d05ca90ee75fadf5

See more details on using hashes here.

Provenance

The following attestation bundles were made for faultcore-2026.4.9-py3-none-manylinux2014_i686.whl:

Publisher: publish-pypi.yml on albertobadia/faultcore

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file faultcore-2026.4.9-py3-none-manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for faultcore-2026.4.9-py3-none-manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 db36244a7dc99ced92c755d7a6617387f0b2ceedc2129ad17212e7341ecb5c40
MD5 691d8f81f1d473a123e30ab2560923c2
BLAKE2b-256 08a0a082084753a698a7261717ed7ed467b062206aaf77dcea5c8d1d3b2f862d

See more details on using hashes here.

Provenance

The following attestation bundles were made for faultcore-2026.4.9-py3-none-manylinux2014_aarch64.whl:

Publisher: publish-pypi.yml on albertobadia/faultcore

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page